
    Mhh                       d Z ddlZddlZddlZddlZddlZddlZddlZddlm	Z
 ddlZddlZddlZddlZddlZddlZddlZddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lm Z  ddl!m"Z"m#Z#m$Z$m%Z% ddl&m'Z' ddl(m)Z)m*Z*m+Z+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 ddl4m5Z5m6Z6m7Z7m8Z8 ddl9m:Z: ddl;m<Z<m=Z=m>Z>m?Z?m@Z@mAZA ddlBmCZC ddlDmEZE ddlFmGZGmHZH ddlImJZJmKZKmLZLmMZMmNZNmOZO  ejP        d          ZQ e
jR         e
jS        eGd                    ZT e
jS        eTd          ZUdZVdZW G d de5          ZXd ZYd ZZd Z[d  Z\d`d!Z]d`d"Z^d`d#Z_d`d$Z`d% Zad`d&Zbd`d'Zc G d( d)e=          Zdd* Zed`d+Zfdad,Zgdbd.Zhdcd/Zid`d0Zj	 	 	 	 	 	 	 	 ddd2Zkd`d3Zlded5Zmded6Zndfd7Zoded8Zpded9Zqd`d:Zrd`d;Zsd`d<Ztd`d=Zud`d>Zvd`d?Zwd@ Zx G dA dB          ZydC ZzdD Z{d`dEZ|dF Z}dG Z~dH ZdI ZdJ ZdK ZdL ZdM ZdgdNZdgdOZd`dPZ ed1Q           G dR dS                      Zd`dTefdUZdV ZdWefdXZdY ZdZ Zd[ Zd\ Zdhd]Zd^ Zed_k    r eceG           dS dS )izJupyterLab command handler    N)deepcopy)	dataclass)glob)Path)TemporaryDirectory)Event)Optional)URLError)Requestquoteurljoinurlopen)jupyter_config_dir)GREEN_ENABLEDGREEN_OKRED_DISABLEDRED_X)get_allowed_levelsget_federated_extensionsget_package_urlget_page_configget_static_page_configwrite_page_config)ProcessWatchHelperlist2cmdlinewhich)Version)Bool	HasTraitsInstanceListUnicodedefault)__version__
CoreConfig)HERE	YARN_PATH)Rangegtgteltltemake_semverz'.*theme-light-extension/style/theme.cssz..dev_modezpin@zhttps://registry.yarnpkg.comc                       e Zd ZddZd ZdS )ProgressProcessNc                    t          |t          t          f          sd}t          |          |r%|                                rd}t          |          t          |          | _        d| _        || _        | j        	                    dt          |                      |                     ||t          j        t          j        dd          | _        |pt!                      | _        t$          j                            |            dS )	a  Start a subprocess that can be run asynchronously.

        Parameters
        ----------
        cmd: list
            The command to run.
        logger: :class:`~logger.Logger`, optional
            The logger instance.
        cwd: string, optional
            The cwd of the process.
        kill_event: :class:`~threading.Event`, optional
            An event used to kill the process operation.
        env: dict, optional
            The environment for the process.
        zCommand must be given as a listzProcess aborted z> Tutf-8)cwdenvstderrstdoutuniversal_newlinesencodingN)
isinstancelisttuple
ValueErroris_set_ensure_loggerlogger
_last_linecmddebugr   _create_process
subprocessSTDOUTPIPEprocr   _kill_eventr   _procsadd)selfrD   rB   r6   
kill_eventr7   msgs          S/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/jupyterlab/commands.py__init__zProgressProcess.__init__F   s      #e}-- 	"3CS//! 	"*++-- 	"#CS//!$V,,2|C0022333(($?# ) 
 
	 &04         c                 *   g }| j         }| j        }t          j        g d          }|                                t
          j                            t          |                     t
          j        	                                 t
          j                            d           |
                                r%|                                  d}t          |          	 |                    d          \  }}|                    |           n# t          j        $ r Y w xY w|                                | j                            d                    |                     t
          j        	                                 |                                 S )N)-\|/zProcess was abortedg?)timeout
)rJ   rK   	itertoolscyclepollsysr9   writenextflushr@   	terminater?   communicateappendrG   TimeoutExpiredrB   rE   join)rN   cacherJ   rO   spinnerrP   out_s           rQ   waitzProgressProcess.waito   sd   y%
/"7"7"788iikk!JT']]+++JJT"""  "" &   + oo%))#)66QS!!!!,    iikk! 	$))E**+++
~~s   .D DD)NNNN)__name__
__module____qualname__rR   rl    rS   rQ   r2   r2   E   s8        '! '! '! '!R         rS   r2   c                  B    t          j        t          j        |            S )z!Join paths to create a real path.)ospabspathrg   )argss    rQ   pjoinru      s    ;sx'''rS   c                      t           j                            d          } | pt          t	                      dd          } t          j        |           S )z6Get the configured JupyterLab user settings directory.JUPYTERLAB_SETTINGS_DIRlabzuser-settingsosenvirongetru   r   rr   rs   )settings_dirs    rQ   get_user_settings_dirr~      sC    :>>";<<LV5);)=)=uo#V#VL;|$$$rS   c                      t           j                            d          } | pt          t	                      dd          } t          j        |           S )z3Get the configured JupyterLab workspaces directory.JUPYTERLAB_WORKSPACES_DIRrx   
workspacesry   )workspaces_dirs    rQ   get_workspaces_dirr      sC    Z^^$?@@N#Wu-?-A-A5,'W'WN;~&&&rS   c                     t           j                            d          r>t          t	          t           j        d                                                             S t          t          j        ddd          } t          t          d          rt          j                     t          t          dd          }t          j        |          r(|                     |          st          |ddd          } nIt          j                            d          r*t          j        |           st          j        d	          rd	} t          t	          |                                                     S )
z,Get the configured JupyterLab app directory.JUPYTERLAB_DIRsharejupyterrx   getuserbase	USER_BASENz/usrz/usr/local/share/jupyter/lab)rz   r{   r|   strr   resolveru   r_   prefixhasattrsiter   getattrr(   
startswithrr   exists)app_diruserbases     rQ   get_app_dirr      s9    
z~~&'' A 4
#3455==??@@@ CJE::G t]## t[$//Hx   	1););H)E)E 	1'9e<< 	
f%%1
7##1 J5661
 1 tG}}$$&&'''rS   c           	          t          dt          dddddg| |                                          dk    }|r/t          dt          g| |          }|                                 d	S d	S )
a>  `yarn-deduplicate` with the `fewer` strategy to minimize total
    packages installed in a given staging directory

    This means a extension (or dependency) _could_ cause a downgrade of an
    version expected at publication time, but core should aggressively set
    pins above, for example, known-bad versions
    nodedlxzyarn-berry-deduplicatez-sfewerHighestz--failr6   rB   r   N)r2   r)   rl   )pathrB   	had_dupes	yarn_procs       rQ   dedupe_yarnr      s     	( 	
 	
 	
 $&&	 "  #VY$7T&QQQ	 rS   c                    t          |          }t          dt          ddg| |          }|                                }|dk    rBt          dt          g| |          }|                                 t	          t
          |           |dk    S )z_Ensure that node_modules is up to date.

    Returns true if the node_modules was updated.
    r   z--immutablez--immutable-cacher   r   )rA   r2   r)   rl   r   	REPO_ROOT)r6   rB   r   rets       rQ   ensure_node_modulesr      s    
 F##F	M+>?SQW  I ..

C axx#VY$7SPPP	Iv&&&!8OrS   c                 
   t          |           } t          t          d          }t          t          |           st          j        |          s5t          dt          dgt          |           }|	                                 dS dS )z)Ensure that the dev assets are available.staticr   buildr   N)
rA   ru   DEV_DIRr   r   rr   r   r2   r)   rl   )rB   targetr   s      rQ   
ensure_devr      s    F##F7H%%F 9f-- SZ5G5G #VY$@iX^___	 rS   c                 "   t          t          d          }t          |           } t          t          dd          }t          j        |          s@t          ||            t          dt          dg||           }|                                 dS dS )z*Ensure that the core assets are available.stagingr   
index.htmlr   r   r   N)	ru   r(   rA   rr   r   r   r2   r)   rl   )rB   r   r   r   s       rQ   ensure_corer      s    D)$$GF##F 4<00F:f GV,,,#VY$@gV\]]]	 rS   c                 b    t          j        t          | dd                    rdS d|  dddg}|S )zEnsure that an application directory is available.

    If it does not exist, return a list of messages to prompt the user.
    r   r   Nz,JupyterLab application assets not found in ""z:Please run `jlpm run build:core` then `jupyter lab build` z or use a different app directory)rr   r   ru   )r   msgss     rQ   
