diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4e1307a..d2ea2cf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,7 +13,7 @@ concurrency: env: # Min and max limits of jupyterlite-core versions that this should work on. # Changes here should be synchronised with pyproject.toml dependencies section. - MIN_LITE_VERSION: jupyterlite-core==0.6.0 + MIN_LITE_VERSION: jupyterlite-core==0.7.0a7 MAX_LITE_VERSION: --pre jupyterlite-core<0.8.0 LAB_VERSION: jupyterlab>=4.0.0,<5 diff --git a/package.json b/package.json index e537fb9..5bee593 100644 --- a/package.json +++ b/package.json @@ -64,8 +64,8 @@ "@jupyterlab/services": "^7.4.3", "@jupyterlab/settingregistry": "^4.4.3", "@jupyterlite/cockle": "^1.2.0", - "@jupyterlite/contents": "^0.6.0", - "@jupyterlite/server": "^0.6.0", + "@jupyterlite/contents": "^0.7.0-a7", + "@jupyterlite/server": "^0.7.0-a7", "@lumino/coreutils": "^2.2.1", "@lumino/signaling": "^2.1.4", "mock-socket": "^9.3.1" diff --git a/pyproject.toml b/pyproject.toml index 85489bd..90bf58d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,7 +24,7 @@ classifiers = [ ] dependencies = [ # Changes here should be synchronised with .github/workflows/build.yml - "jupyterlite-core>=0.6,<0.8.0" + "jupyterlite-core>=0.7.0a7,<0.8.0" ] dynamic = ["version", "description", "authors", "urls", "keywords"] diff --git a/src/index.ts b/src/index.ts index aa13b0a..1ebaee4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -20,6 +20,7 @@ import { ISettingRegistry } from '@jupyterlab/settingregistry'; import { WebSocket } from 'mock-socket'; import { LiteTerminalAPIClient } from './client'; +import { LiteCommand } from './lite_command'; import { ILiteTerminalAPIClient } from './tokens'; /** @@ -137,11 +138,32 @@ const terminalThemeChangePlugin: JupyterFrontEndPlugin = { } }; +const liteCommandPlugin: JupyterFrontEndPlugin = { + id: '@jupyterlite/terminal:lite-command', + autoStart: true, + requires: [ILiteTerminalAPIClient], + activate: ( + app: JupyterFrontEnd, + liteTerminalAPIClient: ILiteTerminalAPIClient + ): void => { + const liteCommand = new LiteCommand(app.commands); + const command = liteCommand.run.bind(liteCommand); + const tabComplete = liteCommand.tabComplete.bind(liteCommand); + + liteTerminalAPIClient.registerExternalCommand({ + name: 'lite-command', + command, + tabComplete + }); + } +}; + export default [ terminalClientPlugin, terminalManagerPlugin, terminalServiceWorkerPlugin, - terminalThemeChangePlugin + terminalThemeChangePlugin, + liteCommandPlugin ]; // Export ILiteTerminalAPIClient so that other extensions can register external commands. diff --git a/src/lite_command.ts b/src/lite_command.ts new file mode 100644 index 0000000..64983d4 --- /dev/null +++ b/src/lite_command.ts @@ -0,0 +1,320 @@ +import { + ansi, + BooleanArgument, + CommandArguments, + ExitCode, + IExternalRunContext, + IExternalTabCompleteContext, + IExternalTabCompleteResult, + PathType, + PositionalArguments, + SubcommandArguments +} from '@jupyterlite/cockle'; +import { CommandRegistry } from '@lumino/commands'; +import { PartialJSONObject } from '@lumino/coreutils'; + +class DescribeSubcommand extends SubcommandArguments { + positional = new PositionalArguments({ + min: 1, + tabComplete: async (context: IExternalTabCompleteContext) => { + const liteCommand: LiteCommand | undefined = (context as any).liteCommand; + return { possibles: liteCommand?.commandNames() ?? [] }; + } + }); +} + +class ListSubcommand extends SubcommandArguments {} + +class RunSubcommand extends SubcommandArguments { + positional = new PositionalArguments({ + min: 1, + tabComplete: async (context: IExternalTabCompleteContext) => { + const liteCommand: LiteCommand | undefined = (context as any).liteCommand; + let possibles: string[] | undefined = undefined; + if (liteCommand !== undefined) { + const { args } = context; + if (args.length === 1) { + // Command name. + possibles = liteCommand.commandNames(); + } else if (args.length % 2 === 0) { + // Argument name. + const commandName = args[0]; + possibles = await liteCommand.argumentNames(commandName); + } else { + // Argument value corresponding to the previous argument name. + const commandName = args[0]; + const argumentName = args[args.length - 2]; + const typeAndValues = await liteCommand.argumentTypeAndValues( + commandName, + argumentName + ); + possibles = typeAndValues?.values; + if ( + (possibles === undefined || possibles.length === 0) && + typeAndValues?.type === 'string' + ) { + // Match on path + return { pathType: PathType.Any }; + } + } + } + return { possibles }; + } + }); +} + +class LiteCommandArguments extends CommandArguments { + help = new BooleanArgument('h', 'help', 'display this help and exit'); + subcommands = { + list: new ListSubcommand('list', 'list available JupyterLite commands.'), + describe: new DescribeSubcommand( + 'describe', + 'describe one or more JupyterLite commands.' + ), + run: new RunSubcommand('run', 'Run a JupyterLite command') + }; +} + +export class LiteCommand { + constructor(readonly commandRegistry: CommandRegistry) {} + + async run(context: IExternalRunContext): Promise { + const { stdout } = context; + const args = new LiteCommandArguments().parse(context.args); + const { subcommands } = args; + + if (args.help.isSet) { + args.writeHelp(stdout); + return ExitCode.SUCCESS; + } + + if (subcommands.list.isSet) { + this.commandNames().forEach(name => stdout.write(name + '\n')); + } else if (subcommands.describe.isSet) { + let started = false; + for (const name of subcommands.describe.positional.strings) { + if (started) { + stdout.write('\n'); + } else { + started = true; + } + await this._describeCommand(context, name); + } + } else if (subcommands.run.isSet) { + const argumentsAndValues = subcommands.run.positional.strings; + const name = argumentsAndValues.shift()!; + await this._runCommand(name, argumentsAndValues); + } else { + return ExitCode.GENERAL_ERROR; + } + + return ExitCode.SUCCESS; + } + + async tabComplete( + context: IExternalTabCompleteContext + ): Promise { + const extendedContext = { ...context, liteCommand: this }; + return await new LiteCommandArguments().tabComplete(extendedContext); + } + + /** + * Return the argument names of a JupyterLite command. + */ + async argumentNames(commandName: string): Promise { + const description = await this.commandRegistry.describedBy(commandName); + const properties = description.args?.properties as any; + if (properties) { + return Object.keys(properties); + } + return []; + } + + /** + * Return the type and possible values of a JupyterLite command. + */ + async argumentTypeAndValues( + commandName: string, + argumentName: string + ): Promise<{ type: string; values: string[] | undefined } | undefined> { + const description = await this.commandRegistry.describedBy(commandName); + const properties = description.args?.properties as any; + if (properties) { + const property = properties[argumentName]; + if (property) { + const type = property['type'] ?? ''; + let values: string[] | undefined = undefined; + if (type === 'string') { + const enum_ = property['enum']; + if (enum_ && Array.isArray(enum_)) { + values = enum_.map(item => String(item)); + } + } + + // boolean possibles ???? + + return { type, values }; + } + } + return undefined; + } + + /** + * Return sorted list of JupyterLite command names. + */ + commandNames(): string[] { + return this.commandRegistry + .listCommands() + .filter(n => !n.startsWith('_')) + .sort(); + } + + /** + * Describe named command. + * @param name Name of command to describe. + */ + private async _describeCommand( + context: IExternalRunContext, + name: string + ): Promise { + if (!this._hasCommand(name)) { + throw new Error(`No such JupyterLite command: ${name}`); + } + + const { environment, stdout } = context; + let colorize = (text: string): string => text; + if (stdout.supportsAnsiEscapes()) { + const isDarkMode = environment.get('COCKLE_DARK_MODE') === '1'; + const color = isDarkMode ? ansi.styleBrightBlue : ansi.styleBlue; + colorize = (text: string): string => color + text + ansi.styleReset; + } + + const caption = this.commandRegistry.caption(name); + const label = this.commandRegistry.label(name); + const usage = this.commandRegistry.usage(name); + + stdout.write(`${colorize('name:')} ${name}\n`); + if (caption && caption.length > 0) { + stdout.write(`${colorize('caption:')} ${caption}\n`); + } + if (label && label.length > 0) { + stdout.write(`${colorize('label:')} ${label}\n`); + } + if (usage && usage.length > 0) { + stdout.write(`${colorize('usage:')} ${usage}\n`); + } + + const description = await this.commandRegistry.describedBy(name); + const properties = description.args?.properties as any; + if (properties) { + const argNames = Object.keys(properties); + if (argNames.length > 0) { + stdout.write(`${colorize('arguments:')}\n`); + } + + for (const argName of argNames) { + const arg = properties[argName]; + stdout.write(` ${argName}\n`); + stdout.write(` ${colorize('description:')} ${arg.description}\n`); + + const typeAndValues = await this.argumentTypeAndValues(name, argName); + if (typeAndValues !== undefined) { + const { type, values } = typeAndValues; + stdout.write(` ${colorize('type:')} ${type}\n`); + if (values !== undefined) { + stdout.write( + ` ${colorize('possible values:')} ${values.join(' ')}\n` + ); + } + } + } + } + + const required = description.args?.required; + if (required !== undefined && Array.isArray(required)) { + stdout.write( + `${colorize('required arguments:')} ${required.join(' ')}\n` + ); + } + + stdout.write( + `${colorize('isEnabled:')} ${this.commandRegistry.isEnabled(name)}\n` + ); + stdout.write( + `${colorize('isToggleable:')} ${this.commandRegistry.isToggleable(name)}\n` + ); + stdout.write( + `${colorize('isVisible:')} ${this.commandRegistry.isVisible(name)}\n` + ); + } + + private _hasCommand(commandName: string): boolean { + // This is more permissive than this.commandNames() which has some commands filtered out + // so that they will not appear when using tab completion. + return this.commandRegistry.hasCommand(commandName); + } + + /** + * Run JupyterLite command, throws an exception if fails. + * @param name + * @param argumentsAndValues + */ + private async _runCommand( + name: string, + argumentsAndValues: string[] + ): Promise { + if (!this._hasCommand(name)) { + throw new Error(`No such JupyterLite command: ${name}`); + } + + // Validate argument types and values. + const commandArgs: PartialJSONObject = {}; + const validArgNames = await this.argumentNames(name); + + while (argumentsAndValues.length > 0) { + const argName = argumentsAndValues.shift()!; + const argValue = argumentsAndValues.shift(); + if (!validArgNames.includes(argName)) { + throw new Error( + `JupyterLite command ${name} does not accept ${argName} argument` + ); + } + if (argValue === undefined) { + throw new Error( + `No value given for ${argName} argument to JupyterLite command ${name}` + ); + } + const validArgValues = await this.argumentTypeAndValues(name, argName); + // If nothing known about argument then cannot validate it. + if (validArgValues !== undefined) { + // validate type... + // may need to convert type or is string always acceptable???? + + if ( + validArgValues.values !== undefined && + !validArgValues.values.includes(argValue) + ) { + throw new Error( + `${argValue} is not valid for argument ${argName}. Acceptable values are: ${validArgValues.values.join(' ')}` + ); + } + } + commandArgs[argName] = argValue; + } + + // Validate required arguments. + const description = await this.commandRegistry.describedBy(name); + const required = description.args?.required; + if (required !== undefined && Array.isArray(required)) { + const missing = required.filter(x => !(x in commandArgs)); + if (missing.length > 0) { + throw new Error( + `JupyterLite command ${name} is missing required argument(s): ${missing.join(' ')}` + ); + } + } + + // Run command. + await this.commandRegistry.execute(name, commandArgs); + } +} diff --git a/yarn.lock b/yarn.lock index b74eae7..d815010 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2251,7 +2251,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/coreutils@npm:^6.4.3, @jupyterlab/coreutils@npm:^6.4.9, @jupyterlab/coreutils@npm:~6.4.5": +"@jupyterlab/coreutils@npm:^6.4.3, @jupyterlab/coreutils@npm:^6.4.9": version: 6.4.9 resolution: "@jupyterlab/coreutils@npm:6.4.9" dependencies: @@ -2265,6 +2265,20 @@ __metadata: languageName: node linkType: hard +"@jupyterlab/coreutils@npm:^6.5.0-beta.0, @jupyterlab/coreutils@npm:~6.5.0-beta.0": + version: 6.5.0-beta.0 + resolution: "@jupyterlab/coreutils@npm:6.5.0-beta.0" + dependencies: + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/signaling": ^2.1.4 + minimist: ~1.2.0 + path-browserify: ^1.0.0 + url-parse: ~1.5.4 + checksum: 96189ec5824a2cbd9ba70324866ae3fb3f54d432593b21404b686fb3130108b3aa30609f1ce3dbec46344547a5f3efdd6713235ed5bc044891c7c4038c527443 + languageName: node + linkType: hard + "@jupyterlab/docmanager@npm:^4.4.9": version: 4.4.9 resolution: "@jupyterlab/docmanager@npm:4.4.9" @@ -2387,7 +2401,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/nbformat@npm:^3.0.0 || ^4.0.0-alpha.21 || ^4.0.0, @jupyterlab/nbformat@npm:^4.4.9, @jupyterlab/nbformat@npm:~4.4.5": +"@jupyterlab/nbformat@npm:^3.0.0 || ^4.0.0-alpha.21 || ^4.0.0, @jupyterlab/nbformat@npm:^4.4.9": version: 4.4.9 resolution: "@jupyterlab/nbformat@npm:4.4.9" dependencies: @@ -2396,6 +2410,15 @@ __metadata: languageName: node linkType: hard +"@jupyterlab/nbformat@npm:^4.5.0-beta.0, @jupyterlab/nbformat@npm:~4.5.0-beta.0": + version: 4.5.0-beta.0 + resolution: "@jupyterlab/nbformat@npm:4.5.0-beta.0" + dependencies: + "@lumino/coreutils": ^2.2.1 + checksum: 812fb2e784be028f6f8bd6913d73877faa71e95fd1ec8a37b182238a34a0044de7d4699beb79df0e13a7bda9b443af2bf8917b89bbf523a1f3b418eef07d8c87 + languageName: node + linkType: hard + "@jupyterlab/notebook@npm:^4.4.9": version: 4.4.9 resolution: "@jupyterlab/notebook@npm:4.4.9" @@ -2434,7 +2457,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/observables@npm:^5.4.9, @jupyterlab/observables@npm:~5.4.5": +"@jupyterlab/observables@npm:^5.4.9": version: 5.4.9 resolution: "@jupyterlab/observables@npm:5.4.9" dependencies: @@ -2447,6 +2470,19 @@ __metadata: languageName: node linkType: hard +"@jupyterlab/observables@npm:~5.5.0-beta.0": + version: 5.5.0-beta.0 + resolution: "@jupyterlab/observables@npm:5.5.0-beta.0" + dependencies: + "@lumino/algorithm": ^2.0.3 + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/messaging": ^2.0.3 + "@lumino/signaling": ^2.1.4 + checksum: 81a93251940b8e8babea2461e68005d6faef399140758e6fb0a8a6b9fb58a08392fc7e9ab960e815669f88c19badd72a045f0f02f912b699b0f95081dd53ff1a + languageName: node + linkType: hard + "@jupyterlab/outputarea@npm:^4.4.9": version: 4.4.9 resolution: "@jupyterlab/outputarea@npm:4.4.9" @@ -2499,7 +2535,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/services@npm:^7.4.3, @jupyterlab/services@npm:^7.4.9, @jupyterlab/services@npm:~7.4.5": +"@jupyterlab/services@npm:^7.4.3, @jupyterlab/services@npm:^7.4.9": version: 7.4.9 resolution: "@jupyterlab/services@npm:7.4.9" dependencies: @@ -2518,7 +2554,26 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/settingregistry@npm:^4.4.3, @jupyterlab/settingregistry@npm:^4.4.9, @jupyterlab/settingregistry@npm:~4.4.5": +"@jupyterlab/services@npm:~7.5.0-beta.0": + version: 7.5.0-beta.0 + resolution: "@jupyterlab/services@npm:7.5.0-beta.0" + dependencies: + "@jupyter/ydoc": ^3.1.0 + "@jupyterlab/coreutils": ^6.5.0-beta.0 + "@jupyterlab/nbformat": ^4.5.0-beta.0 + "@jupyterlab/settingregistry": ^4.5.0-beta.0 + "@jupyterlab/statedb": ^4.5.0-beta.0 + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/polling": ^2.1.4 + "@lumino/properties": ^2.0.3 + "@lumino/signaling": ^2.1.4 + ws: ^8.11.0 + checksum: b70f19cc4728fcbdefa5d0055ebc29b8e9fac13140bbe1491b7c14d9dddac22b4c81b4434a16cff2021f4e7d076cf35ef319912f102785311151ae2dfd033400 + languageName: node + linkType: hard + +"@jupyterlab/settingregistry@npm:^4.4.3, @jupyterlab/settingregistry@npm:^4.4.9": version: 4.4.9 resolution: "@jupyterlab/settingregistry@npm:4.4.9" dependencies: @@ -2537,7 +2592,26 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/statedb@npm:^4.4.9, @jupyterlab/statedb@npm:~4.4.5": +"@jupyterlab/settingregistry@npm:^4.5.0-beta.0, @jupyterlab/settingregistry@npm:~4.5.0-beta.0": + version: 4.5.0-beta.0 + resolution: "@jupyterlab/settingregistry@npm:4.5.0-beta.0" + dependencies: + "@jupyterlab/nbformat": ^4.5.0-beta.0 + "@jupyterlab/statedb": ^4.5.0-beta.0 + "@lumino/commands": ^2.3.2 + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/signaling": ^2.1.4 + "@rjsf/utils": ^5.13.4 + ajv: ^8.12.0 + json5: ^2.2.3 + peerDependencies: + react: ">=16" + checksum: 36d5a13cef8b10836654778d09b4722d11e1c9a5f1a622559284b9258942f3e0a1fbf65e85d88d2bbdc0322984fe968ec790d2e15b1a1369a23aa91229bd99b6 + languageName: node + linkType: hard + +"@jupyterlab/statedb@npm:^4.4.9": version: 4.4.9 resolution: "@jupyterlab/statedb@npm:4.4.9" dependencies: @@ -2550,6 +2624,19 @@ __metadata: languageName: node linkType: hard +"@jupyterlab/statedb@npm:^4.5.0-beta.0, @jupyterlab/statedb@npm:~4.5.0-beta.0": + version: 4.5.0-beta.0 + resolution: "@jupyterlab/statedb@npm:4.5.0-beta.0" + dependencies: + "@lumino/commands": ^2.3.2 + "@lumino/coreutils": ^2.2.1 + "@lumino/disposable": ^2.1.4 + "@lumino/properties": ^2.0.3 + "@lumino/signaling": ^2.1.4 + checksum: 391227e8eb004395443e50c6fa64daabf6de5251071ec78cba102e0e0254a63b7167e93266c6f7fe9c8e63c3c1683eec2a5fe311dd10dc4d4276bda66296cac8 + languageName: node + linkType: hard + "@jupyterlab/statusbar@npm:^4.4.9": version: 4.4.9 resolution: "@jupyterlab/statusbar@npm:4.4.9" @@ -2684,97 +2771,97 @@ __metadata: languageName: node linkType: hard -"@jupyterlite/contents@npm:^0.6.0, @jupyterlite/contents@npm:^0.6.4": - version: 0.6.4 - resolution: "@jupyterlite/contents@npm:0.6.4" +"@jupyterlite/contents@npm:^0.7.0-a7, @jupyterlite/contents@npm:^0.7.0-alpha.7": + version: 0.7.0-alpha.7 + resolution: "@jupyterlite/contents@npm:0.7.0-alpha.7" dependencies: - "@jupyterlab/nbformat": ~4.4.5 - "@jupyterlab/services": ~7.4.5 - "@jupyterlite/localforage": ^0.6.4 + "@jupyterlab/nbformat": ~4.5.0-beta.0 + "@jupyterlab/services": ~7.5.0-beta.0 + "@jupyterlite/localforage": ^0.7.0-alpha.7 "@lumino/coreutils": ^2.2.1 "@types/emscripten": ^1.39.6 localforage: ^1.9.0 mime: ^3.0.0 - checksum: c4fd8c8ac5763023b49f64bae0df9cd028bd26ddc12b35c2022bff50c0a48586428bfe6809c092b711fb2d9312c7a51c091f3125dbdfe30ba678feb32063180c + checksum: bd3b7f1009f4a4b0ad32027c99d8b7cad9cf40a0d67efcb3d7903e0507a97ceaa68603d42d4efdd3186656ef2300bd1c4e2ad944387831a1bb62aebbd62e7b58 languageName: node linkType: hard -"@jupyterlite/kernel@npm:^0.6.4": - version: 0.6.4 - resolution: "@jupyterlite/kernel@npm:0.6.4" +"@jupyterlite/kernel@npm:^0.7.0-alpha.7": + version: 0.7.0-alpha.7 + resolution: "@jupyterlite/kernel@npm:0.7.0-alpha.7" dependencies: - "@jupyterlab/coreutils": ~6.4.5 - "@jupyterlab/observables": ~5.4.5 - "@jupyterlab/services": ~7.4.5 + "@jupyterlab/coreutils": ~6.5.0-beta.0 + "@jupyterlab/observables": ~5.5.0-beta.0 + "@jupyterlab/services": ~7.5.0-beta.0 "@lumino/coreutils": ^2.2.1 "@lumino/disposable": ^2.1.4 "@lumino/signaling": ^2.1.4 async-mutex: ^0.3.1 comlink: ^4.3.1 mock-socket: ^9.3.1 - checksum: ca04de42582c72ff0b00d05c8613930019c059d0a7b37d755f04e6fb623c31a61040bb4e0f2d817fa22cb5f8db9b61407f560b71025f41e6470897c12360a7c8 + checksum: 384129dbb44dea297cc9dcdea316d2d3f37d815645b38371584b34d0b6168ff4cf1369fa6a051f2b688763a989e54eb5c41a6804dd740afe8769e109db709c5a languageName: node linkType: hard -"@jupyterlite/localforage@npm:^0.6.4": - version: 0.6.4 - resolution: "@jupyterlite/localforage@npm:0.6.4" +"@jupyterlite/localforage@npm:^0.7.0-alpha.7": + version: 0.7.0-alpha.7 + resolution: "@jupyterlite/localforage@npm:0.7.0-alpha.7" dependencies: - "@jupyterlab/coreutils": ~6.4.5 + "@jupyterlab/coreutils": ~6.5.0-beta.0 "@lumino/coreutils": ^2.2.1 localforage: ^1.9.0 localforage-memoryStorageDriver: ^0.9.2 - checksum: 3d81ebae1e1de2018e82f0aa1cbaffd3f7d57c4e09e46736da56bbd45a1900a13edf4d990693a39fc255a5c066839347386a0d54aaae526b22a399444efd85eb + checksum: fa7f966f2952d9992d32346930ea427e734fb501ff0b208255385402c4392d938638a9fda8f287a1facdf3f38a116be751b7adf615a55e33356dbd9981d33fb3 languageName: node linkType: hard -"@jupyterlite/server@npm:^0.6.0": - version: 0.6.4 - resolution: "@jupyterlite/server@npm:0.6.4" +"@jupyterlite/server@npm:^0.7.0-a7": + version: 0.7.0-alpha.7 + resolution: "@jupyterlite/server@npm:0.7.0-alpha.7" dependencies: - "@jupyterlab/coreutils": ~6.4.5 - "@jupyterlab/nbformat": ~4.4.5 - "@jupyterlab/observables": ~5.4.5 - "@jupyterlab/services": ~7.4.5 - "@jupyterlab/settingregistry": ~4.4.5 - "@jupyterlab/statedb": ~4.4.5 - "@jupyterlite/contents": ^0.6.4 - "@jupyterlite/kernel": ^0.6.4 - "@jupyterlite/session": ^0.6.4 - "@jupyterlite/settings": ^0.6.4 + "@jupyterlab/coreutils": ~6.5.0-beta.0 + "@jupyterlab/nbformat": ~4.5.0-beta.0 + "@jupyterlab/observables": ~5.5.0-beta.0 + "@jupyterlab/services": ~7.5.0-beta.0 + "@jupyterlab/settingregistry": ~4.5.0-beta.0 + "@jupyterlab/statedb": ~4.5.0-beta.0 + "@jupyterlite/contents": ^0.7.0-alpha.7 + "@jupyterlite/kernel": ^0.7.0-alpha.7 + "@jupyterlite/session": ^0.7.0-alpha.7 + "@jupyterlite/settings": ^0.7.0-alpha.7 "@lumino/application": ^2.4.4 "@lumino/coreutils": ^2.2.1 "@lumino/signaling": ^2.1.4 "@types/emscripten": ^1.39.6 mock-socket: ^9.3.1 - checksum: d7698dcc8d27deab87c9c19be05363d3106c09f6935cc7471d1aa14daa0b750d94e9478694c007e38d771d275e6bdbbd2f594fe35f9fd6c36d1a23b1c20f896d + checksum: a5bb2476d0b8cf3d32997556aea2ed87b333d4281e7180cb6b5056242fac2449f4f1f4f8dafba38951be3c72dcbb89f5b0de10e96fbb10a942f8dcc41f773686 languageName: node linkType: hard -"@jupyterlite/session@npm:^0.6.4": - version: 0.6.4 - resolution: "@jupyterlite/session@npm:0.6.4" +"@jupyterlite/session@npm:^0.7.0-alpha.7": + version: 0.7.0-alpha.7 + resolution: "@jupyterlite/session@npm:0.7.0-alpha.7" dependencies: - "@jupyterlab/coreutils": ~6.4.5 - "@jupyterlab/services": ~7.4.5 - "@jupyterlite/kernel": ^0.6.4 + "@jupyterlab/coreutils": ~6.5.0-beta.0 + "@jupyterlab/services": ~7.5.0-beta.0 + "@jupyterlite/kernel": ^0.7.0-alpha.7 "@lumino/algorithm": ^2.0.3 "@lumino/coreutils": ^2.2.1 - checksum: 27321b8fcea3f36cb5fe4943c860adabe2ff9f4b288b7477edaac34ce01513270e51f9b0124145aef7c188ce89f345d0170588bd7897b86ad3049387ff57b26d + checksum: 509cd171bd80ba2035318ef887252b2fabccf70884b7af0ced04b52be438eac8390ce654b926f6e387515aa9b948b6005b0579514fc77215fb5ee89999fb7428 languageName: node linkType: hard -"@jupyterlite/settings@npm:^0.6.4": - version: 0.6.4 - resolution: "@jupyterlite/settings@npm:0.6.4" +"@jupyterlite/settings@npm:^0.7.0-alpha.7": + version: 0.7.0-alpha.7 + resolution: "@jupyterlite/settings@npm:0.7.0-alpha.7" dependencies: - "@jupyterlab/coreutils": ~6.4.5 - "@jupyterlab/settingregistry": ~4.4.5 - "@jupyterlite/localforage": ^0.6.4 + "@jupyterlab/coreutils": ~6.5.0-beta.0 + "@jupyterlab/settingregistry": ~4.5.0-beta.0 + "@jupyterlite/localforage": ^0.7.0-alpha.7 "@lumino/coreutils": ^2.2.1 json5: ^2.2.0 localforage: ^1.9.0 - checksum: b149cc4711c0a37685030353055202eff613925054df1a02f32e0c5696281d7c1e5b4cc0a151a7c8b29d0be8cf6b91915acd6251415c0a93cbc8f59337bd501e + checksum: 2588abef685f982c358cc4816736fa9d86481b006b0e1aaf70deaaa7be994d003264cba4630791862cef21896937b0fdc03898b7ef8cdbe53a96dbf204ec4c09 languageName: node linkType: hard @@ -2789,8 +2876,8 @@ __metadata: "@jupyterlab/settingregistry": ^4.4.3 "@jupyterlab/testutils": ^4.4.3 "@jupyterlite/cockle": ^1.2.0 - "@jupyterlite/contents": ^0.6.0 - "@jupyterlite/server": ^0.6.0 + "@jupyterlite/contents": ^0.7.0-a7 + "@jupyterlite/server": ^0.7.0-a7 "@lumino/coreutils": ^2.2.1 "@lumino/signaling": ^2.1.4 "@types/jest": ^29.2.0