
    [eO                    *   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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+m,Z,m-Z-m.Z. ddl/m0Z0m1Z1m2Z2m3Z3 ddl4m5Z5 ddl6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z< ddl=m>Z> ddl?m@Z@ ddlAmBZBmCZC ddlDmEZEmFZFmGZGmHZHmIZImJZJ  ejK        d          ZL e
jM         e
jN        eBd                    ZO e
jN        eOd          ZPdZQdZR G d de0          ZSd ZTd ZUd ZVd ZWdVdZXdVd ZYdVd!ZZdVd"Z[d# Z\dVd$Z]dVd%Z^ G d& d'e8          Z_d( Z`dVd)ZadWd*ZbdXd,ZcdYd-ZddVd.Ze	 	 	 	 	 	 	 	 dZd0ZfdVd1Zgd[d3Zhd[d4Zid\d5ZjdVd6ZkdVd7ZldVd8ZmdVd9ZndVd:ZodVd;Zpd< Zq G d= d>          Zrd? Zsd@ ZtdVdAZudB ZvdC ZwdD ZxdE ZydF ZzdG Z{dH Z|dI Z}d]dJZ~d]dKZdVdLZdM ZdN ZdO ZdP ZdQ ZdR Zd^dSZdT ZedUk    r e^eB           dS dS )_zJupyterLab command handler    N)deepcopy)glob)Path)TemporaryDirectory)Event)URLError)Requestquoteurljoinurlopen)jupyter_config_dir)GREEN_ENABLEDGREEN_OKRED_DISABLEDRED_X)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)selfrA   r?   r3   
kill_eventr4   msgs          3lib/python3.11/site-packages/jupyterlab/commands.py__init__zProgressProcess.__init__C   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
)rG   rH   	itertoolscyclepollsysr6   writenextflushr=   	terminater<   communicateappendrD   TimeoutExpiredr?   rB   join)rK   cacherG   rL   spinnerrM   out_s           rN   waitzProgressProcess.waitl   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__rO   ri    rP   rN   r/   r/   B   s8        '! '! '! '!R         rP   r/   c                  B    t          j        t          j        |            S )z!Join paths to create a real path.)ospabspathrd   )argss    rN   pjoinrr      s    ;sx'''rP   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getrr   r   ro   rp   )settings_dirs    rN   get_user_settings_dirr{      sC    :>>";<<LV5);)=)=uo#V#VL;|$$$rP   c                      t           j                            d          } | pt          t	                      dd          } t          j        |           S )z3Get the configured JupyterLab workspaces directory.JUPYTERLAB_WORKSPACES_DIRru   
workspacesrv   )workspaces_dirs    rN   get_workspaces_dirr      sC    Z^^$?@@N#Wu-?-A-A5,'W'WN;~&&&rP   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jupyterru   getuserbase	USER_BASENz/usrz/usr/local/share/jupyter/lab)rw   rx   ry   strr   resolverr   r\   prefixhasattrsiter   getattrr%   
startswithro   exists)app_diruserbases     rN   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}}$$&&'''rP   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r3   r?   r   N)r/   r&   ri   )pathr?   	had_dupes	yarn_procs       rN   dedupe_yarnr      s     	( 	
 	
 	
 $&&	 "  #VY$7T&QQQ	 rP   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   )r>   r/   r&   ri   r   	REPO_ROOT)r3   r?   r   rets       rN   ensure_node_modulesr      s    
 F##F	M+>?SQW  I ..

C axx#VY$7SPPP	Iv&&&!8OrP   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)
r>   rr   DEV_DIRr   r   ro   r   r/   r&   ri   )r?   targetr   s      rN   
ensure_devr      s    F##F7H%%F 9f-- SZ5G5G #VY$@iX^___	 rP   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)	rr   r%   r>   ro   r   r   r/   r&   ri   )r?   r   r   r   s       rN   ensure_corer      s    D)$$GF##F 4<00F:f GV,,,#VY$@gV\]]]	 rP   c                 ^    t          j        t          | dd                    rdS d| z  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 "%s"z?Please run `jupyter lab build` or use a different app directory)ro   r   rr   )r   msgss     rN   
ensure_appr      sB    
 z%<8899  	:GCID KrP   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r3   r?   startup_regex)r>   r   r   ro   rp   rd   r   r&   )r?   ts_dirts_regexts_procs       rN   watch_packagesr     sw     F##F	6***[)ZGGHHF BH	E7+V^  G 9rP   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   )r>   r   r   r&   r   WEBPACK_EXPECT)r?   package_procswp_procs      rN   	watch_devr   )  s[     F##F"6**M 	E7+$	  G %]$G$$rP   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 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_configr?   r   rm   )popsuperrO   )rK   r?   r   kwargs	__class__s       rN   rO   zAppOptions.__init__G  so    "$/F=!%F8 vi'8JJy!!!""6"""""rP   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 datarm   zEvent for aborting call)rq   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.r?   c                 *    t          j        d          S )N
jupyterlablogging	getLoggerrK   s    rN   _default_loggerzAppOptions._default_loggerp  s     ...rP   r   c                     t                      S N)r   r   s    rN   _default_app_dirzAppOptions._default_app_dirv  s    }}rP   r   c                     t                      S r   r#   r   s    rN   _default_core_configzAppOptions._default_core_configz  s    ||rP   registryc                 l    t          | j                  d         }|                    dt                    S )Nyarn configr   )_yarn_configr?   ry   YARN_DEFAULT_REGISTRYrK   configs     rN   _default_registryzAppOptions._default_registry~  s+    dk**=9zz*&;<<<rP   NN)rj   rk   rl   __doc__rO   r    r   r   use_sys_dirr   r   Loggerr?   r$   r   r   rL   r   labextensions_pathr   splice_sourceskip_full_build_checkr!   r   r   r   r   __classcell__)r   s   @rN   r   r   D  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   WX/ / /
 WY   W]   WZ= = = = = = =rP   r   c                 r    | t                      S t          | j        t                     r| S t          di | S )z-Helper to use deprecated kwargs for AppOptionNrm   )r   
