diff --git a/.eslintignore b/.eslintignore index a32fbc9f..9192fb27 100644 --- a/.eslintignore +++ b/.eslintignore @@ -7,6 +7,7 @@ **/*.d.ts **/test **/ui-tests +**/labextension docs tests diff --git a/.prettierignore b/.prettierignore index bf69e417..999d80d9 100644 --- a/.prettierignore +++ b/.prettierignore @@ -6,6 +6,7 @@ **/tsconfig.test.json **/*.d.ts **/test +**/labextension docs tests diff --git a/packages/collaboration-extension/package.json b/packages/collaboration-extension/package.json index cbb37e85..2f2bffa9 100644 --- a/packages/collaboration-extension/package.json +++ b/packages/collaboration-extension/package.json @@ -71,7 +71,7 @@ }, "devDependencies": { "@jupyterlab/builder": "^4.0.5", - "@types/react": "~18.0.26", + "@types/react": "~18.3.1", "npm-run-all": "^4.1.5", "rimraf": "^4.1.2", "typescript": "~5.0.4" diff --git a/packages/collaboration/package.json b/packages/collaboration/package.json index ab5cf579..f19133b5 100644 --- a/packages/collaboration/package.json +++ b/packages/collaboration/package.json @@ -56,7 +56,7 @@ "yjs": "^13.5.40" }, "devDependencies": { - "@types/react": "^18.0.27", + "@types/react": "~18.3.1", "rimraf": "^4.1.2", "typescript": "~5.0.4" }, diff --git a/packages/docprovider-extension/package.json b/packages/docprovider-extension/package.json index d2d9e218..b56d4706 100644 --- a/packages/docprovider-extension/package.json +++ b/packages/docprovider-extension/package.json @@ -71,8 +71,8 @@ "yjs": "^13.5.40" }, "devDependencies": { - "@jupyterlab/builder": "^4.0.5", - "@types/react": "~18.0.26", + "@jupyterlab/builder": "^4.0.0", + "@types/react": "~18.3.1", "npm-run-all": "^4.1.5", "rimraf": "^4.1.2", "typescript": "~5.0.4" diff --git a/packages/docprovider-extension/src/executor.ts b/packages/docprovider-extension/src/executor.ts index cc9666bb..1e55c906 100644 --- a/packages/docprovider-extension/src/executor.ts +++ b/packages/docprovider-extension/src/executor.ts @@ -5,14 +5,12 @@ * @module docprovider-extension */ +import { NotebookCellServerExecutor } from '@jupyter/docprovider'; import { JupyterFrontEnd, JupyterFrontEndPlugin } from '@jupyterlab/application'; -import { PageConfig, URLExt } from '@jupyterlab/coreutils'; -import { ServerConnection } from '@jupyterlab/services'; - -import { type MarkdownCell } from '@jupyterlab/cells'; +import { PageConfig } from '@jupyterlab/coreutils'; import { INotebookCellExecutor, runCell } from '@jupyterlab/notebook'; export const notebookCellExecutor: JupyterFrontEndPlugin = @@ -24,53 +22,10 @@ export const notebookCellExecutor: JupyterFrontEndPlugin provides: INotebookCellExecutor, activate: (app: JupyterFrontEnd): INotebookCellExecutor => { if (PageConfig.getOption('serverSideExecution') === 'true') { - return Object.freeze({ runCell: runCellServerSide }); + return new NotebookCellServerExecutor({ + serverSettings: app.serviceManager.serverSettings + }); } return Object.freeze({ runCell }); } }; - -async function runCellServerSide({ - cell, - notebook, - notebookConfig, - onCellExecuted, - onCellExecutionScheduled, - sessionContext, - sessionDialogs, - translator -}: INotebookCellExecutor.IRunCellOptions): Promise { - switch (cell.model.type) { - case 'markdown': - (cell as MarkdownCell).rendered = true; - cell.inputHidden = false; - onCellExecuted({ cell, success: true }); - break; - case 'code': { - const kernelId = sessionContext?.session?.kernel?.id; - const settings = ServerConnection.makeSettings(); - const apiURL = URLExt.join( - settings.baseUrl, - `api/kernels/${kernelId}/execute` - ); - const cellId = cell.model.sharedModel.getId(); - const documentId = `json:notebook:${notebook.sharedModel.getState( - 'file_id' - )}`; - const body = `{"cell_id":"${cellId}","document_id":"${documentId}"}`; - const init = { - method: 'POST', - body - }; - try { - await ServerConnection.makeRequest(apiURL, init, settings); - } catch (error: any) { - throw new ServerConnection.NetworkError(error); - } - break; - } - default: - break; - } - return Promise.resolve(true); -} diff --git a/packages/docprovider/package.json b/packages/docprovider/package.json index 47027009..cb6f83a4 100644 --- a/packages/docprovider/package.json +++ b/packages/docprovider/package.json @@ -42,17 +42,22 @@ }, "dependencies": { "@jupyter/ydoc": "^2.0.0", - "@jupyterlab/coreutils": "^6.0.5", - "@jupyterlab/services": "^7.0.5", + "@jupyterlab/apputils": "^4.2.0", + "@jupyterlab/cells": "^4.2.0", + "@jupyterlab/coreutils": "^6.2.0", + "@jupyterlab/notebook": "^4.2.0", + "@jupyterlab/services": "^7.2.0", + "@jupyterlab/translation": "^4.2.0", "@lumino/coreutils": "^2.1.0", "@lumino/disposable": "^2.1.0", "@lumino/signaling": "^2.1.0", + "@lumino/widgets": "^2.2.0", "y-protocols": "^1.0.5", "y-websocket": "^1.3.15", "yjs": "^13.5.40" }, "devDependencies": { - "@jupyterlab/testing": "^4.0.5", + "@jupyterlab/testing": "^4.0.0", "@types/jest": "^29.2.0", "jest": "^29.5.0", "rimraf": "^4.1.2", diff --git a/packages/docprovider/src/index.ts b/packages/docprovider/src/index.ts index 62edebda..7e399365 100644 --- a/packages/docprovider/src/index.ts +++ b/packages/docprovider/src/index.ts @@ -8,6 +8,8 @@ */ export * from './awareness'; +export * from './notebookCellExecutor'; +export * from './requests'; export * from './ydrive'; export * from './yprovider'; export * from './tokens'; diff --git a/packages/docprovider/src/notebookCellExecutor.ts b/packages/docprovider/src/notebookCellExecutor.ts new file mode 100644 index 00000000..cda8f022 --- /dev/null +++ b/packages/docprovider/src/notebookCellExecutor.ts @@ -0,0 +1,138 @@ +/* ----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +import { Dialog, showDialog } from '@jupyterlab/apputils'; +import { type ICodeCellModel, type MarkdownCell } from '@jupyterlab/cells'; +import { URLExt } from '@jupyterlab/coreutils'; +import { INotebookCellExecutor } from '@jupyterlab/notebook'; +import { ServerConnection } from '@jupyterlab/services'; +import { nullTranslator } from '@jupyterlab/translation'; + +/** + * Notebook cell executor posting a request to the server for execution. + */ +export class NotebookCellServerExecutor implements INotebookCellExecutor { + private _serverSettings: ServerConnection.ISettings; + + /** + * Constructor + * + * @param options Constructor options; the contents manager, the collaborative drive and optionally the server settings. + */ + constructor(options: { serverSettings?: ServerConnection.ISettings }) { + this._serverSettings = + options.serverSettings ?? ServerConnection.makeSettings(); + } + + /** + * Execute a given cell of the notebook. + * + * @param options Execution options + * @returns Execution success status + */ + async runCell({ + cell, + notebook, + notebookConfig, + onCellExecuted, + onCellExecutionScheduled, + sessionContext, + sessionDialogs, + translator + }: INotebookCellExecutor.IRunCellOptions): Promise { + translator = translator ?? nullTranslator; + const trans = translator.load('jupyterlab'); + + switch (cell.model.type) { + case 'markdown': + (cell as MarkdownCell).rendered = true; + cell.inputHidden = false; + onCellExecuted({ cell, success: true }); + break; + case 'code': + if (sessionContext) { + if (sessionContext.isTerminating) { + await showDialog({ + title: trans.__('Kernel Terminating'), + body: trans.__( + 'The kernel for %1 appears to be terminating. You can not run any cell for now.', + sessionContext.session?.path + ), + buttons: [Dialog.okButton()] + }); + break; + } + if (sessionContext.pendingInput) { + await showDialog({ + title: trans.__('Cell not executed due to pending input'), + body: trans.__( + 'The cell has not been executed to avoid kernel deadlock as there is another pending input! Submit your pending input and try again.' + ), + buttons: [Dialog.okButton()] + }); + return false; + } + if (sessionContext.hasNoKernel) { + const shouldSelect = await sessionContext.startKernel(); + if (shouldSelect && sessionDialogs) { + await sessionDialogs.selectKernel(sessionContext); + } + } + + if (sessionContext.hasNoKernel) { + cell.model.sharedModel.transact(() => { + (cell.model as ICodeCellModel).clearExecution(); + }); + return true; + } + + const kernelId = sessionContext?.session?.kernel?.id; + const apiURL = URLExt.join( + this._serverSettings.baseUrl, + `api/kernels/${kernelId}/execute` + ); + const cellId = cell.model.sharedModel.getId(); + const documentId = notebook.sharedModel.getState('document_id'); + + const init = { + method: 'POST', + body: JSON.stringify({ cell_id: cellId, document_id: documentId }) + }; + onCellExecutionScheduled({ cell }); + let success = false; + try { + // FIXME quid of deletedCells and timing record + const response = await ServerConnection.makeRequest( + apiURL, + init, + this._serverSettings + ); + success = response.ok; + } catch (error: unknown) { + onCellExecuted({ + cell, + success: false + }); + if (cell.isDisposed) { + return false; + } else { + throw error; + } + } + + onCellExecuted({ cell, success }); + + return true; + } + cell.model.sharedModel.transact(() => { + (cell.model as ICodeCellModel).clearExecution(); + }, false); + break; + default: + break; + } + return Promise.resolve(true); + } +} diff --git a/packages/docprovider/src/yprovider.ts b/packages/docprovider/src/yprovider.ts index 4061ebeb..24e3bd5b 100644 --- a/packages/docprovider/src/yprovider.ts +++ b/packages/docprovider/src/yprovider.ts @@ -133,8 +133,13 @@ export class WebSocketProvider implements IDocumentProvider { private _onSync = (isSynced: boolean) => { if (isSynced) { + if (this._yWebsocketProvider) { + this._yWebsocketProvider.off('sync', this._onSync); + + const state = this._sharedModel.ydoc.getMap('state'); + state.set('document_id', this._yWebsocketProvider.roomname); + } this._ready.resolve(); - this._yWebsocketProvider?.off('sync', this._onSync); } }; diff --git a/projects/jupyter-server-ydoc/jupyter_server_ydoc/app.py b/projects/jupyter-server-ydoc/jupyter_server_ydoc/app.py index e1df345d..0f8b89a2 100644 --- a/projects/jupyter-server-ydoc/jupyter_server_ydoc/app.py +++ b/projects/jupyter-server-ydoc/jupyter_server_ydoc/app.py @@ -136,21 +136,35 @@ def initialize_handlers(self): async def get_document( self: YDocExtension, *, - path: str, - content_type: Literal["notebook", "file"], - file_format: Literal["json", "text"], + path: str | None = None, + content_type: str | None = None, + file_format: Literal["json", "text"] | None = None, + room_id: str | None = None, copy: bool = True, ) -> YBaseDoc | None: """Get a view of the shared model for the matching document. + You need to provide either a ``room_id`` or the ``path``, + the ``content_type`` and the ``file_format``. + If `copy=True`, the returned shared model is a fork, meaning that any changes made to it will not be propagated to the shared model used by the application. """ - file_id_manager = self.serverapp.web_app.settings["file_id_manager"] - file_id = file_id_manager.index(path) + error_msg = "You need to provide either a ``room_id`` or the ``path``, the ``content_type`` and the ``file_format``." + if room_id is None: + if path is None or content_type is None or file_format is None: + raise ValueError(error_msg) + + file_id_manager = self.serverapp.web_app.settings["file_id_manager"] + file_id = file_id_manager.index(path) + + encoded_path = encode_file_path(file_format, content_type, file_id) + room_id = room_id_from_encoded_path(encoded_path) - encoded_path = encode_file_path(file_format, content_type, file_id) - room_id = room_id_from_encoded_path(encoded_path) + elif path is not None or content_type is not None or file_format is not None: + raise ValueError(error_msg) + else: + room_id = room_id try: room = await self.ywebsocket_server.get_room(room_id) @@ -164,7 +178,7 @@ async def get_document( fork_ydoc = Doc() fork_ydoc.apply_update(update) - return YDOCS.get(content_type, YDOCS["file"])(fork_ydoc) + return YDOCS.get(room.file_type, YDOCS["file"])(fork_ydoc) else: return room._document diff --git a/projects/jupyter-server-ydoc/jupyter_server_ydoc/rooms.py b/projects/jupyter-server-ydoc/jupyter_server_ydoc/rooms.py index bfb5f76e..873fe113 100644 --- a/projects/jupyter-server-ydoc/jupyter_server_ydoc/rooms.py +++ b/projects/jupyter-server-ydoc/jupyter_server_ydoc/rooms.py @@ -56,6 +56,16 @@ def __init__( self._document.observe(self._on_document_change) self._file.observe(self.room_id, self._on_outofband_change) + @property + def file_format(self) -> str: + """Document file format.""" + return self._file_format + + @property + def file_type(self) -> str: + """Document file type.""" + return self._file_type + @property def room_id(self) -> str: """ diff --git a/yarn.lock b/yarn.lock index 8156a572..84a199b4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2100,7 +2100,7 @@ __metadata: "@jupyterlab/translation": ^4.2.0 "@jupyterlab/ui-components": ^4.2.0 "@lumino/widgets": ^2.1.0 - "@types/react": ~18.0.26 + "@types/react": ~18.3.1 npm-run-all: ^4.1.5 rimraf: ^4.1.2 typescript: ~5.0.4 @@ -2126,7 +2126,7 @@ __metadata: "@lumino/signaling": ^2.0.0 "@lumino/virtualdom": ^2.0.0 "@lumino/widgets": ^2.1.0 - "@types/react": ^18.0.27 + "@types/react": ~18.3.1 react: ^18.2.0 rimraf: ^4.1.2 typescript: ~5.0.4 @@ -2144,7 +2144,7 @@ __metadata: "@jupyter/ydoc": ^2.0.0 "@jupyterlab/application": ^4.2.0 "@jupyterlab/apputils": ^4.2.0 - "@jupyterlab/builder": ^4.0.5 + "@jupyterlab/builder": ^4.0.0 "@jupyterlab/docregistry": ^4.2.0 "@jupyterlab/filebrowser": ^4.2.0 "@jupyterlab/fileeditor": ^4.2.0 @@ -2153,7 +2153,7 @@ __metadata: "@jupyterlab/settingregistry": ^4.2.0 "@jupyterlab/translation": ^4.2.0 "@lumino/commands": ^2.1.0 - "@types/react": ~18.0.26 + "@types/react": ~18.3.1 npm-run-all: ^4.1.5 rimraf: ^4.1.2 typescript: ~5.0.4 @@ -2168,12 +2168,17 @@ __metadata: resolution: "@jupyter/docprovider@workspace:packages/docprovider" dependencies: "@jupyter/ydoc": ^2.0.0 - "@jupyterlab/coreutils": ^6.0.5 - "@jupyterlab/services": ^7.0.5 - "@jupyterlab/testing": ^4.0.5 + "@jupyterlab/apputils": ^4.2.0 + "@jupyterlab/cells": ^4.2.0 + "@jupyterlab/coreutils": ^6.2.0 + "@jupyterlab/notebook": ^4.2.0 + "@jupyterlab/services": ^7.2.0 + "@jupyterlab/testing": ^4.0.0 + "@jupyterlab/translation": ^4.2.0 "@lumino/coreutils": ^2.1.0 "@lumino/disposable": ^2.1.0 "@lumino/signaling": ^2.1.0 + "@lumino/widgets": ^2.2.0 "@types/jest": ^29.2.0 jest: ^29.5.0 rimraf: ^4.1.2 @@ -2315,7 +2320,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/builder@npm:^4.0.5": +"@jupyterlab/builder@npm:^4.0.0, @jupyterlab/builder@npm:^4.0.5": version: 4.2.0 resolution: "@jupyterlab/builder@npm:4.2.0" dependencies: @@ -2817,7 +2822,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/testing@npm:^4.0.5": +"@jupyterlab/testing@npm:^4.0.0": version: 4.2.0 resolution: "@jupyterlab/testing@npm:4.2.0" dependencies: @@ -3294,7 +3299,7 @@ __metadata: languageName: node linkType: hard -"@lumino/widgets@npm:^1.37.2 || ^2.3.2, @lumino/widgets@npm:^2.1.0, @lumino/widgets@npm:^2.3.2": +"@lumino/widgets@npm:^1.37.2 || ^2.3.2, @lumino/widgets@npm:^2.1.0, @lumino/widgets@npm:^2.2.0, @lumino/widgets@npm:^2.3.2": version: 2.3.2 resolution: "@lumino/widgets@npm:2.3.2" dependencies: @@ -4187,7 +4192,7 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:^18.0.26, @types/react@npm:^18.0.27": +"@types/react@npm:^18.0.26, @types/react@npm:~18.3.1": version: 18.3.1 resolution: "@types/react@npm:18.3.1" dependencies: @@ -4197,24 +4202,6 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:~18.0.26": - version: 18.0.38 - resolution: "@types/react@npm:18.0.38" - dependencies: - "@types/prop-types": "*" - "@types/scheduler": "*" - csstype: ^3.0.2 - checksum: 34481c79f4f7ea2aefbaa45281319dc183200230d932d968463eba1643bd3635073d0a17c5c613150a69e36ca18b811ecffafea6384fa3dff3b5203866339d69 - languageName: node - linkType: hard - -"@types/scheduler@npm:*": - version: 0.23.0 - resolution: "@types/scheduler@npm:0.23.0" - checksum: 874d753aa65c17760dfc460a91e6df24009bde37bfd427a031577b30262f7770c1b8f71a21366c7dbc76111967384cf4090a31d65315155180ef14bd7acccb32 - languageName: node - linkType: hard - "@types/semver@npm:^7.3.12": version: 7.5.8 resolution: "@types/semver@npm:7.5.8" @@ -6129,20 +6116,13 @@ __metadata: languageName: node linkType: hard -"csstype@npm:3.0.10": +"csstype@npm:3.0.10, csstype@npm:^3.0.2": version: 3.0.10 resolution: "csstype@npm:3.0.10" checksum: 20a8fa324f2b33ddf94aa7507d1b6ab3daa6f3cc308888dc50126585d7952f2471de69b2dbe0635d1fdc31223fef8e070842691877e725caf456e2378685a631 languageName: node linkType: hard -"csstype@npm:^3.0.2": - version: 3.1.3 - resolution: "csstype@npm:3.1.3" - checksum: 8db785cc92d259102725b3c694ec0c823f5619a84741b5c7991b8ad135dfaa66093038a1cc63e03361a6cd28d122be48f2106ae72334e067dd619a51f49eddf7 - languageName: node - linkType: hard - "dargs@npm:^7.0.0": version: 7.0.0 resolution: "dargs@npm:7.0.0" @@ -7685,17 +7665,17 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.1.3, glob@npm:^7.1.4": - version: 7.2.3 - resolution: "glob@npm:7.2.3" +"glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:~7.1.6": + version: 7.1.7 + resolution: "glob@npm:7.1.7" dependencies: fs.realpath: ^1.0.0 inflight: ^1.0.4 inherits: 2 - minimatch: ^3.1.1 + minimatch: ^3.0.4 once: ^1.3.0 path-is-absolute: ^1.0.0 - checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 + checksum: b61f48973bbdcf5159997b0874a2165db572b368b931135832599875919c237fc05c12984e38fe828e69aa8a921eb0e8a4997266211c517c9cfaae8a93988bb8 languageName: node linkType: hard @@ -7724,20 +7704,6 @@ __metadata: languageName: node linkType: hard -"glob@npm:~7.1.6": - version: 7.1.7 - resolution: "glob@npm:7.1.7" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^3.0.4 - once: ^1.3.0 - path-is-absolute: ^1.0.0 - checksum: b61f48973bbdcf5159997b0874a2165db572b368b931135832599875919c237fc05c12984e38fe828e69aa8a921eb0e8a4997266211c517c9cfaae8a93988bb8 - languageName: node - linkType: hard - "global-modules@npm:^2.0.0": version: 2.0.0 resolution: "global-modules@npm:2.0.0" @@ -8249,7 +8215,7 @@ __metadata: languageName: node linkType: hard -"inquirer@npm:8.2.4": +"inquirer@npm:8.2.4, inquirer@npm:^8.2.4": version: 8.2.4 resolution: "inquirer@npm:8.2.4" dependencies: @@ -8272,29 +8238,6 @@ __metadata: languageName: node linkType: hard -"inquirer@npm:^8.2.4": - version: 8.2.6 - resolution: "inquirer@npm:8.2.6" - dependencies: - ansi-escapes: ^4.2.1 - chalk: ^4.1.1 - cli-cursor: ^3.1.0 - cli-width: ^3.0.0 - external-editor: ^3.0.3 - figures: ^3.0.0 - lodash: ^4.17.21 - mute-stream: 0.0.8 - ora: ^5.4.1 - run-async: ^2.4.0 - rxjs: ^7.5.5 - string-width: ^4.1.0 - strip-ansi: ^6.0.0 - through: ^2.3.6 - wrap-ansi: ^6.0.1 - checksum: 387ffb0a513559cc7414eb42c57556a60e302f820d6960e89d376d092e257a919961cd485a1b4de693dbb5c0de8bc58320bfd6247dfd827a873aa82a4215a240 - languageName: node - linkType: hard - "internal-slot@npm:^1.0.7": version: 1.0.7 resolution: "internal-slot@npm:1.0.7" @@ -10288,7 +10231,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -10878,7 +10821,7 @@ __metadata: languageName: node linkType: hard -"npm-registry-fetch@npm:14.0.3": +"npm-registry-fetch@npm:14.0.3, npm-registry-fetch@npm:^14.0.0, npm-registry-fetch@npm:^14.0.3": version: 14.0.3 resolution: "npm-registry-fetch@npm:14.0.3" dependencies: @@ -10908,21 +10851,6 @@ __metadata: languageName: node linkType: hard -"npm-registry-fetch@npm:^14.0.0, npm-registry-fetch@npm:^14.0.3": - version: 14.0.5 - resolution: "npm-registry-fetch@npm:14.0.5" - dependencies: - make-fetch-happen: ^11.0.0 - minipass: ^5.0.0 - minipass-fetch: ^3.0.0 - minipass-json-stream: ^1.0.1 - minizlib: ^2.1.2 - npm-package-arg: ^10.0.0 - proc-log: ^3.0.0 - checksum: c63649642955b424bc1baaff5955027144af312ae117ba8c24829e74484f859482591fe89687c6597d83e930c8054463eef23020ac69146097a72cc62ff10986 - languageName: node - linkType: hard - "npm-run-all@npm:^4.1.5": version: 4.1.5 resolution: "npm-run-all@npm:4.1.5" @@ -12417,14 +12345,7 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:^5.1.0, safe-buffer@npm:~5.2.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 - languageName: node - linkType: hard - -"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": +"safe-buffer@npm:^5.1.0, safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": version: 5.1.2 resolution: "safe-buffer@npm:5.1.2" checksum: f2f1f7943ca44a594893a852894055cf619c1fbcb611237fc39e461ae751187e7baf4dc391a72125e0ac4fb2d8c5c0b3c71529622e6a58f46b960211e704903c @@ -12535,7 +12456,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:7.5.4": +"semver@npm:7.5.4, semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.5.4": version: 7.5.4 resolution: "semver@npm:7.5.4" dependencies: @@ -12555,17 +12476,6 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.5.4": - version: 7.6.0 - resolution: "semver@npm:7.6.0" - dependencies: - lru-cache: ^6.0.0 - bin: - semver: bin/semver.js - checksum: 7427f05b70786c696640edc29fdd4bc33b2acf3bbe1740b955029044f80575fc664e1a512e4113c3af21e767154a94b4aa214bf6cd6e42a1f6dba5914e0b208c - languageName: node - linkType: hard - "serialize-javascript@npm:^6.0.1": version: 6.0.2 resolution: "serialize-javascript@npm:6.0.2" @@ -13038,16 +12948,7 @@ __metadata: languageName: node linkType: hard -"string_decoder@npm:^1.1.1": - version: 1.3.0 - resolution: "string_decoder@npm:1.3.0" - dependencies: - safe-buffer: ~5.2.0 - checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 - languageName: node - linkType: hard - -"string_decoder@npm:~1.1.1": +"string_decoder@npm:^1.1.1, string_decoder@npm:~1.1.1": version: 1.1.1 resolution: "string_decoder@npm:1.1.1" dependencies: @@ -14512,17 +14413,6 @@ __metadata: languageName: node linkType: hard -"wrap-ansi@npm:^6.0.1": - version: 6.2.0 - resolution: "wrap-ansi@npm:6.2.0" - dependencies: - ansi-styles: ^4.0.0 - string-width: ^4.1.0 - strip-ansi: ^6.0.0 - checksum: 6cd96a410161ff617b63581a08376f0cb9162375adeb7956e10c8cd397821f7eb2a6de24eb22a0b28401300bf228c86e50617cd568209b5f6775b93c97d2fe3a - languageName: node - linkType: hard - "wrap-ansi@npm:^8.1.0": version: 8.1.0 resolution: "wrap-ansi@npm:8.1.0"