ensure_appr     sL    
 z%<8899  	BwAAAD*D
 KrS   c                     t          |           } t          t          |            t          j        t          j        t          dd                    }d}t          dt          ddg|| |          }|gS )zRun watch mode for the source packages.

    Parameters
    ----------
    logger: :class:`~logger.Logger`, optional
        The logger instance.

    Returns
    -------
    A list of `WatchHelper` objects.
    packagesmetapackagez/.* Found 0 errors\. Watching for file changes\.r   runwatchr6   rB   startup_regex)rA   r   r   rr   rs   rg   r   r)   )rB   ts_dirts_regexts_procs       rQ   watch_packagesr     sw     F##F	6***[)ZGGHHF BH	E7+V^  G 9rS   c                     t          |           } t          |           }t          dt          ddgt          | t
                    }g ||S )zRun watch mode in a given directory.

    Parameters
    ----------
    logger: :class:`~logger.Logger`, optional
        The logger instance.

    Returns
    -------
    A list of `WatchHelper` objects.
    r   r   r   r   )rA   r   r   r)   r   WEBPACK_EXPECT)rB   package_procswp_procs      rQ   	watch_devr   -  s[     F##F"6**M 	E7+$	  G %]$G$$rS   c                       e Zd ZdZd fd	Z ed          Z edd          Z e	e
j        d          Z e	ed	          Z e	ed
d          Z e e            d          Z ed          Z edd          Z edd          Z edd          Z ed          d             Z ed          d             Z ed          d             Z ed          d             Z xZS )
AppOptionszOptions object for build systemNc                     |||d<   |||d<   d|v r|d         s|                     d            t                      j        di | d S )Ncore_configrB   r   rp   )popsuperrR   )rN   rB   r   kwargs	__class__s       rQ   rR   zAppOptions.__init__K  so    "$/F=!%F8 vi'8JJy!!!""6"""""rS   zThe application directory)helpTzKWhether to shadow the default app_dir if that is set to a non-default valuezThe logger to usezConfiguration for core datarp   zEvent for aborting call)rt   r   z7The paths to look in for prebuilt JupyterLab extensionszNPM packages registry URLFz*Splice source packages into app directory.zIf true, perform only a quick check that the lab build is up to date. If false, perform a thorough check, which verifies extension contents.zIncrease verbosity level.rB   c                 *    t          j        d          S )N
jupyterlablogging	getLoggerrN   s    rQ   _default_loggerzAppOptions._default_loggerv  s     ...rS   r   c                     t                      S N)r   r   s    rQ   _default_app_dirzAppOptions._default_app_dir|  s    }}rS   r   c                     t                      S r   r&   r   s    rQ   _default_core_configzAppOptions._default_core_config  s    ||rS   registryc                 l    t          | j                  d         }|                    dt                    S )Nyarn configr   )_yarn_configrB   r|   YARN_DEFAULT_REGISTRYrN   configs     rQ   _default_registryzAppOptions._default_registry  s+    dk**=9zz*&;<<<rS   NN)rm   rn   ro   __doc__rR   r#   r   r   use_sys_dirr!   r   LoggerrB   r'   r   r   rO   r"   labextensions_pathr   splice_sourceskip_full_build_checkverboser$   r   r   r   r   __classcell__)r   s   @rQ   r   r   H  s       ))
# 
# 
# 
# 
# 
# g6777G$[  K
 Xgn+>???F(:,IJJJK%b/HIIIJ		Q   w7888HD%QRRRM DV   d5:;;;GWX/ / /
 WY   W]   WZ= = = = = = =rS   r   c                 r    | t                      S t          | j        t                     r| S t          di | S )z-Helper to use deprecated kwargs for AppOptionNrp   )r   
issubclassr   )optionss    rQ   _ensure_optionsr     s?    ||	G%z	2	2 %$$G$$$rS   c                     t          |           } t          | j                   t          |           }| j        rt          | j                  ng }||                                z   S )zWatch the application.

    Parameters
    ----------
    app_options: :class:`AppOptions`, optional
        The application options.

    Returns
    -------
    A list of processes to run asynchronously.
    )r   _node_checkrB   _AppHandlerr   r   r   )app_optionshandlerr   s      rQ   r   r     s`     "+..K"###+&&G:E:S[N;#5666Y[M7==??**rS   c                     t          |          }t          |j                   t          |          }|                    | |          S )zInstall an extension package into JupyterLab.

    The extension is first validated.

    Returns `True` if a rebuild is recommended, `False` otherwise.
    pin)r   r   rB   r   install_extension)	extensionr   r   r   s       rQ   r   r     sH     "+..K"###+&&G$$YC$888rS   Fc                     t          |          }t          |j                   t          |          }|du r|                                S |                    |           S )zpUninstall an extension by name or path.

    Returns `True` if a rebuild is recommended, `False` otherwise.
    T)r   r   rB   r   uninstall_all_extensionsuninstall_extension)namer   all_r   s       rQ   r   r     s^    
 "+..K"###+&&Gt||//111&&t,,,rS   c                     t          |          }t          |j                   t          |          }|du r|                                S |                    |           S )zUpdate an extension by name, or all extensions.
    Either `name` must be given as a string, or `all_` must be `True`.
    If `all_` is `True`, the value of `name` is ignored.
    Returns `True` if a rebuild is recommended, `False` otherwise.
    T)r   r   rB   r   update_all_extensionsupdate_extension)r   r   r   r   r   s        rQ   r   r     s^     "+..K"###+&&Gt||,,...##D)))rS   c                 (    t                       j        } j        }|                    d| d           |t	          t
          d          k    rd}t          |          |t	          t
          d          k    rd}t          |          t           dd          r*|                    d	| d           t          ||           n}g d
} fd|D             }|D ]h}t	          ||          }t          j
        |          r*|                    d| d           t          ||           P|                    | d           i|                    d           t           dd          st           dd          r|                    d           dS dS )z+Clean the JupyterLab application directory.	Cleaning z...devzCannot clean the dev appcorezCannot clean the core appallFzRemoving everything in )
extensionssettingsr   r   c                 4    g | ]}t          |          |S rp   )r   ).0tr   s     rQ   
<listcomp>zclean.<locals>.<listcomp>  s(    JJJ'+q2I2IJ1JJJrS   z	Removing z not present, skipping...zSuccess!r  zIAll of your extensions have been removed, and will need to be reinstalledN)r   rB   r   inforu   r(   r?   r   _rmtree_starrr   r   _rmtree)r   rB   r   rP   possible_targetstargetsr   r   s   `       rQ   cleanr    s   !+..KF!G
KK(G((()))%e$$$$(oo%f%%%%)oo{E5)) @:g:::;;;Wf%%%%JJJJJJJ.JJJ 	@ 	@D7D))Fz&!! @1111222''''t>>>????
KK
{E5)) aW[,PU-V-V a_`````a arS   Tc                     t          |          }t          |j                   t          |          }|                    | |||||          S )z!Build the JupyterLab application.)r   version
static_url
productionminimizeclean_staging)r   r   rB   r   r   )	r   r  r  rO   r  r   r  r  r   s	            rQ   r   r     s\     "+..K"###+&&G==#    rS   c                 V    t          |           }|                                 |j        S )z.Get a dictionary of information about the app.)r   _ensure_disabled_infor  r   r   s     rQ   get_app_infor    s)    +&&G!!###<rS   
sys_prefixc                 P    t          |          }|                    | d|          S )znEnable a JupyterLab extension/plugin.

    Returns `True` if a rebuild is recommended, `False` otherwise.
    Flevelr   toggle_extensionr   r   r  r   s       rQ   enable_extensionr    s,    
 +&&G##IuE#BBBrS   c                 P    t          |          }|                    | d|          S )zoDisable a JupyterLab extension/plugin.

    Returns `True` if a rebuild is recommended, `False` otherwise.
    Tr  r  r  s       rQ   disable_extensionr     s,    
 +&&G##It5#AAArS   c                 L    t          |          }|                    | |          S )z7Check if a JupyterLab extension is enabled or disabled.)r   check_extension)r   	installedr   r   s       rQ   r"  r"  $  s%    +&&G""9i888rS   c                 P    t          |          }|                    | d|          S )z#Lock a JupyterLab extension/plugin.Tr  r   toggle_extension_lockr  s       rQ   lock_extensionr'  *  s*    +&&G((D(FFFrS   c                 P    t          |          }|                    | d|          S )z%Unlock a JupyterLab extension/plugin.Fr  r%  r  s       rQ   unlock_extensionr)  0  s*    +&&G((E(GGGrS   c                     t          |           } t          | j                   t          |           }|                                S )zSDetermine whether JupyterLab should be built.

    Returns a list of messages.
    )r   r   rB   r   build_checkr  s     rQ   r+  r+  6  sA    
 "+..K"###+&&G   rS   c                 H    t          |           }|                                S )zList the extensions.)r   list_extensionsr  s     rQ   r-  r-  A  s!    +&&G""$$$rS   c                 J    t          |          }|                    |           S )zuLink a package against the JupyterLab build.

    Returns `True` if a rebuild is recommended, `False` otherwise.
    )r   link_package)r   r   r   s      rQ   r/  r/  G  s%    
 +&&G%%%rS   c                 J    t          |          }|                    |           S )zzUnlink a package from JupyterLab by path or name.

    Returns `True` if a rebuild is recommended, `False` otherwise.
    )r   unlink_package)packager   r   s      rQ   r1  r1  P  s%    
 +&&G!!'***rS   c                 :    t          |           }|j        d         S )zGet the application version.r  )r   r  r  s     rQ   get_app_versionr4  Y  s    +&&G<	""rS   c                 J    t          |          }|                    |           S )z8Get the latest compatible version of a list of packages.)r   "latest_compatible_package_versions)namesr   r   s      rQ   &get_latest_compatible_package_versionsr8  _  s#    +&&G55e<<<rS   c                 n   t          j        | d          5 }|                    d          5 }t          j        |                                                    d                    }ddd           n# 1 swxY w Y   d |                                D             |d<   ddd           n# 1 swxY w Y   |S )z0Read the package data in a given target tarball.rzpackage/package.jsonutf8Nc                 F    g | ]}|j         t          d           d         S )zpackage/N)r   len)r  fs     rQ   r  z read_package.<locals>.<listcomp>j  s+    -b-b-bAafS__5F5F.G-b-b-brS   jupyterlab_extracted_files)tarfileopenextractfilejsonloadsreaddecode
getmembers)r   tarr>  datas       rQ   read_packagerJ  e  s+   	fc	"	" cc__344 	7:affhhoof5566D	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7-b-bQTQ_Q_QaQa-b-b-b)*c c c c c c c c c c c c c c c Ks4   B*:A2&B*2A6	6B*9A6	:$B**B.1B.c                   R   e Zd Zd Zd6dZ	 	 	 	 	 	 d7dZd Zd Zd8d	Zd
 Z	d Z
d Zd Zd Zd Zd Zd9dZd:dZd:dZd:dZd;dZd Zd Zd Zd Zd<dZd;dZd Zd Zd Zd  Zd! Zd" Z d# Z!d$ Z"d% Z#d& Z$d' Z%d(e&d)e'd*e'd+e&fd,Z(d- Z)d. Z*d/ Z+d8d0Z,d8d1Z-d2 Z.d3 Z/d4 Z0d5 Z1dS )=r   c                    t          |          }|| _        |j        | _        |j        rt	                      n| j        | _        |j        | _        t          |j        j	                  | _
        |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        |                                 | _        	 |                     d           dS # t&          t(          f$ rh 	 | j                            d           |                     d           Y dS # t&          t(          f$ r | j                            d           Y Y dS w xY ww xY w)zCreate a new _AppHandler objectr  r  za`sys_prefix` level settings are read-only, using `user` level for migration to `lockedExtensions`userzyBoth `sys_prefix` and `user` level settings are read-only, cannot auto-migrate `disabledExtensions` to `lockedExtensions`N)r   _optionsr   r   r   sys_dirrB   r   r   _data	core_datar   r   rO   r   r   _get_app_infor   _maybe_mirror_disabled_in_lockedPermissionErrorOSErrorwarning)rN   r   s     rQ   rR   z_AppHandler.__init__t  sx   !'**(/(;M{}}}n!'"5";<<")"<!,(%,%B" &&((		111EEEEE) 		 		 		  w   55F5CCCCCC#W-   ## P      		s*   C E.0D!!+EEEENc                 8   t          |          }| j        d         }|| j        d         v r~|                                 }|                    dg           }||v rN| j                            d|            |                    |           ||d<   |                     |           dS dS |                                  t                      5 }| 	                    |||          }ddd           n# 1 swxY w Y   |d	         }	|d
         rJ|                                 }|
                    di           }
|d         |
|	<   |                     |           |	|v r@||	         }|d         |d         k    r&|d         dk    rt          j        |d                    dS )zInstall an extension package into JupyterLab.

        The extension is first validated.

        Returns `True` if a rebuild is recommended, `False` otherwise.
        r  core_extensionsuninstalled_core_extensionszInstalling core extension TFr   Nr   is_dirlocal_extensionssourcer   locationapp)_normalize_pathr  _read_build_configr|   rB   remove_write_build_config_ensure_app_dirsr   _install_extension
setdefaultrz   )rN   r   existingr   r  r   uninstalledtempdirr  r   localothers               rQ   r   z_AppHandler.install_extension  s    $I..	Y|,
 	"3444,,..F **%BBGGKK''  !Ii!I!IJJJ""9---8C45((000t5 	  !! 	HW**9g3*GGD	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H F| > 	-,,..F%%&8"==Ex.E$K$$V,,, :t$EV}V,,z1Be1K1K	%-(((ts   C11C58C5FTc                 n   || j         d         p| j         d          }|sd}| j        j        r?t          t          | j                   |                     dt          dgt                     |rd	nd
g}|r|                    |rdnd           | j                             dd	                    |           d           | j
        }|                     ||||           t          |d          }	|                     dt          dg|	          }
|
dk    r+d}| j                            |           t          |          t          |	| j                   d|rdnd |rdnd }|                     dt          d|g|	          }
|
dk    r+d}| j                            |           t          |          dS )zBuild the application.Nlinked_packagesr[  FrB   r   zbuild:packagesr6   r  development	minimizedznot minimizedzBuilding jupyterlab assets (, ))r   r  r  r  r   installr   z"npm dependencies failed to installzbuild:prodr   z	:minimizer4   r   zJupyterLab failed to build)r  rN  r   r   r   rB   _runr)   re   rg   r   _populate_stagingru   rE   RuntimeErrorr   )rN   r   r  r  r  r  r  r  r   r   r   rP   commands                rQ   r   z_AppHandler.build  s    "i(9:[diHZ>[\J 	H =& 	L	$+>>>>IIvy*:;IKKK *=> 	FKKxD_EEEJ		$JJJKKK ,w:] 	 	
 	
 	
 ++ iiI6GiDD!886CKc"""s### 	GT[)))]Z:66U]8<[KKY[]]iiE7;iII!88.CKc"""s### 8rS   c                 4   t          | j        d          }|                                  |                     dt          dg|           t          || j                   t          dt          ddgt          | j        d          t          | j                  }|gS )zXStart the application watcher and then run the watch in
        the background.
        r   r   rs  rn  r   r   )r6   r   rB   )	ru   r   rv  ru  r)   r   rB   r   r   )rN   r   rJ   s      rQ   r   z_AppHandler.watch  s     i00    			69i0g	>>>GT[)))Yw/dlI..(;	
 
 
 vrS   c                 b   |                                   | j        | j        }|d         }                    d|            |d         s|d         r|                                 |d<   |d         r|                                  |d         rA                    d           |                     |d           |                     |d           |d	         }|rH                    d
           t          |          D ]#}                    d| d||                     $|d         }|rP                    d           t          |          D ]+}||         d         }                    d| d|            ,|d         }|r0                    d           fdt          |          D              t          |d                   t          |d                   z   t          |d                   z   fd|d         D             }	|	rH                    d           t          |	          D ]#}