issubclassr   )optionss    rN   _ensure_optionsr     s?    ||	G%z	2	2 %$$G$$$rP   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_checkr?   _AppHandlerr   r   r   )app_optionshandlerr   s      rN   r   r     s`     "+..K"###+&&G:E:S[N;#5666Y[M7==??**rP   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   r?   r   install_extension)	extensionr   r   r   s       rN   r   r     sH     "+..K"###+&&G$$YC$888rP   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   r?   r   uninstall_all_extensionsuninstall_extension)namer   all_r   s       rN   r   r     s^    
 "+..K"###+&&Gt||//111&&t,,,rP   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   r?   r   update_all_extensionsupdate_extension)r   r   r   r   r   s        rN   r   r     s^     "+..K"###+&&Gt||,,...##D)))rP   c                     t                       j        } j        }|                    d|           |t	          t
          d          k    rd}t          |          |t	          t
          d          k    rd}t          |          t           dd          r'|                    d|           t          ||           nxg d	} fd
|D             }|D ]c}t	          ||          }t          j
        |          r'|                    d|           t          ||           M|                    d|           d|                    d           t           dd          st           dd          r|                    d           dS dS )z+Clean the JupyterLab application directory.zCleaning %s...devzCannot clean the dev appcorezCannot clean the core appallFzRemoving everything in %s...)
extensionssettingsr   r   c                 4    g | ]}t          |          |S rm   )r   ).0tr   s     rN   
<listcomp>zclean.<locals>.<listcomp>  s(    JJJ'+q2I2IJ1JJJrP   zRemoving %s...z%s not present, skipping...zSuccess!r   zIAll of your extensions have been removed, and will need to be reinstalledN)r   r?   r   inforr   r%   r<   r   _rmtree_starro   r   _rmtree)r   r?   r   rM   possible_targetstargetsr   r   s   `       rN   cleanr    s   !+..KF!G
KK '***%e$$$$(oo%f%%%%)oo{E5)) A2G<<<Wf%%%%JJJJJJJ.JJJ 	A 	AD7D))Fz&!! A,d333''''94@@@@
KK
{E5)) aW[,PU-V-V a_`````a arP   Tc                     t          |          }t          |j                   t          |          }|                    | |||||          S )z!Build the JupyterLab application.)r   version
static_url
productionminimizeclean_staging)r   r   r?   r   r   )	r   r  r	  rL   r  r   r
  r  r   s	            rN   r   r     s\     "+..K"###+&&G==#    rP   c                 V    t          |           }|                                 |j        S )z.Get a dictionary of information about the app.)r   _ensure_disabled_infor  r   r   s     rN   get_app_infor    s)    +&&G!!###<rP   
sys_prefixc                 P    t          |          }|                    | d|          S )zgEnable a JupyterLab extension.

    Returns `True` if a rebuild is recommended, `False` otherwise.
    Flevelr   toggle_extensionr   r   r  r   s       rN   enable_extensionr    s,    
 +&&G##IuE#BBBrP   c                 P    t          |          }|                    | d|          S )zfDisable a JupyterLab package.

    Returns `True` if a rebuild is recommended, `False` otherwise.
    Tr  r  r  s       rN   disable_extensionr    s,    
 +&&G##It5#AAArP   c                 L    t          |          }|                    | |          S )z7Check if a JupyterLab extension is enabled or disabled.)r   check_extension)r   	installedr   r   s       rN   r  r    s%    +&&G""9i888rP   c                     t          |           } t          | j                   t          |           }|                                S )zSDetermine whether JupyterLab should be built.

    Returns a list of messages.
    )r   r   r?   r   build_checkr  s     rN   r  r  $  sA    
 "+..K"###+&&G   rP   c                 H    t          |           }|                                S )zList the extensions.)r   list_extensionsr  s     rN   r!  r!  /  s!    +&&G""$$$rP   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      rN   r#  r#  5  s%    
 +&&G%%%rP   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      rN   r%  r%  >  s%    
 +&&G!!'***rP   c                 :    t          |           }|j        d         S )zGet the application version.r  )r   r  r  s     rN   get_app_versionr(  G  s    +&&G<	""rP   c                 J    t          |          }|                    |           S )z8Get the latest compatible version of a list of packages.)r   "latest_compatible_package_versions)namesr   r   s      rN   &get_latest_compatible_package_versionsr,  M  s#    +&&G55e<<<rP   c                 6   t          j        | d          }|                    d          }t          j        |                                                    d                    }d |                                D             |d<   |                                 |S )z0Read the package data in a given target tarball.rzpackage/package.jsonutf8c                 F    g | ]}|j         t          d           d         S )zpackage/N)r   len)r   fs     rN   r   z read_package.<locals>.<listcomp>X  s+    )^)^)^!&Z1B1B*C)^)^)^rP   jupyterlab_extracted_files)	tarfileopenextractfilejsonloadsreaddecode
getmembersclose)r   tarr2  datas       rN   read_packager?  S  s}    
,vs
#
#C.//A:affhhoof--..D)^)^S^^M]M])^)^)^D	%&IIKKKKrP   c                   "   e Zd Zd Zd.dZ	 	 	 	 	 	 d/dZd Zd Zd0d	Zd
 Z	d Z
d Zd Zd Zd Zd Zd1dZd2dZd Zd Zd Zd Zd3dZd2dZ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& Z$d' Z%d0d(Z&d0d)Z'd* Z(d+ Z)d, Z*d- Z+dS )4r   c                 r   t          |          }|| _        |j        | _        |j        rt	                      n| j        | _        |j        | _        t          |j        j	                  | _
        |j        | _        |j        | _        |j        | _        |j        | _        |                                 | _        dS )zCreate a new _AppHandler objectN)r   _optionsr   r   r   sys_dirr?   r   r   _data	core_datar   rL   r   r   _get_app_infor  )rK   r   s     rN   rO   z_AppHandler.__init__c  s    !'**(/(;M{}}}n!'"5";<<")"<!,(%,%B" &&((			rP   Nc                 8   t          |          }| j        d         }|| j        d         v r~|                                 }|                    dg           }||v rN| j                            d|z             |                    |           ||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 %sTFr   Nr   is_dirlocal_extensionssourcer   locationapp)_normalize_pathr  _read_build_configry   r?   remove_write_build_config_ensure_app_dirsr   _install_extension
setdefaultrw   )rK   r   existingr   r   r   uninstalledtempdirr  r   localothers               rN   r   z_AppHandler.install_extensiont  s    $I..	Y|,
 	"3444,,..F **%BBGGKK''  !?)!KLLL""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_packagesrK  Fr?   r   zbuild:packagesr3   r
  development	minimizedznot minimizedzBuilding jupyterlab assets (z, ))r   r  r	  r  r   installr   z"npm dependencies failed to installzbuild:prodr   z	:minimizer1   r   zJupyterLab failed to build)r  rB  r   r   r   r?   _runr&   rb   rd   r   _populate_stagingrr   rB   RuntimeErrorr   )rK   r   r  r	  r  r
  r  r  r   r   r   rM   commands                rN   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### 8rP   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   rb  r^  r   r   )r3   r   r?   )	rr   r   re  rd  r&   r   r?   r   r   )rK   r   rG   s      rN   r   z_AppHandler.watch  s     i00    			69i0g	>>>GT[)))Yw/dlI..(;	
 
 
 vrP   c                 ^   |                                   | j        | j        }                    d|d         z             |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|	z             $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.zJupyterLab v%sr  federated_extensionsr   compat_errorsz+Other labextensions (built into JupyterLab)rN  r\   rK  z
   local extensions:        : r\  z
   linked packages:rL  uninstalled_corez
Uninstalled core extensions:c                 @    g | ]}                     d |z            S     %sr  r   itemr?   s     rN   r   z/_AppHandler.list_extensions.<locals>.<listcomp>  s)    OOOdV[[D))OOOrP   rH  c                 N    g | ]!}|                     d           d         v |"S ):r   )	partition)r   iall_extss     rN   r   z/_AppHandler.list_extensions.<locals>.<listcomp>  s4    SSS!1;;s3C3CA3F(3R3RA3R3R3RrP   disabledz
Disabled extensions:z (all plugins)rq  shadowed_extsTzO
The following source extensions are overshadowed by older prebuilt extensions:c                 @    g | ]}                     d |z            S rp  rr  )r   r   r?   s     rN   r   z/_AppHandler.list_extensions.<locals>.<listcomp>)  s)    PPPdV[[D))PPPrP   )fastz3
Build recommended, please run `jupyter lab build`:c                 @    g | ]}                     d |z            S rp  rr  rs  s     rN   r   z/_AppHandler.list_extensions.<locals>.<listcomp>.  s)    ???dV[[D))???rP   N)r  r?   r  _get_extension_compat_list_federated_extensions_list_extensionssortedr:   r)   rb   r  )rK   r  rY  r   r\  keyrL  rn  rz  rt  improper_shadowedext_namesource_versionprebuilt_versionmessagesry  r?   s                  @@rN   r!  z_AppHandler.list_extensions  s   ""$$$y$tI677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 	PKK8999OOOOf=M6N6NOOOO ,-..4%&&'4)*++, 	 TSSStJ/SSS 	-KK0111x(( - -8##,,DHtO,,,, 	/2 	3 	3H!Y|4X>yIN#y)?@J9U'>> 3!((222 	QKKb   QPPPf=N6O6OPPPP###.. 	@KKNOOO????h??????	@ 	@rP   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          s2|d
         }t          |
          t          |          k    r
d}||
|fz  gS | j        d         }| 	                    |          }|d         }|                    d	i           }dD ]f}||         D ])}||v r|||         vr|
                    d|z             *||         D ])}||v r|||         vr|
                    d|z             *gt          t          d          }|                                D ]r\  }}|	                    |d                              |          r/||	vr4||v s||v r=|	|         |k    r)d}|
                    |||	|         ||         fz             s|                                D ]K\  }}|s||v rt          |d          }|                     |||          r|
                    d|z             L|                                D ]R\  }}|s||v rt          |dd          }|                     ||d         |          r|
                    d|z             S|S )z[Determine whether JupyterLab should be built.

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

        Returns `True` if a rebuild is recommended, `False` otherwise.
        rj  rb  uninstallInstructionsNz.JupyterLab cannot uninstall this extension. %szJupyterLab cannot uninstall %s since it was installed outside of JupyterLab. Use the same method used to install this extension to uninstall this extension.FrH  rI  zUninstalling core extension %sTrK  r   r   zUninstalling z from $No labextension named "%s" installed)r  r?   ry   errorrP  rb   rR  r  ro   dirnamerw   rQ  rU  warning)rK   r   r  r?   r   rW  rY  extnamer>  r   rM   s              rN   r   z_AppHandler.uninstall_extension  sP   
 y4.///+,T2Y##,d33
 D1248CD[\]   
  s   5 4)***,,..F **%BBGGK;&&<tCDDD""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  	=DEEEurP   c                     d}| j         d                                         D ]\  }}|                     |          }|p|}|S )ziUninstalls all extensions

        Returns `True` if a rebuild is recommended, `False` otherwise
        Fr   )r  r  r   )rK   should_rebuildr  rh   rW  s        rN   r   z$_AppHandler.uninstall_all_extensions  sT    
 )L17799 	; 	;JGQ227;;K+:{NNrP   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   rK  )r  r  _update_extension)rK   r  r  rh   updateds        rN   r   z!_AppHandler.update_all_extensions  sj    
 )L17799 	7 	7JGQ$)$6777,,W55G+6wNNrP   c                     || j         d         vr| j                            d|z             dS |                     |          S )mUpdate an extension by name.

        Returns `True` if a rebuild is recommended, `False` otherwise.
        r   r  F)r  r?   r  r  )rK   r   s     rN   r   z_AppHandler.update_extension  sK    
 ty...K F MNNN5%%d+++rP   c                    | j         d         |         }|d         r| j                            d|z             dS 	 |                     |          }n# t          $ r Y dS w xY w| | j                            d| d           dS ||d         k    r| j                             d	|z             dS | j                             d
| d|            |                     | d|           S )r  r   alias_package_sourcez(Skipping updating pinned extension '%s'.FNz No compatible version found for !r  zExtension %r already up to datez	Updating z to version @)r  r?   r  "_latest_compatible_package_versionr   r   )rK   r   r>  latests       rN   r  z_AppHandler._update_extension  s%   
 y&t,&' 	K JT QRRR5	<<TBBFF 	 	 	55	>K J4 J J JKKK5T)_$$K>EFFF5?T??v??@@@%%&8&8&8&8999s   A 
A A c                 `    t          |          }t          j        |          rt          j        |          sd}t	          ||z            t                      5 }                     ||          }ddd           n# 1 swxY w Y   t          |d                   }|s                     |          S  j	        
                    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 "%s" only link local directoriesNr>  zNInstalling %s as a linked package because it does not have extension metadata:c                 J    g | ]}j                             d |z             S )z   %s)r?   r  )r   mrK   s     rN   r   z,_AppHandler.link_package.<locals>.<listcomp>	  s-    <<<a		Wq[	)	)<<<rP   r\  rL  r   T)rO  ro   r   isdirr<   r   _extract_package_validate_extensionr   r?   r  rP  rU  rR  )rK   r   rM   rX  r  r  r   r  s   `       rN   r#  z_AppHandler.link_package  s~   
 t$$z$ 	)sy 	)CCS4Z(((!! 	8W((w77D	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 'tF|44 	0))$/// 	\^b	
 	
 	
 	=<<<8<<<< ((**""#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t          d|z            |                     |           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.
        r\  NrK  r   r   zNo linked package for %sT)	rO  rP  rU  r  r  rw   rQ  r<   rR  )rK   r   r   r  foundr   rL  rY  s           rN   r%  z_AppHandler.unlink_package  s,    t$$((**""#4b99"LLNN 	 	LD&f~%% 
	 u%%&8"==E % ! !fD&>)) E  %Ly.u5f=	$ 	@7$>???  (((trP   r  c                 "   t          j        | j        d          }t          || j        |          }|                    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   )app_settings_dirr?   r  disabledExtensionsFTr  )ro   rd   r   r   r?   ry   r   )	rK   r   valuer  r  page_configrz  did_somethingis_disableds	            rN   r  z_AppHandler.toggle_extension5  s    
 8DL*==,-dk
 
 
 ??#7<<ll9e44 	! 	!"&HY MM 	!; 	!"'HY M 	808K,-k7777rP   c                    |                                   | j        }||d         v r|                     |||          S ||d         v r&| j                            | dt                      dS |                     |||          S )z/Check if a lab extension is enabled or disabledrH  r\  rv  T)r  r  _check_core_extensionr?   r   _check_common_extension)rK   r   check_installed_onlyr  s       rN   r  z_AppHandler.check_extensionO  s    ""$$$y.///--i?STTT.///K	;;M;;<<<4++It=QRRRrP   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 disabledrn  rv  Frm  Tdisabled_core)r?   r  r   r   r   r   )rK   r   r  r  s       rN   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trP   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   rv  Fz (compatibility errors)rm  Trz  )r?   r  r   r  r   _is_disabledr   r   )rK   r   r  r  errorss        rN   r  z#_AppHandler._check_common_extensionk  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trP   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.rE  r   rK  r\  app_extensionssys_extensionsis_localrM  rN  rn  r  r   r  	staticUrlr1   rC  r   rH  rj  c                 (    g | ]}|d          v |S )rj  rm   )r   r  r  s     rN   r   z-_AppHandler._get_app_info.<locals>.<listcomp>  s0     !
 !
 !
=S8T1T1TC1T1T1TrP   r{  )rE  _get_extensions_get_local_extensions_get_linked_packagesr  rb    _get_uninstalled_core_extensions_get_static_datar   ry   rC  _get_core_extensionsr   r   )	rK   rE  r   rN  r\   r   r>  app_datar  s	           @rN   rF  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#$!
 !
 !
 !
-!
 !
 !
_ rP   c                 j   | j         }d|v rd S | j        }t          j        | j        d          }t          ||| j                  }|                    di           }t          |t                    rd |D             }||d<   g }|d         D ]!}||d         v r|
                    |           "||d<   d S )Nrz  r   )r  r?   r  c                     i | ]}|d S )Trm   )r   r   s     rN   
<dictcomp>z5_AppHandler._ensure_disabled_info.<locals>.<dictcomp>  s    BBBI	4BBBrP   rH  r  )r  r   ro   rd   r   r   r?   ry   r9   r:   rb   )rK   r  r   r  r  rz  r  r  s           rN   r  z!_AppHandler._ensure_disabled_info  s    yF!48DL*==%1A$+
 
 
 ??#7<< h%% 	CBBBBBH#Z)* 	* 	*Cd:&&&$$S))) -_rP   c                    | j         }t          |d          }|rDt          j        |          r0| 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   zCleaning %srE  r   r  z)Splicing dev packages into app directory.r  r  Nr1   )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]r\  r   FrK  TrL  r   r  r   *r2   )r8   r  linkedPackagesresolutionsbuilderdevDependenciesz@jupyterlab/buildernode_modulesz@jupyterlab)ignore_errorsw   indentz	yarn.lock).r   rr   ro   r   r?   r  r  rS  rB  r   rB   r   r"   r%   r5  r7  loadry   rw   makedirsshutilcopycopytreeErrorr   r  rP  rU  rR  _update_localr  r  r   r   r  rp   r8  r   	read_textrd   rmtreedumpchmodstatS_IWRITES_IREAD)!rK   r   r  r	  r  r   r   r   
source_dirr  fidr>  fnamer   r  r  
real_error
linked_dirr   removedr  rL  r   r  r  rt  jlabr   
local_pathpkg_datar  	lock_pathlock_templates!                                    rN   re  z_AppHandler._populate_staging  s   ,++ 	*SZ(( 	*K]G444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<   D00D47D44#I J*'9J%%J*0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.rE  rK  r\  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:rU   nt)ro   relpathrp   realpathrr   r   replacerw   sepr   lower)r   rK   s    rN   format_pathz6_AppHandler._get_package_template.<locals>.format_pathX  sl    ;tS[eDLR[>\>\1]1]%^%^__DT\\"&#666Dw$zz||KrP   r  r  r   r  r   filenamer  rL  extensionMetadatar  )r   mimeExtensionFTr1   srn  r  )
r?   r   r  r  rr   r   r  _log_single_compat_errorsry   r   )rK   r  r?   r>  rY  r  r   r{  r  r  r  rL  rt  r   rk  r  r  	jlab_datar  s   `                  rN   r  z!_AppHandler._get_package_templateM  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+++^$((...rP   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.
        r  N)r   r  rr   ro   r   )rK   r   rL  r  rX  r  r   s          rN   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.r  r1   Nr   tar_dir)	ro   r   rr   r   r  r  moverw   rQ  )	rK   r   rL  r  r>  dtyperV  rX  r  s	            rN   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   rr   rC  _get_extensions_in_dirro   r   update)rK   rE  r   r   sys_pathapp_paths         rN   r  z_AppHandler._get_extensions  s    ,
 |44|4400yII
 ,//xsz(';';$55gyIIJJJrP   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.rN  r\   r   *.tgzr  r   r   .tgzNdescriptionr1   r  )
r#  r   r  urlr  r  r   r  r  rM  )r   r   rr   r?  ry   ro   rp   basenamer   
PIN_PREFIXr1  r   r  )rK   r  rE  r   rM  r   r>  depsr   r  r   r  aliasr$  s                 rN   r  z"_AppHandler._get_extensions_in_dir  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}%% rP   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.rE  rj  r  r   )r  setr  _validate_compatibilityrJ   )rK   compatrE  seenr   r>  r'  s          rN   r  z!_AppHandler._get_extension_compat  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rP   c                 ,    |                      d          S )z%Get the locally installed extensions.rK  )_get_local_datar   s    rN   r  z!_AppHandler._get_local_extensions  s    ##$6777rP   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|z             t          j        |           c||         }t	          j        |          |d<   ||d	<   |d
         |d
<   ||d<   |S )zGet the linked packages.r\  r   r1   )rL  r  r  r!  r   z#Removing orphaned linked package %sr  r   r  r>  )r/  rr   r   r  ro   r   r   rp   r?  r?   r  rw   rQ  r%  )rK   r  r  r   rL  r   r>  rt  s           rN   r  z _AppHandler._get_linked_packages  s3   ##$566dlI/@AA JJLL 	N 	NLD&$*uMMDJJz%   	Kug..// 	  	 D;t$$D%%D<D4##$ID$PQQQ	$:D"|D11DDL"9oDODLLrP   c                 V    |                                  }|                    dg           S )z$Get the uninstalled core extensions.rI  )rP  ry   r   s     rN   r  z,_AppHandler._get_uninstalled_core_extensions   s(    ((**zz7<<<rP   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)	rr   r   ro   r   rw   r  OSErrorerrnoEEXIST)rK   dirsr  r   es        rN   rS  z_AppHandler._ensure_app_dirs%  s    III 	 	Eu--D:d## K%%%%   w%,.. /....	 	s   A
A2A--A2c           
         |                                   | j        }|d|z           }|sdS |d|z           }i }|                    d| d|            t          |          D ]}||d         v r|d         |         }|d         }	|d	         |         }
d
}t	          ||d                   r|dt
          z  z  }n|dt          z  z  }|
r|dt          z  z  }n|dt          z  z  }|d         r|dz  }|d         }|r!|                    d| d| d|	 |            n|                    d| d|	 |            |
r|	|
f||<   t          ||           |                    d
           dS )z$List the extensions of a given type.z%s_extensionsNz%s_dirz   z dir: rj  r   r  rk  r1   rz   %sr  r  r  rl    v)
r  r?   r  r  r  r   r   r   r   _log_multiple_compat_errors)rK   r  r  r?   r+  r  error_accumulatorr   r>  r  r  extrar  s                rN   r  z_AppHandler._list_extensions1  s   ""$$$_x/0 	FX()1(11%112225MM 	< 	<Dt2333%d+D9oG/*40FED$z"233 /--.. *&))J #'(>#? # AVtVV.BVVgVuVVWWWW?t??w???@@@ <+2F*;!$' 	$F,=>>> 	BrP   c           	      h   |                                   | j        }| j        }i }d | j        D             }|d                                         D ]}d||d         <   |                                D ].\  }}|s	|                    |           |d         D ]}|d         |         }	|	d         |k    r|	d         }
|d         |         }d}t          ||d                   r|d	t          z  z  }n|d	t          z  z  }|r|d	t          z  z  }n|d	t          z  z  }|	d
         r|dz  }|	                    d          }|r%|d                    |d         |d                   z  }|                    d| d|
 |            |r|
|f||<   |                    d           0t          ||           d S )Nc                     i | ]}|d S Frm   )r   ps     rN   r  z:_AppHandler._list_federated_extensions.<locals>.<dictcomp>e  s    >>>Au>>>rP   rj  Text_dirr  rk  r1   rz  r;  r  r  rb  z	 ({}, {})packageManagerpackageNamerl  r=  )r  r  r?   r   valuesr  r  r   r   r   r   ry   formatr>  )rK   r  r?   r?  ext_dirsr  rE  has_extsr   r>  r  r  r@  rb  s                 rN   r  z&_AppHandler._list_federated_extensions^  s"   ""$$$y>>d&=>>>0188:: 	. 	.E)-HU9%&&!)!1!1 	 	GX KK   34 @ @23D9	?g--y/o.t4d:&677 3U\11EEU]22E .UU]*EEUX--E
# !SLE((9-- c[//8H0I7S`KabbbE?t??w???@@@ @/6.?%d+KKOOOO 	$F,=>>>>>rP   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)rr   r   ro   r   r5  r7  r  )rK   r   r  s      rN   rP  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   rM  r  r  r  N)rS  rr   r   r5  r7  r  )rK   r   r   r  s       rN   rR  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.rh   r<  z**Note: Removing dead z "")
rP  rU  r  ro   r   rb   r  r?   r  rR  )rK   rL  r   r>  deadr   	link_typerM   s           rN   r/  z_AppHandler._get_local_data  s    ((**  ,, JJLL 	" 	"LD&:f%% "D!!! 	 	DsC00I?9?????CK$$$T

 	-$$V,,,rP   c                    |                      |||          }|d         }d|dd         vo|d          }|d         }t          |          }|rbd}	|	|d	                    |          fz  }	|r5	 |                     |          }
n-# t          $ r t          |	          dw xY wt          |	          |                    d
i           }t          ||| j                  }|r9t          |d         |d         |          }	|r
	 |                     |          }
n# t          $ r t          |	          dw xY w|
ry|rw| 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   r>  r     NrJ  r   z!"%s" is not a valid extension:
%srX   r  r  zIncompatible extension:
%szFound compatible version: %s   r1   z

r   r  r   )r  r  rd   r  r   r<   ry   r+  rE  _format_compatibility_errorsr?   rB   r   rT  
splitlines%_format_no_compatible_package_versionrr   r   ro   r   rw   rQ  r  r  )rK   r   rX  r   r  r>  allow_fallbackr   r  rM   r  r'  r  tempdir2	conflictsr   s                   rN   rT  z_AppHandler._install_extension  s   $$YS$AAF| IabbM1H$x.6HF| 't,, 		&6CDIIh$7$788C &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%%&CTJJJK%%&DgNNN+-- 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 D2=F%%F),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	}t          ||z            t          t          |d
                    d         }t          |          |d<   |rHt          |          x|d<   }	|                    dd|	z            }
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   rb  r^  )rL  rJ  npmpackr   "%s" is not a valid npm packager!  r>  shar"  z-%s.tgzr   r  r   r  )ro   r   r  rr   rd  r&   r   r<   r   r?  _tarsumr  r  r  r  r&  r%  )rK   rL  rX  r   rJ  r  r   rM   r   r`  r   old_pathnew_paths                rN   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3CS6\***E'7++,,Q/#D))V 	  '-DK#\\&)c/::F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rP   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 packagerE  Nversionsc                 0    t          | d         d          S Nr   T)prerelease_first_semver_key	key_values    rN   sort_keyz@_AppHandler._latest_compatible_package_version.<locals>.sort_key  s    y|dCCCCrP   Tr  reverser  
deprecatedz@Disregarding compatible version of package as it is deprecated: r  r>  )r  _fetch_package_metadatar   r?   r   ry   r  r  r+  rB   r   r  r  )rK   r   rE  metadatarf  rn  r  r>  r'  r  rX  r  s               rN   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}t          ||z            |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.
        rE  rf  c                 0    t          | d         d          S rh  rj  rl  s    rN   rn  z@_AppHandler.latest_compatible_package_versions.<locals>.sort_keyD      "9Q<$GGGGrP   Tro  rq  r  r  r]  r^  r^  r   r_  r1   rT  NrR   rU   r"  r  r   )r  rr  r   r?   r   ry   r  r  r+  rb   r   rd  r   r<   r  r?  ro   rd   r  )rK   r+  rE  keysr   rs  rf  rn  r  r>  r'  r  rX  r   rM   r  r  s                    rN   r*  z._AppHandler.latest_compatible_package_versions3  sv    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7 t,,, = =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|z  S dg}|r|
                    d           d                    |                              |          S )re  rE  Frf  c                 0    t          | d         d          S rh  rj  rl  s    rN   rn  zC_AppHandler._format_no_compatible_package_version.<locals>.sort_keyw  rv  rP   Tro  r   rT  r  r  r   singletonPackagesdrop_prerelease1zKThe extension "%s" does not yet support the current version of JupyterLab.
zcNo version of {extension} 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  rr  r   r?   ry   r;   r  r  _compare_rangesr   extendrd   rI  )rK   r   rE  lab_newer_than_latestlatest_newer_than_labrs  rf  rn  storelatest_deps	core_deps
singletonsr  r  cpartss                   rN   rX  z1_AppHandler._format_no_compatible_package_versiong  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	. ! 	 "&'1
 ! 	LL   xx%%%555s   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 killedr?   rL   )rL   r=   r<   r?   r/   ri   )rK   rA   r   rM   rG   s        rN   rd  z_AppHandler._run  sf    
 ?!!## 	"&CS//!;x#|s--f--yy{{rP   r   )NNNFTTr   )r  rC  )NNNF),rj   rk   rl   rO   r   r   r   r!  r  r   r   r   r   r  r#  r%  r  r  r  r  rF  r  re  r  r  r  r  r  r  r  r  r  rS  r  r  rP  rR  r/  rT  r  r  r*  rX  rd  rm   rP   rN   r   r   b  s       ) ) )", , , ,` 1$ 1$ 1$ 1$f  (E@ E@ E@NQ Q Q Qf6 6 6p	 	 	  , , ,: : :,  >     D   4S S S S    ," " "H. . .6K> K> K> K>ZI I I IV* * *     0  (  @   8 8 8  2= = =

 
 
+ + +Z+? +? +?Z& & &- - -  *9 9 9 9v% % % %N  B2 2 2h56 56 56n    rP   r   c                 8   t          d          }	 t          j        |dgt                    }|                     |                    d                     dS # t          $ r7 t                      j        }|d         d         }d|z  }t          |          dw xY w)z;Check for the existence of nodejs with the correct version.r   znode-version-check.jsr^  r2   enginesztPlease install nodejs %s before continuing. nodejs may be installed using conda or directly from the nodejs website.N)
r   rD   check_outputr%   rB   r:  	Exceptionr$   rD  r<   )r?   r   outputr>  verrM   s         rN   r   r     s    ==D
(($0G)HdSSSV]]7++,,,,, ( ( (||!9of% C 	 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 unsuccessfull the subdictionary are empty
    )r   z
npm configr   z9NodeJS was not found. Yarn user configuration is ignored.r   z--json)r5   r3   r2   typer  r>  inspectzYarn configuration loaded.z(Fail to get yarn configuration. {!s}{!s}Nz Fail to get yarn configuration. )r   r<   rB   rD   r  r&   rF   r%   r:  iterrW  r7  r8  r^   StopIterationCalledProcessErrorr  rI  r5   r  r  )r?   configurationr   output_binaryr  linesliner  r  r  r9  s              rN   r   r     s3    %'b99MV}}   PQQQ?"/9h1*/t
 
 
 %%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   r]  s    rN   r>   r>     s    4W&|444rP   c                 ~    t          j        |           } t          j        |           rt          j        |           } | S )z,Normalize a given extension if it is a path.)ro   
expanduserr   rp   r}  s    rN   rO  rO    s8    y))I
z) +K	**	rP   c                 >    fd}t          j        | |           dS )zRemove a tree, logging errorsc                  6                         d|            d S )NzError in shutil.rmtreeexc_info)rB   )r  r?   s    rN   onerrorz_rmtree.<locals>.onerror  s     -AAAAArP   )r  N)r  r  )r   r?   r  s    ` rN   r  r    s>    B B B B B M$((((((rP   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)rw   unlinkr  rB   r\   r  )r   r?   s     rN   _unlinkr    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)	rw   listdirro   rd   isfileislinkr  r  r  )r   r?   r  	file_paths       rN   r  r    s    Jt$$ ' 'HT8,,	:i   	'CJy$9$9 	'Iv&&&&Yy!! 	'Iv&&&' 'rP   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|z             |r||vr|                    d|z             	r3t          	fd|D                       s|                    d	z             r3t          fd|D                       s|                    dz             |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   Fr  	themePathr1   	schemaDirz-No `extension` or `mimeExtension` key presentz?`mimeExtension` and `extension` must point to different modulesr3  mainr  z.jsTzMissing extension module "%s"z!Missing mimeExtension module "%s"c              3   v   K   | ]3}|                     t          t                                        V  4d S r   r   r   r   )r   r2  
theme_paths     rN   	<genexpr>z&_validate_extension.<locals>.<genexpr><  ?      QQaall3tJ/?/?+@+@AAQQQQQQrP   zthemePath is empty: "%s"c              3   v   K   | ]3}|                     t          t                                        V  4d S r   r  )r   r2  
schema_dirs     rN   r  z&_validate_extension.<locals>.<genexpr>?  r  rP   zschemaDir is empty: "%s")ry   r9   dictrb   r  any)
r>  r  r   mime_extensionr  rM   filesr  r  r  s
           @@rN   r  r    sm   
 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 > >  % EYe++7)CDDD N.55;nLMMM A#QQQQ5QQQQQ A2Z?@@@ A#QQQQ5QQQQQ A2Z?@@@OrP   c                 d   t          j        | d          }d}t          j        d          }|D ]o}|                                s|                    |          }|                    |          }|r,|                    |           |                    |          }|,p|                                S )z6
    Compute the recursive sha sum of a tar file.
    r.  i  sha1)	r4  r5  hashlibnewr  r6  r9  r  	hexdigest)
input_filer=  
chunk_sizehmemberr2  r>  s          rN   ra  ra  E  s     ,z3
'
'CJFA & &}} 	OOF##vvj!! 	&HHTNNN66*%%D  	& ;;==rP   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)rr   ro   r   r5  r7  r  )r   r   r  s      rN   r  r  X  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   rz  Tr{  F)r  _test_overlaprb   )	r   r'  rE  r  r  r  r  r  overlaps	            rN   r+  r+  b  s    -(I<()<=JFjjll < <
U* $IcNEDQQQG%sIcNE:;;;MrP   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        rN   r  r  u  s8     u'7JZ  C {!8OrP   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 )NTrm   )xyzs      rN   noopz_compare_ranges.<locals>.noop  s    4rP   >rT  z(Unexpected case comparing version ranges)r'   rangerY   productr*  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  rM   s                        rN   r~  r~    s    
ud		B	ud		B 8 28  L ")"&"&99 B" B"u1X_2Y1X_2Y= 	!- 	!B= 	!- 	!B1X1X == 	s!3!3 	 "HHSS""HHSS""HHSS""HHSS"	 	 	 88c**8B88c**8B B	2r4  	 r"b$	 2r4  		
 2r4  	 2r4  	 r"b$	 2r4  	 11r2t 	u$$ ###r2t 	u$$!""#8S!!!urP   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   rz  patternr  s       rN   r  r    ss    ~2H"..**  E>>7??44:g$$T**644 75rP   c                 L   g }d}d}|D ]}|\  }}}	t          t          |d                    }t          t          |	d                    }	|                    |||	f           t          |t	          |          dz             }t          |t	          |          dz             }d}
|
| |fz  }
|
dz  }
|
d                    |          z  }
|
d                    |          z  }
|
dz  }
|D ]:\  }}}	|
|                    |          |	                    |          z   |z   d	z   z  }
;|
S )
z*Format a message for compatibility errors.
   TrT  z6
"%s@%s" is not compatible with the current JupyterLabz
Conflicting Dependencies:

JupyterLab	ExtensionzPackage
rX   )r   r'   rb   maxr1  ljust)r   r  r  r   l0l1r  r  r  r  rM   s              rN   rV  rV    sG   D	B	B $ $T35t$$%%%T""##S$$%%%SXX\""SYY]##
CC
w
C**C<b!!!C;R   C;C ; ;T3tzz"~~		"-3d::JrP   c                    g }g }|                                 D ]H\  }\  }}t          |          }|dk    r|                    |           3|                    |           I|r-|                     d                    dg|d                     |D ]6}||         \  }}t          |||          }	|                     |	 d           7dS )z8Log compatibility errors for multiple extensions at oncer   z	
        z*
   The following extensions are outdated:zD
   Consider checking if an update is available for these packages.
rX   N)r  _compat_error_agerb   r  rd   rV  )
r?   
errors_mapoutdatedothersr   rh   r  ager  rM   s
             rN   r>  r>  	  s    HF'--//    kq&''77OOD!!!!MM$ 	
A ] 	
 	
 	
  # #$T**4&AA#zzz""""# #rP   c                     t          |          }|dk    r|                     d|           dS t          |||          }|                     | d           dS )z/Log compatability errors for a single extensionr   z The extension "%s" is outdated.
rX   N)r  r  rV  )r?   r   r  r  r  rM   s         rN   r  r  &	  sd     F
#
#C
Qww:DAAAAA*4&AA#zzz"""""rP   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   rT  r  r  )r  	any_older	any_newerrh   r  r  r  s          rN   r  r  1	  s     II ' '4 C===&Q	&Q		  q	 9 r1rP   c                 h    | d         }t          |d                   t          |d                   z   S )zGet the core extensions.r   r   r  )r:   )rE  r>  s     rN   r  r  K	  s2    \"D\"##d40@+A&B&BBBrP   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.
    r1   N)r9   int)r  entrys     rN   _semver_prerelease_keyr  Q	  sU         eS!! 	u+ (NNNN rP   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   )rT  rm   r   )r,   r  majorminorr  r;   r  )r  ri  vr  s       rN   rk  rk  i	  s     	GT""A.>
F1<)44TTBC
+C
+
+!'
+17
+
+C 2<1iiQiiiT| @E0>>???JrP   c           	      R   t          t          | t          |d                    ddi          }	 |                    d|j        z             n:# t
          $ r- |                    d|                                z             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}~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: %sr2   Nz+Failed to fetch package metadata for %r: %r)r	   r   r
   rB   full_urlAttributeErrorget_full_url
contextlibclosingr   r7  r8  r9  r:  r   r  )r   r   r?   reqresponseexcs         rN   rr  rr  	  s   
%3///00a
  C@'3<89999 @ @ @'3+;+;+=+=>?????@-- 	?:hmmoo44W==>>	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	?   DdCPPP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)FFrC  )r   r  r6  r  rY   r7  r   rw   os.pathr   ro   r  r  r   r  rD   r\   r4  r  r   r   pathlibr   tempfiler   	threadingr   urllib.errorr   urllib.requestr	   r
   r   r   jupyter_core.pathsr   (jupyter_server.extension.serverextensionr   r   r   r   jupyterlab_server.configr   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   rp   rd   r   r   r&  r   r/   rr   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(  r,  r?  r   r   r   r>   rO  r  r  r  r  ra  r  r+  r  r~  r  rV  r>  r  r  r  r  rk  rr  rj   rm   rP   rN   <module>r(     sF                   				       				        



                    ' ' ' ' ' '       ! ! ! ! ! ! ; ; ; ; ; ; ; ; ; ; ; ; 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== == == == == == == ==@% % %+ + + +*
9 
9 
9 
9
- 
- 
- 
-* * * *a a a aF 
   0   C C C CB B B B9 9 9 9! ! ! !% % % %& & & &+ + + +# # # #= = = =  H H H H H H H HV*( ( ( ( ( (V5 5 5 5
  ) ) )D D D' ' '2 2 2j  &    &   Z Z Z Zz     4# # #<# # #  4C C C  0   2  ( zIdOOOOO rP   