|
v r|
dz  }
                    d|
            $g }| j        d         D ]Z}| j        d         |         d         }| j        d         |         d         }t          ||d          s|	                    |           [|r0                    d           fdt          |          D              | 
                    d          }|r%                    d           fd|D              d S d S )!z"Print an output of the extensions.r  zJupyterLab vfederated_extensionsr  compat_errorsz+Other labextensions (built into JupyterLab)r^  r_   r[  z
   local extensions:        : rl  z
   linked packages:r\  uninstalled_corez
Uninstalled core extensions:c                 @    g | ]}                     d |           S     r  r  itemrB   s     rQ   r  z/_AppHandler.list_extensions.<locals>.<listcomp>+  s+    MMMDV[[''MMMrS   rX  c                 N    g | ]!}|                     d           d         v |"S ):r   )	partition)r  iall_extss     rQ   r  z/_AppHandler.list_extensions.<locals>.<listcomp>3  s4    SSS!1;;s3C3CA3F(3R3RA3R3R3RrS   disabledz
Disabled extensions:z (all plugins)r  shadowed_extsTzO
The following source extensions are overshadowed by older prebuilt extensions:c                 @    g | ]}                     d |           S r  r  )r  r   rB   s     rQ   r  z/_AppHandler.list_extensions.<locals>.<listcomp>H  s+    NNNDV[[''NNNrS   )fastz3
Build recommended, please run `jupyter lab build`:c                 @    g | ]}                     d |           S r  r  r  s     rQ   r  z/_AppHandler.list_extensions.<locals>.<listcomp>M  s+    ===DV[[''===rS   N)r  rB   r  _get_extension_compat_list_federated_extensions_list_extensionssortedr=   r,   re   r+  )rN   r  r  ri  r   rl  keyr\  r  r  r  improper_shadowedext_namesource_versionprebuilt_versionmessagesr  rB   s                   @@rQ   r-  z_AppHandler.list_extensions  s   ""$$$yy/,7,,---&' 	A4+= 	A$($>$>$@$@D!&' 	.++--- 	/KKEFFF!!$...!!$...'( 	>KK0111u > ><t<<uT{<<====01 	8KK/000o.. 8 8(-h76s66f667777 23 	NKK8999MMMMF;K4L4LMMMM ,-..4%&&'4)*++, 	 TSSStJ/SSS 	+KK0111x(( + +8##,,DM4MM**** 	/2 	3 	3H!Y|4X>yIN#y)?@J9U'>> 3!((222 	OKKb   ONNNF;L4M4MNNNN###.. 	>KKNOOO====H======	> 	>rS   c                    || j         }| j        }| j        d         }| j        d         }g }t          |dd          }t	          j        |          sdgS | j        d         }|d         }|                    d	i           }	|                    d
d          }
|
                    d          s4|d
         }t          |
          t          |          k    rd|
 d| d}|gS | j        d         }| 	                    |          }|d         }|                    d	i           }dD ]f}||         D ])}||v r|||         vr|
                    | d           *||         D ])}||v r|||         vr|
                    | d           *gt          t          d          }|                                D ]t\  }}|	                    |d                              |          r/||	vr4||v s||v r=|	|         |k    r+| d|	|          d||          }|
                    |           u|                                D ]K\  }}|s||v rt          |d          }|                     |||          r|
                    | d           L|                                D ]R\  }}|s||v rt          |dd          }|                     ||d         |          r|
                    | d           S|S )z[Determine whether JupyterLab should be built.

        Returns a list of messages.
        Nr[  rl  r   package.jsonzNo built applicationstatic_datar   dependenciesr  r4   -splicedzVersion mismatch: z
 (built), z
 (current)r  )silent)r  mimeExtensionsz needs to be included in buildz needs to be removed from buildr   z changed from z to r  z content changedr   r\  )r   r   r  ru   rr   r   r|   endswithr   _get_package_templatere   r   itemsr   _check_local)rN   r  r   ri  linkedr  pkg_pathr  old_jlabold_depsstatic_versioncore_versionrP   r  new_packagenew_jlabnew_depsext_typeextsrc_pkg_dirpkgdepr   r\  dnamer  s                             rQ   r+  z_AppHandler.build_checkO  s   
 <-D,	,-,- (N;;z(## 	,*++i.|,??>266 "i44&&z22 	#I.L~&&',*?*???]>]]\]]]u	/2 000==|,??>2668 	M 	MH) L L-''hx000OOs$J$J$JKKK  ) M M-''hx000OOs$K$K$KLLL	M Iz22 (( 
	% 
	%HC||C$$//<< (""e||sf}}}##NNHSMNNx}NN$$$ "KKMM 	; 	;LD& t},,'<00E  vu55 ;4 9 9 9::: !,,.. 	; 	;JD$ t},,'9.?@@E  tH~u== ;4 9 9 9:::rS   c                    | j         }| j        }||d         v r|d         |                             di                               dd          r3|d         |         d         d         }|                    d|            n|                    d| d           dS ||d	         v ry|                                 }|                    d
g           }||vrI|                     d|            |                    |           ||d
<   |                     |           dS dS |d         }|d                                         D ]\  }}	|	d         }
||k    rd| dt          j	        |
           }|                     |           t          j        |
           ||v rB|                                 }|                    di           }	|	|= |                     |            dS |                    d| d           dS )zpUninstall an extension by name.

        Returns `True` if a rebuild is recommended, `False` otherwise.
        r{  rs  uninstallInstructionsNz,JupyterLab cannot uninstall this extension. zJupyterLab cannot uninstall z~ since it was installed outside of JupyterLab. Use the same method used to install this extension to uninstall this extension.FrX  rY  zUninstalling core extension Tr[  r  r   zUninstalling z from No labextension named "" installed)r  rB   r|   errorr`  re   rb  r  rr   dirnamerz   ra  re  rV  )rN   r   r  rB   instructionsr   rg  ri  extnamerI  r   rP   s               rQ   r   z_AppHandler.uninstall_extension  sc   
 y4.///+,T2Y##,d33
  $$:;DA)L+  ZLZZ[[[[ x4  x  x  x   5 4)***,,..F **%BBGGK;&&A4AABBB""4(((8C45((000t5'(!,/5577 	 	MGT<D$EdEE#+d2C2CEEC   	$e##!4466F!,,-?DDDW,,V444tt  	BBBBCCCurS   c                     d}| j         d                                         D ]\  }}|                     |          }|p|}|S )ziUninstalls all extensions

        Returns `True` if a rebuild is recommended, `False` otherwise
        Fr  )r  r  r   )rN   should_rebuildr  rk   rg  s        rQ   r   z$_AppHandler.uninstall_all_extensions  sT    
 )L17799 	; 	;JGQ227;;K+:{NNrS   c                     d}| j         d                                         D ].\  }}|| j         d         v r|                     |          }|p|}/|S )zqUpdate all non-local extensions.

        Returns `True` if a rebuild is recommended, `False` otherwise.
        Fr  r[  )r  r  _update_extension)rN   r  r  rk   updateds        rQ   r   z!_AppHandler.update_all_extensions  sj    
 )L17799 	7 	7JGQ$)$6777,,W55G+6wNNrS   c                     || j         d         vr | j                            d| d           dS |                     |          S )mUpdate an extension by name.

        Returns `True` if a rebuild is recommended, `False` otherwise.
        r  r  r  F)r  rB   rV  r  )rN   r   s     rQ   r   z_AppHandler.update_extension  sQ    
 ty...K K$ K K KLLL5%%d+++rS   c                    | j         d         |         }|d         r | j                            d| d           dS 	 |                     |          }n# t          $ r Y dS w xY w| | j                            d| d           dS ||d	         k    r | j                             d
|d           dS | j                             d| d|            |                     | d|           S )r  r  alias_package_sourcez$Skipping updating pinned extension 'z'.FNz No compatible version found for !r  z
Extension z already up to datez	Updating z to version @)r  rB   rV  "_latest_compatible_package_versionr
   r   )rN   r   rI  latests       rQ   r  z_AppHandler._update_extension  s1   
 y&t,&' 	K Ot O O OPPP5	<<TBBFF 	 	 	55	>K J4 J J JKKK5T)_$$KE$EEEFFF5?T??v??@@@%%&8&8&8&8999s   A 
A! A!c                 h    t          |          }t          j        |          rt          j        |          sd| d}t	          |          t                      5 }                     ||          }ddd           n# 1 swxY w Y   t          |d                   }|s                     |          S  j	        
                    d| d            fd|D                                               }|                    di           }|d	         ||d
         <                        |           dS )zrLink a package at the given path.

        Returns `True` if a rebuild is recommended, `False` otherwise.
        zCannot install "z" only link local directoriesNrI  zInstalling zA as a linked package because it does not have extension metadata:c                 J    g | ]}j                             d |            S )   )rB   rV  )r  mrN   s     rQ   r  z,_AppHandler.link_package.<locals>.<listcomp>'  s/    :::A		Y1YY	'	':::rS   rl  r\  r   T)r_  rr   r   isdirr?   r   _extract_package_validate_extensionr   rB   rV  r`  re  rb  )rN   r   rP   rh  r  r  r   r  s   `       rQ   r/  z_AppHandler.link_package  s   
 t$$z$ 	"sy 	"HTHHHCS//!!! 	8W((w77D	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 'tF|44 	0))$/// 	a$aaa	
 	
 	
 	;::::::: ((**""#4b99#H~tF|  (((ts   A??BBc                    t          |          }|                                 }|                    di           }d}|                                D ]\  }}|||hv r|}|r||= nj|                    di           }|                                D ]\  }}|||hv r|}|r0||= | j        d         |         d         }t          j        |           |sd| }t          |          |                     |           dS )zUnlink a package by name or at the given path.

        A ValueError is raised if the path is not an unlinkable package.

        Returns `True` if a rebuild is recommended, `False` otherwise.
        rl  Nr[  r  r   zNo linked package for T)	r_  r`  re  r  r  rz   ra  r?   rb  )	rN   r   r   r  foundr   r\  ri  rP   s	            rQ   r1  z_AppHandler.unlink_package1  s0    t$$((**""#4b99"LLNN 	 	LD&f~%% 
	 u%%&8"==E % ! !fD&>)) E  %Ly.u5f=	$ 	"1411CS//!  (((trS   r  c                     t          j        | j        d          }t          || j        |d          }|                    di           }|                    |d          S )Nr  T)app_settings_dirrB   r  include_higher_levelslockedExtensionsF)rr   rg   r   r   rB   r|   )rN   r   r  r  r  page_configlockeds          rQ   _is_extension_lockedz _AppHandler._is_extension_lockedT  sb    8DL*==,-;"&	
 
 
 !3R88zz)U+++rS   c                 D   t          j        | j        d          }|dk    r^t                      }|                     |||                    |          dz            d          r| j                            d           dS t          || j        d	          }t          || j        |	          }|	                    d
i           }|	                    d
i           }	d}
|	                    |d          }|r
|sd|	|<   d}
n|s	|rd|	|<   d}
|
r|	|d
<   t          ||           |
S )zsEnable or disable a lab extension.

        Returns `True` if a rebuild is recommended, `False` otherwise.
        r  system   Tr  r  z8Extension locked at a higher level, cannot toggle statusFr   r  rB   r  disabledExtensionsr  rr   rg   r   r   r  indexrB   r  r   r|   r   )rN   r   valuer  r  allowedcomplete_page_configlevel_page_configr  disabled_at_leveldid_somethingis_disableds               rQ   r  z_AppHandler.toggle_extension`  s|   
 8DL*==
 H(**G((u)=)=)A!BZ^ )      ![\\\u5-dk 
  
  
 3-dk
 
 
 (++,@"EE-112FKKll9e44 	! 	!+/i( MM 	!; 	!+0i( M 	>6G23/u====rS   c                 ,   t          j        | j        d          }t          || j        |          }d|v rdS |                    di           }t          |t                    rt          	                    |d          }||d<   t          ||           dS )a  Lock all extensions that were previously disabled.

        This exists to facilitate migration from 4.0 (which did not include lock
        function) to 4.1 which exposes the plugin management to users in UI.

        Returns `True` if migration happened, `False` otherwise.
        r  r  r  Fr  Tr  )rr   rg   r   r   rB   r|   r<   r=   dictfromkeysr   )rN   r  r  r  r  s        rQ   rS  z,_AppHandler._maybe_mirror_disabled_in_locked  s     8DL*==,-dk
 
 
 ,,5 ??#7<<h%% 	5}}Xt44H*2&'+U3333trS   c                    t          j        | j        d          }|dk    r^t                      }|                     |||                    |          dz            d          r| j                            d           dS t          || j        |          }|	                    d	i           }|||<   ||d	<   t          ||
           dS )z)Lock or unlock a lab extension (/plugin).r  r  r  Tr  z1Extension locked at a higher level, cannot toggleFr  r  r  Nr  )rN   r   r  r  r  r  r  r  s           rQ   r&  z!_AppHandler.toggle_extension_lock  s    8DL*== H(**G((u)=)=)A!BZ^ )      !TUUUu,-dk
 
 
 !3R88!y*0&'+U333333rS   c                    |                                   | j        }||d         v r|                     |||          S ||d         v r&| j                            | dt                      dS |                     |||          S )z/Check if a lab extension is enabled or disabledrX  rl  r  T)r  r  _check_core_extensionrB   r   _check_common_extension)rN   r   check_installed_onlyr  s       rQ   r"  z_AppHandler.check_extension  s    ""$$$y.///--i?STTT.///K	;;M;;<<<4++It=QRRRrS   c                 ^   ||d         v r&| j                             | dt                      dS |r&| j                             | dt                      dS ||d         v r&| j                             | dt                      dS | j                             | dt
                      dS )z0Check if a core extension is enabled or disabledr  r  Fr~  Tdisabled_core)rB   r  r   r   r   r   )rN   r   r  r  s       rQ   r  z!_AppHandler._check_core_extension  s    /000K	33E334445 	K	77X778884_---K	;;\;;<<<5I7777888trS   c                    ||d         vr&| j                             | dt                      dS |                                 |         }|r'| j                             | dt           d           dS |r&| j                             | dt                      dS t          ||d                   r&| j                             | dt                      dS | j                             | dt                      dS )z=Check if a common (non-core) extension is enabled or disabledr  r  Fz (compatibility errors)r~  Tr  )rB   r  r   r  r   _is_disabledr   r   )rN   r   r  r  errorss        rQ   r  z#_AppHandler._check_common_extension  s   D...K	33E334445++--i8 	K	JJEJJJKKK5 	K	77X778884	4
#344 	K	;;\;;<<<5I7777888trS   c                    i | j         xd<   }|                     |          xd<   }|                                 d<   |                                 d<   g xd<   }g xd<   }|                                D ]D\  }}|d         v |d<   |d         d	k    r|                    |           4 |j        |           E|                                 d
<   t          | j                  d<   d         p|}|d         d         d<   |d         	                    dd          d<   | j
        d<   | j        d<   t          | j                   d<   t          | j                  d<   fdd         D             d<   S )zGet information about the app.rQ  r  r[  rl  app_extensionssys_extensionsis_localr]  r^  r  r  r   r  	staticUrlr4   rO  r   rX  r{  c                 (    g | ]}|d          v |S )r{  rp   )r  r  r  s     rQ   r  z-_AppHandler._get_app_info.<locals>.<listcomp>  s0     !
 !
 !
=S8T1T1TC1T1T1TrS   r  )rQ  _get_extensions_get_local_extensions_get_linked_packagesr  re    _get_uninstalled_core_extensions_get_static_datar   r|   rO  _get_core_extensionsr   r   )	rN   rQ  r  r^  r_   r   rI  app_datar  s	           @rQ   rR  z_AppHandler._get_app_info  s    (,6[I*.*>*>y*I*II\Z#'#=#=#?#? "&";";"="='))'))$**,, 	! 	!JD$#t,>'??DJ5((

4    
4    #'#H#H#J#J .t|<<]&3)"<0;Y$\266{BGG[,Y,Y"6t~"F"F'?@W'X'X#$!
 !
 !
 !
-!
 !
 !
_ rS   c                    | j         }d|v rd S | j        }t          j        | j        d          }t          ||| j                  }|                    di           }t          |t                    rt                              |d          }||d<   |                    di           }t          |t                    rt                              |d          }||d<   g }|d         D ]!}||d         v r|                    |           "||d	<   d S )
Nr  r  )r  rB   r  Tr  r  rX  r  )r  r   rr   rg   r   r   rB   r|   r<   r=   r  r  re   )	rN   r  r   r  r  r  r  r  r  s	            rQ   r  z!_AppHandler._ensure_disabled_info  s,   yF!48DL*==%1A$+
 
 
 ??#7<< h%% 	5}}Xt44H#Z!3R88fd## 	1]]6400FX)* 	* 	*Cd:&&&$$S))) -_rS   c                    | j         }t          |d          }|rFt          j        |          r2| j                            d|            t          || j                   |                                  |s| j        d         d         d         }| j        j	        }|r,| j        
                    d           t          }t          dz   }nt          t          d          }t          |d          }	t          j        |	          rt          |	          5 }
t          j        |
          }d	d	d	           n# 1 swxY w Y   |d                             dd
          |k    r)t          || j                   t%          j        |           dD ]5}t          ||          }t)          j        t          ||          |           6dD ];}t          ||          }t)          j        t          t          d|          |           <t          |d          }t          j        |          rt          || j                   	 t)          j        t          |d          |           nU# t(          j        $ rC}dt1          |          vodt1          |          v}|st          j        |          s Y d	}~nd	}~ww xY wt          |d          }t          j        |          rt          || j                   t%          j        |           | j        d         }d}| j        d                                         D ]}\  }}||vrE|                                 }|                    di           }||= |                     |           d}Nt          |d          }|                     |||||         d           ~|r|                                 | j        d<   | j        d         }|                                D ]4\  }}t          |d          }|                     ||d         ||d           5|                                 }|d         }|r||d<   |r||d<   |r||d<   |rBtA          t          tB          ddd                    D ]}t          j"        t          j#        |                    }t          j$        tK          |          &                    d                    }|d         }||d         v r||d         |<   ||d         |<   ||d         v r||d         |<   t          j#        t          tB          d                    }||d          d!<   t          j'        |d"d#d          }t          |d"          }t          j        |          rt)          j(        |d$           t          |d          }	t          |	d%          5 }
t          j)        ||
d&'           d	d	d	           n# 1 swxY w Y   t          |d(          }t          t          dd(          } t          j        |          sCt)          j        | |           t%          j*        |tV          j,        tV          j-        z             d	S d	S ))z+Set up the assets in the staging directory.r   r   rQ  r   r  z)Splicing dev packages into app directory.r  r  Nr4   )index.jszbootstrap.jszpublicpath.jszwebpack.config.jszwebpack.prod.config.jszwebpack.prod.minimize.config.js)z.yarnrc.ymlzyarn.js	templatesz
[Errno 22]z	[Errno 5]rl  r  Fr[  Tr\  r   r  r   *r5   )r;   r  linkedPackagesresolutionsbuilderdevDependenciesz@jupyterlab/buildernode_modulesz@jupyterlab)ignore_errorsw   indentz	yarn.lock).r   ru   rr   r   rB   r  r	  rc  rN  r   rE   r   r%   r(   rA  rC  loadr|   rz   makedirsshutilcopycopytreeErrorr   r  r`  re  rb  _update_localr  r  r   r   r  rs   rD  r   	read_textrg   rmtreedumpchmodstatS_IWRITES_IREAD)!rN   r   r  r  r  r   r   r   
source_dirr  fidrI  fnamer   r  r  
real_error
linked_dirr  removedr  r\  r   r  r  r  jlabr   
local_pathpkg_datar  	lock_pathlock_templates!                                    rQ   rv  z_AppHandler._populate_staging1  s   ,++ 	*SZ(( 	*K222333GT[))) 	Fi,\:9EG3 	0KIJJJ J!J.GGtY//J .11:h 	%h &3y~~& & & & & & & & & & & & & & &L!%%i44??---G$$$
 		: 		:E 7E**FKj%00&9999/ 	? 	?E7E**FKdIu55v>>>> ';//	:i   	,It{+++		OE*k::IFFFF| 	 	 	
 &SZZ7YKsSXzz<YJ I!6!6     	 7$566
:j!! 	-J,,,
J Y|,
9%78>>@@ 
	X 
	XKC*$$0022(();R@@I((000'<00EsFE:c?DVWWWW  	I,0,F,F,H,HDI() ,- 	T 	TIC'#455EsDNE4ARSSSS ))++L! 	&%DO 	 DL 	+ *D  	@U9j#~NNOO ; ; [T):):;;
:d4jj&:&:G&:&L&LMM'4///1;D(.3=D)*404...0:D'- U9i%@%@AAJ=GD"#$9:Xg~}iPPF !.99Lz,'' @l$???? .11(C   	+CIdC****	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ ';//	dI{;;z)$$ 	>Ky111HY <=====	> 	>s<   D22D69D66#I J,)9J''J,2WWWc                      j         }t           j        d                   } j        d         } j        d         } j        d         } j        d         }|d         } fd}	i |d<   |                                D ]:\  }
}|
|v r
||d         |
<   d	 j        d         |
         d
         z   |d         |
<   ;|                                D ]o\  }
}|
|v r
t	           j        dd          }t	          ||d                   } |	|          |d         |
<   |d         |d         |
<    |	|          |d         |
<   pi |d         d<                                    }|                                D ]\  }
}||
         }|r|st          ||
|d         |           * |	|d
                   |d         |
<   |d         }dD ]@}|                    |d          }|s|du rd}|||dz            |
<   ||d         d         |
<   A j        d         D ]~}||d         v r"|d         d         	                    |           n+||d         v r!|d         d         	                    |           ||d         v r|d         	                    |           |S )z3Get the template the for staging package.json file.rQ  r[  rl  r  r  r   c                 .   t          j        | t          j        t          j        t	          j        d                                        } d|                     t          j        d          z   } t          j	        dk    r| 
                                } | S )Nr   file:rX   nt)rr   relpathrs   realpathru   r   replacerz   sepr   lower)r   rN   s    rQ   format_pathz6_AppHandler._get_package_template.<locals>.format_path  sl    ;tS[eDLR[>\>\1]1]%^%^__DT\\"&#666Dw$zz||KrS   r  r,  r   r  r   filenamer  r\  extensionMetadatar  )r   mimeExtensionFTr4   sr  r  )
rB   r   r  r  ru   r   r  _log_single_compat_errorsr|   r   )rN   r  rB   rI  ri  r  r  r  r%  r3  r  r\  r  r   r|  r  r  	jlab_datar  s   `                  rQ   r  z!_AppHandler._get_package_template  s>   	+.//	,-,-Y|,
	/2L!	 	 	 	 	 "$ !;;== 	V 	VKCm##*0D!"3''.<1H1Mf1U'UD$$   	9 	9ICm##y2CDDDtJ/00D(3D(9(9D %*.x.D!"3''2{4'8'8D$$24\./ 2244$**,, 	I 	IJC"3'F  U-fc5;KVTTT(3E&M(B(BD %l+I6 	I 	ImmD%00 $;;C(+TCZ % @I\"#67<<	I I01 	/ 	/DtL)))\"<044T::::.///\"#3488>>>tN+++^$((...rS   c                     t                      5 }|                     ||          }t          ||d                   }t          j        |           cddd           S # 1 swxY w Y   dS )zwCheck if a local package has changed.

        `dname` is the directory name of existing package tar archives.
        r4  N)r   r  ru   rr   r   )rN   r   r\  r  rh  r  r   s          rQ   r  z_AppHandler._check_local	  s      !! 	*W((99D
 5$z"233Fz&)))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*s   AAA!$A!c           	         |d         }t          j        t          ||                    sd}t                      5 }|                     ||          }|d         |k    r|cddd           S t          j        |d         t          ||d                              ddd           n# 1 swxY w Y   |r"t          j        t          ||                     |d         |d<   t          |d         |d                   |d<   |d         S )z5Update a local dependency.  Return `True` if changed.r4  r4   Nr   tar_dir)	rr   r   ru   r   r  r  moverz   ra  )	rN   r   r\  r  rI  dtyperf  rh  r  s	            rQ   r  z_AppHandler._update_local  sx    
#z%x0011 	H!! 	FW((99D J8++	F 	F 	F 	F 	F 	F 	F 	F KVeE4
3C&D&DEEE	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F  	.IeE8,,---
+ZT)_d:.>??VJs   $B',/B''B+.B+c                 L   | j         }i }t          | j        d          }t          | j         d          }|                     | j        |          }t          |d          }||k    st	          j        |          s|S |                    |                     ||                     |S )z'Get the extensions for the application.r  )r   ru   rO  _get_extensions_in_dirrr   r   update)rN   rQ  r   r  sys_pathapp_paths         rQ   r  z_AppHandler._get_extensions0  s    ,
 |44|4400yII
 ,//xsz(';';$55gyIIJJJrS   c                    i }|| j         k    rdnd}t          t          |dd                    D ]}t          |          }|                    di           }|d         }|                    di           }	t          j        |          }
t          j        |          }|                    t                    r+|t          t                    t          d                    }nd	}t          |          }|                    d
d          |
t          j        |
          ||d         |r|nd	|	|t          j        |
          |d
||p|<   |S )z(Get the extensions in a given directory.r^  r_   r  *.tgzr  r   r   .tgzNdescriptionr4   r  )
rG  r   r4  urlr  r  r   r  r<  r]  )r   r   ru   rJ  r|   rr   rs   basenamer   
PIN_PREFIXr=  r   r  )rN   r  rQ  r  r]  r   rI  depsr   r%  r   r4  aliasrH  s                 rQ   r@  z"_AppHandler._get_extensions_in_dirD  sM   
!T\1155u5g>>?? 	 	F''D88NB//D<D88L"--D;v&&D|F++H"":..  ZCKK<!?@!$''C#xxr::L..	?05(?4" $;t,,$) )Ju}%% rS   c                 x   i }| j         d         }t                      }| j         d                                         D ]6\  }}|d         }t          |||          ||<   |                    |           7| j         d                                         D ]&\  }}||v r
|d         }t          |||          ||<   '|S )z%Get the extension compatibility info.rQ  r{  r  r  )r  setr  _validate_compatibilityrM   )rN   compatrQ  seenr   rI  rK  s          rQ   r  z!_AppHandler._get_extension_compatd  s    Ik*	uu)$:;AACC 	 	JD$'D24yIIF4LHHTNNNN)L17799 	J 	JJD$t||'D24yIIF4LLrS   c                 ,    |                      d          S )z%Get the locally installed extensions.r[  )_get_local_datar   s    rQ   r  z!_AppHandler._get_local_extensionst  s    ##$6777rS   c                 8   |                      d          }t          | j        dd          }|                                D ]\  }}|d|d||<   t	          j        |          s|S t          t          |d                    D ]}t	          j        |          }t          |          }|d         }||vr2| j	        
                    d|            t          j        |           c||         }t	          j        |          |d<   ||d	<   |d
         |d
<   ||d<   |S )zGet the linked packages.rl  r   r4   )r\  r4  r<  rE  r   z!Removing orphaned linked package r4  r   r  rI  )rS  ru   r   r  rr   r   r   rs   rJ  rB   rV  rz   ra  rI  )rN   r  r  r   r\  r   rI  r  s           rQ   r  z _AppHandler._get_linked_packagesx  s6   ##$566dlI/@AA JJLL 	N 	NLD&$*uMMDJJz%   	Kug..// 	  	 D;t$$D%%D<D4##$N$N$NOOO	$:D"|D11DDL"9oDODLLrS   c                 V    |                                  }|                    dg           S )z$Get the uninstalled core extensions.rY  )r`  r|   r   s     rQ   r  z,_AppHandler._get_uninstalled_core_extensions  s(    ((**zz7<<<rS   c                     g d}|D ]n}t          | j        |          }t          j        |          sC	 t	          j        |           A# t          $ r }|j        t          j        k    r Y d}~fd}~ww xY wodS )z-Ensure that the application directories exist)r  r  r   schemasthemesN)	ru   r   rr   r   rz   r  rU  errnoEEXIST)rN   dirsr  r   es        rQ   rc  z_AppHandler._ensure_app_dirs  s    III 	 	Eu--D:d## K%%%%   w%,.. /....	 	s   A
A2A--A2c           
      T   |                                   | j        }|| d         }|sdS || d         }i }|                    d| d|            t          |          D ]}||d         v r|d         |         }|d         }	|d	         |         }
|                     ||||
          }|d
         }|r!|                    d| d| d|	 |            n|                    d| d|	 |            |
r|	|
f||<   t          ||| j                   |                    d           dS )z$List the extensions of a given type._extensionsN_dirr  z dir: r{  r  r  r|  r  r}    vr4   )r  rB   r  r  _compose_extra_status_log_multiple_compat_errorsr   )rN   r  r  rB   r7  r  error_accumulatorr   rI  r  r  extrar  s                rQ   r  z_AppHandler._list_extensions  s   ""$$$---. 	F&&&'1(11%112225MM 	< 	<Dt2333%d+D9oG/*40F..tT4HHE $((>#? # AVtVV.BVVgVuVVWWWW?t??w???@@@ <+2F*;!$' 	$F,=t|LLL 	BrS   c           	         |                                   | j        }| j        }i }t                              | j        d          }|d                                         D ]}d||d         <   |                                D ]\  }}|s|                    |           |d         D ]}|d         |         }	|	d         |k    r|	d         }
|d         |         }|                     |||	|          }|		                    d          }|r%|d
                    |d	         |d
                   z  }|                    d| d|
 |            |r|
|f||<   |                    d           t          ||| j                   d S )NFr{  Text_dirr  r|  rs  z	 ({}, {})packageManagerpackageNamer}  ra  r4   )r  r  rB   r  r  r   valuesr  rb  r|   formatrc  r   )rN   r  rB   rd  ext_dirsr  rg  has_extsr   rI  r  r  re  rs  s                 rQ   r  z&_AppHandler._list_federated_extensions  s   ""$$$y==!8%@@0188:: 	. 	.E)-HU9%&&!)!1!1 	 	GX KK   34 @ @23D9	?g--y/o.t4224tVLL((9-- c[//8H0I7S`KabbbE?t??w???@@@ @/6.?%d+KKOOOO 	$F,=t|LLLLLrS   r   r  rI  returnc                 t   d}t          ||d                   r|dt           z  }n|dt           z  }|r|dt           z  }n|dt           z  }|d         r|dz  }t          ||d                   }|j        r|dz  }n7|j        r0d                    t          |j                            }|d	| d
z  }|S )Nr4   r  r`  r  r  r  u    🔒 (all plugins locked)rq  u    🔒 (plugins: z locked))
r  r   r   r   r   
_is_lockedentire_extension_lockedlocked_pluginsrg   r  )rN   r   r  rI  r  re  lock_statusplugin_lists           rQ   rb  z!_AppHandler._compose_extra_status  s    d:.// 	)''''EE((((E 	$[[[ EE^^^#E
 	SLE tH~66. 	>11EE' 	>))F;+E$F$FGGK=====ErS   c                     t          | j        dd          }t          j        |          si S t	          |          5 }t          j        |          cddd           S # 1 swxY w Y   dS )z*Get the build config data for the app dir.r  build_config.jsonN)ru   r   rr   r   rA  rC  r  )rN   r   r   s      rQ   r`  z_AppHandler._read_build_config  s    t|Z1DEEz&!! 	&If &y~~& & & & & & & & & & & & & & & & & &s   AA!$A!c                     |                                   t          | j        dd          }t          |d          5 }t	          j        ||d           ddd           dS # 1 swxY w Y   dS )z&Write the build config to the app dir.r  rv  r  r  r  N)rc  ru   r   rA  rC  r  )rN   r   r   r   s       rQ   rb  z_AppHandler._write_build_config  s    t|Z1DEE&# 	-#Ifc!,,,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s   A  A$'A$c                    |                                  }|                    |i           }g }|                                D ].\  }}t          j        |          s|                    |           /|D ]>}|                    dd          }d| d| d}| j                            |           ||= ?|r| 	                    |           |S )z5Get the local data for extensions or linked packages.rk   r`  z**Note: Removing dead z "r   )
r`  re  r  rr   r   re   r0  rB   rV  rb  )	rN   r\  r   rI  deadr   source_	link_typerP   s	            rQ   rS  z_AppHandler._get_local_data  s    ((**  ,,!ZZ\\ 	" 	"MD':g&& "D!!! 	 	DsC00I?9?????CK$$$T

 	-$$V,,,rS   c                    |                      |||          }|d         }d|dd         vo|d          }|d         }t          |          }|rcd                    |          }	d	| d
|	 }
|r5	 |                     |          }n-# t          $ r t          |
          dw xY wt          |
          |                    di           }t          ||| j                  }|r=t          |d         |d         |          }
|r	 |                     |          }n# t          $ r t          |
          dw xY w|r}|r{| j
                            d|            | j
                            d|            t                      5 }|                     | d| |          cddd           S # 1 swxY w Y   d                    |
                                dd                   }d                    |                     |          d|f          }
t          |
          t!          | j        d|d                   }t%          j        |          rt)          j        |           t-          j        |d         |           ||d<   |S )zBInstall an extension with validation and return the name and path.r   rI  r  r  NrZ  r   r[   r   z" is not a valid extension:
r  r  zIncompatible extension:
zFound compatible version:    r4   z

r  r4  r   )r  r  rg   r  r
   r?   r|   rO  rQ  _format_compatibility_errorsrB   rE   r   rd  
splitlines%_format_no_compatible_package_versionru   r   rr   r   rz   ra  r  r=  )rN   r   rh  r   r  rI  allow_fallbackr   r  all_messagesrP   r  rK  r  tempdir2	conflictsr   s                    rQ   rd  z_AppHandler._install_extension"  s   $$YS$AAF| IabbM1H$x.6HF| 't,, 		&99X..LLiLLlLLC &4"EEdKKGG 4 4 4$S//t34 !oo% xx++(D$.II 	".tF|T)_fUUC e4"EEdKKGG 4 4 4$S//t34  Vt VK%%&H$&H&HIIIK%%&L7&L&LMMM+-- V#66$7J7J7J7JHUUV V V V V V V V V V V V V V V V !IIcnn&6&6qrr&:;;	ggtII$OOQWYbcddS//! t|\4
3CDD:f 	IfDL&)))Vs*   /B B D D3F**F.1F.c                    t          j        |          ot          j        |          }|rAt          j        t          |d                    s|                     dt
          dg|           ||d}|                     t          d          d|g|          }|dk    rd	| d
}t          |          t          t          |d                    d         }t          |          |d<   |rIt          |          x|d<   }	|                    dd|	 d          }
t          j        ||
           |
|d<   n||d<   |rN|d         }t          t          j        |          t           | d          }t          j        ||           ||d<   t          j        |d                   |d<   |d         d         |d<   |d         d         |d<   |S )zCall `npm pack` for an extension.

        The pack command will download the package tar if `source` is
        a package name, or run `npm pack` locally if `source` is a
        directory.
        r  r   rs  rn  )r\  rZ  npmpackr   r   " is not a valid npm packagerE  rI  sharF  rU   r   r4  r   r  )rr   r   r  ru   ru  r)   r   r?   r   rJ  _tarsumr0  r  r=  r  rJ  rI  )rN   r\  rh  r   rZ  r  r   rP   r   r  r   old_pathnew_paths                rQ   r  z_AppHandler._extract_package]  s    F##9	&(9(9 	B#*U6>%B%BCC 	BIIvy)4&IAAA F33iiuvv6GiDD!88:f:::CS//!E'7++,,Q/#D))V 	  '-DK#\\&-c---88FKf%%%!DLLDL 	$F|HS[22z4L34L4L4LMMHK(+++#DL<V55ZF|F+Vv,y1YrS   c                 X   | j         d         }	 t          | j        || j                  }n# t          $ r Y dS w xY w|                    di           }d }t          |                                |d          D ]\  }}|                    di           }t          |||          }	|	sd|v r!| j        	                    d	| d
|            St                      5 }
|                     | d
| |
          }ddd           n# 1 swxY w Y   t          |d                   r dS |c S dS ).Get the latest compatible version of a packagerQ  Nversionsc                 0    t          | d         d          S Nr   T)prerelease_first_semver_key	key_values    rQ   sort_keyz@_AppHandler._latest_compatible_package_version.<locals>.sort_key  s    y|dCCCCrS   Tr  reverser  
deprecatedz@Disregarding compatible version of package as it is deprecated: r  rI  )r  _fetch_package_metadatar   rB   r
   r|   r  r  rO  rE   r   r  r  )rN   r   rQ  metadatar  r  r  rI  rK  r  rh  r  s               rQ   r  z._AppHandler._latest_compatible_package_version  s   Ik*		.t}dDKPPHH 	 	 	FF	<<
B//	D 	D 	D $HNN$4$4(DQQQ 	 	MGT88NB//D,T4CCF   4''K%%k[_kkbikk   ')) OW00D1D1D71D1DgNNDO O O O O O O O O O O O O O O&tF|44 FF	 	s   + 
99DD		D	c                    | j         d         }g }|D ]}	 t          | j        || j                  }n# t          $ r Y +w xY w|                    di           }d }t          |                                |d          D ]O\  }}	d|	v r
|	                    di           }
t          ||
|          }|s|	                    | d|             nPi }|s|S t                      5 }|                     t          d	          d
g||          }|dk    rd| d}t          |          |D ]}|d                             dd          |dd                             dd                              dd          z   dz   }t          t!          j        ||                    }	t%          |	          s|	d         ||	d         <   	 ddd           n# 1 swxY w Y   |S )zGet the latest compatible versions of several packages

        Like _latest_compatible_package_version, but optimized for
        retrieving the latest version for several packages in one go.
        rQ  r  c                 0    t          | d         d          S r  r  r  s    rQ   r  z@_AppHandler.latest_compatible_package_versions.<locals>.sort_key      "9Q<$GGGGrS   Tr  r  r  r  r  r  rn  r   r   r  r4   r  NrU   rX   rF  r  r   )r  r  r   rB   r
   r|   r  r  rO  re   r   ru  r   r?   r0  rJ  rr   rg   r  )rN   r7  rQ  keysr   r  r  r  r  rI  rK  r  rh  r   rP   r  r!  s                    rQ   r6  z._AppHandler.latest_compatible_package_versions  s{    Ik*	 	 	D24=$TT   ||J33HH H H "((8(8hPT!U!U!U 
 
4''xx330tYGG KK4 3 3' 3 3444E
  	O!! 	=W))U5\\69D9w)GGCaxx<$<<< oo% = =FNN3++c!""gooc3.G.G.O.OPSUX.Y.YY\bb  $CHWe$<$<==*400 =-1)_HT&\*=	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= s   1
>>#CGGGc                    | j         d         }d}d}	 t          | j        || j                  }|                    di           }d }t          t          |                                |d                    }|d         d                             d	i           }	|d
         }
|d         d         }|	                                D ]1\  }}||v r(t          |
|         |d          }|p|dk     }|p|dk    }2n# t          $ r Y nw xY w|rd| dS d| dg}|r|
                    d           d                    |          S )r  rQ  Fr  c                 0    t          | d         d          S r  r  r  s    rQ   r  zC_AppHandler._format_no_compatible_package_version.<locals>.sort_key  r  rS   Tr  r   r  r  r  r   singletonPackagesdrop_prerelease1The extension "z:" does not yet support the current version of JupyterLab.
zNo version of zJ could be found that is compatible with the current version of JupyterLab.)z9However, it seems to support a new version of JupyterLab.zConsider upgrading JupyterLab.r`  )r  r  r   rB   r|   r>   r  r  _compare_rangesr
   extendrg   )rN   r   rQ  lab_newer_than_latestlatest_newer_than_labr  r  r  storelatest_deps	core_deps
singletonsr  r  cpartss                   rQ   r  z1_AppHandler._format_no_compatible_package_version  s   Ik*	 % !&	K.t}dDKPPH  ||J33HH H H &!1!1xNNNOOE(1+//."==K!-0I"<01DEJ)//11 K K
U*$$ (	#PTUUUA,A,JQU),A,JQU)K  	 	 	D	. ! 	 d$ccc
1T 1 1 1
 ! 	LL   xxs   C7 7
DDc                     | j                                         rd}t          |          | j        |d<   | j         |d<   t	          |fi |}|                                S )z]Run the command using our logger and abort callback.

        Returns the exit code.
        zCommand was killedrB   rO   )rO   r@   r?   rB   r2   rl   )rN   rD   r   rP   rJ   s        rQ   ru  z_AppHandler._run  sf    
 ?!!## 	"&CS//!;x#|s--f--yy{{rS   r   )NNNFTTr   )r  T)r  F)NNNF)2rm   rn   ro   rR   r   r   r   r-  r+  r   r   r   r   r  r/  r1  r  r  rS  r&  r"  r  r  rR  r  rv  r  r  r  r  r@  r  r  r  r  rc  r  r  r   r  rb  r`  rb  rS  rd  r  r  r6  r  ru  rp   rS   rQ   r   r   s  sR         >, , , ,` 1$ 1$ 1$ 1$f  (E> E> E>NQ Q Q Qf5 5 5n	 	 	  , , ,: : :,  >! ! !F
, 
, 
, 
,) ) ) )V   24 4 4 4.S S S S    ," " "H. . .@K> K> K> K>ZI I I IV* * *     0  (  @   8 8 8  2= = =

 
 
" " "H!M !M !MF# T  RU    (& & &- - -  *9 9 9 9v% % % %N  B2 2 2h4 4 4l    rS   r   c                 :   t          d          }	 t          j        |dgt                    }|                     |                    d                     dS # t          $ r8 t                      j        }|d         d         }d| d}t          |          dw xY w)	z;Check for the existence of nodejs with the correct version.r   znode-version-check.jsrn  r5   engineszPlease install nodejs z\ before continuing. nodejs may be installed using conda or directly from the nodejs website.N)
r   rG   check_outputr(   rE   rF  	Exceptionr'   rP  r?   )rB   r   outputrI  verrP   s         rQ   r   r     s    ==D(($0G)HdSSSV]]7++,,,,, ( ( (||!9of% Is  I  I  Ioo4'	(s   AA ABc           	         i i d}	 t          d          }n'# t          $ r |                     d           |cY S w xY w	 t          j        |t
          ddgt          j        t                    }|                    d          }t          |
                                          }	 |D ]b}t          j        |          }|d         d	k    r@|d
         }t          j        t          |                    }	|	d         dk    r|	d
         ||<   cn# t          $ r Y nw xY w|                     d           n# t          j        $ rc}
|                     d                    |
j                            d          |
j                            d                               Y d}
~
n2d}
~
wt(          $ r"}
|                     d|
           Y d}
~
nd}
~
ww xY w|S )zGet the yarn configuration.

    Returns
    -------
    {"yarn config": dict, "npm config": dict}
    if unsuccessful, the subdictionaries are empty
    )r   z
npm configr   z9NodeJS was not found. Yarn user configuration is ignored.r   z--json)r8   r6   r5   typer  rI  inspectzYarn configuration loaded.z(Fail to get yarn configuration. {!s}{!s}Nz Fail to get yarn configuration. )r   r?   rE   rG   r  r)   rI   r(   rF  iterr  rC  rD  ra   StopIterationCalledProcessErrorr  rk  r8   r  r  )rB   configurationr   output_binaryr  linesliner  r  r  r\  s              rQ   r   r   +  s5    %'b99MV}}   PQQQ?"/9h1?
 
 

 %%g..V&&(())		 = =z$''<6))v,C"je55Gv)33-4V_c*=  	 	 	D	12222( 
 
 
6==((!(//'*B*B 	
 	
 	
 	
 	
 	
 	
 	

  ? ? ?===>>>>>>>>? sV    !;;A%D1 %A%D 
D1 
DD1 DD1 1G AFG+GGc                 .    | pt          j        d          S )zEnsure that we have a loggerr   r   rm  s    rQ   rA   rA   Y  s    4W&|444rS   c                 ~    t          j        |           } t          j        |           rt          j        |           } | S )z,Normalize a given extension if it is a path.)rr   
expanduserr   rs   )r   s    rQ   r_  r_  ^  s8    y))I
z) +K	**	rS   c                 >    fd}t          j        | |           dS )zRemove a tree, logging errorsc                  6                         d|            d S )NzError in shutil.rmtreeexc_info)rE   )r  rB   s    rQ   onerrorz_rmtree.<locals>.onerrori  s     -AAAAArS   )r  N)r  r  )r   rB   r  s    ` rQ   r	  r	  f  s>    B B B B B M$((((((rS   c                     	 t          j        |            dS # t          $ r, |                    dt	          j                               Y dS w xY w)zRemove a file, logging errorszError in os.unlinkr  N)rz   unlinkr  rE   r_   r  )r   rB   s     rQ   _unlinkr  o  s^    D
	$ D D D)CLNNCCCCCCDs    2AAc                    t          j        |           D ]t}t          j        | |          }t          j        |          st          j        |          rt          ||           Pt          j        |          rt          ||           udS )z3Remove all files/trees within a dir, logging errorsN)	rz   listdirrr   rg   isfileislinkr  r  r	  )r   rB   r4  	file_paths       rQ   r  r  w  s    Jt$$ ' 'HT8,,	:i   	'CJy$9$9 	'Iv&&&&Yy!! 	'Iv&&&' 'rS   c                   	 |                      dd          }|dgS t          |t                    sdgS |                     dd          }|                     dd          }|                     dd	          	|                     d
d	          g }|s|s|                    d           ||k    rd}|                    |           | d         }|                      dd          }|                    d          s|dz  }|du r|}n|r|                    d          s|dz  }|du r|}n|r|                    d          s|dz  }|r||vr|                    d| d           |r||vr|                    d| d           	r4t          	fd|D                       s|                    d	 d           r4t          fd|D                       s|                    d d           |S )z`Detect if a package is an extension using its metadata.

    Returns any problems it finds.
    r   NzNo `jupyterlab` keyz*The `jupyterlab` key must be a JSON objectr   Fr6  	themePathr4   	schemaDirz-No `extension` or `mimeExtension` key presentz?`mimeExtension` and `extension` must point to different modulesr?  mainr  z.jsTzMissing extension module "r   zMissing mimeExtension module "c              3   v   K   | ]3}|                     t          t                                        V  4d S r   r   r   r   )r  r>  
theme_paths     rQ   	<genexpr>z&_validate_extension.<locals>.<genexpr>  ?      QQaall3tJ/?/?+@+@AAQQQQQQrS   zthemePath is empty: "c              3   v   K   | ]3}|                     t          t                                        V  4d S r   r  )r  r>  
schema_dirs     rQ   r  z&_validate_extension.<locals>.<genexpr>  r  rS   zschemaDir is empty: ")r|   r<   r  re   r  any)
rI  r%  r   mime_extensionr  rP   filesr  r  r  s
           @@rQ   r  r    s   
 88L$''D|%&&dD!! ><==e,,IXXou55N+r**J+r**JH I^ IGHHHN""O-.E88FJ''D== D			 9--e44 U		   7 7 > >  % CYe++AYAAABBB L.55JJJJKKK ?#QQQQ5QQQQQ ?=
===>>> ?#QQQQ5QQQQQ ?=
===>>>OrS   c                    d}t          j        d          }t          j        | d          5 }|D ]}|                                s|                    |          5 }|rC|                    |          }|r,|                    |           |                    |          }|,ddd           n# 1 swxY w Y   	 ddd           n# 1 swxY w Y   |                                S )z6
    Compute the recursive sha sum of a tar file.
    i  sha1r:  N)	hashlibnewr@  rA  r  rB  rE  rA  	hexdigest)
input_file
chunk_sizehrH  memberr>  rI  s          rQ   r  r    sc    JFA	j#	&	& 	2# 	2 	2F==?? (( 2A 266*--D 2 vvj11  22 2 2 2 2 2 2 2 2 2 2 2 2 2 2	2	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 ;;==s6   /CAB-!C-B11C4B15CC
C
c                     t          | dd          }t          j        |          r=t          |          5 }t	          j        |          cddd           S # 1 swxY w Y   dS dS )z$Get the data for the app static dir.r   r  N)ru   rr   r   rA  rC  r  )r   r   r   s      rQ   r  r    s    7Hn55F
z& &\\ 	"S9S>>	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" ts   AAAc                     |d         }|d         d         }g }|                                 D ]C\  }}||v r:t          ||         |d          }|du r|                    |||         |f           D|S )z+Validate the compatibility of an extension.r  r   r  Tr  F)r  _test_overlapre   )	r   rK  rQ  r  r  r  r  r  overlaps	            rQ   rO  rO    s    -(I<()<=JFjjll < <
U* $IcNEDQQQG%sIcNE:;;;MrS   c                 <    t          | |||          }|dS |dk    S )zTest whether two version specs overlap.

    Returns `None` if we cannot determine compatibility,
    otherwise whether there is an overlap
    )r  drop_prerelease2Nr   r  )spec1spec2r  r  cmps        rQ   r  r    s8     u'7JZ  C {!8OrS   c                    t          | d          }t          |d          }|j        r|j        sdS d}t          j        |j        |j                  D ]\  }}|d         j        }	|d         j        }
|d         j        }|d         j        }|	j        r|r|	                    d          }	|j        r|r|                    d          }|d         j        }|d         j        }|	                    d          s|	                    d          r|	|
k    rt          nt          }||k    rt          nt          }|	|
k    rt          nt          }|	|
k    rt          nt          }d }|	|
k    r|	                    d	          r|}||k    r|	                    d	          r|}t          |	|d          r ||	|d          sR ||
|d          r ||
|d          s8t          ||	d          r |||
d          s |||	d          r |||
d          r dS t          ||
d          r|du rd
}n|dk    rd}t          |	|d          r|du rd}n|d
k    rd}d}t          |          |du rd}|S )zTest whether two version specs overlap.

    Returns `None` if we cannot determine compatibility,
    otherwise return 0 if there is an overlap, 1 if
    spec1 is lower/older than spec2, and -1 if spec1
    is higher/newer than spec2.
    TNFr   patch<c                     dS )NTrp   )xyzs      rQ   noopz_compare_ranges.<locals>.noop$	  s    4rS   >r  z(Unexpected case comparing version ranges)r*   ranger\   productrN  semver
prereleaseincoperatorr   r.   r-   r,   r+   AssertionError)r  r  r  r  r1r2return_valuer1setr2setx1x2y1y2o1o2lxlygxgyr  rP   s                        rQ   r  r    s
    
ud		B	ud		B 8 28  L ")"&"&99 >" >"u1X_2Y1X_2Y= 	!- 	!B= 	!- 	!B1X1X == 	s!3!3 	 "HHSS""HHSS""HHSS""HHSS"	 	 	 88c**8B88c**8B R	#%2b"d#3#3	2r4  	%'RB%5%5	 BD!!	 ')bR&6&6	 2r4  		 &(RB%5%5		 11r2t 	u$$ ###r2t 	u$$!""#8S!!!urS   c                     |pi }|                                 D ]=\  }}|du r
| |k    r dS t          j        |                              |            dS >dS )z%Test whether the package is disabled.FT)r  recompilematch)r   r  patternr  s       rQ   r  r  O	  ss    ~2H"..**  E>>7??44:g$$T**644 75rS   )frozenc                   @    e Zd ZU eed<   dZeee                  ed<   dS )
LockStatusrq  Nrr  )	rm   rn   ro   bool__annotations__rr  r	   	frozensetr   rp   rS   rQ   r  r  ]	  s7         !!!!/3NHYs^,33333rS   r  rn  c                 "   |pi }t                      }|                                D ]X\  }}|du r
| |k    rt          d          c S |                    d          d         }| |k    r|                    |           Yt          d|          S )zjTest whether the package is locked.

    If only a subset of extension plugins is locked return them.
    FT)rq  r  r   )rq  rr  )rN  r  r  r  rM   )r   r  rr  lockr  extension_parts         rQ   rp  rp  d	  s    
 \rFUUN||~~ % %eE>>4<<d;;;;;;,,Q/>!!t$$$eNSSSSrS   c                 L   g }d}d}|D ]}|\  }}}	t          t          |d                    }t          t          |	d                    }	|                    |||	f           t          |t	          |          dz             }t          |t	          |          dz             }d|  d| d}
|
dz  }
|
d                    |          z  }
|
d	                    |          z  }
|
d
z  }
|D ]:\  }}}	|
|                    |          |	                    |          z   |z   dz   z  }
;|
S )z*Format a message for compatibility errors.
   Tr  z
"r  z/" is not compatible with the current JupyterLabz
Conflicting Dependencies:

JupyterLab	ExtensionzPackage
r[   )r   r*   re   maxr=  ljust)r   r  r  r   l0l1r  r  r%  r  rP   s              rQ   r~  r~  x	  sL   D	B	B $ $T35t$$%%%T""##S$$%%%SXX\""SYY]##
O
O
Ow
O
O
OC**C<b!!!C;R   C;C ; ;T3tzz"~~		"-3d::JrS   r   c                    g }|                                 D ]2\  }\  }}t          |          }|dk    r|                    |           3|r4|                     d                    dg|d|sdndz                        |                                 D ]8\  }\  }}||v r|st          |||          }	|                     |	 d           9dS )	z8Log compatibility errors for multiple extensions at oncer   z	
        z
   The following extensions may be outdated or specify dependencies that are incompatible with the current version of jupyterlab:zK
   If you are a user, check if an update is available for these packages.
zJ   If you are a developer, re-run with `--verbose` flag for more details.
z   See below for the details.
r[   N)r  _compat_error_agere   rV  rg   r~  )
rB   
errors_mapr   outdatedr   rk   r  ager  rP   s
             rQ   rc  rc  	  s-    H'--// " "kq&''77OOD!!! 
 Z		 d  '?ee>		 	
 	
 	
" $.#3#3#5#5 # #w8G*4&AA#zzz""""	# #rS   c                     t          |          }|dk    r|                     d| d           dS t          |||          }|                     | d           dS )z/Log compatibility errors for a single extensionr   r  z" is outdated.
r[   N)r+  rV  r~  )rB   r   r  r  r.  rP   s         rQ   r8  r8  	  sm     F
#
#C
Qww????@@@@@*4&AA#zzz"""""rS   c                 |    d}d}| D ](\  }}}t          ||d          }|p|dk     }|p|dk    })|r|sdS |r|sdS dS )zCompare all incompatibilities for an extension.

    Returns a number > 0 if all extensions are older than that supported by lab.
    Returns a number < 0 if all extensions are newer than that supported by lab.
    Returns 0 otherwise (i.e. a mix).
    FTr  r   r  r  r  )r  	any_older	any_newerrk   r%  r  r  s          rQ   r+  r+  	  s     II ' '4 C===&Q	&Q		  q	 9 r1rS   c                 h    | d         }t          |d                   t          |d                   z   S )zGet the core extensions.r   r  r  )r=   )rQ  rI  s     rQ   r   r   	  s2    \"D\"##d40@+A&B&BBBrS   c              #   V   K   | D ]#}t          |t                    rd|fV  |fV  $dS )az  Sort key for prereleases.

    Precedence for two pre-release versions with the same
    major, minor, and patch version MUST be determined by
    comparing each dot separated identifier from left to
    right until a difference is found as follows:
    identifiers consisting of only digits are compare
    numerically and identifiers with letters or hyphens
    are compared lexically in ASCII sort order. Numeric
    identifiers always have lower precedence than non-
    numeric identifiers. A larger set of pre-release
    fields has a higher precedence than a smaller set,
    if all of the preceding identifiers are equal.
    r4   N)r<   int)r  entrys     rQ   _semver_prerelease_keyr7  	  sU         eS!! 	u+ (NNNN rS   c                     t          | d          }|r|j        rdndnd}g ||j        |j        |j        R }|s|j        rg |dR nd}|j        r$|t          t          |j                            z   }|S )a  A sort key-function for sorting semver version string.

    The default sorting order is ascending (0.x -> 1.x -> 2.x).

    If `prerelease_first`, pre-releases will come before
    ALL other semver keys (not just those with same version).
    I.e (1.0-pre, 2.0-pre -> 0.x -> 1.x -> 2.x).

    Otherwise it will sort in the standard way that it simply
    comes before any release with shared version string
    (0.x -> 1.0-pre -> 1.x -> 2.0-pre -> 2.x).
    T)r   )r  rp   r   )r/   r  majorminorr  r>   r7  )r  r  vr  s       rQ   r  r  	  s     	GT""A.>
F1<)44TTBC
+C
+
+!'
+17
+
+C 2<1iiQiiiT| @E0>>???JrS   c           	      Z   t          t          | t          |d                    ddi          }	 |                    d|j                    n:# t
          $ r- |                    d|                                            Y nw xY w	 t          j        t          |                    5 }t          j        |                                                    d                    cddd           S # 1 swxY w Y   dS # t          $ r!}|                    d	|d
|            d}~ww xY w)z6Fetch the metadata for a package from the npm registryr  )safeAcceptzHapplication/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*)headerszFetching URL: r5   Nz%Failed to fetch package metadata for r~  )r   r   r   rE   full_urlAttributeErrorget_full_url
contextlibclosingr   rC  rD  rE  rF  r
   rV  )r   r   rB   reqresponseexcs         rQ   r  r  
  s   
%3///00a
  C<4cl445555 < < <:c&6&6&8&8::;;;;;<-- 	?:hmmoo44W==>>	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	?   PtPPPPQQQsM   A 4BB!C? ,9C2%C? 2C66C? 9C6:C? ?
D*	D%%D*__main__r   r   )NNF)NFNN)NNNNFNTT)Nr  )FN)FFr  )r   rC  rY  r  r\   rC  r   rz   os.pathr   rr   r  r  r   r  rG   r_   r@  r  r   dataclassesr   r   pathlibr   tempfiler   	threadingr   typingr	   urllib.errorr
   urllib.requestr   r   r   r   jupyter_core.pathsr   (jupyter_server.extension.serverextensionr   r   r   r   jupyterlab_server.configr   r   r   r   r   r   jupyterlab_server.processr   r   r   r   packaging.versionr   	traitletsr   r    r!   r"   r#   r$   jupyterlab._versionr%   jupyterlab.coreconfigr'   jupyterlab.jlpmappr(   r)   jupyterlab.semverr*   r+   r,   r-   r.   r/   r  r   rs   rg   r   r   rJ  r   r2   ru   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r  r  r   r"  r'  r)  r+  r-  r/  r1  r4  r8  rJ  r   r   r   rA   r_  r	  r  r  r  r  r  rO  r  r  r  r  rp  r~  r  rc  r8  r+  r   r7  r  r  rm   rp   rS   rQ   <module>r[     s                   				       				        



        ! ! ! ! ! !             ' ' ' ' ' '             ! ! ! ! ! ! ; ; ; ; ; ; ; ; ; ; ; ; 1 1 1 1 1 1 a a a a a a a a a a a a                P O O O O O O O O O O O % % % % % % G G G G G G G G G G G G G G G G + + + + + + , , , , , , . . . . . . . . B B B B B B B B B B B B B B B B FGG CKt,,--	 #(9j
)
) 
 7 >  >  >  >  > g >  >  > B( ( (
% % %' ' '( ( (@   <   (   
 
 
 
      4% % % %6?= ?= ?= ?= ?= ?= ?= ?=D% % %+ + + +*
9 
9 
9 
9
- 
- 
- 
-* * * *a a a aF 
   0   C C C CB B B B9 9 9 9G G G GH H H H! ! ! !% % % %& & & &+ + + +# # # #= = = =  h h h h h h h hV-
( 
( 
(+ + +\5 5 5 5
  ) ) )D D D' ' '2 2 2j  *    &   V V V Vr    $4 4 4 4 4 4 4 4T TZ T T T T(  2 #T  #  #  #  #F# # #  4C C C  0   2  ( zIdOOOOO rS   