From c3fa920a41481c675a3155c2bbb4ebc02bf01b9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=A4der?= Date: Tue, 1 Aug 2023 16:49:42 +0200 Subject: [PATCH 01/79] Quit Electron app when back end fails to start. Fixes #12769 (#12778) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Contributed on behalf of STMicroelectronics Signed-off-by: Thomas Mäder --- CHANGELOG.md | 2 ++ .../application-manager/src/generator/backend-generator.ts | 1 + packages/core/src/electron-main/electron-main-application.ts | 3 +++ 3 files changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index baac95bedfbe1..ecd2d342c9cfb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ ## History - [Previous Changelogs](https://github.com/eclipse-theia/theia/tree/master/doc/changelogs/) +## v1.41.0 - +- [application-package] Quit Electron app when back end fails to start [#12778](https://github.com/eclipse-theia/theia/pull/12778) - Contributed on behalf of STMicroelectronics. ## v1.40.0 - 07/27/2023 diff --git a/dev-packages/application-manager/src/generator/backend-generator.ts b/dev-packages/application-manager/src/generator/backend-generator.ts index c7f526095946b..d48e9484aa669 100644 --- a/dev-packages/application-manager/src/generator/backend-generator.ts +++ b/dev-packages/application-manager/src/generator/backend-generator.ts @@ -90,6 +90,7 @@ module.exports = Promise.resolve()${this.compileElectronMainModuleImports(electr if (reason) { console.error(reason); } + app.quit(); }); `; } diff --git a/packages/core/src/electron-main/electron-main-application.ts b/packages/core/src/electron-main/electron-main-application.ts index bf43b2cb025a4..a9db290a14b99 100644 --- a/packages/core/src/electron-main/electron-main-application.ts +++ b/packages/core/src/electron-main/electron-main-application.ts @@ -507,6 +507,9 @@ export class ElectronMainApplication { backendProcess.on('error', error => { reject(error); }); + backendProcess.on('exit', () => { + reject(new Error('backend process exited')); + }); app.on('quit', () => { // Only issue a kill signal if the backend process is running. // eslint-disable-next-line no-null/no-null From e4b9075ede8f6ec287f68267e91fd5a219ccfbd7 Mon Sep 17 00:00:00 2001 From: Mark Sujew Date: Wed, 2 Aug 2023 13:13:22 +0200 Subject: [PATCH 02/79] Reuse markdown instance for preferences widget (#12790) --- .../preference-markdown-renderer.ts | 68 +++++++++++++++++++ .../components/preference-node-renderer.ts | 31 +-------- .../views/preference-widget-bindings.ts | 3 + 3 files changed, 73 insertions(+), 29 deletions(-) create mode 100644 packages/preferences/src/browser/views/components/preference-markdown-renderer.ts diff --git a/packages/preferences/src/browser/views/components/preference-markdown-renderer.ts b/packages/preferences/src/browser/views/components/preference-markdown-renderer.ts new file mode 100644 index 0000000000000..231524e99a504 --- /dev/null +++ b/packages/preferences/src/browser/views/components/preference-markdown-renderer.ts @@ -0,0 +1,68 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { inject, injectable } from '@theia/core/shared/inversify'; +import { PreferenceTreeModel } from '../../preference-tree-model'; +import { PreferenceTreeLabelProvider } from '../../util/preference-tree-label-provider'; +import * as markdownit from '@theia/core/shared/markdown-it'; + +@injectable() +export class PreferenceMarkdownRenderer { + + @inject(PreferenceTreeModel) protected readonly model: PreferenceTreeModel; + @inject(PreferenceTreeLabelProvider) protected readonly labelProvider: PreferenceTreeLabelProvider; + + protected _renderer?: markdownit; + + render(text: string): string { + return this.getRenderer().render(text); + } + + renderInline(text: string): string { + return this.getRenderer().renderInline(text); + } + + protected getRenderer(): markdownit { + this._renderer ??= this.buildMarkdownRenderer(); + return this._renderer; + } + + protected buildMarkdownRenderer(): markdownit { + const engine = markdownit(); + const inlineCode = engine.renderer.rules.code_inline; + + engine.renderer.rules.code_inline = (tokens, idx, options, env, self) => { + const token = tokens[idx]; + const content = token.content; + if (content.startsWith('#') && content.endsWith('#')) { + const preferenceId = content.substring(1, content.length - 1); + const preferenceNode = this.model.getNodeFromPreferenceId(preferenceId); + if (preferenceNode) { + let name = this.labelProvider.getName(preferenceNode); + const prefix = this.labelProvider.getPrefix(preferenceNode, true); + if (prefix) { + name = prefix + name; + } + return `${name}`; + } else { + console.warn(`Linked preference "${preferenceId}" not found.`); + } + } + return inlineCode ? inlineCode(tokens, idx, options, env, self) : ''; + }; + return engine; + } +} diff --git a/packages/preferences/src/browser/views/components/preference-node-renderer.ts b/packages/preferences/src/browser/views/components/preference-node-renderer.ts index b034b8a477955..35fff31db55ef 100644 --- a/packages/preferences/src/browser/views/components/preference-node-renderer.ts +++ b/packages/preferences/src/browser/views/components/preference-node-renderer.ts @@ -27,9 +27,9 @@ import { JSONValue } from '@theia/core/shared/@phosphor/coreutils'; import debounce = require('@theia/core/shared/lodash.debounce'); import { PreferenceTreeModel } from '../../preference-tree-model'; import { PreferencesSearchbarWidget } from '../preference-searchbar-widget'; -import * as markdownit from '@theia/core/shared/markdown-it'; import * as DOMPurify from '@theia/core/shared/dompurify'; import URI from '@theia/core/lib/common/uri'; +import { PreferenceMarkdownRenderer } from './preference-markdown-renderer'; export const PreferenceNodeRendererFactory = Symbol('PreferenceNodeRendererFactory'); export type PreferenceNodeRendererFactory = (node: Preference.TreeNode) => PreferenceNodeRenderer; @@ -163,13 +163,13 @@ export abstract class PreferenceLeafNodeRenderer | undefined; protected isModifiedFromDefault = false; - protected markdownRenderer: markdownit; get schema(): PreferenceDataProperty { return this.preferenceNode.preference.data; @@ -179,7 +179,6 @@ export abstract class PreferenceLeafNodeRenderer(this.id, this.scopeTracker.currentScope.uri); } - protected buildMarkdownRenderer(): markdownit { - const engine = markdownit(); - const inlineCode = engine.renderer.rules.code_inline; - - engine.renderer.rules.code_inline = (tokens, idx, options, env, self) => { - const token = tokens[idx]; - const content = token.content; - if (content.startsWith('#') && content.endsWith('#')) { - const preferenceId = content.substring(1, content.length - 1); - const preferenceNode = this.model.getNodeFromPreferenceId(preferenceId); - if (preferenceNode) { - let name = this.labelProvider.getName(preferenceNode); - const prefix = this.labelProvider.getPrefix(preferenceNode, true); - if (prefix) { - name = prefix + name; - } - return `${name}`; - } else { - console.warn(`Linked preference "${preferenceId}" not found. Source: "${this.preferenceNode.preferenceId}"`); - } - } - return inlineCode ? inlineCode(tokens, idx, options, env, self) : ''; - }; - return engine; - } - protected openLink(event: MouseEvent): void { if (event.target instanceof HTMLAnchorElement) { event.preventDefault(); diff --git a/packages/preferences/src/browser/views/preference-widget-bindings.ts b/packages/preferences/src/browser/views/preference-widget-bindings.ts index a2369163124e4..926893f74ad96 100644 --- a/packages/preferences/src/browser/views/preference-widget-bindings.ts +++ b/packages/preferences/src/browser/views/preference-widget-bindings.ts @@ -30,6 +30,7 @@ import { import { PreferenceNumberInputRenderer, PreferenceNumberInputRendererContribution } from './components/preference-number-input'; import { PreferenceSelectInputRenderer, PreferenceSelectInputRendererContribution } from './components/preference-select-input'; import { PreferenceStringInputRenderer, PreferenceStringInputRendererContribution } from './components/preference-string-input'; +import { PreferenceMarkdownRenderer } from './components/preference-markdown-renderer'; import { PreferencesEditorWidget } from './preference-editor-widget'; import { PreferencesScopeTabBar } from './preference-scope-tabbar-widget'; import { PreferencesSearchbarWidget } from './preference-searchbar-widget'; @@ -95,5 +96,7 @@ export function createPreferencesWidgetContainer(parent: interfaces.Container): return creator.createRenderer(node, container); }); + child.bind(PreferenceMarkdownRenderer).toSelf().inSingletonScope(); + return child; } From ff10ef0dd60a51b7cbaa04d7eafb3bc31ce6690d Mon Sep 17 00:00:00 2001 From: Vincent Fugnitto Date: Thu, 3 Aug 2023 08:27:08 -0400 Subject: [PATCH 03/79] deps: perform `yarn upgrade` (#12698) The commit includes the following changes: - performs a `yarn upgrade` to better represent what downstream adopters will pull, and resolve known security vulnerabilities - pins `puppeteer` to prevent `protocolTimeout` errors Signed-off-by: vince-fugnitto --- dependency-check-baseline.json | 1 + dev-packages/application-manager/package.json | 4 +- dev-packages/application-package/package.json | 4 +- dev-packages/cli/package.json | 6 +- dev-packages/ovsx-client/package.json | 2 +- dev-packages/private-re-exports/package.json | 2 +- lerna.json | 8 +- package.json | 8 +- packages/core/package.json | 2 +- packages/plugin-ext/package.json | 2 +- packages/vsx-registry/package.json | 2 +- yarn.lock | 4649 +++++++++-------- 12 files changed, 2358 insertions(+), 2332 deletions(-) diff --git a/dependency-check-baseline.json b/dependency-check-baseline.json index 252cd2932f2d0..958754ff37a73 100644 --- a/dependency-check-baseline.json +++ b/dependency-check-baseline.json @@ -1,4 +1,5 @@ { + "npm/npmjs/-/allure-commandline/2.23.0": "Approved https://gitlab.eclipse.org/eclipsefdn/emo-team/iplab/-/issues/9379", "npm/npmjs/-/clone/2.1.2": "Under review, license believed to be MIT: https://gitlab.eclipse.org/eclipsefdn/emo-team/iplab/-/issues/7971", "npm/npmjs/-/eslint-plugin-deprecation/1.2.1": "Approved as 'works-with': https://dev.eclipse.org/ipzilla/show_bug.cgi?id=22573", "npm/npmjs/-/jschardet/2.3.0": "Approved for Eclipse Theia: https://dev.eclipse.org/ipzilla/show_bug.cgi?id=22481", diff --git a/dev-packages/application-manager/package.json b/dev-packages/application-manager/package.json index fe1acc781de6d..a59e9fe6a0483 100644 --- a/dev-packages/application-manager/package.json +++ b/dev-packages/application-manager/package.json @@ -37,7 +37,7 @@ "@theia/ffmpeg": "1.40.0", "@theia/native-webpack-plugin": "1.40.0", "@types/fs-extra": "^4.0.2", - "@types/semver": "^7.3.8", + "@types/semver": "^7.5.0", "babel-loader": "^8.2.2", "buffer": "^6.0.3", "compression-webpack-plugin": "^9.0.0", @@ -51,7 +51,7 @@ "node-abi": "*", "node-loader": "^2.0.0", "path-browserify": "^1.0.1", - "semver": "^7.3.5", + "semver": "^7.5.4", "setimmediate": "^1.0.5", "source-map": "^0.6.1", "source-map-loader": "^2.0.1", diff --git a/dev-packages/application-package/package.json b/dev-packages/application-package/package.json index 5e5249c75296e..5d59b586e58cc 100644 --- a/dev-packages/application-package/package.json +++ b/dev-packages/application-package/package.json @@ -31,14 +31,14 @@ "dependencies": { "@theia/request": "1.40.0", "@types/fs-extra": "^4.0.2", - "@types/semver": "^5.4.0", + "@types/semver": "^7.5.0", "@types/write-json-file": "^2.2.1", "deepmerge": "^4.2.2", "fs-extra": "^4.0.2", "is-electron": "^2.1.0", "nano": "^9.0.5", "resolve-package-path": "^4.0.3", - "semver": "^5.4.1", + "semver": "^7.5.4", "write-json-file": "^2.2.0" }, "devDependencies": { diff --git a/dev-packages/cli/package.json b/dev-packages/cli/package.json index d66ebbcfc2e3c..4860fb380d8a0 100644 --- a/dev-packages/cli/package.json +++ b/dev-packages/cli/package.json @@ -47,9 +47,9 @@ "limiter": "^2.1.0", "log-update": "^4.0.0", "mocha": "^10.1.0", - "puppeteer": "^19.7.2", - "puppeteer-core": "^19.7.2", - "puppeteer-to-istanbul": "^1.4.0", + "puppeteer": "19.7.2", + "puppeteer-core": "19.7.2", + "puppeteer-to-istanbul": "1.4.0", "temp": "^0.9.1", "yargs": "^15.3.1" }, diff --git a/dev-packages/ovsx-client/package.json b/dev-packages/ovsx-client/package.json index 454fe271d4b56..48f53aa6b32a7 100644 --- a/dev-packages/ovsx-client/package.json +++ b/dev-packages/ovsx-client/package.json @@ -30,6 +30,6 @@ }, "dependencies": { "@theia/request": "1.40.0", - "semver": "^5.4.1" + "semver": "^7.5.4" } } diff --git a/dev-packages/private-re-exports/package.json b/dev-packages/private-re-exports/package.json index 5093b2984167f..41e72b8470a72 100644 --- a/dev-packages/private-re-exports/package.json +++ b/dev-packages/private-re-exports/package.json @@ -25,7 +25,7 @@ }, "dependencies": { "mustache": "^4.2.0", - "semver": "^7.3.5", + "semver": "^7.5.4", "yargs": "^15.3.1" }, "devDependencies": { diff --git a/lerna.json b/lerna.json index 8aee1e8583b59..186d5552f5f19 100644 --- a/lerna.json +++ b/lerna.json @@ -1,7 +1,6 @@ { - "lerna": "2.2.0", + "$schema": "https://json.schemastore.org/lerna.json", "npmClient": "yarn", - "useWorkspaces": true, "version": "1.40.0", "command": { "run": { @@ -10,8 +9,9 @@ "publish": { "forcePublish": true, "graphType": "all", - "skipGit": true, - "registry": "https://registry.npmjs.org/" + "registry": "https://registry.npmjs.org/", + "push": false, + "gitTagVersion": false } } } diff --git a/package.json b/package.json index dbda4a4b56a5d..162832b8cc325 100644 --- a/package.json +++ b/package.json @@ -40,14 +40,14 @@ "ignore-styles": "^5.0.1", "improved-yarn-audit": "^3.0.0", "jsdom": "^21.1.1", - "lerna": "^6.0.1", + "lerna": "^7.1.1", "mkdirp": "^0.5.0", "node-gyp": "^9.0.0", "nsfw": "^2.2.4", "nyc": "^15.0.0", - "puppeteer": "^19.7.2", - "puppeteer-core": "^19.7.2", - "puppeteer-to-istanbul": "^1.4.0", + "puppeteer": "19.7.2", + "puppeteer-core": "19.7.2", + "puppeteer-to-istanbul": "1.4.0", "rimraf": "^2.6.1", "sinon": "^12.0.0", "temp": "^0.9.1", diff --git a/packages/core/package.json b/packages/core/package.json index 7abfcf33057cc..b271d30e0b901 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -55,7 +55,7 @@ "lodash.debounce": "^4.0.8", "lodash.throttle": "^4.1.1", "markdown-it": "^12.3.2", - "msgpackr": "^1.6.1", + "msgpackr": "1.6.1", "nsfw": "^2.2.4", "p-debounce": "^2.1.0", "perfect-scrollbar": "^1.3.0", diff --git a/packages/plugin-ext/package.json b/packages/plugin-ext/package.json index 281fc297f7fe9..c34ce9a3abdc2 100644 --- a/packages/plugin-ext/package.json +++ b/packages/plugin-ext/package.json @@ -42,7 +42,7 @@ "macaddress": "^0.2.9", "mime": "^2.4.4", "ps-tree": "^1.2.0", - "semver": "^5.4.1", + "semver": "^7.5.4", "uuid": "^8.0.0", "vhost": "^3.0.2", "vscode-textmate": "^7.0.3" diff --git a/packages/vsx-registry/package.json b/packages/vsx-registry/package.json index c47b720f32765..fde2d00fa52b8 100644 --- a/packages/vsx-registry/package.json +++ b/packages/vsx-registry/package.json @@ -12,7 +12,7 @@ "@theia/workspace": "1.40.0", "luxon": "^2.4.0", "p-debounce": "^2.1.0", - "semver": "^5.4.1", + "semver": "^7.5.4", "uuid": "^8.0.0" }, "publishConfig": { diff --git a/yarn.lock b/yarn.lock index af8c2a1af3b95..7b80f2c2101fc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,12 +2,17 @@ # yarn lockfile v1 -"@ampproject/remapping@^2.1.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== dependencies: - "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" "@babel/code-frame@7.12.11": @@ -17,404 +22,282 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" + integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== dependencies: - "@babel/highlight" "^7.18.6" + "@babel/highlight" "^7.22.5" -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": - version "7.20.14" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.14.tgz#4106fc8b755f3e3ee0a0a7c27dde5de1d2b2baf8" - integrity sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw== +"@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.6.tgz#15606a20341de59ba02cd2fcc5086fcbe73bf544" + integrity sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg== "@babel/core@^7.10.0", "@babel/core@^7.7.5": - version "7.20.12" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d" - integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.7" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helpers" "^7.20.7" - "@babel/parser" "^7.20.7" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.12" - "@babel/types" "^7.20.7" + version "7.22.8" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.8.tgz#386470abe884302db9c82e8e5e87be9e46c86785" + integrity sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.7" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helpers" "^7.22.6" + "@babel/parser" "^7.22.7" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.8" + "@babel/types" "^7.22.5" + "@nicolo-ribaudo/semver-v6" "^6.3.3" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.2" - semver "^6.3.0" -"@babel/generator@^7.20.7": - version "7.20.14" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.14.tgz#9fa772c9f86a46c6ac9b321039400712b96f64ce" - integrity sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg== +"@babel/generator@^7.22.7": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.7.tgz#a6b8152d5a621893f2c9dacf9a4e286d520633d5" + integrity sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ== dependencies: - "@babel/types" "^7.20.7" + "@babel/types" "^7.22.5" "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" - integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.22.5" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" - integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz#a3f4758efdd0190d8927fcffd261755937c71878" + integrity sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw== dependencies: - "@babel/helper-explode-assignable-expression" "^7.18.6" - "@babel/types" "^7.18.9" + "@babel/types" "^7.22.5" -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" - integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== +"@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz#e30d61abe9480aa5a83232eb31c111be922d2e52" + integrity sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA== dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.21.3" + "@babel/compat-data" "^7.22.6" + "@babel/helper-validator-option" "^7.22.5" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + browserslist "^4.21.9" lru-cache "^5.1.1" - semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.5", "@babel/helper-create-class-features-plugin@^7.20.7": - version "7.20.12" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz#4349b928e79be05ed2d1643b20b99bb87c503819" - integrity sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-member-expression-to-functions" "^7.20.7" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/helper-split-export-declaration" "^7.18.6" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz#5ea79b59962a09ec2acf20a963a01ab4d076ccca" - integrity sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.2.1" - -"@babel/helper-define-polyfill-provider@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" - integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== +"@babel/helper-create-class-features-plugin@^7.22.5": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.6.tgz#58564873c889a6fea05a538e23f9f6d201f10950" + integrity sha512-iwdzgtSiBxF6ni6mzVnZCF3xt5qE6cEA0J7nFt8QOAWZ0zjCFceEgpn3vtb2V7WFR6QzP2jmIFOHMTRo7eNJjQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.6.tgz#87afd63012688ad792de430ceb3b6dc28e4e7a40" + integrity sha512-nBookhLKxAWo/TUCmhnaEJyLz2dekjQvv5SRpE9epWQBcpedWLKt8aZdsuT9XV5ovzR3fENLjRXVT0GsSlGGhA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + regexpu-core "^5.3.1" + +"@babel/helper-define-polyfill-provider@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.1.tgz#af1429c4a83ac316a6a8c2cc8ff45cb5d2998d3a" + integrity sha512-kX4oXixDxG197yhX+J3Wp+NpL2wuCFjWQAr6yX2jtCnflK9ulMI51ULFGIrWiX1jGfvAxdHp+XQCcP2bZGPs9A== dependencies: - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" debug "^4.1.1" lodash.debounce "^4.0.8" resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== - -"@babel/helper-explode-assignable-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" - integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" - integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== - dependencies: - "@babel/template" "^7.18.10" - "@babel/types" "^7.19.0" - -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-member-expression-to-functions@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz#a6f26e919582275a93c3aa6594756d71b0bb7f05" - integrity sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw== - dependencies: - "@babel/types" "^7.20.7" - -"@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" - integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.10" - "@babel/types" "^7.20.7" - -"@babel/helper-optimise-call-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" - integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" - integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== - -"@babel/helper-remap-async-to-generator@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" - integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-wrap-function" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" - integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.20.7" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/helper-simple-access@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" - integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== - dependencies: - "@babel/types" "^7.20.2" - -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" - integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== - dependencies: - "@babel/types" "^7.20.0" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== - -"@babel/helper-wrap-function@^7.18.9": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" - integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== - dependencies: - "@babel/helper-function-name" "^7.19.0" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" - -"@babel/helpers@^7.20.7": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.13.tgz#e3cb731fb70dc5337134cadc24cbbad31cc87ad2" - integrity sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg== - dependencies: - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.13" - "@babel/types" "^7.20.7" -"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" +"@babel/helper-environment-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" + integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== + +"@babel/helper-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" + integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== + dependencies: + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-member-expression-to-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz#0a7c56117cad3372fbf8d2fb4bf8f8d64a1e76b2" + integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-imports@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" + integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-transforms@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef" + integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-remap-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz#14a38141a7bf2165ad38da61d61cf27b43015da2" + integrity sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-wrap-function" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-replace-supers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz#71bc5fb348856dea9fdc4eafd7e2e49f585145dc" + integrity sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.5", "@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== + +"@babel/helper-validator-option@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" + integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== + +"@babel/helper-wrap-function@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.5.tgz#44d205af19ed8d872b4eefb0d2fa65f45eb34f06" + integrity sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helpers@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.6.tgz#8e61d3395a4f0c5a8060f309fb008200969b5ecd" + integrity sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA== + dependencies: + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.6" + "@babel/types" "^7.22.5" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" + integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.20.13", "@babel/parser@^7.20.7": - version "7.20.15" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.15.tgz#eec9f36d8eaf0948bb88c87a46784b5ee9fd0c89" - integrity sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" - integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" - integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-proposal-optional-chaining" "^7.20.7" - -"@babel/plugin-proposal-async-generator-functions@^7.20.1": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" - integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-class-static-block@^7.18.6": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz#92592e9029b13b15be0f7ce6a7aedc2879ca45a7" - integrity sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.20.7" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-dynamic-import@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" - integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-namespace-from@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" - integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" - integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" - integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" - integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" - integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.20.2": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" - integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== - dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.20.7" - -"@babel/plugin-proposal-optional-catch-binding@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" - integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" +"@babel/parser@^7.22.5", "@babel/parser@^7.22.7": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae" + integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== -"@babel/plugin-proposal-optional-chaining@^7.18.9", "@babel/plugin-proposal-optional-chaining@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz#49f2b372519ab31728cc14115bb0998b15bfda55" - integrity sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz#87245a21cd69a73b0b81bcda98d443d6df08f05e" + integrity sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-proposal-private-methods@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" - integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz#fef09f9499b1f1c930da8a0c419db42167d792ca" + integrity sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g== dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.5" -"@babel/plugin-proposal-private-property-in-object@^7.18.6": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz#309c7668f2263f1c711aa399b5a9a6291eef6135" - integrity sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.20.5" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== -"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== @@ -457,12 +340,26 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-import-assertions@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" - integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== +"@babel/plugin-syntax-import-assertions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98" + integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-attributes@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb" + integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" @@ -527,301 +424,434 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-arrow-functions@^7.18.6": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz#bea332b0e8b2dab3dafe55a163d8227531ab0551" - integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-async-to-generator@^7.18.6": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" - integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== +"@babel/plugin-transform-arrow-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958" + integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-block-scoped-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" - integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== +"@babel/plugin-transform-async-generator-functions@^7.22.7": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz#053e76c0a903b72b573cb1ab7d6882174d460a1b" + integrity sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-transform-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" + integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" + +"@babel/plugin-transform-block-scoped-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024" + integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-block-scoping@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz#8bfc793b3a4b2742c0983fadc1480d843ecea31b" + integrity sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77" + integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-static-block@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz#3e40c46f048403472d6f4183116d5e46b1bff5ba" + integrity sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-block-scoping@^7.20.2": - version "7.20.15" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.15.tgz#3e1b2aa9cbbe1eb8d644c823141a9c5c2a22392d" - integrity sha512-Vv4DMZ6MiNOhu/LdaZsT/bsLRxgL94d269Mv4R/9sp6+Mp++X/JqypZYypJXLlM4mlL352/Egzbzr98iABH1CA== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-classes@^7.10.0", "@babel/plugin-transform-classes@^7.20.2": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz#f438216f094f6bb31dc266ebfab8ff05aecad073" - integrity sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-split-export-declaration" "^7.18.6" +"@babel/plugin-transform-classes@^7.10.0", "@babel/plugin-transform-classes@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz#e04d7d804ed5b8501311293d1a0e6d43e94c3363" + integrity sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.18.9": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz#704cc2fd155d1c996551db8276d55b9d46e4d0aa" - integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== +"@babel/plugin-transform-computed-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" + integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/template" "^7.20.7" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.5" -"@babel/plugin-transform-destructuring@^7.20.2": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz#8bda578f71620c7de7c93af590154ba331415454" - integrity sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA== +"@babel/plugin-transform-destructuring@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz#d3aca7438f6c26c78cdd0b0ba920a336001b27cc" + integrity sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" - integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== +"@babel/plugin-transform-dotall-regex@^7.22.5", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165" + integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-duplicate-keys@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" - integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== +"@babel/plugin-transform-duplicate-keys@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285" + integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-exponentiation-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" - integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== +"@babel/plugin-transform-dynamic-import@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz#d6908a8916a810468c4edff73b5b75bda6ad393e" + integrity sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-transform-for-of@^7.18.8": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" - integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== +"@babel/plugin-transform-exponentiation-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a" + integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" - integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== +"@babel/plugin-transform-export-namespace-from@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz#57c41cb1d0613d22f548fddd8b288eedb9973a5b" + integrity sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg== dependencies: - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" - integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== +"@babel/plugin-transform-for-of@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz#ab1b8a200a8f990137aff9a084f8de4099ab173f" + integrity sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-member-expression-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" - integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== +"@babel/plugin-transform-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" + integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-amd@^7.19.6": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" - integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== +"@babel/plugin-transform-json-strings@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz#14b64352fdf7e1f737eed68de1a1468bd2a77ec0" + integrity sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A== dependencies: - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-modules-commonjs@^7.19.6": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz#8cb23010869bf7669fd4b3098598b6b2be6dc607" - integrity sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw== +"@babel/plugin-transform-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" + integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== dependencies: - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-systemjs@^7.19.6": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" - integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== +"@babel/plugin-transform-logical-assignment-operators@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz#66ae5f068fd5a9a5dc570df16f56c2a8462a9d6c" + integrity sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA== dependencies: - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-identifier" "^7.19.1" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-modules-umd@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" - integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== +"@babel/plugin-transform-member-expression-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def" + integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" - integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== +"@babel/plugin-transform-modules-amd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz#4e045f55dcf98afd00f85691a68fc0780704f526" + integrity sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.20.5" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-new-target@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" - integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== +"@babel/plugin-transform-modules-commonjs@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz#7d9875908d19b8c0536085af7b053fd5bd651bfa" + integrity sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-object-super@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" - integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== +"@babel/plugin-transform-modules-systemjs@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz#18c31410b5e579a0092638f95c896c2a98a5d496" + integrity sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.6" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" -"@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz#0ee349e9d1bc96e78e3b37a7af423a4078a7083f" - integrity sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA== +"@babel/plugin-transform-modules-umd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98" + integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-property-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" - integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-new-target@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d" + integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz#f8872c65776e0b552e0849d7596cddd416c3e381" + integrity sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz#57226a2ed9e512b9b446517ab6fa2d17abb83f58" + integrity sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz#9686dc3447df4753b0b2a2fae7e8bc33cdc1f2e1" + integrity sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ== + dependencies: + "@babel/compat-data" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.22.5" + +"@babel/plugin-transform-object-super@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c" + integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" -"@babel/plugin-transform-regenerator@^7.18.6": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" - integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== +"@babel/plugin-transform-optional-catch-binding@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz#842080be3076703be0eaf32ead6ac8174edee333" + integrity sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.22.5", "@babel/plugin-transform-optional-chaining@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz#4bacfe37001fe1901117672875e931d439811564" + integrity sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz#c3542dd3c39b42c8069936e48717a8d179d63a18" + integrity sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-methods@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722" + integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-property-in-object@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz#07a77f28cbb251546a43d175a1dda4cf3ef83e32" + integrity sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766" + integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-regenerator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz#cd8a68b228a5f75fa01420e8cc2fc400f0fc32aa" + integrity sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" regenerator-transform "^0.15.1" -"@babel/plugin-transform-reserved-words@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" - integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== +"@babel/plugin-transform-reserved-words@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb" + integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-runtime@^7.10.0": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz#9d2a9dbf4e12644d6f46e5e75bfbf02b5d6e9194" - integrity sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw== - dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.19.0" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - semver "^6.3.0" + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.7.tgz#eb9094b5fb756cc2d98d398b2c88aeefa9205de9" + integrity sha512-o02xM7iY7mSPI+TvaYDH0aYl+lg3+KT7qrD705JlsB/GrZSNaYO/4i+aDFKPiJ7ubq3hgv8NNLCdyB5MFxT8mg== + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + babel-plugin-polyfill-corejs2 "^0.4.4" + babel-plugin-polyfill-corejs3 "^0.8.2" + babel-plugin-polyfill-regenerator "^0.5.1" -"@babel/plugin-transform-shorthand-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" - integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== +"@babel/plugin-transform-shorthand-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624" + integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-spread@^7.19.0": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" - integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== +"@babel/plugin-transform-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" + integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" -"@babel/plugin-transform-sticky-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" - integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== +"@babel/plugin-transform-sticky-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa" + integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-template-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" - integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== +"@babel/plugin-transform-template-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff" + integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-typeof-symbol@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" - integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== +"@babel/plugin-transform-typeof-symbol@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34" + integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-escapes@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" - integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== +"@babel/plugin-transform-unicode-escapes@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz#ce0c248522b1cb22c7c992d88301a5ead70e806c" + integrity sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" - integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== +"@babel/plugin-transform-unicode-property-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81" + integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183" + integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-sets-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91" + integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/preset-env@^7.10.0": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.20.2.tgz#9b1642aa47bb9f43a86f9630011780dab7f86506" - integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== - dependencies: - "@babel/compat-data" "^7.20.1" - "@babel/helper-compilation-targets" "^7.20.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-async-generator-functions" "^7.20.1" - "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-class-static-block" "^7.18.6" - "@babel/plugin-proposal-dynamic-import" "^7.18.6" - "@babel/plugin-proposal-export-namespace-from" "^7.18.9" - "@babel/plugin-proposal-json-strings" "^7.18.6" - "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" - "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.20.2" - "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-private-methods" "^7.18.6" - "@babel/plugin-proposal-private-property-in-object" "^7.18.6" - "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.7.tgz#a1ef34b64a80653c22ce4d9c25603cfa76fc168a" + integrity sha512-1whfDtW+CzhETuzYXfcgZAh8/GFMeEbz0V5dVgya8YeJyCU6Y/P2Gnx4Qb3MylK68Zu9UiwUvbPMPTpFAOJ+sQ== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.5" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.5" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/plugin-syntax-import-assertions" "^7.22.5" + "@babel/plugin-syntax-import-attributes" "^7.22.5" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" @@ -831,45 +861,62 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.18.6" - "@babel/plugin-transform-async-to-generator" "^7.18.6" - "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.20.2" - "@babel/plugin-transform-classes" "^7.20.2" - "@babel/plugin-transform-computed-properties" "^7.18.9" - "@babel/plugin-transform-destructuring" "^7.20.2" - "@babel/plugin-transform-dotall-regex" "^7.18.6" - "@babel/plugin-transform-duplicate-keys" "^7.18.9" - "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-for-of" "^7.18.8" - "@babel/plugin-transform-function-name" "^7.18.9" - "@babel/plugin-transform-literals" "^7.18.9" - "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.19.6" - "@babel/plugin-transform-modules-commonjs" "^7.19.6" - "@babel/plugin-transform-modules-systemjs" "^7.19.6" - "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" - "@babel/plugin-transform-new-target" "^7.18.6" - "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.20.1" - "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.18.6" - "@babel/plugin-transform-reserved-words" "^7.18.6" - "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.19.0" - "@babel/plugin-transform-sticky-regex" "^7.18.6" - "@babel/plugin-transform-template-literals" "^7.18.9" - "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.18.10" - "@babel/plugin-transform-unicode-regex" "^7.18.6" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.22.5" + "@babel/plugin-transform-async-generator-functions" "^7.22.7" + "@babel/plugin-transform-async-to-generator" "^7.22.5" + "@babel/plugin-transform-block-scoped-functions" "^7.22.5" + "@babel/plugin-transform-block-scoping" "^7.22.5" + "@babel/plugin-transform-class-properties" "^7.22.5" + "@babel/plugin-transform-class-static-block" "^7.22.5" + "@babel/plugin-transform-classes" "^7.22.6" + "@babel/plugin-transform-computed-properties" "^7.22.5" + "@babel/plugin-transform-destructuring" "^7.22.5" + "@babel/plugin-transform-dotall-regex" "^7.22.5" + "@babel/plugin-transform-duplicate-keys" "^7.22.5" + "@babel/plugin-transform-dynamic-import" "^7.22.5" + "@babel/plugin-transform-exponentiation-operator" "^7.22.5" + "@babel/plugin-transform-export-namespace-from" "^7.22.5" + "@babel/plugin-transform-for-of" "^7.22.5" + "@babel/plugin-transform-function-name" "^7.22.5" + "@babel/plugin-transform-json-strings" "^7.22.5" + "@babel/plugin-transform-literals" "^7.22.5" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.5" + "@babel/plugin-transform-member-expression-literals" "^7.22.5" + "@babel/plugin-transform-modules-amd" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.5" + "@babel/plugin-transform-modules-systemjs" "^7.22.5" + "@babel/plugin-transform-modules-umd" "^7.22.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.22.5" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.5" + "@babel/plugin-transform-numeric-separator" "^7.22.5" + "@babel/plugin-transform-object-rest-spread" "^7.22.5" + "@babel/plugin-transform-object-super" "^7.22.5" + "@babel/plugin-transform-optional-catch-binding" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.6" + "@babel/plugin-transform-parameters" "^7.22.5" + "@babel/plugin-transform-private-methods" "^7.22.5" + "@babel/plugin-transform-private-property-in-object" "^7.22.5" + "@babel/plugin-transform-property-literals" "^7.22.5" + "@babel/plugin-transform-regenerator" "^7.22.5" + "@babel/plugin-transform-reserved-words" "^7.22.5" + "@babel/plugin-transform-shorthand-properties" "^7.22.5" + "@babel/plugin-transform-spread" "^7.22.5" + "@babel/plugin-transform-sticky-regex" "^7.22.5" + "@babel/plugin-transform-template-literals" "^7.22.5" + "@babel/plugin-transform-typeof-symbol" "^7.22.5" + "@babel/plugin-transform-unicode-escapes" "^7.22.5" + "@babel/plugin-transform-unicode-property-regex" "^7.22.5" + "@babel/plugin-transform-unicode-regex" "^7.22.5" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.20.2" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - core-js-compat "^3.25.1" - semver "^6.3.0" + "@babel/types" "^7.22.5" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + babel-plugin-polyfill-corejs2 "^0.4.4" + babel-plugin-polyfill-corejs3 "^0.8.2" + babel-plugin-polyfill-regenerator "^0.5.1" + core-js-compat "^3.31.0" "@babel/preset-modules@^0.1.5": version "0.1.5" @@ -888,44 +935,44 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.10.0", "@babel/runtime@^7.8.4": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" - integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA== + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.6.tgz#57d64b9ae3cff1d67eb067ae117dac087f5bd438" + integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ== dependencies: regenerator-runtime "^0.13.11" -"@babel/template@^7.18.10", "@babel/template@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.13", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.13.tgz#817c1ba13d11accca89478bd5481b2d168d07473" - integrity sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.20.13" - "@babel/types" "^7.20.7" +"@babel/template@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" + integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/traverse@^7.22.5", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8": + version "7.22.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.8.tgz#4d4451d31bc34efeae01eac222b514a77aa4000e" + integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.7" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.22.7" + "@babel/types" "^7.22.5" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.4.4": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" - integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== +"@babel/types@^7.22.5", "@babel/types@^7.4.4": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" + integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" to-fast-properties "^2.0.0" "@discoveryjs/json-ext@^0.5.0": @@ -963,11 +1010,6 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@gar/promisify@^1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" - integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== - "@humanwhocodes/config-array@^0.5.0": version "0.5.0" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" @@ -987,10 +1029,17 @@ resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" integrity sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q== -"@isaacs/string-locale-compare@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz#291c227e93fd407a96ecd59879a35809120e432b" - integrity sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ== +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" @@ -1008,18 +1057,17 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== +"@jest/schemas@^29.6.0": + version "29.6.0" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.0.tgz#0f4cb2c8e3dca80c135507ba5635a4fd755b0040" + integrity sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ== dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" + "@sinclair/typebox" "^0.27.8" "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== dependencies: "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" @@ -1030,58 +1078,63 @@ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": +"@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/source-map@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" - integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== +"@jridgewell/source-map@^0.3.3": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" + integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== dependencies: "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@1.4.14": version "1.4.14" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== dependencies: "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" -"@lerna/child-process@6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-6.5.1.tgz#da9161ba00e8d67fa7241a709703e5cc5e4a5e5e" - integrity sha512-QfyleXSD9slh4qM54wDaqKVPvtUH1NJMgsFc9BabqSHO1Ttpandv1EAvTCN9Lu73RbCX3LJpn+BfJmnjHbjCyw== +"@lerna/child-process@7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@lerna/child-process/-/child-process-7.1.1.tgz#60eddd6dc4b6ba0fd51851c78b6dbdc4e1614220" + integrity sha512-mR8PaTkckYPLmEBG2VsVsJq2UuzEvjXevOB1rKLKUZ/dPCGcottVhbiEzTxickc+s7Y/1dTTLn/1BKj3B1a5BA== dependencies: chalk "^4.1.0" execa "^5.0.0" strong-log-transformer "^2.1.0" -"@lerna/create@6.5.1": - version "6.5.1" - resolved "https://registry.yarnpkg.com/@lerna/create/-/create-6.5.1.tgz#326b5d26c247bfc9e2d8728aa1f69419840cec8c" - integrity sha512-ejERJnfA36jEuKrfM+94feLiyf2/hF2NoG923N0rE4rsmvRFPr1XLVPvAKleXW+Gdi/t1p410lJ7NKaLRMYCYw== +"@lerna/create@7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@lerna/create/-/create-7.1.1.tgz#2af94afb01971c1b594c06347b6998607aefe5c4" + integrity sha512-1PY2OgwGxp7b91JzLKEhONVl69mCt1IyYEc6pzKy3Sv+UOdeK2QFq1SX/85hNOR3iitiyZ75bNWUTcBly1ZlZg== dependencies: - "@lerna/child-process" "6.5.1" - dedent "^0.7.0" - fs-extra "^9.1.0" - init-package-json "^3.0.2" + "@lerna/child-process" "7.1.1" + dedent "0.7.0" + fs-extra "^11.1.1" + init-package-json "5.0.0" npm-package-arg "8.1.1" p-reduce "^2.1.0" - pacote "^13.6.1" - pify "^5.0.0" + pacote "^15.2.0" + pify "5.0.0" semver "^7.3.4" slash "^3.0.0" validate-npm-package-license "^3.0.4" - validate-npm-package-name "^4.0.0" + validate-npm-package-name "5.0.0" yargs-parser "20.2.4" "@malept/cross-spawn-promise@^2.0.0": @@ -1091,35 +1144,40 @@ dependencies: cross-spawn "^7.0.1" -"@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.0.tgz#d31a238c943ffc34bab73ad6ce7a6466d65888ef" - integrity sha512-5qpnNHUyyEj9H3sm/4Um/bnx1lrQGhe8iqry/1d+cQYCRd/gzYA0YLeq0ezlk4hKx4vO+dsEsNyeowqRqslwQA== +"@msgpackr-extract/msgpackr-extract-darwin-arm64@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-2.2.0.tgz#901c5937e1441572ea23e631fe6deca68482fe76" + integrity sha512-Z9LFPzfoJi4mflGWV+rv7o7ZbMU5oAU9VmzCgL240KnqDW65Y2HFCT3MW06/ITJSnbVLacmcEJA8phywK7JinQ== -"@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.0.tgz#2f6fbbec3d3f0bbe9c6678c899f1c1a6e25ed980" - integrity sha512-ZphTFFd6SFweNAMKD+QJCrWpgkjf4qBuHltiMkKkD6FFrB3NOTRVmetAGTkJ57pa+s6J0yCH06LujWB9rZe94g== +"@msgpackr-extract/msgpackr-extract-darwin-x64@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-2.2.0.tgz#fb877fe6bae3c4d3cea29786737840e2ae689066" + integrity sha512-vq0tT8sjZsy4JdSqmadWVw6f66UXqUCabLmUVHZwUFzMgtgoIIQjT4VVRHKvlof3P/dMCkbMJ5hB1oJ9OWHaaw== -"@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.0.tgz#19875441da50b9aa8f8e726eb097a4cead435a3f" - integrity sha512-NEX6hdSvP4BmVyegaIbrGxvHzHvTzzsPaxXCsUt0mbLbPpEftsvNwaEVKOowXnLoeuGeD4MaqSwL3BUK2elsUA== +"@msgpackr-extract/msgpackr-extract-linux-arm64@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-2.2.0.tgz#986179c38b10ac41fbdaf7d036c825cbc72855d9" + integrity sha512-hlxxLdRmPyq16QCutUtP8Tm6RDWcyaLsRssaHROatgnkOxdleMTgetf9JsdncL8vLh7FVy/RN9i3XR5dnb9cRA== -"@msgpackr-extract/msgpackr-extract-linux-arm@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.0.tgz#3b855ac72cc16e89db2f72adf47ddc964c20a53d" - integrity sha512-ztKVV1dO/sSZyGse0PBCq3Pk1PkYjsA/dsEWE7lfrGoAK3i9HpS2o7XjGQ7V4va6nX+xPPOiuYpQwa4Bi6vlww== +"@msgpackr-extract/msgpackr-extract-linux-arm@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-2.2.0.tgz#15f2c6fe9e0adc06c21af7e95f484ff4880d79ce" + integrity sha512-SaJ3Qq4lX9Syd2xEo9u3qPxi/OB+5JO/ngJKK97XDpa1C587H9EWYO6KD8995DAjSinWvdHKRrCOXVUC5fvGOg== -"@msgpackr-extract/msgpackr-extract-linux-x64@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.0.tgz#455f1d5bb00e87f78c67711f26e7bff9f1457684" - integrity sha512-9uvdAkZMOPCY7SPRxZLW8XGqBOVNVEhqlgffenN8shA1XR9FWVsSM13nr/oHtNgXg6iVyML7RwWPyqUeThlwxg== +"@msgpackr-extract/msgpackr-extract-linux-x64@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-2.2.0.tgz#30cae5c9a202f3e1fa1deb3191b18ffcb2f239a2" + integrity sha512-94y5PJrSOqUNcFKmOl7z319FelCLAE0rz/jPCWS+UtdMZvpa4jrQd+cJPQCLp2Fes1yAW/YUQj/Di6YVT3c3Iw== -"@msgpackr-extract/msgpackr-extract-win32-x64@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.0.tgz#03c6bfcd3acb179ea69546c20d50895b9d623ada" - integrity sha512-Wg0+9615kHKlr9iLVcG5I+/CHnf6w3x5UADRv8Ad16yA0Bu5l9eVOROjV7aHPG6uC8ZPFIVVaoSjDChD+Y0pzg== +"@msgpackr-extract/msgpackr-extract-win32-x64@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-2.2.0.tgz#016d855b6bc459fd908095811f6826e45dd4ba64" + integrity sha512-XrC0JzsqQSvOyM3t04FMLO6z5gCuhPE6k4FXuLK5xf52ZbdvcFe1yBmo7meCew9B8G2f0T9iu9t3kfTYRYROgA== + +"@nicolo-ribaudo/semver-v6@^6.3.3": + version "6.3.3" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz#ea6d23ade78a325f7a52750aab1526b02b628c29" + integrity sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -1142,232 +1200,143 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@npmcli/arborist@5.3.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-5.3.0.tgz#321d9424677bfc08569e98a5ac445ee781f32053" - integrity sha512-+rZ9zgL1lnbl8Xbb1NQdMjveOMwj4lIYfcDtyJHHi5x4X8jtR6m8SXooJMZy5vmFVZ8w7A2Bnd/oX9eTuU8w5A== - dependencies: - "@isaacs/string-locale-compare" "^1.1.0" - "@npmcli/installed-package-contents" "^1.0.7" - "@npmcli/map-workspaces" "^2.0.3" - "@npmcli/metavuln-calculator" "^3.0.1" - "@npmcli/move-file" "^2.0.0" - "@npmcli/name-from-folder" "^1.0.1" - "@npmcli/node-gyp" "^2.0.0" - "@npmcli/package-json" "^2.0.0" - "@npmcli/run-script" "^4.1.3" - bin-links "^3.0.0" - cacache "^16.0.6" - common-ancestor-path "^1.0.1" - json-parse-even-better-errors "^2.3.1" - json-stringify-nice "^1.1.4" - mkdirp "^1.0.4" - mkdirp-infer-owner "^2.0.0" - nopt "^5.0.0" - npm-install-checks "^5.0.0" - npm-package-arg "^9.0.0" - npm-pick-manifest "^7.0.0" - npm-registry-fetch "^13.0.0" - npmlog "^6.0.2" - pacote "^13.6.1" - parse-conflict-json "^2.0.1" - proc-log "^2.0.0" - promise-all-reject-late "^1.0.0" - promise-call-limit "^1.0.1" - read-package-json-fast "^2.0.2" - readdir-scoped-modules "^1.1.0" - rimraf "^3.0.2" - semver "^7.3.7" - ssri "^9.0.0" - treeverse "^2.0.0" - walk-up-path "^1.0.0" - -"@npmcli/fs@^2.1.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" - integrity sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ== +"@npmcli/fs@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" + integrity sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w== dependencies: - "@gar/promisify" "^1.1.3" semver "^7.3.5" -"@npmcli/git@^3.0.0": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-3.0.2.tgz#5c5de6b4d70474cf2d09af149ce42e4e1dacb931" - integrity sha512-CAcd08y3DWBJqJDpfuVL0uijlq5oaXaOJEKHKc4wqrjd00gkvTZB+nFuLn+doOOKddaQS9JfqtNoFCO2LCvA3w== +"@npmcli/git@^4.0.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-4.1.0.tgz#ab0ad3fd82bc4d8c1351b6c62f0fa56e8fe6afa6" + integrity sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ== dependencies: - "@npmcli/promise-spawn" "^3.0.0" + "@npmcli/promise-spawn" "^6.0.0" lru-cache "^7.4.4" - mkdirp "^1.0.4" - npm-pick-manifest "^7.0.0" - proc-log "^2.0.0" + npm-pick-manifest "^8.0.0" + proc-log "^3.0.0" promise-inflight "^1.0.1" promise-retry "^2.0.1" semver "^7.3.5" - which "^2.0.2" - -"@npmcli/installed-package-contents@^1.0.7": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz#ab7408c6147911b970a8abe261ce512232a3f4fa" - integrity sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw== - dependencies: - npm-bundled "^1.1.1" - npm-normalize-package-bin "^1.0.1" + which "^3.0.0" -"@npmcli/map-workspaces@^2.0.3": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@npmcli/map-workspaces/-/map-workspaces-2.0.4.tgz#9e5e8ab655215a262aefabf139782b894e0504fc" - integrity sha512-bMo0aAfwhVwqoVM5UzX1DJnlvVvzDCHae821jv48L1EsrYwfOZChlqWYXEtto/+BkBXetPbEWgau++/brh4oVg== - dependencies: - "@npmcli/name-from-folder" "^1.0.1" - glob "^8.0.1" - minimatch "^5.0.1" - read-package-json-fast "^2.0.3" - -"@npmcli/metavuln-calculator@^3.0.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@npmcli/metavuln-calculator/-/metavuln-calculator-3.1.1.tgz#9359bd72b400f8353f6a28a25c8457b562602622" - integrity sha512-n69ygIaqAedecLeVH3KnO39M6ZHiJ2dEv5A7DGvcqCB8q17BGUgW8QaanIkbWUo2aYGZqJaOORTLAlIvKjNDKA== - dependencies: - cacache "^16.0.0" - json-parse-even-better-errors "^2.3.1" - pacote "^13.0.3" - semver "^7.3.5" - -"@npmcli/move-file@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.1.tgz#26f6bdc379d87f75e55739bab89db525b06100e4" - integrity sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ== - dependencies: - mkdirp "^1.0.4" - rimraf "^3.0.2" - -"@npmcli/name-from-folder@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@npmcli/name-from-folder/-/name-from-folder-1.0.1.tgz#77ecd0a4fcb772ba6fe927e2e2e155fbec2e6b1a" - integrity sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA== - -"@npmcli/node-gyp@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz#8c20e53e34e9078d18815c1d2dda6f2420d75e35" - integrity sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A== - -"@npmcli/package-json@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-2.0.0.tgz#3bbcf4677e21055adbe673d9f08c9f9cde942e4a" - integrity sha512-42jnZ6yl16GzjWSH7vtrmWyJDGVa/LXPdpN2rcUWolFjc9ON2N3uz0qdBbQACfmhuJZ2lbKYtmK5qx68ZPLHMA== +"@npmcli/installed-package-contents@^2.0.1": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz#bfd817eccd9e8df200919e73f57f9e3d9e4f9e33" + integrity sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ== dependencies: - json-parse-even-better-errors "^2.3.1" + npm-bundled "^3.0.0" + npm-normalize-package-bin "^3.0.0" -"@npmcli/promise-spawn@^3.0.0": +"@npmcli/node-gyp@^3.0.0": version "3.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz#53283b5f18f855c6925f23c24e67c911501ef573" - integrity sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g== + resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz#101b2d0490ef1aa20ed460e4c0813f0db560545a" + integrity sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA== + +"@npmcli/promise-spawn@^6.0.0", "@npmcli/promise-spawn@^6.0.1": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz#c8bc4fa2bd0f01cb979d8798ba038f314cfa70f2" + integrity sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg== dependencies: - infer-owner "^1.0.4" + which "^3.0.0" -"@npmcli/run-script@4.1.7": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-4.1.7.tgz#b1a2f57568eb738e45e9ea3123fb054b400a86f7" - integrity sha512-WXr/MyM4tpKA4BotB81NccGAv8B48lNH0gRoILucbcAhTQXLCoi6HflMV3KdXubIqvP9SuLsFn68Z7r4jl+ppw== +"@npmcli/run-script@6.0.2", "@npmcli/run-script@^6.0.0": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-6.0.2.tgz#a25452d45ee7f7fb8c16dfaf9624423c0c0eb885" + integrity sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA== dependencies: - "@npmcli/node-gyp" "^2.0.0" - "@npmcli/promise-spawn" "^3.0.0" + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/promise-spawn" "^6.0.0" node-gyp "^9.0.0" - read-package-json-fast "^2.0.3" - which "^2.0.2" + read-package-json-fast "^3.0.0" + which "^3.0.0" -"@npmcli/run-script@^4.1.0", "@npmcli/run-script@^4.1.3": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-4.2.1.tgz#c07c5c71bc1c70a5f2a06b0d4da976641609b946" - integrity sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg== +"@nrwl/devkit@16.5.1": + version "16.5.1" + resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-16.5.1.tgz#43985cc1105e85afd8323586477c4a0d1b2eeee3" + integrity sha512-NB+DE/+AFJ7lKH/WBFyatJEhcZGj25F24ncDkwjZ6MzEiSOGOJS0LaV/R+VUsmS5EHTPXYOpn3zHWWAcJhyOmA== dependencies: - "@npmcli/node-gyp" "^2.0.0" - "@npmcli/promise-spawn" "^3.0.0" - node-gyp "^9.0.0" - read-package-json-fast "^2.0.3" - which "^2.0.2" + "@nx/devkit" "16.5.1" -"@nrwl/cli@15.7.0": - version "15.7.0" - resolved "https://registry.yarnpkg.com/@nrwl/cli/-/cli-15.7.0.tgz#f1bebf5a210230b041bc7b903401fc5b2382ae46" - integrity sha512-dorpQl7TPgL75Fb6+g92/2v/pzP8RM6jhZ9efmW4RgwwH8/E778yZqslINn/aGAnqefMeUiZSvw/Q7m0QjWBPg== +"@nrwl/tao@16.5.1": + version "16.5.1" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-16.5.1.tgz#e6e6b1ab73238497d4d9f014b30af18722e73503" + integrity sha512-x+gi/fKdM6uQNIti9exFlm3V5LBP3Y8vOEziO42HdOigyrXa0S0HD2WMpccmp6PclYKhwEDUjKJ39xh5sdh4Ig== dependencies: - nx "15.7.0" + nx "16.5.1" -"@nrwl/devkit@>=15.5.2 < 16": - version "15.7.0" - resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-15.7.0.tgz#90929cc1e46d2e8f1ea1c0f83baa87db8d6ba7b1" - integrity sha512-aPh3xnSpP4HH8sU2ICuuhtBgp2k4ydfkW/uTOlK/BvT94++AJ/Aj8ZSJFWAd2IteFsMNynPz5c0jLO+MSTqRnA== +"@nx/devkit@16.5.1", "@nx/devkit@>=16.1.3 < 17": + version "16.5.1" + resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-16.5.1.tgz#1d6a27895a7c85edebe0ba31e0a394839ad5fdd2" + integrity sha512-T1acZrVVmJw/sJ4PIGidCBYBiBqlg/jT9e8nIGXLSDS20xcLvfo4zBQf8UZLrmHglnwwpDpOWuVJCp2rYA5aDg== dependencies: - "@phenomnomnominal/tsquery" "4.1.1" + "@nrwl/devkit" "16.5.1" ejs "^3.1.7" ignore "^5.0.4" - semver "7.3.4" + semver "7.5.3" + tmp "~0.2.1" tslib "^2.3.0" -"@nrwl/nx-darwin-arm64@15.7.0": - version "15.7.0" - resolved "https://registry.yarnpkg.com/@nrwl/nx-darwin-arm64/-/nx-darwin-arm64-15.7.0.tgz#0a819c6209ff05e8bc68251236c648749cc254e0" - integrity sha512-SeuA4X6U/bL9FLdaxYavI60plsWeRe4Gk+LuATyxwOk9N1fqBw03ISyYu7ZFJqHZ0zbCGUApgsTdk7NfDY8OQg== - -"@nrwl/nx-darwin-x64@15.7.0": - version "15.7.0" - resolved "https://registry.yarnpkg.com/@nrwl/nx-darwin-x64/-/nx-darwin-x64-15.7.0.tgz#b9e5c216a661d1f746bb4b4f8be5a4e9fddaedf1" - integrity sha512-TqpFSomP6hUEOy+H9TdhYXOW5VcC/bP82sf+EO2rR8sU1LYHyGlJH3spzkoc+KgIYXMZnc3q3EHkz9DW8iVs6A== - -"@nrwl/nx-linux-arm-gnueabihf@15.7.0": - version "15.7.0" - resolved "https://registry.yarnpkg.com/@nrwl/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-15.7.0.tgz#51570813b49f5890d54a92cc24d960891129efb1" - integrity sha512-lAny7Y4iPTEThBTgwk7ttfq9qUbqCBpy3wVI18+jo72Rx128qOn7m3Uyirpx0ibegNr5AI1DgfEONe7ZdiBNOA== - -"@nrwl/nx-linux-arm64-gnu@15.7.0": - version "15.7.0" - resolved "https://registry.yarnpkg.com/@nrwl/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-15.7.0.tgz#38bb3e7293c1fdd5ff5a7e4aa383e63d3e0e96ef" - integrity sha512-GzBBeAwR9yS2ON5LZlyeVUkFp7LEPc00r1QQy9vF4wPJcDgS5VkZvpivNZo+DpncregGFRGqgriPlQlPy4a4Sw== - -"@nrwl/nx-linux-arm64-musl@15.7.0": - version "15.7.0" - resolved "https://registry.yarnpkg.com/@nrwl/nx-linux-arm64-musl/-/nx-linux-arm64-musl-15.7.0.tgz#8a47cf7001508445261c0113ac830e3646cad00f" - integrity sha512-bX567rltZJYbwlc9rFvELxL74tGvDXks8x90fGMx7NZ/gQVPmTZpMfl/QEfTQNI/Kn4MP/fAu4uz5vWmbTSAug== - -"@nrwl/nx-linux-x64-gnu@15.7.0": - version "15.7.0" - resolved "https://registry.yarnpkg.com/@nrwl/nx-linux-x64-gnu/-/nx-linux-x64-gnu-15.7.0.tgz#283dcc3f079220f0751deed6b619638806d40ad7" - integrity sha512-o8DDAuoZW53KTkfYJP53NgWacI7y3FIK38JTnvexO7TPO25YsJE7OthHpJShQLo71qq/LHusPTMkYm/BsIunAQ== - -"@nrwl/nx-linux-x64-musl@15.7.0": - version "15.7.0" - resolved "https://registry.yarnpkg.com/@nrwl/nx-linux-x64-musl/-/nx-linux-x64-musl-15.7.0.tgz#bc10f9d9983a2dee1ef476e0f668842005afe9de" - integrity sha512-ydkYW08Tr2Uytzys5V9pN3M3Ptq4ggy78VWF4SFwnsO9vEVmrZ+3ezwCiztzz8ZtQ4nLKdmin/FfdKUO7tVMdw== - -"@nrwl/nx-win32-arm64-msvc@15.7.0": - version "15.7.0" - resolved "https://registry.yarnpkg.com/@nrwl/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-15.7.0.tgz#c92593732169cdc815a8d1aa1f5be5f1c68b1f3e" - integrity sha512-h7fER4pvCqIFEPX7XVrGhlhPSrHFst5GqNoBukjSF0fNzH6LADHnTSw+rgFJePxFNoAYVqNHBjBeciUataWKhw== - -"@nrwl/nx-win32-x64-msvc@15.7.0": - version "15.7.0" - resolved "https://registry.yarnpkg.com/@nrwl/nx-win32-x64-msvc/-/nx-win32-x64-msvc-15.7.0.tgz#963e724da0ed987028e2117b8831a57a553d5d0f" - integrity sha512-wEJ3wCWrofVouTJpIDsaM6PPP5Yc+W6wNzuBgri1t1QGe+5/evMXKscaShwiS4BHXM5nalbQ+srQPttFCcNCfQ== - -"@nrwl/tao@15.7.0": - version "15.7.0" - resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-15.7.0.tgz#54a9a6e234d5f6f832c0c8614f64e0a9a0c36e71" - integrity sha512-EKS6vEqh+ykG/6DLgc5+u2RiXdv7PIX9pGvyIWiEDELcUuo0e8ptXQM8HxETZt0ihDgW2u0rUky3Avr6boO2bQ== - dependencies: - nx "15.7.0" +"@nx/nx-darwin-arm64@16.5.1": + version "16.5.1" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.5.1.tgz#87111664de492e5ae270ef2adc74553e03d77341" + integrity sha512-q98TFI4B/9N9PmKUr1jcbtD4yAFs1HfYd9jUXXTQOlfO9SbDjnrYJgZ4Fp9rMNfrBhgIQ4x1qx0AukZccKmH9Q== + +"@nx/nx-darwin-x64@16.5.1": + version "16.5.1" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-16.5.1.tgz#05c34ce8f8f23eeae0529d3c1022ee3e95a608a1" + integrity sha512-j9HmL1l8k7EVJ3eOM5y8COF93gqrydpxCDoz23ZEtsY+JHY77VAiRQsmqBgEx9GGA2dXi9VEdS67B0+1vKariw== + +"@nx/nx-freebsd-x64@16.5.1": + version "16.5.1" + resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-16.5.1.tgz#b4303ac5066f5c8ced7768097d6c85e8055c7d3a" + integrity sha512-CXSPT01aVS869tvCCF2tZ7LnCa8l41wJ3mTVtWBkjmRde68E5Up093hklRMyXb3kfiDYlfIKWGwrV4r0eH6x1A== + +"@nx/nx-linux-arm-gnueabihf@16.5.1": + version "16.5.1" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.5.1.tgz#4dde9e8c79da9c5a213b6938dff74f65dd79c157" + integrity sha512-BhrumqJSZCWFfLFUKl4CAUwR0Y0G2H5EfFVGKivVecEQbb+INAek1aa6c89evg2/OvetQYsJ+51QknskwqvLsA== + +"@nx/nx-linux-arm64-gnu@16.5.1": + version "16.5.1" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.5.1.tgz#43dcdbd9b39fa91923ab949d161aa25c650f56d9" + integrity sha512-x7MsSG0W+X43WVv7JhiSq2eKvH2suNKdlUHEG09Yt0vm3z0bhtym1UCMUg3IUAK7jy9hhLeDaFVFkC6zo+H/XQ== + +"@nx/nx-linux-arm64-musl@16.5.1": + version "16.5.1" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.5.1.tgz#fc33960cecb0064c3dd3330f393e3a38be8a71b7" + integrity sha512-J+/v/mFjOm74I0PNtH5Ka+fDd+/dWbKhpcZ2R1/6b9agzZk+Ff/SrwJcSYFXXWKbPX+uQ4RcJoytT06Zs3s0ow== + +"@nx/nx-linux-x64-gnu@16.5.1": + version "16.5.1" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.5.1.tgz#2b2ffbb80e29455b6900ec20d4249055590dc58f" + integrity sha512-igooWJ5YxQ94Zft7IqgL+Lw0qHaY15Btw4gfK756g/YTYLZEt4tTvR1y6RnK/wdpE3sa68bFTLVBNCGTyiTiDQ== + +"@nx/nx-linux-x64-musl@16.5.1": + version "16.5.1" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.5.1.tgz#955b2eae615ee6cf1954e24d42c205b1de8772bf" + integrity sha512-zF/exnPqFYbrLAduGhTmZ7zNEyADid2bzNQiIjJkh8Y6NpDwrQIwVIyvIxqynsjMrIs51kBH+8TUjKjj2Jgf5A== + +"@nx/nx-win32-arm64-msvc@16.5.1": + version "16.5.1" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.5.1.tgz#1dc4a7e3662eb757214c46d8db432f61e43a3dd9" + integrity sha512-qtqiLS9Y9TYyAbbpq58kRoOroko4ZXg5oWVqIWFHoxc5bGPweQSJCROEqd1AOl2ZDC6BxfuVHfhDDop1kK05WA== + +"@nx/nx-win32-x64-msvc@16.5.1": + version "16.5.1" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.5.1.tgz#d2f4a1b2bf675bceb6fb16174b836438293f9dca" + integrity sha512-kUJBLakK7iyA9WfsGGQBVennA4jwf5XIgm0lu35oMOphtZIluvzItMt0EYBmylEROpmpEIhHq0P6J9FA+WH0Rg== "@octokit/auth-token@^3.0.0": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-3.0.3.tgz#ce7e48a3166731f26068d7a7a7996b5da58cbe0c" - integrity sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA== - dependencies: - "@octokit/types" "^9.0.0" + version "3.0.4" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-3.0.4.tgz#70e941ba742bdd2b49bdb7393e821dea8520a3db" + integrity sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ== -"@octokit/core@^4.0.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-4.2.0.tgz#8c253ba9605aca605bc46187c34fcccae6a96648" - integrity sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg== +"@octokit/core@^4.2.1": + version "4.2.4" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-4.2.4.tgz#d8769ec2b43ff37cc3ea89ec4681a20ba58ef907" + integrity sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ== dependencies: "@octokit/auth-token" "^3.0.0" "@octokit/graphql" "^5.0.0" @@ -1378,62 +1347,52 @@ universal-user-agent "^6.0.0" "@octokit/endpoint@^7.0.0": - version "7.0.5" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-7.0.5.tgz#2bb2a911c12c50f10014183f5d596ce30ac67dd1" - integrity sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA== + version "7.0.6" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-7.0.6.tgz#791f65d3937555141fb6c08f91d618a7d645f1e2" + integrity sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg== dependencies: "@octokit/types" "^9.0.0" is-plain-object "^5.0.0" universal-user-agent "^6.0.0" "@octokit/graphql@^5.0.0": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-5.0.5.tgz#a4cb3ea73f83b861893a6370ee82abb36e81afd2" - integrity sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ== + version "5.0.6" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-5.0.6.tgz#9eac411ac4353ccc5d3fca7d76736e6888c5d248" + integrity sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw== dependencies: "@octokit/request" "^6.0.0" "@octokit/types" "^9.0.0" universal-user-agent "^6.0.0" -"@octokit/openapi-types@^12.11.0": - version "12.11.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-12.11.0.tgz#da5638d64f2b919bca89ce6602d059f1b52d3ef0" - integrity sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ== - -"@octokit/openapi-types@^14.0.0": - version "14.0.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-14.0.0.tgz#949c5019028c93f189abbc2fb42f333290f7134a" - integrity sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw== - -"@octokit/openapi-types@^16.0.0": - version "16.0.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-16.0.0.tgz#d92838a6cd9fb4639ca875ddb3437f1045cc625e" - integrity sha512-JbFWOqTJVLHZSUUoF4FzAZKYtqdxWu9Z5m2QQnOyEa04fOFljvyh7D3GYKbfuaSWisqehImiVIMG4eyJeP5VEA== +"@octokit/openapi-types@^18.0.0": + version "18.0.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-18.0.0.tgz#f43d765b3c7533fd6fb88f3f25df079c24fccf69" + integrity sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw== "@octokit/plugin-enterprise-rest@6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz#e07896739618dab8da7d4077c658003775f95437" integrity sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw== -"@octokit/plugin-paginate-rest@^3.0.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-3.1.0.tgz#86f8be759ce2d6d7c879a31490fd2f7410b731f0" - integrity sha512-+cfc40pMzWcLkoDcLb1KXqjX0jTGYXjKuQdFQDc6UAknISJHnZTiBqld6HDwRJvD4DsouDKrWXNbNV0lE/3AXA== +"@octokit/plugin-paginate-rest@^6.1.2": + version "6.1.2" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz#f86456a7a1fe9e58fec6385a85cf1b34072341f8" + integrity sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ== dependencies: - "@octokit/types" "^6.41.0" + "@octokit/tsconfig" "^1.0.2" + "@octokit/types" "^9.2.3" "@octokit/plugin-request-log@^1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz#5e50ed7083a613816b1e4a28aeec5fb7f1462e85" integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA== -"@octokit/plugin-rest-endpoint-methods@^6.0.0": - version "6.8.1" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.8.1.tgz#97391fda88949eb15f68dc291957ccbe1d3e8ad1" - integrity sha512-QrlaTm8Lyc/TbU7BL/8bO49vp+RZ6W3McxxmmQTgYxf2sWkO8ZKuj4dLhPNJD6VCUW1hetCmeIM0m6FTVpDiEg== +"@octokit/plugin-rest-endpoint-methods@^7.1.2": + version "7.2.3" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.2.3.tgz#37a84b171a6cb6658816c82c4082ac3512021797" + integrity sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA== dependencies: - "@octokit/types" "^8.1.1" - deprecation "^2.3.1" + "@octokit/types" "^10.0.0" "@octokit/request-error@^3.0.0": version "3.0.3" @@ -1445,9 +1404,9 @@ once "^1.4.0" "@octokit/request@^6.0.0": - version "6.2.3" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-6.2.3.tgz#76d5d6d44da5c8d406620a4c285d280ae310bdb4" - integrity sha512-TNAodj5yNzrrZ/VxP+H5HiYaZep0H3GU0O7PaF+fhDrt8FPrnkei9Aal/txsN/1P7V3CPiThG0tIvpPDYUsyAA== + version "6.2.8" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-6.2.8.tgz#aaf480b32ab2b210e9dadd8271d187c93171d8eb" + integrity sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw== dependencies: "@octokit/endpoint" "^7.0.0" "@octokit/request-error" "^3.0.0" @@ -1456,36 +1415,34 @@ node-fetch "^2.6.7" universal-user-agent "^6.0.0" -"@octokit/rest@19.0.3": - version "19.0.3" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-19.0.3.tgz#b9a4e8dc8d53e030d611c053153ee6045f080f02" - integrity sha512-5arkTsnnRT7/sbI4fqgSJ35KiFaN7zQm0uQiQtivNQLI8RQx8EHwJCajcTUwmaCMNDg7tdCvqAnc7uvHHPxrtQ== +"@octokit/rest@19.0.11": + version "19.0.11" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-19.0.11.tgz#2ae01634fed4bd1fca5b642767205ed3fd36177c" + integrity sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw== dependencies: - "@octokit/core" "^4.0.0" - "@octokit/plugin-paginate-rest" "^3.0.0" + "@octokit/core" "^4.2.1" + "@octokit/plugin-paginate-rest" "^6.1.2" "@octokit/plugin-request-log" "^1.0.4" - "@octokit/plugin-rest-endpoint-methods" "^6.0.0" + "@octokit/plugin-rest-endpoint-methods" "^7.1.2" -"@octokit/types@^6.41.0": - version "6.41.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.41.0.tgz#e58ef78d78596d2fb7df9c6259802464b5f84a04" - integrity sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg== - dependencies: - "@octokit/openapi-types" "^12.11.0" +"@octokit/tsconfig@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@octokit/tsconfig/-/tsconfig-1.0.2.tgz#59b024d6f3c0ed82f00d08ead5b3750469125af7" + integrity sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA== -"@octokit/types@^8.1.1": - version "8.2.1" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-8.2.1.tgz#a6de091ae68b5541f8d4fcf9a12e32836d4648aa" - integrity sha512-8oWMUji8be66q2B9PmEIUyQm00VPDPun07umUWSaCwxmeaquFBro4Hcc3ruVoDo3zkQyZBlRvhIMEYS3pBhanw== +"@octokit/types@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-10.0.0.tgz#7ee19c464ea4ada306c43f1a45d444000f419a4a" + integrity sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg== dependencies: - "@octokit/openapi-types" "^14.0.0" + "@octokit/openapi-types" "^18.0.0" -"@octokit/types@^9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-9.0.0.tgz#6050db04ddf4188ec92d60e4da1a2ce0633ff635" - integrity sha512-LUewfj94xCMH2rbD5YJ+6AQ4AVjFYTgpp6rboWM5T7N3IsIF65SBEOVcYMGAEzO/kKNiNaW4LoWtoThOhH06gw== +"@octokit/types@^9.0.0", "@octokit/types@^9.2.3": + version "9.3.2" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-9.3.2.tgz#3f5f89903b69f6a2d196d78ec35f888c0013cac5" + integrity sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA== dependencies: - "@octokit/openapi-types" "^16.0.0" + "@octokit/openapi-types" "^18.0.0" "@parcel/watcher@2.0.4": version "2.0.4" @@ -1495,13 +1452,6 @@ node-addon-api "^3.2.1" node-gyp-build "^4.3.0" -"@phenomnomnominal/tsquery@4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@phenomnomnominal/tsquery/-/tsquery-4.1.1.tgz#42971b83590e9d853d024ddb04a18085a36518df" - integrity sha512-jjMmK1tnZbm1Jq5a7fBliM4gQwjxMU7TFoRNwIyzwlO+eHPRCFv/Nv+H/Gi1jc3WR7QURG8D5d0Tn12YGrUqBQ== - dependencies: - esquery "^1.0.1" - "@phosphor/algorithm@1", "@phosphor/algorithm@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@phosphor/algorithm/-/algorithm-1.2.0.tgz#4a19aa59261b7270be696672dc3f0663f7bef152" @@ -1601,16 +1551,39 @@ "@phosphor/signaling" "^1.3.1" "@phosphor/virtualdom" "^1.2.0" +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + "@playwright/test@^1.32.1": - version "1.32.1" - resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.32.1.tgz#749c9791adb048c266277a39ba0f7e33fe593ffe" - integrity sha512-FTwjCuhlm1qHUGf4hWjfr64UMJD/z0hXYbk+O387Ioe6WdyZQ+0TBDAc6P+pHjx2xCv1VYNgrKbYrNixFWy4Dg== + version "1.35.1" + resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.35.1.tgz#a596b61e15b980716696f149cc7a2002f003580c" + integrity sha512-b5YoFe6J9exsMYg0pQAobNDR85T1nLumUYgUTtKm4d21iX2L7WqKq9dW8NGJ+2vX0etZd+Y7UeuqsxDXm9+5ZA== dependencies: "@types/node" "*" - playwright-core "1.32.1" + playwright-core "1.35.1" optionalDependencies: fsevents "2.3.2" +"@sigstore/protobuf-specs@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz#957cb64ea2f5ce527cc9cf02a096baeb0d2b99b4" + integrity sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ== + +"@sigstore/tuf@^1.0.1": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-1.0.2.tgz#acbb2c8399fb03aca0c90fa1dc1934bda4160623" + integrity sha512-vjwcYePJzM01Ha6oWWZ9gNcdIgnzyFxfqfWzph483DPJTH8Tb7f7bQRRll3CYVkyH56j0AgcPAcl6Vg95DPF+Q== + dependencies: + "@sigstore/protobuf-specs" "^0.1.0" + tuf-js "^1.1.7" + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + "@sindresorhus/df@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@sindresorhus/df/-/df-1.0.1.tgz#c69b66f52f6fcdd287c807df210305dbaf78500d" @@ -1642,12 +1615,19 @@ dependencies: type-detect "4.0.8" +"@sinonjs/commons@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" + integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== + dependencies: + type-detect "4.0.8" + "@sinonjs/fake-timers@^10.0.2": - version "10.0.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz#d10549ed1f423d80639c528b6c7f5a1017747d0c" - integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw== + version "10.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== dependencies: - "@sinonjs/commons" "^2.0.0" + "@sinonjs/commons" "^3.0.0" "@sinonjs/fake-timers@^8.1.0": version "8.1.0" @@ -1702,6 +1682,19 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== +"@tufjs/canonical-json@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz#eade9fd1f537993bc1f0949f3aea276ecc4fab31" + integrity sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ== + +"@tufjs/models@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tufjs/models/-/models-1.0.4.tgz#5a689630f6b9dbda338d4b208019336562f176ef" + integrity sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A== + dependencies: + "@tufjs/canonical-json" "1.0.0" + minimatch "^9.0.0" + "@types/bent@^7.0.1": version "7.3.3" resolved "https://registry.yarnpkg.com/@types/bent/-/bent-7.3.3.tgz#b8daa06e72219045b3f67f968d590d3df3875d96" @@ -1742,9 +1735,9 @@ "@types/chai" "*" "@types/chai@*", "@types/chai@^4.2.7": - version "4.3.4" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.4.tgz#e913e8175db8307d78b4e8fa690408ba6b65dee4" - integrity sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw== + version "4.3.5" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.5.tgz#ae69bcbb1bebb68c4ac0b11e9d8ed04526b3562b" + integrity sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng== "@types/chai@4.3.0": version "4.3.0" @@ -1808,22 +1801,17 @@ "@types/estree" "*" "@types/eslint@*": - version "8.21.1" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.21.1.tgz#110b441a210d53ab47795124dbc3e9bb993d1e7c" - integrity sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ== + version "8.44.0" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.44.0.tgz#55818eabb376e2272f77fbf5c96c43137c3c1e53" + integrity sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw== dependencies: "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" - integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== - -"@types/estree@^0.0.51": - version "0.0.51" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" - integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" + integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== "@types/events@*": version "3.0.0" @@ -1831,13 +1819,14 @@ integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== "@types/express-serve-static-core@^4.17.33": - version "4.17.33" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz#de35d30a9d637dc1450ad18dd583d75d5733d543" - integrity sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA== + version "4.17.35" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz#c95dd4424f0d32e525d23812aa8ab8e4d3906c4f" + integrity sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" + "@types/send" "*" "@types/express@*", "@types/express@^4.16.0": version "4.17.17" @@ -1864,9 +1853,9 @@ "@types/node" "*" "@types/glob@*": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-8.0.1.tgz#6e3041640148b7764adf21ce5c7138ad454725b0" - integrity sha512-8bVUjXZvJacUFkJXHdyZ9iH1Eaj5V7I8c4NdH5sQJsdXkqT4CA5Dhb4yb4VE/3asyx4L9ayZr1NIhTsWHczmMw== + version "8.1.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-8.1.0.tgz#b63e70155391b0584dce44e7ea25190bbc38f2fc" + integrity sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w== dependencies: "@types/minimatch" "^5.1.2" "@types/node" "*" @@ -1883,6 +1872,11 @@ resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== +"@types/http-errors@*": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.1.tgz#20172f9578b225f6c7da63446f56d4ce108d5a65" + integrity sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ== + "@types/jsdom@^21.1.1": version "21.1.1" resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-21.1.1.tgz#e59e26352071267b507bf04d51841a1d7d3e8617" @@ -1893,9 +1887,9 @@ parse5 "^7.0.0" "@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + version "7.0.12" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== "@types/json5@^0.0.29": version "0.0.29" @@ -1936,9 +1930,9 @@ "@types/lodash" "*" "@types/lodash@*": - version "4.14.191" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.191.tgz#09511e7f7cba275acd8b419ddac8da9a6a79e2fa" - integrity sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ== + version "4.14.195" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.195.tgz#bafc975b252eb6cea78882ce8a7b6bf22a6de632" + integrity sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg== "@types/long@^4.0.0": version "4.0.2" @@ -1980,6 +1974,11 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + "@types/mime@^2.0.1": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.3.tgz#c893b73721db73699943bfc3653b1deb7faa4a3a" @@ -2023,17 +2022,17 @@ integrity sha512-lhjcQxXaKhbP3SpIjJONnx4cy6cUW2bdCSwPJISuznG3S889TUPQZsYswxYhS4vg8eJDIG5/6pg533HorQI0rw== "@types/node-fetch@^2.5.7": - version "2.6.2" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.2.tgz#d1a9c5fd049d9415dce61571557104dec3ec81da" - integrity sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A== + version "2.6.4" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.4.tgz#1bc3a26de814f6bf466b25aeb1473fa1afe6a660" + integrity sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg== dependencies: "@types/node" "*" form-data "^3.0.0" "@types/node@*", "@types/node@16", "@types/node@>=10.0.0", "@types/node@^10.14.22", "@types/node@^16.11.26": - version "16.18.12" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.12.tgz#e3bfea80e31523fde4292a6118f19ffa24fd6f65" - integrity sha512-vzLe5NaNMjIE3mcddFVGlAXN1LEWueUsMsOJWaT6wWMJGyljHAWHznqfnKUQWGzu7TLPrGvWdNAsvQYW+C0xtw== + version "16.18.38" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.38.tgz#1dcdb6c54d02b323f621213745f2e44af30c73e6" + integrity sha512-6sfo1qTulpVbkxECP+AVrHV9OoJqhzCsfTNp5NIG+enM4HyM3HvZCO798WShIXBN0+QtDIcutJCjsVYnQP5rIQ== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -2045,11 +2044,6 @@ resolved "https://registry.yarnpkg.com/@types/p-queue/-/p-queue-2.3.2.tgz#16bc5fece69ef85efaf2bce8b13f3ebe39c5a1c8" integrity sha512-eKAv5Ql6k78dh3ULCsSBxX6bFNuGjTmof5Q/T6PiECDq0Yf8IIn46jCyp3RJvCi8owaEmm3DZH1PEImjBMd/vQ== -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - "@types/prop-types@*": version "15.7.5" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" @@ -2078,16 +2072,16 @@ integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== "@types/react-dom@^18.0.6": - version "18.0.10" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.10.tgz#3b66dec56aa0f16a6cc26da9e9ca96c35c0b4352" - integrity sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg== + version "18.2.6" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.6.tgz#ad621fa71a8db29af7c31b41b2ea3d8a6f4144d1" + integrity sha512-2et4PDvg6PVCyS7fuTc4gPoksV58bW0RwSxWKcPRcHZf0PRUGq03TKcD/rUHe3azfV6/5/biUBJw+HhCQjaP0A== dependencies: "@types/react" "*" "@types/react@*", "@types/react@^18.0.15": - version "18.0.28" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.28.tgz#accaeb8b86f4908057ad629a26635fe641480065" - integrity sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew== + version "18.2.14" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.14.tgz#fa7a6fecf1ce35ca94e74874f70c56ce88f7a127" + integrity sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2121,32 +2115,36 @@ "@types/node" "*" "@types/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + version "0.16.3" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" + integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== -"@types/semver@^5.4.0": - version "5.5.0" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-5.5.0.tgz#146c2a29ee7d3bae4bf2fcb274636e264c813c45" - integrity sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ== +"@types/semver@^7.5.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" + integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== -"@types/semver@^7.3.8": - version "7.3.13" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" - integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== +"@types/send@*": + version "0.17.1" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.1.tgz#ed4932b8a2a805f1fe362a70f4e62d0ac994e301" + integrity sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== + dependencies: + "@types/mime" "^1" + "@types/node" "*" "@types/serve-static@*": - version "1.15.0" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.0.tgz#c7930ff61afb334e121a9da780aac0d9b8f34155" - integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg== + version "1.15.2" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.2.tgz#3e5419ecd1e40e7405d34093f10befb43f63381a" + integrity sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw== dependencies: + "@types/http-errors" "*" "@types/mime" "*" "@types/node" "*" "@types/sinon@^10.0.6": - version "10.0.13" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.13.tgz#60a7a87a70d9372d0b7b38cc03e825f46981fb83" - integrity sha512-UVjDqJblVNQYvVNUsj0PuYYw0ELRmgt1Nt5Vk0pT5f16ROGfcKJY8o1HVuMOJOpD727RrGB9EGvoaTQE5tgxZQ== + version "10.0.15" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.15.tgz#513fded9c3cf85e589bbfefbf02b2a0541186b48" + integrity sha512-3lrFNQG0Kr2LDzvjyjB6AMJk4ge+8iYhQfdnSwIwlG88FUOV43kPcQqDZkDa/h3WSZy6i8Fr0BSjfQtB1B3xuQ== dependencies: "@types/sinonjs__fake-timers" "*" @@ -2183,9 +2181,9 @@ integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== "@types/trusted-types@*": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.2.tgz#fc25ad9943bcac11cceb8168db4f275e0e72e756" - integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.3.tgz#a136f83b0758698df454e328759dbd3d44555311" + integrity sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g== "@types/unzipper@^0.9.2": version "0.9.2" @@ -2200,9 +2198,9 @@ integrity sha512-hKB88y3YHL8oPOs/CNlaXtjWn93+Bs48sDQR37ZUqG2tLeCS7EA1cmnkKsuQsub9OKEB/y/Rw9zqJqqNSbqVlQ== "@types/vscode@^1.50.0": - version "1.79.1" - resolved "https://registry.yarnpkg.com/@types/vscode/-/vscode-1.79.1.tgz#ab568315f9c844a8f4fa8f168b2d6dbf1f58dd02" - integrity sha512-Ikwc4YbHABzqthrWfeAvItaAIfX9mdjMWxqNgTpGjhgOu0TMRq9LzyZ2yBK0JhYqoSjEubEPawf6zJgnl6Egtw== + version "1.80.0" + resolved "https://registry.yarnpkg.com/@types/vscode/-/vscode-1.80.0.tgz#e004dd6cde74dafdb7fab64a6e1754bf8165b981" + integrity sha512-qK/CmOdS2o7ry3k6YqU4zD3R2AYlJfbwBoSbKpBoP+GpXNE+0NEgJOli4n0bm0diK5kfBnchgCEj4igQz/44Hg== "@types/which@^1.3.2": version "1.3.2" @@ -2374,14 +2372,14 @@ integrity sha512-iirJNv92A1ZWxoOHHDYW/1KPoi83939o83iUBQHIim0i3tMeSKEh+bxhJdTHQ86Mr4uXx9xGUTq69cp52ZP8Xw== "@vscode/codicons@*": - version "0.0.32" - resolved "https://registry.yarnpkg.com/@vscode/codicons/-/codicons-0.0.32.tgz#9e27de90d509c69762b073719ba3bf46c3cd2530" - integrity sha512-3lgSTWhAzzWN/EPURoY4ZDBEA80OPmnaknNujA3qnI4Iu7AONWd9xF3iE4L+4prIe8E3TUnLQ4pxoaFTEEZNwg== + version "0.0.33" + resolved "https://registry.yarnpkg.com/@vscode/codicons/-/codicons-0.0.33.tgz#a56243ab5492801fff04e53c0aab0d18a6521751" + integrity sha512-VdgpnD75swH9hpXjd34VBgQ2w2quK63WljodlUcOoJDPKiV+rPjHrcUc2sjLCNKxhl6oKqmsZgwOWcDAY2GKKQ== "@vscode/debugprotocol@^1.51.0": - version "1.59.0" - resolved "https://registry.yarnpkg.com/@vscode/debugprotocol/-/debugprotocol-1.59.0.tgz#f173ff725f60e4ff1002f089105634900c88bd77" - integrity sha512-Ks8NiZrCvybf9ebGLP8OUZQbEMIJYC8X0Ds54Q/szpT/SYEDjTksPvZlcWGTo7B9t5abjvbd0jkNH3blYaSuVw== + version "1.61.0" + resolved "https://registry.yarnpkg.com/@vscode/debugprotocol/-/debugprotocol-1.61.0.tgz#82bbcaba5a925f1f58246c9f50b669855c9f23f9" + integrity sha512-K/kF27jIStVFqlmUaGc2u+Dj8IR7YdEiSqShWr7MWhDudqpAW7uu7XMwoFwjpuC9LSaVwJMIX7EFC5OJ/RmnDQ== "@vscode/proxy-agent@^0.13.2": version "0.13.2" @@ -2398,17 +2396,17 @@ "@vscode/windows-ca-certs" "^0.3.1" "@vscode/ripgrep@^1.14.2": - version "1.14.2" - resolved "https://registry.yarnpkg.com/@vscode/ripgrep/-/ripgrep-1.14.2.tgz#47c0eec2b64f53d8f7e1b5ffd22a62e229191c34" - integrity sha512-KDaehS8Jfdg1dqStaIPDKYh66jzKd5jy5aYEPzIv0JYFLADPsCSQPBUdsJVXnr0t72OlDcj96W05xt/rSnNFFQ== + version "1.15.5" + resolved "https://registry.yarnpkg.com/@vscode/ripgrep/-/ripgrep-1.15.5.tgz#26025884bbc3a8b40dfc29f5bda4b87b47bd7356" + integrity sha512-PVvKNEmtnlek3i4MJMaB910dz46CKQqcIY2gKR3PSlfz/ZPlSYuSuyQMS7iK20KL4hGUdSbWt964B5S5EIojqw== dependencies: https-proxy-agent "^5.0.0" proxy-from-env "^1.1.0" "@vscode/vsce@^2.15.0": - version "2.16.0" - resolved "https://registry.yarnpkg.com/@vscode/vsce/-/vsce-2.16.0.tgz#a3ddcf7e84914576f35d891e236bc496c568776f" - integrity sha512-BhJ0zO7UxShLFBZM6jwOLt1ZVoqQ4r5Lj/kHNeYp0ICPXhz/erqBSMQnHkRgkjn2L/bh+TYFGkZyguhu/SKsjw== + version "2.19.0" + resolved "https://registry.yarnpkg.com/@vscode/vsce/-/vsce-2.19.0.tgz#342225662811245bc40d855636d000147c394b11" + integrity sha512-dAlILxC5ggOutcvJY24jxz913wimGiUrHaPkk16Gm9/PGFbz1YezWtrXsTKUtJws4fIlpX2UIlVlVESWq8lkfQ== dependencies: azure-devops-node-api "^11.0.1" chalk "^2.4.2" @@ -2416,6 +2414,7 @@ commander "^6.1.0" glob "^7.0.6" hosted-git-info "^4.0.2" + jsonc-parser "^3.2.0" leven "^3.1.0" markdown-it "^12.3.2" mime "^1.3.4" @@ -2426,7 +2425,7 @@ tmp "^0.2.1" typed-rest-client "^1.8.4" url-join "^4.0.1" - xml2js "^0.4.23" + xml2js "^0.5.0" yauzl "^2.3.1" yazl "^2.2.2" optionalDependencies: @@ -2439,125 +2438,125 @@ dependencies: node-addon-api "^3.0.2" -"@webassemblyjs/ast@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" - integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== +"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" + integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== dependencies: - "@webassemblyjs/helper-numbers" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" -"@webassemblyjs/floating-point-hex-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" - integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== -"@webassemblyjs/helper-api-error@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" - integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== -"@webassemblyjs/helper-buffer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" - integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== +"@webassemblyjs/helper-buffer@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" + integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== -"@webassemblyjs/helper-numbers@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" - integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" "@xtuc/long" "4.2.2" -"@webassemblyjs/helper-wasm-bytecode@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" - integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== -"@webassemblyjs/helper-wasm-section@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" - integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== +"@webassemblyjs/helper-wasm-section@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" + integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" -"@webassemblyjs/ieee754@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" - integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" - integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" - integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== - -"@webassemblyjs/wasm-edit@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" - integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/helper-wasm-section" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-opt" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - "@webassemblyjs/wast-printer" "1.11.1" - -"@webassemblyjs/wasm-gen@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" - integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wasm-opt@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" - integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - -"@webassemblyjs/wasm-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" - integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wast-printer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" - integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== - dependencies: - "@webassemblyjs/ast" "1.11.1" +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== + +"@webassemblyjs/wasm-edit@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" + integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-opt" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + "@webassemblyjs/wast-printer" "1.11.6" + +"@webassemblyjs/wasm-gen@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" + integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-opt@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" + integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + +"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" + integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wast-printer@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" + integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== + dependencies: + "@webassemblyjs/ast" "1.11.6" "@xtuc/long" "4.2.2" "@webpack-cli/configtest@^1.0.3": @@ -2592,10 +2591,10 @@ resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== -"@yarnpkg/parsers@^3.0.0-rc.18": - version "3.0.0-rc.39" - resolved "https://registry.yarnpkg.com/@yarnpkg/parsers/-/parsers-3.0.0-rc.39.tgz#0301a0541312124a5bdade79708868f10f9cdfcd" - integrity sha512-BsD4zq3EVmaHqlynXTceNuEFAtrfToV4fI9GA54moKlWZL4Eb2eXrhgf1jV2nMYx18SZxYO4Jc5Kf1sCDNRjOg== +"@yarnpkg/parsers@3.0.0-rc.46": + version "3.0.0-rc.46" + resolved "https://registry.yarnpkg.com/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz#03f8363111efc0ea670e53b0282cd3ef62de4e01" + integrity sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q== dependencies: js-yaml "^3.10.0" tslib "^2.4.0" @@ -2607,7 +2606,7 @@ dependencies: argparse "^2.0.1" -JSONStream@^1.0.4: +JSONStream@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== @@ -2620,7 +2619,7 @@ abab@^2.0.5, abab@^2.0.6: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -abbrev@1, abbrev@^1.0.0: +abbrev@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== @@ -2641,10 +2640,10 @@ acorn-globals@^7.0.0: acorn "^8.1.0" acorn-walk "^8.0.2" -acorn-import-assertions@^1.7.6: - version "1.8.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" - integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== +acorn-import-assertions@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" + integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== acorn-jsx@^5.3.1: version "5.3.2" @@ -2661,10 +2660,10 @@ acorn@^7.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.1.0, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.2: - version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== +acorn@^8.1.0, acorn@^8.7.1, acorn@^8.8.2: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== add-stream@^1.0.0: version "1.0.0" @@ -2679,12 +2678,12 @@ agent-base@6, agent-base@^6.0.2: debug "4" agentkeepalive@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717" - integrity sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA== + version "4.3.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255" + integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg== dependencies: debug "^4.1.0" - depd "^1.1.2" + depd "^2.0.0" humanize-ms "^1.2.1" aggregate-error@^3.0.0: @@ -2707,7 +2706,7 @@ ajv-keywords@^3.5.2: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv-keywords@^5.0.0: +ajv-keywords@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== @@ -2724,7 +2723,7 @@ ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.5.3: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.0.1, ajv@^8.6.3, ajv@^8.8.0: +ajv@^8.0.0, ajv@^8.0.1, ajv@^8.6.3, ajv@^8.9.0: version "8.12.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== @@ -2735,24 +2734,24 @@ ajv@^8.0.0, ajv@^8.0.1, ajv@^8.6.3, ajv@^8.8.0: uri-js "^4.2.2" allure-commandline@^2.21.0: - version "2.21.0" - resolved "https://registry.yarnpkg.com/allure-commandline/-/allure-commandline-2.21.0.tgz#57433c32ac7dec10786a388542a27a1307d1443a" - integrity sha512-1MMFkEhMScOFRkisuZwp52KrQVpPuhpK4SgIys9GPLqwczt9NcsI2G11XY2TSWydP5gBaPoSakevFHpqKVHaZw== + version "2.23.0" + resolved "https://registry.yarnpkg.com/allure-commandline/-/allure-commandline-2.23.0.tgz#fdea57adee905808c0953ac51a234e474e9f5c27" + integrity sha512-bfAbyQzke0Gj48bxIAhHOcJ6DluYeR4uz3iQ1wJWx7TgGA1gazN1PXUtpr+wnX9eXCTRApEuggaJIduLik7Wsg== -allure-js-commons@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/allure-js-commons/-/allure-js-commons-2.1.0.tgz#cafc3ac445db1fc4d047aa1fa75a5584a06e0629" - integrity sha512-EPtyzVXjpWhIGpZd1jBQ9+Ymt+H0fhywkcBSN9eSXOjpmJV8TWGrQximQV5q9XKuNyMmz0PlwvbIn42NC/u2/A== +allure-js-commons@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/allure-js-commons/-/allure-js-commons-2.4.0.tgz#1f75ff0ac153e30aaf4a4eb835fc6e55ee6610c6" + integrity sha512-mIQKAA91ihtMPzHJh7fQib/8MhZaUQ0oYtqFzS//5/Q+ILbMWW3WD2ISWtwniFAF2XWdRFjZ013IfUuKusbh1g== dependencies: properties "^1.2.1" uuid "^8.3.0" allure-playwright@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/allure-playwright/-/allure-playwright-2.1.0.tgz#d93d6afa3dfd31702f70032f95e63a6dcb2bf447" - integrity sha512-0dt4Re8Mg5kLDevPuZOJHgYaG7+BKsdHodl8/GRJW5JiU1Vd1xHoyxj4WBb8r7F/AOi6ASjRBbZHofXRF43Tnw== + version "2.4.0" + resolved "https://registry.yarnpkg.com/allure-playwright/-/allure-playwright-2.4.0.tgz#8b8ce4ac27290dbc87120029d12aefc8b1477b75" + integrity sha512-YtOdQXKPUFFfXVEPUaH5ebNf/2tLmJ1q898l+TPCPBeTQWVpKxLJm5yQkBbu+cmbsN+FGCsfDHFiqcS/r6f71w== dependencies: - allure-js-commons "2.1.0" + allure-js-commons "2.4.0" anser@^2.0.1: version "2.1.1" @@ -2786,6 +2785,11 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -2800,6 +2804,16 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" @@ -2825,7 +2839,7 @@ aproba@^1.0.3: resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== -"aproba@^1.0.3 || ^2.0.0", aproba@^2.0.0: +"aproba@^1.0.3 || ^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== @@ -2863,6 +2877,14 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + array-differ@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" @@ -2878,7 +2900,7 @@ array-ify@^1.0.0: resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== -array-includes@^3.1.5, array-includes@^3.1.6: +array-includes@^3.1.6: version "3.1.6" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== @@ -2947,12 +2969,7 @@ arrify@^2.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== -asap@^2.0.0: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== - -asn1@^0.2.4: +asn1@^0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== @@ -3039,9 +3056,9 @@ axios@^0.21.1: follow-redirects "^1.14.0" axios@^1.0.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.3.tgz#e7011384ba839b885007c9c9fae1ff23dceb295b" - integrity sha512-eYq77dYIFS77AQlhzEL937yUBSepBfPIe8FcgEDN35vMNZKMrs81pgnyrQpwfy4NF4b4XWX1Zgx7yX+25w8QJA== + version "1.4.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.4.0.tgz#38a7bf1224cd308de271146038b551d725f0be1f" + integrity sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA== dependencies: follow-redirects "^1.15.0" form-data "^4.0.0" @@ -3065,29 +3082,29 @@ babel-loader@^8.2.2: make-dir "^3.1.0" schema-utils "^2.6.5" -babel-plugin-polyfill-corejs2@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" - integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== +babel-plugin-polyfill-corejs2@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.4.tgz#9f9a0e1cd9d645cc246a5e094db5c3aa913ccd2b" + integrity sha512-9WeK9snM1BfxB38goUEv2FLnA6ja07UMfazFHzCXUb3NyDZAwfXvQiURQ6guTTMeHcOsdknULm1PDhs4uWtKyA== dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.3.3" - semver "^6.1.1" + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.4.1" + "@nicolo-ribaudo/semver-v6" "^6.3.3" -babel-plugin-polyfill-corejs3@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" - integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== +babel-plugin-polyfill-corejs3@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.2.tgz#d406c5738d298cd9c66f64a94cf8d5904ce4cc5e" + integrity sha512-Cid+Jv1BrY9ReW9lIfNlNpsI53N+FN7gE+f73zLAUbr9C52W4gKLWSByx47pfDJsEysojKArqOtOKZSVIIUTuQ== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" - core-js-compat "^3.25.1" + "@babel/helper-define-polyfill-provider" "^0.4.1" + core-js-compat "^3.31.0" -babel-plugin-polyfill-regenerator@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" - integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== +babel-plugin-polyfill-regenerator@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.1.tgz#ace7a5eced6dff7d5060c335c52064778216afd3" + integrity sha512-L8OyySuI6OSQ5hFy9O+7zFjyr4WhAfRjLIOkhQGYl+emwJkd/S4XXT1JpfrgR1jrQ1NcGiOh+yAdGlF8pnC3Jw== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" + "@babel/helper-define-polyfill-provider" "^0.4.1" babel-polyfill@^6.2.0: version "6.26.0" @@ -3152,18 +3169,6 @@ big.js@^5.2.2: resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== -bin-links@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-3.0.3.tgz#3842711ef3db2cd9f16a5f404a996a12db355a6e" - integrity sha512-zKdnMPWEdh4F5INR07/eBrodC7QrF5JKvqskjz/ZZRXg5YSAZIbn8zGhbhUrElzHBZ2fvEQdOU59RHcTG3GiwA== - dependencies: - cmd-shim "^5.0.0" - mkdirp-infer-owner "^2.0.0" - npm-normalize-package-bin "^2.0.0" - read-cmd-shim "^3.0.0" - rimraf "^3.0.0" - write-file-atomic "^4.0.0" - binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -3211,7 +3216,7 @@ bluebird@~3.4.1: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" integrity sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA== -body-parser@1.20.1, body-parser@^1.17.2, body-parser@^1.18.3: +body-parser@1.20.1: version "1.20.1" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== @@ -3229,6 +3234,24 @@ body-parser@1.20.1, body-parser@^1.17.2, body-parser@^1.18.3: type-is "~1.6.18" unpipe "1.0.0" +body-parser@^1.17.2, body-parser@^1.18.3: + version "1.20.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + boolbase@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" @@ -3266,15 +3289,15 @@ browser-stdout@1.3.1: resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.5: - version "4.21.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" - integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== +browserslist@^4.14.5, browserslist@^4.21.9: + version "4.21.9" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" + integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== dependencies: - caniuse-lite "^1.0.30001449" - electron-to-chromium "^1.4.284" - node-releases "^2.0.8" - update-browserslist-db "^1.0.10" + caniuse-lite "^1.0.30001503" + electron-to-chromium "^1.4.431" + node-releases "^2.0.12" + update-browserslist-db "^1.0.11" buffer-alloc-unsafe@^1.1.0: version "1.1.0" @@ -3364,10 +3387,10 @@ byline@^5.0.0: resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" integrity sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q== -byte-size@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-7.0.0.tgz#36528cd1ca87d39bd9abd51f5715dc93b6ceb032" - integrity sha512-NNiBxKgxybMBtWdmvx7ZITJi4ZG+CYUgwOSZTfqB1qogkRHrhbQE/R2r5Fh94X+InN5MCYz6SvB/ejHMj/HbsQ== +byte-size@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/byte-size/-/byte-size-8.1.1.tgz#3424608c62d59de5bfda05d31e0313c6174842ae" + integrity sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg== bytes@3.1.2: version "3.1.2" @@ -3379,29 +3402,23 @@ bytesish@^0.4.1: resolved "https://registry.yarnpkg.com/bytesish/-/bytesish-0.4.4.tgz#f3b535a0f1153747427aee27256748cff92347e6" integrity sha512-i4uu6M4zuMUiyfZN4RU2+i9+peJh//pXhd9x1oSe1LBkZ3LEbCoygu8W0bXTukU1Jme2txKuotpCZRaC3FLxcQ== -cacache@^16.0.0, cacache@^16.0.6, cacache@^16.1.0: - version "16.1.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.3.tgz#a02b9f34ecfaf9a78c9f4bc16fceb94d5d67a38e" - integrity sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ== +cacache@^17.0.0: + version "17.1.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.3.tgz#c6ac23bec56516a7c0c52020fd48b4909d7c7044" + integrity sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg== dependencies: - "@npmcli/fs" "^2.1.0" - "@npmcli/move-file" "^2.0.0" - chownr "^2.0.0" - fs-minipass "^2.1.0" - glob "^8.0.1" - infer-owner "^1.0.4" + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^10.2.2" lru-cache "^7.7.1" - minipass "^3.1.6" + minipass "^5.0.0" minipass-collect "^1.0.2" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" - mkdirp "^1.0.4" p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^9.0.0" + ssri "^10.0.0" tar "^6.1.11" - unique-filename "^2.0.0" + unique-filename "^3.0.0" cacheable-lookup@^5.0.3: version "5.0.4" @@ -3409,9 +3426,9 @@ cacheable-lookup@^5.0.3: integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== cacheable-request@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27" - integrity sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew== + version "7.0.4" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817" + integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== dependencies: clone-response "^1.0.2" get-stream "^5.1.0" @@ -3463,10 +3480,10 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001449: - version "1.0.30001452" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001452.tgz#dff7b8bb834b3a91808f0a9ff0453abb1fbba02a" - integrity sha512-Lkp0vFjMkBB3GTpLR8zk4NwW5EdRdnitwYJHDOOKIU85x4ckYCPQ+9WlVvSVClHxVReefkUMtWZH2l9KGlD51w== +caniuse-lite@^1.0.30001503: + version "1.0.30001515" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz#418aefeed9d024cd3129bfae0ccc782d4cb8f12b" + integrity sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA== caseless@~0.12.0: version "0.12.0" @@ -3620,10 +3637,10 @@ chromium-bidi@0.4.4: dependencies: mitt "3.0.0" -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +ci-info@^3.2.0, ci-info@^3.6.1: + version "3.8.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== clean-stack@^2.0.0: version "2.2.0" @@ -3643,9 +3660,9 @@ cli-spinners@2.6.1: integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== cli-spinners@^2.5.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a" - integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== + version "2.9.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.0.tgz#5881d0ad96381e117bbe07ad91f2008fe6ffd8db" + integrity sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g== cli-width@^3.0.0: version "3.0.0" @@ -3705,12 +3722,10 @@ clone@^2.1.2: resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== -cmd-shim@5.0.0, cmd-shim@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-5.0.0.tgz#8d0aaa1a6b0708630694c4dbde070ed94c707724" - integrity sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw== - dependencies: - mkdirp-infer-owner "^2.0.0" +cmd-shim@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-6.0.1.tgz#a65878080548e1dca760b3aea1e21ed05194da9d" + integrity sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q== code-point-at@^1.0.0: version "1.1.0" @@ -3786,11 +3801,6 @@ commander@^7.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== -common-ancestor-path@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz#4f7d2d1394d91b7abdf51871c62f71eadb0182a7" - integrity sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w== - commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -3873,14 +3883,6 @@ conf@^10.2.0: pkg-up "^3.1.0" semver "^7.3.5" -config-chain@1.1.12: - version "1.1.12" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" - integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== - dependencies: - ini "^1.3.4" - proto-list "~1.2.1" - console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" @@ -3893,92 +3895,83 @@ content-disposition@0.5.4: dependencies: safe-buffer "5.2.1" -content-type@~1.0.4: +content-type@~1.0.4, content-type@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== -conventional-changelog-angular@5.0.12: - version "5.0.12" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz#c979b8b921cbfe26402eb3da5bbfda02d865a2b9" - integrity sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw== +conventional-changelog-angular@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-6.0.0.tgz#a9a9494c28b7165889144fd5b91573c4aa9ca541" + integrity sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg== dependencies: compare-func "^2.0.0" - q "^1.5.1" -conventional-changelog-core@4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz#e50d047e8ebacf63fac3dc67bf918177001e1e9f" - integrity sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg== +conventional-changelog-core@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-5.0.1.tgz#3c331b155d5b9850f47b4760aeddfc983a92ad49" + integrity sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A== dependencies: add-stream "^1.0.0" - conventional-changelog-writer "^5.0.0" - conventional-commits-parser "^3.2.0" - dateformat "^3.0.0" - get-pkg-repo "^4.0.0" - git-raw-commits "^2.0.8" + conventional-changelog-writer "^6.0.0" + conventional-commits-parser "^4.0.0" + dateformat "^3.0.3" + get-pkg-repo "^4.2.1" + git-raw-commits "^3.0.0" git-remote-origin-url "^2.0.0" - git-semver-tags "^4.1.1" - lodash "^4.17.15" - normalize-package-data "^3.0.0" - q "^1.5.1" + git-semver-tags "^5.0.0" + normalize-package-data "^3.0.3" read-pkg "^3.0.0" read-pkg-up "^3.0.0" - through2 "^4.0.0" -conventional-changelog-preset-loader@^2.3.4: - version "2.3.4" - resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz#14a855abbffd59027fd602581f1f34d9862ea44c" - integrity sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g== +conventional-changelog-preset-loader@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-3.0.0.tgz#14975ef759d22515d6eabae6396c2ae721d4c105" + integrity sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA== -conventional-changelog-writer@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz#e0757072f045fe03d91da6343c843029e702f359" - integrity sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ== +conventional-changelog-writer@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-6.0.1.tgz#d8d3bb5e1f6230caed969dcc762b1c368a8f7b01" + integrity sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ== dependencies: - conventional-commits-filter "^2.0.7" - dateformat "^3.0.0" + conventional-commits-filter "^3.0.0" + dateformat "^3.0.3" handlebars "^4.7.7" json-stringify-safe "^5.0.1" - lodash "^4.17.15" - meow "^8.0.0" - semver "^6.0.0" - split "^1.0.0" - through2 "^4.0.0" + meow "^8.1.2" + semver "^7.0.0" + split "^1.0.1" -conventional-commits-filter@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz#f8d9b4f182fce00c9af7139da49365b136c8a0b3" - integrity sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA== +conventional-commits-filter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-3.0.0.tgz#bf1113266151dd64c49cd269e3eb7d71d7015ee2" + integrity sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q== dependencies: lodash.ismatch "^4.4.0" - modify-values "^1.0.0" + modify-values "^1.0.1" -conventional-commits-parser@^3.2.0: - version "3.2.4" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz#a7d3b77758a202a9b2293d2112a8d8052c740972" - integrity sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q== +conventional-commits-parser@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-4.0.0.tgz#02ae1178a381304839bce7cea9da5f1b549ae505" + integrity sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg== dependencies: - JSONStream "^1.0.4" + JSONStream "^1.3.5" is-text-path "^1.0.1" - lodash "^4.17.15" - meow "^8.0.0" - split2 "^3.0.0" - through2 "^4.0.0" + meow "^8.1.2" + split2 "^3.2.2" -conventional-recommended-bump@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz#cfa623285d1de554012f2ffde70d9c8a22231f55" - integrity sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw== +conventional-recommended-bump@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-7.0.1.tgz#ec01f6c7f5d0e2491c2d89488b0d757393392424" + integrity sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA== dependencies: concat-stream "^2.0.0" - conventional-changelog-preset-loader "^2.3.4" - conventional-commits-filter "^2.0.7" - conventional-commits-parser "^3.2.0" - git-raw-commits "^2.0.8" - git-semver-tags "^4.1.1" - meow "^8.0.0" - q "^1.5.1" + conventional-changelog-preset-loader "^3.0.0" + conventional-commits-filter "^3.0.0" + conventional-commits-parser "^4.0.0" + git-raw-commits "^3.0.0" + git-semver-tags "^5.0.0" + meow "^8.1.2" convert-source-map@^1.7.0: version "1.9.0" @@ -4020,12 +4013,12 @@ copy-webpack-plugin@^8.1.1: schema-utils "^3.0.0" serialize-javascript "^5.0.1" -core-js-compat@^3.25.1: - version "3.28.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.28.0.tgz#c08456d854608a7264530a2afa281fadf20ecee6" - integrity sha512-myzPgE7QodMg4nnd3K1TDoES/nADRStM8Gpz0D6nhkwbmwEnE0ZGJgoWsvQ722FR8D7xS0n0LV556RcEicjTyg== +core-js-compat@^3.31.0: + version "3.31.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.31.1.tgz#5084ad1a46858df50ff89ace152441a63ba7aae0" + integrity sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA== dependencies: - browserslist "^4.21.5" + browserslist "^4.21.9" core-js@^2.4.0, core-js@^2.5.0: version "2.6.12" @@ -4045,31 +4038,30 @@ cors@~2.8.5: object-assign "^4" vary "^1" -cosmiconfig@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" - integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== +cosmiconfig@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.0.0.tgz#e9feae014eab580f858f8a0288f38997a7bebe97" + integrity sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ== dependencies: - "@types/parse-json" "^4.0.0" import-fresh "^3.2.1" + js-yaml "^4.1.0" parse-json "^5.0.0" path-type "^4.0.0" - yaml "^1.10.0" -cosmiconfig@8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.0.0.tgz#e9feae014eab580f858f8a0288f38997a7bebe97" - integrity sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ== +cosmiconfig@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.2.0.tgz#f7d17c56a590856cd1e7cee98734dca272b0d8fd" + integrity sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ== dependencies: import-fresh "^3.2.1" js-yaml "^4.1.0" parse-json "^5.0.0" path-type "^4.0.0" -cpu-features@~0.0.6: - version "0.0.7" - resolved "https://registry.yarnpkg.com/cpu-features/-/cpu-features-0.0.7.tgz#81ba93e1d0a729fd25132a54c3ff689c37b542f7" - integrity sha512-fjzFmsUKKCrC9GrM1eQTvQx18e+kjXFzjRLvJPNEDjk31+bJ6ZiV6uchv/hzbzXVIgbWdrEyyX1IFKwse65+8w== +cpu-features@~0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/cpu-features/-/cpu-features-0.0.8.tgz#a2d464b023b8ad09004c8cdca23b33f192f63546" + integrity sha512-BbHBvtYhUhksqTjr6bhNOjGgMnhwhGTQmOoZGD+K7BCaQDCuZl/Ve1ZxUSMRwVC4D/rkCPQ2MAIeYzrWyK7eEg== dependencies: buildcheck "~0.0.6" nan "^2.17.0" @@ -4099,14 +4091,14 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: which "^2.0.1" css-loader@^6.2.0: - version "6.7.3" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.3.tgz#1e8799f3ccc5874fdd55461af51137fcc5befbcd" - integrity sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ== + version "6.8.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88" + integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== dependencies: icss-utils "^5.1.0" - postcss "^8.4.19" + postcss "^8.4.21" postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" + postcss-modules-local-by-default "^4.0.3" postcss-modules-scope "^3.0.0" postcss-modules-values "^4.0.0" postcss-value-parser "^4.2.0" @@ -4141,9 +4133,9 @@ cssstyle@^3.0.0: rrweb-cssom "^0.6.0" csstype@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" - integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== dargs@^7.0.0: version "7.0.0" @@ -4164,7 +4156,7 @@ date-fns@^1.23.0: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== -dateformat@^3.0.0: +dateformat@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== @@ -4183,7 +4175,7 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@~4.3.1, debug@~4.3.2: +debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -4204,11 +4196,6 @@ debug@^3.1.0, debug@^3.2.7: dependencies: ms "^2.1.1" -debuglog@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" - integrity sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw== - decamelize-keys@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" @@ -4299,7 +4286,7 @@ decompress@^4.2.1: pify "^2.3.0" strip-dirs "^2.0.0" -dedent@0.7.0, dedent@^0.7.0: +dedent@0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== @@ -4323,15 +4310,15 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-is@^0.1.3, deep-is@~0.1.3: +deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: - version "4.3.0" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b" - integrity sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og== + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== default-require-extensions@^3.0.0: version "3.0.1" @@ -4362,7 +4349,7 @@ define-lazy-prop@^2.0.0: resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-properties@^1.1.3, define-properties@^1.1.4: +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== @@ -4380,17 +4367,12 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== -depd@2.0.0: +depd@2.0.0, depd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -depd@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - -deprecation@^2.0.0, deprecation@^2.3.1: +deprecation@^2.0.0: version "2.3.1" resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== @@ -4425,13 +4407,10 @@ devtools-protocol@0.0.1094867: resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1094867.tgz#2ab93908e9376bd85d4e0604aa2651258f13e374" integrity sha512-pmMDBKiRVjh0uKK6CT1WqZmM3hBVSgD+N2MrgyV1uNizAZMw4tx6i/RTc+/uCsKSCmg0xXx7arCP/OFcIwTsiQ== -dezalgo@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81" - integrity sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig== - dependencies: - asap "^2.0.0" - wrappy "1" +diff-sequences@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" + integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== diff@5.0.0: version "5.0.0" @@ -4502,7 +4481,7 @@ domexception@^4.0.0: dependencies: webidl-conversions "^7.0.0" -domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: +domhandler@^5.0.2, domhandler@^5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== @@ -4510,25 +4489,18 @@ domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: domelementtype "^2.3.0" dompurify@^2.2.9: - version "2.4.4" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.4.tgz#c17803931dd524e1b68e0e940a84567f9498f4bd" - integrity sha512-1e2SpqHiRx4DPvmRuXU5J0di3iQACwJM+mFGE2HAkkK7Tbnfk9WcghcAmyWc9CRrjyRRUpmuhPUH6LphQQR3EQ== + version "2.4.7" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.7.tgz#277adeb40a2c84be2d42a8bcd45f582bfa4d0cfc" + integrity sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ== domutils@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c" - integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== dependencies: dom-serializer "^2.0.0" domelementtype "^2.3.0" - domhandler "^5.0.1" - -dot-prop@6.0.1, dot-prop@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" - integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== - dependencies: - is-obj "^2.0.0" + domhandler "^5.0.3" dot-prop@^5.1.0: version "5.3.0" @@ -4537,6 +4509,13 @@ dot-prop@^5.1.0: dependencies: is-obj "^2.0.0" +dot-prop@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" + integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== + dependencies: + is-obj "^2.0.0" + dotenv@~10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" @@ -4582,15 +4561,20 @@ duplexer@^0.1.1, duplexer@~0.1.1: resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== ejs@^3.1.7: - version "3.1.8" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b" - integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ== + version "3.1.9" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" + integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== dependencies: jake "^10.8.5" @@ -4634,10 +4618,10 @@ electron-store@^8.0.0: conf "^10.2.0" type-fest "^2.17.0" -electron-to-chromium@^1.4.284: - version "1.4.295" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.295.tgz#911d5df67542bf7554336142eb302c5ec90bba66" - integrity sha512-lEO94zqf1bDA3aepxwnWoHUjA8sZ+2owgcSZjYQy0+uOSEclJX0VieZC+r+wLpSxUHRd6gG32znTWmr+5iGzFw== +electron-to-chromium@^1.4.431: + version "1.4.455" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.455.tgz#81fe4353ac970eb971c07088c8da8b7f6280ddc9" + integrity sha512-8tgdX0Odl24LtmLwxotpJCVjIndN559AvaOtd67u+2mo+IDsgsTF580NB+uuDCqsHw8yFg53l5+imFV9Fw3cbA== electron-window@^0.8.0: version "0.8.1" @@ -4647,9 +4631,9 @@ electron-window@^0.8.0: is-electron-renderer "^2.0.0" electron@^23.2.4: - version "23.2.4" - resolved "https://registry.yarnpkg.com/electron/-/electron-23.2.4.tgz#6f19be9e45c5e5cdf736d0ed747ce4ed4c4bbfeb" - integrity sha512-ceFd+KIhzK3srGY22kcBu8QH7hV1G3DHlgrg2LGjg7mgtzxlXeyKzk2Efq0iFNu3ly14QKfiN5gYdvEenmzOAA== + version "23.3.10" + resolved "https://registry.yarnpkg.com/electron/-/electron-23.3.10.tgz#f148e0ddeb84c57979530842011ac228851e354b" + integrity sha512-PcEQo8letcJYUAP3x+GN4Qf4atS65EVxe3VhKrQUnSI6GA5+K1zrs3ur88iHXD4a3mJaH/491Y4pBTLxFqwXnA== dependencies: "@electron/get" "^2.0.0" "@types/node" "^16.11.26" @@ -4660,6 +4644,11 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + emojis-list@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" @@ -4684,26 +4673,26 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" -engine.io-client@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.4.0.tgz#88cd3082609ca86d7d3c12f0e746d12db4f47c91" - integrity sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g== +engine.io-client@~6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.5.1.tgz#1735fb8ae3bae5ae13115e18d2f484daf005dd9c" + integrity sha512-hE5wKXH8Ru4L19MbM1GgYV/2Qo54JSMh1rlJbfpa40bEWkCKNo3ol2eOtGmowcr+ysgbI7+SGL+by42Q3pt/Ng== dependencies: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" - engine.io-parser "~5.0.3" + engine.io-parser "~5.1.0" ws "~8.11.0" xmlhttprequest-ssl "~2.0.0" -engine.io-parser@~5.0.3: - version "5.0.6" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.6.tgz#7811244af173e157295dec9b2718dfe42a64ef45" - integrity sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw== +engine.io-parser@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.1.0.tgz#d593d6372d7f79212df48f807b8cace1ea1cb1b8" + integrity sha512-enySgNiK5tyZFynt3z7iqBR+Bto9EVVVvDFuTT0ioHCGbzirZVGDGiQjZzEp8hWl6hd5FSVytJGuScX1C1C35w== -engine.io@~6.4.1: - version "6.4.2" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.4.2.tgz#ffeaf68f69b1364b0286badddf15ff633476473f" - integrity sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg== +engine.io@~6.5.0: + version "6.5.1" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.5.1.tgz#59725f8593ccc891abb47f1efcdc52a089525a56" + integrity sha512-mGqhI+D7YxS9KJMppR6Iuo37Ed3abhU8NdfgSvJSDUafQutrN+sPTncJYTyM9+tkhSmWodKtVYGPPHyXJEwEQA== dependencies: "@types/cookie" "^0.4.1" "@types/cors" "^2.8.12" @@ -4713,13 +4702,13 @@ engine.io@~6.4.1: cookie "~0.4.1" cors "~2.8.5" debug "~4.3.1" - engine.io-parser "~5.0.3" + engine.io-parser "~5.1.0" ws "~8.11.0" -enhanced-resolve@^5.10.0: - version "5.12.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" - integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== +enhanced-resolve@^5.15.0: + version "5.15.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -4731,10 +4720,10 @@ enquirer@^2.3.5, enquirer@~2.3.6: dependencies: ansi-colors "^4.1.1" -entities@^4.2.0, entities@^4.3.0, entities@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" - integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== +entities@^4.2.0, entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== entities@~2.1.0: version "2.1.0" @@ -4746,11 +4735,16 @@ env-paths@^2.2.0, env-paths@^2.2.1: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== -envinfo@^7.7.3, envinfo@^7.7.4: +envinfo@7.8.1: version "7.8.1" resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== +envinfo@^7.7.3: + version "7.10.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.10.0.tgz#55146e3909cc5fe63c22da63fb15b05aeac35b13" + integrity sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw== + err-code@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" @@ -4771,17 +4765,17 @@ error-ex@^1.3.1: is-arrayish "^0.2.1" es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.21.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.1.tgz#e6105a099967c08377830a0c9cb589d570dd86c6" - integrity sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg== + version "1.21.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" + integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== dependencies: + array-buffer-byte-length "^1.0.0" available-typed-arrays "^1.0.5" call-bind "^1.0.2" es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" - function-bind "^1.1.1" function.prototype.name "^1.1.5" - get-intrinsic "^1.1.3" + get-intrinsic "^1.2.0" get-symbol-description "^1.0.0" globalthis "^1.0.3" gopd "^1.0.1" @@ -4789,8 +4783,8 @@ es-abstract@^1.19.0, es-abstract@^1.20.4: has-property-descriptors "^1.0.0" has-proto "^1.0.1" has-symbols "^1.0.3" - internal-slot "^1.0.4" - is-array-buffer "^3.0.1" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" is-callable "^1.2.7" is-negative-zero "^2.0.2" is-regex "^1.1.4" @@ -4798,21 +4792,22 @@ es-abstract@^1.19.0, es-abstract@^1.20.4: is-string "^1.0.7" is-typed-array "^1.1.10" is-weakref "^1.0.2" - object-inspect "^1.12.2" + object-inspect "^1.12.3" object-keys "^1.1.1" object.assign "^4.1.4" regexp.prototype.flags "^1.4.3" safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.7" string.prototype.trimend "^1.0.6" string.prototype.trimstart "^1.0.6" typed-array-length "^1.0.4" unbox-primitive "^1.0.2" which-typed-array "^1.1.9" -es-module-lexer@^0.9.0: - version "0.9.3" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" - integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== +es-module-lexer@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f" + integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA== es-set-tostringtag@^2.0.1: version "2.0.1" @@ -4870,14 +4865,13 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== dependencies: esprima "^4.0.1" estraverse "^5.2.0" esutils "^2.0.2" - optionator "^0.8.1" optionalDependencies: source-map "~0.6.1" @@ -4891,9 +4885,9 @@ eslint-import-resolver-node@^0.3.7: resolve "^1.22.1" eslint-module-utils@^2.7.4: - version "2.7.4" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" - integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== + version "2.8.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== dependencies: debug "^3.2.7" @@ -5055,10 +5049,10 @@ esprima@~3.1.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" integrity sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg== -esquery@^1.0.1, esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== +esquery@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" @@ -5175,6 +5169,11 @@ expand-template@^2.0.3: resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== +exponential-backoff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" + integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== + express@^4.16.3: version "4.18.2" resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" @@ -5249,9 +5248,9 @@ fast-glob@3.2.7: micromatch "^4.0.4" fast-glob@^3.2.5, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + version "3.3.0" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.0.tgz#7c40cb491e1e2ed5664749e87bfb516dbe8727c0" + integrity sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -5264,7 +5263,7 @@ fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== @@ -5332,7 +5331,7 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== -filelist@^1.0.1: +filelist@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== @@ -5478,6 +5477,14 @@ foreground-child@^2.0.0: cross-spawn "^7.0.0" signal-exit "^3.0.2" +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + form-data@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" @@ -5521,16 +5528,6 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-extra@9.1.0, fs-extra@^9.0.8, fs-extra@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - fs-extra@^10.0.0: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" @@ -5540,10 +5537,10 @@ fs-extra@^10.0.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.0.tgz#5784b102104433bb0e090f48bfc4a30742c357ed" - integrity sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw== +fs-extra@^11.1.0, fs-extra@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" + integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" @@ -5567,13 +5564,30 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-minipass@^2.0.0, fs-minipass@^2.1.0: +fs-extra@^9.0.8: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-minipass@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== dependencies: minipass "^3.0.0" +fs-minipass@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.2.tgz#5b383858efa8c1eb8c33b39e994f7e8555b8b3a3" + integrity sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g== + dependencies: + minipass "^5.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -5614,7 +5628,7 @@ functional-red-black-tree@^1.0.1: resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== -functions-have-names@^1.2.2: +functions-have-names@^1.2.2, functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== @@ -5668,12 +5682,13 @@ get-func-name@^2.0.0: integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" - integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== dependencies: function-bind "^1.1.1" has "^1.0.3" + has-proto "^1.0.1" has-symbols "^1.0.3" get-package-type@^0.1.0: @@ -5681,7 +5696,7 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-pkg-repo@^4.0.0: +get-pkg-repo@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz#75973e1c8050c73f48190c52047c4cee3acbf385" integrity sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA== @@ -5729,16 +5744,14 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" -git-raw-commits@^2.0.8: - version "2.0.11" - resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" - integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== +git-raw-commits@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-3.0.0.tgz#5432f053a9744f67e8db03dbc48add81252cfdeb" + integrity sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw== dependencies: dargs "^7.0.0" - lodash "^4.17.15" - meow "^8.0.0" - split2 "^3.0.0" - through2 "^4.0.0" + meow "^8.1.2" + split2 "^3.2.2" git-remote-origin-url@^2.0.0: version "2.0.0" @@ -5748,13 +5761,13 @@ git-remote-origin-url@^2.0.0: gitconfiglocal "^1.0.0" pify "^2.3.0" -git-semver-tags@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-4.1.1.tgz#63191bcd809b0ec3e151ba4751c16c444e5b5780" - integrity sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA== +git-semver-tags@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-5.0.1.tgz#db748aa0e43d313bf38dcd68624d8443234e1c15" + integrity sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA== dependencies: - meow "^8.0.0" - semver "^6.0.0" + meow "^8.1.2" + semver "^7.0.0" git-up@^7.0.0: version "7.0.0" @@ -5819,6 +5832,17 @@ glob@7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^10.2.2: + version "10.3.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.3.tgz#8360a4ffdd6ed90df84aa8d52f21f452e86a123b" + integrity sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.0.3" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7, glob@^7.2.0: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" @@ -5842,6 +5866,16 @@ glob@^8.0.1, glob@^8.0.3: minimatch "^5.0.1" once "^1.3.0" +glob@^9.2.0: + version "9.3.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.5.tgz#ca2ed8ca452781a3009685607fdf025a899dfe21" + integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== + dependencies: + fs.realpath "^1.0.0" + minimatch "^8.0.2" + minipass "^4.2.4" + path-scurry "^1.6.1" + global-agent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6" @@ -5921,10 +5955,10 @@ got@^11.7.0, got@^11.8.5: p-cancelable "^2.0.0" responselike "^2.0.0" -graceful-fs@4.2.10, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +graceful-fs@4.2.11, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== growl@1.10.5: version "1.10.5" @@ -6018,9 +6052,9 @@ he@1.2.0: integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== highlight.js@*: - version "11.7.0" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.7.0.tgz#3ff0165bc843f8c9bce1fd89e2fda9143d24b11e" - integrity sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ== + version "11.8.0" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.8.0.tgz#966518ea83257bae2e7c9a48596231856555bb65" + integrity sha512-MedQhoqVdr0U6SSnWPzfiadUcDHfN/Wzq25AkXiQv9oiOO/sG0S7XkvpFIqWBl9Yq1UYyYOOVORs5UW2XlPyzg== highlight.js@10.4.1: version "10.4.1" @@ -6046,10 +6080,10 @@ hosted-git-info@^4.0.0, hosted-git-info@^4.0.1, hosted-git-info@^4.0.2: dependencies: lru-cache "^6.0.0" -hosted-git-info@^5.0.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-5.2.1.tgz#0ba1c97178ef91f3ab30842ae63d6a272341156f" - integrity sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw== +hosted-git-info@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-6.1.1.tgz#629442c7889a69c05de604d52996b74fe6f26d58" + integrity sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w== dependencies: lru-cache "^7.5.1" @@ -6066,16 +6100,16 @@ html-escaper@^2.0.0: integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== htmlparser2@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.1.tgz#abaa985474fcefe269bc761a779b544d7196d010" - integrity sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA== + version "8.0.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" + integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== dependencies: domelementtype "^2.3.0" - domhandler "^5.0.2" + domhandler "^5.0.3" domutils "^3.0.1" - entities "^4.3.0" + entities "^4.4.0" -http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0: +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== @@ -6195,6 +6229,13 @@ ignore-walk@^5.0.1: dependencies: minimatch "^5.0.1" +ignore-walk@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.3.tgz#0fcdb6decaccda35e308a7b0948645dd9523b7bb" + integrity sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA== + dependencies: + minimatch "^9.0.0" + ignore@^3.3.5: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" @@ -6223,7 +6264,7 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" -import-local@^3.0.2: +import-local@3.1.0, import-local@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== @@ -6246,11 +6287,6 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -6264,23 +6300,23 @@ inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, i resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@^1.3.2, ini@^1.3.4, ini@~1.3.0: +ini@^1.3.2, ini@^1.3.8, ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -init-package-json@3.0.2, init-package-json@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-3.0.2.tgz#f5bc9bac93f2bdc005778bc2271be642fecfcd69" - integrity sha512-YhlQPEjNFqlGdzrBfDNRLhvoSgX7iQRgSxgsNknRQ9ITXFT7UMfVMWhBTOh2Y+25lRnGrv5Xz8yZwQ3ACR6T3A== +init-package-json@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-5.0.0.tgz#030cf0ea9c84cfc1b0dc2e898b45d171393e4b40" + integrity sha512-kBhlSheBfYmq3e0L1ii+VKe3zBTLL5lDCDWR+f9dLmEGSB3MqLlMlsolubSsyI88Bg6EA+BIMlomAnQ1SwgQBw== dependencies: - npm-package-arg "^9.0.1" - promzard "^0.3.0" - read "^1.0.7" - read-package-json "^5.0.0" + npm-package-arg "^10.0.0" + promzard "^1.0.0" + read "^2.0.0" + read-package-json "^6.0.0" semver "^7.3.5" validate-npm-package-license "^3.0.4" - validate-npm-package-name "^4.0.0" + validate-npm-package-name "^5.0.0" inquirer@^8.2.4: version "8.2.5" @@ -6303,7 +6339,7 @@ inquirer@^8.2.4: through "^2.3.6" wrap-ansi "^7.0.0" -internal-slot@^1.0.3, internal-slot@^1.0.4: +internal-slot@^1.0.3, internal-slot@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== @@ -6332,13 +6368,13 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -is-array-buffer@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.1.tgz#deb1db4fcae48308d54ef2442706c0393997052a" - integrity sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ== +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.1.3" + get-intrinsic "^1.2.0" is-typed-array "^1.1.10" is-arrayish@^0.2.1: @@ -6373,17 +6409,17 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-ci@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== +is-ci@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== dependencies: - ci-info "^2.0.0" + ci-info "^3.2.0" is-core-module@^2.11.0, is-core-module@^2.5.0, is-core-module@^2.8.1, is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + version "2.12.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== dependencies: has "^1.0.3" @@ -6405,9 +6441,9 @@ is-electron-renderer@^2.0.0: integrity sha512-pRlQnpaCFhDVPtkXkP+g9Ybv/CjbiQDjnKFQTEjpBfDKeV6dRDBczuFRDpM6DVfk2EjpMS8t5kwE5jPnqYl3zA== is-electron@^2.1.0, is-electron@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.1.tgz#751b1dd8a74907422faa5c35aaa0cf66d98086e9" - integrity sha512-r8EEQQsqT+Gn0aXFx7lTFygYQhILLCB+wn0WCDL5LZRINeLH/Rvw1j2oKodELLXYNImQ3CRlVsY8wW4cGOsyuw== + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.2.tgz#3778902a2044d76de98036f5dc58089ac4d80bb9" + integrity sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg== is-extglob@^2.1.1: version "2.1.1" @@ -6690,15 +6726,39 @@ istanbul-reports@^3.0.2: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +jackspeak@^2.0.3: + version "2.2.1" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.2.1.tgz#655e8cf025d872c9c03d3eb63e8f0c024fef16a6" + integrity sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + jake@^10.8.5: - version "10.8.5" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" - integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw== + version "10.8.7" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" + integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== dependencies: async "^3.2.3" chalk "^4.0.2" - filelist "^1.0.1" - minimatch "^3.0.4" + filelist "^1.0.4" + minimatch "^3.1.2" + +"jest-diff@>=29.4.3 < 30": + version "29.6.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.6.1.tgz#13df6db0a89ee6ad93c747c75c85c70ba941e545" + integrity sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.6.1" + +jest-get-type@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" + integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== jest-worker@^27.4.5: version "27.5.1" @@ -6740,9 +6800,9 @@ jschardet@^2.1.1: integrity sha512-6I6xT7XN/7sBB7q8ObzKbmv5vN+blzLcboDE1BNEsEfmRXJValMxO6OIRT69ylPBRemS3rw6US+CMCar0OBc9g== jsdom@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-21.1.1.tgz#ab796361e3f6c01bcfaeda1fea3c06197ac9d8ae" - integrity sha512-Jjgdmw48RKcdAIQyUD1UdBh2ecH7VqwaXPN3ehoZN6MqgVbMn+lRm1aAT1AsdJRAJpwfa4IpwgzySn61h2qu3w== + version "21.1.2" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-21.1.2.tgz#6433f751b8718248d646af1cdf6662dc8a1ca7f9" + integrity sha512-sCpFmK2jv+1sjff4u7fzft+pUh2KSUbUrEHYHyfSIbGTIcmnjyp83qg6qLwdJ/I3LpTXx33ACxeRL7Lsyc6lGQ== dependencies: abab "^2.0.6" acorn "^8.8.2" @@ -6757,7 +6817,7 @@ jsdom@^21.1.1: http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.1" is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.2" + nwsapi "^2.2.4" parse5 "^7.1.2" rrweb-cssom "^0.6.0" saxes "^6.0.0" @@ -6796,6 +6856,11 @@ json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +json-parse-even-better-errors@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz#2cb2ee33069a78870a0c7e3da560026b89669cf7" + integrity sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -6816,17 +6881,12 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json-stringify-nice@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz#2c937962b80181d3f317dd39aa323e14f5a60a67" - integrity sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw== - json-stringify-safe@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -json5@^1.0.1: +json5@^1.0.1, json5@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== @@ -6838,7 +6898,7 @@ json5@^2.1.2, json5@^2.2.2: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -jsonc-parser@3.2.0, jsonc-parser@^3.0.0: +jsonc-parser@3.2.0, jsonc-parser@^3.0.0, jsonc-parser@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== @@ -6870,22 +6930,14 @@ jsonparse@^1.2.0, jsonparse@^1.3.1: integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== "jsx-ast-utils@^2.4.1 || ^3.0.0": - version "3.3.3" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" - integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== + version "3.3.4" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz#b896535fed5b867650acce5a9bd4135ffc7b3bf9" + integrity sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw== dependencies: - array-includes "^3.1.5" - object.assign "^4.1.3" - -just-diff-apply@^5.2.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/just-diff-apply/-/just-diff-apply-5.5.0.tgz#771c2ca9fa69f3d2b54e7c3f5c1dfcbcc47f9f0f" - integrity sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw== - -just-diff@^5.0.1: - version "5.2.0" - resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-5.2.0.tgz#60dca55891cf24cd4a094e33504660692348a241" - integrity sha512-6ufhP9SHjb7jibNFrNxyFZ6od3g+An6Ai9mhGRvcYe8UJlH0prseN64M+6ZBBUoKYHZsitDP42gAJ8+eVWr3lw== + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" just-extend@^4.0.2: version "4.2.1" @@ -6925,48 +6977,47 @@ kind-of@^6.0.2, kind-of@^6.0.3: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -lerna@^6.0.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/lerna/-/lerna-6.5.1.tgz#eb89698e5b2891f5681f39d980f63d0519fc464f" - integrity sha512-Va1bysubwWdoWZ1ncKcoTGBXNAu/10/TwELb550TTivXmEWjCCdek4eX0BNLTEYKxu3tpV2UEeqVisUiWGn4WA== - dependencies: - "@lerna/child-process" "6.5.1" - "@lerna/create" "6.5.1" - "@npmcli/arborist" "5.3.0" - "@npmcli/run-script" "4.1.7" - "@nrwl/devkit" ">=15.5.2 < 16" +lerna@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/lerna/-/lerna-7.1.1.tgz#6703062e6c4ddefdaf41e8890e9200690924fd71" + integrity sha512-rjivAl3bYu2+lWOi90vy0tYFgwBYPMiNkR/DuEWZC08wle5dsbOZ/SlXeLk9+kzbF89Bt5P6p+qF78A2tJsWPA== + dependencies: + "@lerna/child-process" "7.1.1" + "@lerna/create" "7.1.1" + "@npmcli/run-script" "6.0.2" + "@nx/devkit" ">=16.1.3 < 17" "@octokit/plugin-enterprise-rest" "6.0.1" - "@octokit/rest" "19.0.3" - byte-size "7.0.0" + "@octokit/rest" "19.0.11" + byte-size "8.1.1" chalk "4.1.0" clone-deep "4.0.1" - cmd-shim "5.0.0" + cmd-shim "6.0.1" columnify "1.6.0" - config-chain "1.1.12" - conventional-changelog-angular "5.0.12" - conventional-changelog-core "4.2.4" - conventional-recommended-bump "6.1.0" - cosmiconfig "7.0.0" + conventional-changelog-angular "6.0.0" + conventional-changelog-core "5.0.1" + conventional-recommended-bump "7.0.1" + cosmiconfig "^8.2.0" dedent "0.7.0" - dot-prop "6.0.1" - envinfo "^7.7.4" + envinfo "7.8.1" execa "5.0.0" - fs-extra "9.1.0" + fs-extra "^11.1.1" get-port "5.1.1" get-stream "6.0.0" git-url-parse "13.1.0" glob-parent "5.1.2" globby "11.1.0" - graceful-fs "4.2.10" + graceful-fs "4.2.11" has-unicode "2.0.1" - import-local "^3.0.2" - init-package-json "3.0.2" + import-local "3.1.0" + ini "^1.3.8" + init-package-json "5.0.0" inquirer "^8.2.4" - is-ci "2.0.0" + is-ci "3.0.1" is-stream "2.0.0" - js-yaml "^4.1.0" - libnpmaccess "6.0.3" - libnpmpublish "6.0.4" + jest-diff ">=29.4.3 < 30" + js-yaml "4.1.0" + libnpmaccess "7.0.2" + libnpmpublish "7.3.0" load-json-file "6.2.0" make-dir "3.1.0" minimatch "3.0.5" @@ -6974,35 +7025,34 @@ lerna@^6.0.1: node-fetch "2.6.7" npm-package-arg "8.1.1" npm-packlist "5.1.1" - npm-registry-fetch "13.3.0" + npm-registry-fetch "^14.0.5" npmlog "^6.0.2" - nx ">=15.5.2 < 16" + nx ">=16.1.3 < 17" p-map "4.0.0" p-map-series "2.1.0" p-pipe "3.1.0" p-queue "6.6.2" p-reduce "2.1.0" p-waterfall "2.1.1" - pacote "13.6.1" - path-exists "4.0.0" + pacote "^15.2.0" pify "5.0.0" - read-cmd-shim "3.0.0" - read-package-json "5.0.1" + read-cmd-shim "4.0.0" + read-package-json "6.0.4" resolve-from "5.0.0" - rimraf "^3.0.2" - semver "7.3.4" + rimraf "^4.4.1" + semver "^7.3.8" signal-exit "3.0.7" slash "3.0.0" - ssri "9.0.1" + ssri "^9.0.1" strong-log-transformer "2.1.0" tar "6.1.11" temp-dir "1.0.0" - typescript "^3 || ^4" - upath "^2.0.1" - uuid "8.3.2" + typescript ">=3 < 6" + upath "2.0.1" + uuid "^9.0.0" validate-npm-package-license "3.0.4" - validate-npm-package-name "4.0.0" - write-file-atomic "4.0.1" + validate-npm-package-name "5.0.0" + write-file-atomic "5.0.1" write-pkg "4.0.0" yargs "16.2.0" yargs-parser "20.2.4" @@ -7036,34 +7086,27 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -libnpmaccess@6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-6.0.3.tgz#473cc3e4aadb2bc713419d92e45d23b070d8cded" - integrity sha512-4tkfUZprwvih2VUZYMozL7EMKgQ5q9VW2NtRyxWtQWlkLTAWHRklcAvBN49CVqEkhUw7vTX2fNgB5LzgUucgYg== - dependencies: - aproba "^2.0.0" - minipass "^3.1.1" - npm-package-arg "^9.0.1" - npm-registry-fetch "^13.0.0" - -libnpmpublish@6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-6.0.4.tgz#adb41ec6b0c307d6f603746a4d929dcefb8f1a0b" - integrity sha512-lvAEYW8mB8QblL6Q/PI/wMzKNvIrF7Kpujf/4fGS/32a2i3jzUXi04TNyIBcK6dQJ34IgywfaKGh+Jq4HYPFmg== - dependencies: - normalize-package-data "^4.0.0" - npm-package-arg "^9.0.1" - npm-registry-fetch "^13.0.0" +libnpmaccess@7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-7.0.2.tgz#7f056c8c933dd9c8ba771fa6493556b53c5aac52" + integrity sha512-vHBVMw1JFMTgEk15zRsJuSAg7QtGGHpUSEfnbcRL1/gTBag9iEfJbyjpDmdJmwMhvpoLoNBtdAUCdGnaP32hhw== + dependencies: + npm-package-arg "^10.1.0" + npm-registry-fetch "^14.0.3" + +libnpmpublish@7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-7.3.0.tgz#2ceb2b36866d75a6cd7b4aa748808169f4d17e37" + integrity sha512-fHUxw5VJhZCNSls0KLNEG0mCD2PN1i14gH5elGOgiVnU3VgTcRahagYP2LKI1m0tFCJ+XrAm0zVYyF5RCbXzcg== + dependencies: + ci-info "^3.6.1" + normalize-package-data "^5.0.0" + npm-package-arg "^10.1.0" + npm-registry-fetch "^14.0.3" + proc-log "^3.0.0" semver "^7.3.7" - ssri "^9.0.0" + sigstore "^1.4.0" + ssri "^10.0.1" limiter@^2.1.0: version "2.1.0" @@ -7284,9 +7327,14 @@ lru-cache@^6.0.0: yallist "^4.0.0" lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: - version "7.14.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.14.1.tgz#8da8d2f5f59827edb388e63e459ac23d6d408fea" - integrity sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA== + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + +"lru-cache@^9.1.1 || ^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.0.tgz#b9e2a6a72a129d81ab317202d93c7691df727e61" + integrity sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw== lunr@^2.3.9: version "2.3.9" @@ -7334,27 +7382,26 @@ make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-fetch-happen@^10.0.3, make-fetch-happen@^10.0.6: - version "10.2.1" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" - integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== +make-fetch-happen@^11.0.0, make-fetch-happen@^11.0.1, make-fetch-happen@^11.0.3, make-fetch-happen@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz#85ceb98079584a9523d4bf71d32996e7e208549f" + integrity sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w== dependencies: agentkeepalive "^4.2.1" - cacache "^16.1.0" - http-cache-semantics "^4.1.0" + cacache "^17.0.0" + http-cache-semantics "^4.1.1" http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" is-lambda "^1.0.1" lru-cache "^7.7.1" - minipass "^3.1.6" - minipass-collect "^1.0.2" - minipass-fetch "^2.0.3" + minipass "^5.0.0" + minipass-fetch "^3.0.0" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" negotiator "^0.6.3" promise-retry "^2.0.1" socks-proxy-agent "^7.0.0" - ssri "^9.0.0" + ssri "^10.0.0" map-obj@^1.0.0: version "1.0.1" @@ -7388,9 +7435,9 @@ markdown-it@^12.3.2: uc.micro "^1.0.5" marked@^4.0.16: - version "4.2.12" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.2.12.tgz#d69a64e21d71b06250da995dcd065c11083bebb5" - integrity sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw== + version "4.3.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" + integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== matcher@^3.0.0: version "3.0.0" @@ -7409,7 +7456,7 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== -meow@^8.0.0: +meow@^8.1.2: version "8.1.2" resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== @@ -7507,9 +7554,9 @@ min-indent@^1.0.0: integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== mini-css-extract-plugin@^2.6.1: - version "2.7.2" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz#e049d3ea7d3e4e773aad585c6cb329ce0c7b72d7" - integrity sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw== + version "2.7.6" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz#282a3d38863fddcd2e0c220aaed5b90bc156564d" + integrity sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw== dependencies: schema-utils "^4.0.0" @@ -7548,6 +7595,20 @@ minimatch@^5.0.1, minimatch@^5.1.0: dependencies: brace-expansion "^2.0.1" +minimatch@^8.0.2: + version "8.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-8.0.4.tgz#847c1b25c014d4e9a7f68aaf63dedd668a626229" + integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.0, minimatch@^9.0.1: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" @@ -7569,12 +7630,12 @@ minipass-collect@^1.0.2: dependencies: minipass "^3.0.0" -minipass-fetch@^2.0.3: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.2.tgz#95560b50c472d81a3bc76f20ede80eaed76d8add" - integrity sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA== +minipass-fetch@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.3.tgz#d9df70085609864331b533c960fd4ffaa78d15ce" + integrity sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ== dependencies: - minipass "^3.1.6" + minipass "^5.0.0" minipass-sized "^1.0.3" minizlib "^2.1.2" optionalDependencies: @@ -7609,17 +7670,27 @@ minipass-sized@^1.0.3: dependencies: minipass "^3.0.0" -minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6: +minipass@^3.0.0, minipass@^3.1.1: version "3.3.6" resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== dependencies: yallist "^4.0.0" -minipass@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.0.3.tgz#00bfbaf1e16e35e804f4aa31a7c1f6b8d9f0ee72" - integrity sha512-OW2r4sQ0sI+z5ckEt5c1Tri4xTgZwYDxpE54eqWlQloQRoWtXjqt9udJ5Z4dSv7wK+nfFI7FRXyCpBSft+gpFw== +minipass@^4.2.4: + version "4.2.8" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a" + integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": + version "7.0.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.2.tgz#58a82b7d81c7010da5bd4b2c0c85ac4b4ec5131e" + integrity sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA== minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" @@ -7639,15 +7710,6 @@ mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== -mkdirp-infer-owner@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz#55d3b368e7d89065c38f32fd38e638f0ab61d316" - integrity sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw== - dependencies: - chownr "^2.0.0" - infer-owner "^1.0.4" - mkdirp "^1.0.3" - "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.4: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" @@ -7717,7 +7779,7 @@ mocha@^9.1.1: yargs-parser "20.2.4" yargs-unparser "2.0.0" -modify-values@^1.0.0: +modify-values@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== @@ -7753,26 +7815,26 @@ ms@2.1.3, ms@^2.0.0, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -msgpackr-extract@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-3.0.0.tgz#5b5c5fbfff25be5ee5b5a82a9cbe02e37f72bed0" - integrity sha512-oy6KCk1+X4Bn5m6Ycq5N1EWl9npqG/cLrE8ga8NX7ZqfqYUUBS08beCQaGq80fjbKBySur0E6x//yZjzNJDt3A== +msgpackr-extract@^2.0.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-2.2.0.tgz#4bb749b58d9764cfdc0d91c7977a007b08e8f262" + integrity sha512-0YcvWSv7ZOGl9Od6Y5iJ3XnPww8O7WLcpYMDwX+PAA/uXLDtyw94PJv9GLQV/nnp3cWlDhMoyKZIQLrx33sWog== dependencies: - node-gyp-build-optional-packages "5.0.7" + node-gyp-build-optional-packages "5.0.3" optionalDependencies: - "@msgpackr-extract/msgpackr-extract-darwin-arm64" "3.0.0" - "@msgpackr-extract/msgpackr-extract-darwin-x64" "3.0.0" - "@msgpackr-extract/msgpackr-extract-linux-arm" "3.0.0" - "@msgpackr-extract/msgpackr-extract-linux-arm64" "3.0.0" - "@msgpackr-extract/msgpackr-extract-linux-x64" "3.0.0" - "@msgpackr-extract/msgpackr-extract-win32-x64" "3.0.0" - -msgpackr@^1.6.1: - version "1.8.3" - resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.8.3.tgz#78c1b91359f72707f4abeaca40cc423bd2d75185" - integrity sha512-m2JefwcKNzoHYXkH/5jzHRxAw7XLWsAdvu0FOJ+OLwwozwOV/J6UA62iLkfIMbg7G8+dIuRwgg6oz+QoQ4YkoA== + "@msgpackr-extract/msgpackr-extract-darwin-arm64" "2.2.0" + "@msgpackr-extract/msgpackr-extract-darwin-x64" "2.2.0" + "@msgpackr-extract/msgpackr-extract-linux-arm" "2.2.0" + "@msgpackr-extract/msgpackr-extract-linux-arm64" "2.2.0" + "@msgpackr-extract/msgpackr-extract-linux-x64" "2.2.0" + "@msgpackr-extract/msgpackr-extract-win32-x64" "2.2.0" + +msgpackr@1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.6.1.tgz#4f3c94d6a5b819b838ffc736eddaf60eba436d20" + integrity sha512-Je+xBEfdjtvA4bKaOv8iRhjC8qX2oJwpYH4f7JrG4uMVJVmnmkAT4pjKdbztKprGj3iwjcxPzb5umVZ02Qq3tA== optionalDependencies: - msgpackr-extract "^3.0.0" + msgpackr-extract "^2.0.2" multer@1.4.4-lts.1: version "1.4.4-lts.1" @@ -7808,6 +7870,11 @@ mute-stream@0.0.8, mute-stream@~0.0.4: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== +mute-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" + integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== + nan@^2.14.0, nan@^2.17.0: version "2.17.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" @@ -7834,10 +7901,10 @@ nanoid@3.3.3: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== -nanoid@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== +nanoid@^3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== napi-build-utils@^1.0.1: version "1.0.2" @@ -7880,10 +7947,10 @@ nise@^5.1.0: just-extend "^4.0.2" path-to-regexp "^1.7.0" -node-abi@*, node-abi@^3.0.0: - version "3.33.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.33.0.tgz#8b23a0cec84e1c5f5411836de6a9b84bccf26e7f" - integrity sha512-7GGVawqyHF4pfd0YFybhv/eM9JwTtPqx0mAanQ146O3FlSh3pA24zf9IRQTOsfTSqXTNzPSP5iagAJ94jjuVog== +node-abi@*, node-abi@^3.0.0, node-abi@^3.3.0: + version "3.45.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.45.0.tgz#f568f163a3bfca5aacfce1fbeee1fa2cc98441f5" + integrity sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ== dependencies: semver "^7.3.5" @@ -7894,13 +7961,6 @@ node-abi@^2.21.0, node-abi@^2.7.0: dependencies: semver "^5.4.1" -node-abi@^3.3.0: - version "3.30.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.30.0.tgz#d84687ad5d24ca81cdfa912a36f2c5c19b137359" - integrity sha512-qWO5l3SCqbwQavymOmtTVuCWZE23++S+rxyoHjXqUmPyzRcaoI4lA2gO55/drddGnedAyjA7sk76SfQ5lfUMnw== - dependencies: - semver "^7.3.5" - node-addon-api@^3.0.0, node-addon-api@^3.0.2, node-addon-api@^3.1.0, node-addon-api@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" @@ -7931,16 +7991,16 @@ node-fetch@2.6.7: whatwg-url "^5.0.0" node-fetch@^2.6.7: - version "2.6.9" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" - integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== + version "2.6.12" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba" + integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== dependencies: whatwg-url "^5.0.0" -node-gyp-build-optional-packages@5.0.7: - version "5.0.7" - resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.7.tgz#5d2632bbde0ab2f6e22f1bbac2199b07244ae0b3" - integrity sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w== +node-gyp-build-optional-packages@5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.3.tgz#92a89d400352c44ad3975010368072b41ad66c17" + integrity sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA== node-gyp-build@^4.2.1, node-gyp-build@^4.3.0: version "4.6.0" @@ -7948,14 +8008,15 @@ node-gyp-build@^4.2.1, node-gyp-build@^4.3.0: integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== node-gyp@^9.0.0: - version "9.3.1" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.3.1.tgz#1e19f5f290afcc9c46973d68700cbd21a96192e4" - integrity sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg== + version "9.4.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.0.tgz#2a7a91c7cba4eccfd95e949369f27c9ba704f369" + integrity sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg== dependencies: env-paths "^2.2.0" + exponential-backoff "^3.1.1" glob "^7.1.4" graceful-fs "^4.2.6" - make-fetch-happen "^10.0.3" + make-fetch-happen "^11.0.3" nopt "^6.0.0" npmlog "^6.0.0" rimraf "^3.0.2" @@ -7984,10 +8045,10 @@ node-pty@0.11.0-beta17: dependencies: nan "^2.14.0" -node-releases@^2.0.8: - version "2.0.10" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" - integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== +node-releases@^2.0.12: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== node-ssh@^12.0.1: version "12.0.5" @@ -8006,13 +8067,6 @@ noop-logger@^0.1.1: resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" integrity sha512-6kM8CLXvuW5crTxsAtva2YLrRrDaiTIkIePWs9moLHqbFWT94WpNFjwS/5dfLfECg5i/lkmw3aoqVidxt23TEQ== -nopt@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" - integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== - dependencies: - abbrev "1" - nopt@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" @@ -8030,7 +8084,7 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-package-data@^3.0.0: +normalize-package-data@^3.0.0, normalize-package-data@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== @@ -8040,12 +8094,12 @@ normalize-package-data@^3.0.0: semver "^7.3.4" validate-npm-package-license "^3.0.1" -normalize-package-data@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-4.0.1.tgz#b46b24e0616d06cadf9d5718b29b6d445a82a62c" - integrity sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg== +normalize-package-data@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-5.0.0.tgz#abcb8d7e724c40d88462b84982f7cbf6859b4588" + integrity sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q== dependencies: - hosted-git-info "^5.0.0" + hosted-git-info "^6.0.0" is-core-module "^2.8.1" semver "^7.3.5" validate-npm-package-license "^3.0.4" @@ -8060,24 +8114,24 @@ normalize-url@^6.0.1: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== -npm-bundled@^1.1.1, npm-bundled@^1.1.2: +npm-bundled@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== dependencies: npm-normalize-package-bin "^1.0.1" -npm-bundled@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-2.0.1.tgz#94113f7eb342cd7a67de1e789f896b04d2c600f4" - integrity sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw== +npm-bundled@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-3.0.0.tgz#7e8e2f8bb26b794265028491be60321a25a39db7" + integrity sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ== dependencies: - npm-normalize-package-bin "^2.0.0" + npm-normalize-package-bin "^3.0.0" -npm-install-checks@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-5.0.0.tgz#5ff27d209a4e3542b8ac6b0c1db6063506248234" - integrity sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA== +npm-install-checks@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.1.1.tgz#b459b621634d06546664207fde16810815808db1" + integrity sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw== dependencies: semver "^7.1.1" @@ -8086,10 +8140,10 @@ npm-normalize-package-bin@^1.0.1: resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== -npm-normalize-package-bin@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz#9447a1adaaf89d8ad0abe24c6c84ad614a675fff" - integrity sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ== +npm-normalize-package-bin@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz#25447e32a9a7de1f51362c61a559233b89947832" + integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== npm-package-arg@8.1.1: version "8.1.1" @@ -8100,15 +8154,15 @@ npm-package-arg@8.1.1: semver "^7.0.0" validate-npm-package-name "^3.0.0" -npm-package-arg@^9.0.0, npm-package-arg@^9.0.1: - version "9.1.2" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-9.1.2.tgz#fc8acecb00235f42270dda446f36926ddd9ac2bc" - integrity sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg== +npm-package-arg@^10.0.0, npm-package-arg@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-10.1.0.tgz#827d1260a683806685d17193073cc152d3c7e9b1" + integrity sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA== dependencies: - hosted-git-info "^5.0.0" - proc-log "^2.0.1" + hosted-git-info "^6.0.0" + proc-log "^3.0.0" semver "^7.3.5" - validate-npm-package-name "^4.0.0" + validate-npm-package-name "^5.0.0" npm-packlist@5.1.1: version "5.1.1" @@ -8120,51 +8174,35 @@ npm-packlist@5.1.1: npm-bundled "^1.1.2" npm-normalize-package-bin "^1.0.1" -npm-packlist@^5.1.0: - version "5.1.3" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-5.1.3.tgz#69d253e6fd664b9058b85005905012e00e69274b" - integrity sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg== +npm-packlist@^7.0.0: + version "7.0.4" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-7.0.4.tgz#033bf74110eb74daf2910dc75144411999c5ff32" + integrity sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q== dependencies: - glob "^8.0.1" - ignore-walk "^5.0.1" - npm-bundled "^2.0.0" - npm-normalize-package-bin "^2.0.0" + ignore-walk "^6.0.0" -npm-pick-manifest@^7.0.0: - version "7.0.2" - resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-7.0.2.tgz#1d372b4e7ea7c6712316c0e99388a73ed3496e84" - integrity sha512-gk37SyRmlIjvTfcYl6RzDbSmS9Y4TOBXfsPnoYqTHARNgWbyDiCSMLUpmALDj4jjcTZpURiEfsSHJj9k7EV4Rw== +npm-pick-manifest@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz#c6acd97d1ad4c5dbb80eac7b386b03ffeb289e5f" + integrity sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA== dependencies: - npm-install-checks "^5.0.0" - npm-normalize-package-bin "^2.0.0" - npm-package-arg "^9.0.0" + npm-install-checks "^6.0.0" + npm-normalize-package-bin "^3.0.0" + npm-package-arg "^10.0.0" semver "^7.3.5" -npm-registry-fetch@13.3.0: - version "13.3.0" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-13.3.0.tgz#0ce10fa4a699a1e70685ecf41bbfb4150d74231b" - integrity sha512-10LJQ/1+VhKrZjIuY9I/+gQTvumqqlgnsCufoXETHAPFTS3+M+Z5CFhZRDHGavmJ6rOye3UvNga88vl8n1r6gg== - dependencies: - make-fetch-happen "^10.0.6" - minipass "^3.1.6" - minipass-fetch "^2.0.3" - minipass-json-stream "^1.0.1" - minizlib "^2.1.2" - npm-package-arg "^9.0.1" - proc-log "^2.0.0" - -npm-registry-fetch@^13.0.0, npm-registry-fetch@^13.0.1: - version "13.3.1" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz#bb078b5fa6c52774116ae501ba1af2a33166af7e" - integrity sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw== +npm-registry-fetch@^14.0.0, npm-registry-fetch@^14.0.3, npm-registry-fetch@^14.0.5: + version "14.0.5" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz#fe7169957ba4986a4853a650278ee02e568d115d" + integrity sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA== dependencies: - make-fetch-happen "^10.0.6" - minipass "^3.1.6" - minipass-fetch "^2.0.3" + 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 "^9.0.1" - proc-log "^2.0.0" + npm-package-arg "^10.0.0" + proc-log "^3.0.0" npm-run-all@1.4.0: version "1.4.0" @@ -8237,21 +8275,20 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== -nwsapi@^2.2.2: - version "2.2.4" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.4.tgz#fd59d5e904e8e1f03c25a7d5a15cfa16c714a1e5" - integrity sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g== +nwsapi@^2.2.4: + version "2.2.7" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== -nx@15.7.0, "nx@>=15.5.2 < 16": - version "15.7.0" - resolved "https://registry.yarnpkg.com/nx/-/nx-15.7.0.tgz#40c1b0e0f8a4da498624a24bd2429600fad1032d" - integrity sha512-edyIWZ3ARJ0Zy0+OCPQz8J4aYUAAG8lKll7O8rb9vZzYGUgdiTiVzKu5SaLj8maNMmrXC2oY28Gmt1pV318KsQ== +nx@16.5.1, "nx@>=16.1.3 < 17": + version "16.5.1" + resolved "https://registry.yarnpkg.com/nx/-/nx-16.5.1.tgz#fc0d19090d8faae5f431f9fec199adf95881150c" + integrity sha512-I3hJRE4hG7JWAtncWwDEO3GVeGPpN0TtM8xH5ArZXyDuVeTth/i3TtJzdDzqXO1HHtIoAQN0xeq4n9cLuMil5g== dependencies: - "@nrwl/cli" "15.7.0" - "@nrwl/tao" "15.7.0" + "@nrwl/tao" "16.5.1" "@parcel/watcher" "2.0.4" "@yarnpkg/lockfile" "^1.1.0" - "@yarnpkg/parsers" "^3.0.0-rc.18" + "@yarnpkg/parsers" "3.0.0-rc.46" "@zkochan/js-yaml" "0.0.6" axios "^1.0.0" chalk "^4.1.0" @@ -8272,7 +8309,7 @@ nx@15.7.0, "nx@>=15.5.2 < 16": minimatch "3.0.5" npm-run-path "^4.0.1" open "^8.4.0" - semver "7.3.4" + semver "7.5.3" string-width "^4.2.3" strong-log-transformer "^2.1.0" tar-stream "~2.2.0" @@ -8283,15 +8320,16 @@ nx@15.7.0, "nx@>=15.5.2 < 16": yargs "^17.6.2" yargs-parser "21.1.1" optionalDependencies: - "@nrwl/nx-darwin-arm64" "15.7.0" - "@nrwl/nx-darwin-x64" "15.7.0" - "@nrwl/nx-linux-arm-gnueabihf" "15.7.0" - "@nrwl/nx-linux-arm64-gnu" "15.7.0" - "@nrwl/nx-linux-arm64-musl" "15.7.0" - "@nrwl/nx-linux-x64-gnu" "15.7.0" - "@nrwl/nx-linux-x64-musl" "15.7.0" - "@nrwl/nx-win32-arm64-msvc" "15.7.0" - "@nrwl/nx-win32-x64-msvc" "15.7.0" + "@nx/nx-darwin-arm64" "16.5.1" + "@nx/nx-darwin-x64" "16.5.1" + "@nx/nx-freebsd-x64" "16.5.1" + "@nx/nx-linux-arm-gnueabihf" "16.5.1" + "@nx/nx-linux-arm64-gnu" "16.5.1" + "@nx/nx-linux-arm64-musl" "16.5.1" + "@nx/nx-linux-x64-gnu" "16.5.1" + "@nx/nx-linux-x64-musl" "16.5.1" + "@nx/nx-win32-arm64-msvc" "16.5.1" + "@nx/nx-win32-x64-msvc" "16.5.1" nyc@^15.0.0: version "15.1.0" @@ -8331,7 +8369,7 @@ object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1 resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.12.2, object-inspect@^1.9.0: +object-inspect@^1.12.3, object-inspect@^1.9.0: version "1.12.3" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== @@ -8341,7 +8379,7 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.3, object.assign@^4.1.4: +object.assign@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== @@ -8415,37 +8453,25 @@ onetime@^5.1.0, onetime@^5.1.2: mimic-fn "^2.1.0" open@^8.4.0: - version "8.4.1" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.1.tgz#2ab3754c07f5d1f99a7a8d6a82737c95e3101cff" - integrity sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg== + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== dependencies: define-lazy-prop "^2.0.0" is-docker "^2.1.1" is-wsl "^2.2.0" -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" - word-wrap "^1.2.3" ora@^5.1.0, ora@^5.4.1: version "5.4.1" @@ -8617,58 +8643,28 @@ package-hash@^4.0.0: lodash.flattendeep "^4.4.0" release-zalgo "^1.0.0" -pacote@13.6.1: - version "13.6.1" - resolved "https://registry.yarnpkg.com/pacote/-/pacote-13.6.1.tgz#ac6cbd9032b4c16e5c1e0c60138dfe44e4cc589d" - integrity sha512-L+2BI1ougAPsFjXRyBhcKmfT016NscRFLv6Pz5EiNf1CCFJFU0pSKKQwsZTyAQB+sTuUL4TyFyp6J1Ork3dOqw== - dependencies: - "@npmcli/git" "^3.0.0" - "@npmcli/installed-package-contents" "^1.0.7" - "@npmcli/promise-spawn" "^3.0.0" - "@npmcli/run-script" "^4.1.0" - cacache "^16.0.0" - chownr "^2.0.0" - fs-minipass "^2.1.0" - infer-owner "^1.0.4" - minipass "^3.1.6" - mkdirp "^1.0.4" - npm-package-arg "^9.0.0" - npm-packlist "^5.1.0" - npm-pick-manifest "^7.0.0" - npm-registry-fetch "^13.0.1" - proc-log "^2.0.0" - promise-retry "^2.0.1" - read-package-json "^5.0.0" - read-package-json-fast "^2.0.3" - rimraf "^3.0.2" - ssri "^9.0.0" - tar "^6.1.11" - -pacote@^13.0.3, pacote@^13.6.1: - version "13.6.2" - resolved "https://registry.yarnpkg.com/pacote/-/pacote-13.6.2.tgz#0d444ba3618ab3e5cd330b451c22967bbd0ca48a" - integrity sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg== - dependencies: - "@npmcli/git" "^3.0.0" - "@npmcli/installed-package-contents" "^1.0.7" - "@npmcli/promise-spawn" "^3.0.0" - "@npmcli/run-script" "^4.1.0" - cacache "^16.0.0" - chownr "^2.0.0" - fs-minipass "^2.1.0" - infer-owner "^1.0.4" - minipass "^3.1.6" - mkdirp "^1.0.4" - npm-package-arg "^9.0.0" - npm-packlist "^5.1.0" - npm-pick-manifest "^7.0.0" - npm-registry-fetch "^13.0.1" - proc-log "^2.0.0" +pacote@^15.2.0: + version "15.2.0" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-15.2.0.tgz#0f0dfcc3e60c7b39121b2ac612bf8596e95344d3" + integrity sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA== + dependencies: + "@npmcli/git" "^4.0.0" + "@npmcli/installed-package-contents" "^2.0.1" + "@npmcli/promise-spawn" "^6.0.1" + "@npmcli/run-script" "^6.0.0" + cacache "^17.0.0" + fs-minipass "^3.0.0" + minipass "^5.0.0" + npm-package-arg "^10.0.0" + npm-packlist "^7.0.0" + npm-pick-manifest "^8.0.0" + npm-registry-fetch "^14.0.0" + proc-log "^3.0.0" promise-retry "^2.0.1" - read-package-json "^5.0.0" - read-package-json-fast "^2.0.3" - rimraf "^3.0.2" - ssri "^9.0.0" + read-package-json "^6.0.0" + read-package-json-fast "^3.0.0" + sigstore "^1.3.0" + ssri "^10.0.0" tar "^6.1.11" parent-module@^1.0.0: @@ -8678,15 +8674,6 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-conflict-json@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/parse-conflict-json/-/parse-conflict-json-2.0.2.tgz#3d05bc8ffe07d39600dc6436c6aefe382033d323" - integrity sha512-jDbRGb00TAPFsKWCpZZOT93SxVP9nONOSgES3AevqRq/CHvavEBvKAjxX9p5Y5F0RZLxH9Ufd9+RwtCsa+lFDA== - dependencies: - json-parse-even-better-errors "^2.3.1" - just-diff "^5.0.1" - just-diff-apply "^5.2.0" - parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -8751,16 +8738,16 @@ path-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== -path-exists@4.0.0, path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -8793,6 +8780,14 @@ path-root@^0.1.1: dependencies: path-root-regex "^0.1.0" +path-scurry@^1.10.1, path-scurry@^1.6.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + dependencies: + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -8830,9 +8825,9 @@ pause-stream@0.0.11: through "~2.3" pdfobject@^2.0.201604172: - version "2.2.8" - resolved "https://registry.yarnpkg.com/pdfobject/-/pdfobject-2.2.8.tgz#956c8ce254883cdbc7c3cbee3d74d5a017f98d0b" - integrity sha512-dB/soWNMLtVGHfXERXnAtsKm0XwC6lyGVYegQcZxL4rw07rNOKvawc9kddBzlGr7TbiBZuGf4Drb3kyRbTf/QA== + version "2.2.12" + resolved "https://registry.yarnpkg.com/pdfobject/-/pdfobject-2.2.12.tgz#b789e4606b69763f2f3ae501ff003f3db8231943" + integrity sha512-D0oyD/sj8j82AMaJhoyMaY1aD5TkbpU3FbJC6w9/cpJlZRpYHqAkutXw1Ca/FKjYPZmTAu58uGIfgOEaDlbY8A== pend@~1.2.0: version "1.2.0" @@ -8900,20 +8895,20 @@ pkg-up@^3.1.0: dependencies: find-up "^3.0.0" -playwright-core@1.32.1: - version "1.32.1" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.32.1.tgz#5a10c32403323b07d75ea428ebeed866a80b76a1" - integrity sha512-KZYUQC10mXD2Am1rGlidaalNGYk3LU1vZqqNk0gT4XPty1jOqgup8KDP8l2CUlqoNKhXM5IfGjWgW37xvGllBA== +playwright-core@1.35.1: + version "1.35.1" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.35.1.tgz#52c1e6ffaa6a8c29de1a5bdf8cce0ce290ffb81d" + integrity sha512-pNXb6CQ7OqmGDRspEjlxE49w+4YtR6a3X6mT1hZXeJHWmsEz7SunmvZeiG/+y1yyMZdHnnn73WKYdtV1er0Xyg== postcss-modules-extract-imports@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== -postcss-modules-local-by-default@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" - integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== +postcss-modules-local-by-default@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" + integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== dependencies: icss-utils "^5.0.0" postcss-selector-parser "^6.0.2" @@ -8934,9 +8929,9 @@ postcss-modules-values@^4.0.0: icss-utils "^5.0.0" postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.0.11" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" - integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== + version "6.0.13" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" + integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -8946,12 +8941,12 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.4.19: - version "8.4.21" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" - integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== +postcss@^8.4.21: + version "8.4.25" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.25.tgz#4a133f5e379eda7f61e906c3b1aaa9b81292726f" + integrity sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw== dependencies: - nanoid "^3.3.4" + nanoid "^3.3.6" picocolors "^1.0.0" source-map-js "^1.0.2" @@ -9018,20 +9013,24 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== +pretty-format@^29.6.1: + version "29.6.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.6.1.tgz#ec838c288850b7c4f9090b867c2d4f4edbfb0f3e" + integrity sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog== + dependencies: + "@jest/schemas" "^29.6.0" + ansi-styles "^5.0.0" + react-is "^18.0.0" private@~0.1.5: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== -proc-log@^2.0.0, proc-log@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-2.0.1.tgz#8f3f69a1f608de27878f91f5c688b225391cb685" - integrity sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw== +proc-log@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-3.0.0.tgz#fb05ef83ccd64fd7b20bbe9c8c1070fc08338dd8" + integrity sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A== process-nextick-args@~2.0.0: version "2.0.1" @@ -9057,16 +9056,6 @@ prom-client@^10.2.0: dependencies: tdigest "^0.1.1" -promise-all-reject-late@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz#f8ebf13483e5ca91ad809ccc2fcf25f26f8643c2" - integrity sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw== - -promise-call-limit@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-call-limit/-/promise-call-limit-1.0.1.tgz#4bdee03aeb85674385ca934da7114e9bcd3c6e24" - integrity sha512-3+hgaa19jzCGLuSCbieeRsu5C2joKfYn8pY6JAuXFRVfF4IO+L7UPpFWNTeWT9pM7uhskvbPPd/oEOktCn317Q== - promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" @@ -9080,12 +9069,12 @@ promise-retry@^2.0.1: err-code "^2.0.2" retry "^0.12.0" -promzard@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" - integrity sha512-JZeYqd7UAcHCwI+sTOeUDYkvEU+1bQ7iE0UT1MgB/tERkAPkesW46MrpIySzODi+owTjZtiF8Ay5j9m60KmMBw== +promzard@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/promzard/-/promzard-1.0.0.tgz#3246f8e6c9895a77c0549cefb65828ac0f6c006b" + integrity sha512-KQVDEubSUHGSt5xLakaToDFrSoZhStB8dXLzk2xvwR67gJktrHFvpR63oZgHyK19WKbHFLXJqCPXdVR3aBP8Ig== dependencies: - read "1" + read "^2.0.0" prop-types@^15.5.6, prop-types@^15.6.1, prop-types@^15.8.1: version "15.8.1" @@ -9101,11 +9090,6 @@ properties@^1.2.1: resolved "https://registry.yarnpkg.com/properties/-/properties-1.2.1.tgz#0ee97a7fc020b1a2a55b8659eda4aa8d869094bd" integrity sha512-qYNxyMj1JeW54i/EWEFsM1cVwxJbtgPp8+0Wg9XjNaK6VE/c4oRi6PNu5p7w1mNXEIQIjV5Wwn8v8Gz82/QzdQ== -proto-list@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" - integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== - protocols@^2.0.0, protocols@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.1.tgz#8f155da3fc0f32644e83c5782c8e8212ccf70a86" @@ -9167,7 +9151,7 @@ punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== -puppeteer-core@19.7.2, puppeteer-core@^19.7.2: +puppeteer-core@19.7.2: version "19.7.2" resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-19.7.2.tgz#deee9ef915829b6a1d1a3a008625c29eeb251161" integrity sha512-PvI+fXqgP0uGJxkyZcX51bnzjFA73MODZOAv0fSD35yR7tvbqwtMV3/Y+hxQ0AMMwzxkEebP6c7po/muqxJvmQ== @@ -9184,7 +9168,7 @@ puppeteer-core@19.7.2, puppeteer-core@^19.7.2: unbzip2-stream "1.4.3" ws "8.11.0" -puppeteer-to-istanbul@^1.4.0: +puppeteer-to-istanbul@1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/puppeteer-to-istanbul/-/puppeteer-to-istanbul-1.4.0.tgz#451dced6f42652448f55cf0bc780b35512c8d1b0" integrity sha512-dzW8u/PMqMZppvoXCFod8IkCTI2JL0yP2YUBbaALnX+iJJ6gqjk77fIoK9MqnMqRZAcoa81GLFfZExakWg/Q4Q== @@ -9194,7 +9178,7 @@ puppeteer-to-istanbul@^1.4.0: v8-to-istanbul "^1.2.1" yargs "^15.3.1" -puppeteer@^19.7.2: +puppeteer@19.7.2: version "19.7.2" resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-19.7.2.tgz#1b3ce99a093cc2f8f84dfb06f066d0757ea79d4b" integrity sha512-4Lm7Qpe/LU95Svirei/jDLDvR5oMrl9BPGd7HMY5+Q28n+BhvKuW97gKkR+1LlI86bO8J3g8rG/Ll5kv9J1nlQ== @@ -9205,18 +9189,20 @@ puppeteer@^19.7.2: proxy-from-env "1.1.0" puppeteer-core "19.7.2" -q@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== - -qs@6.11.0, qs@^6.9.1, qs@^6.9.4: +qs@6.11.0: version "6.11.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" +qs@^6.9.1, qs@^6.9.4: + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + dependencies: + side-channel "^1.0.4" + querystringify@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" @@ -9259,6 +9245,16 @@ raw-body@2.5.1: iconv-lite "0.4.24" unpipe "1.0.0" +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -9291,6 +9287,11 @@ react-is@^16.13.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + react-perfect-scrollbar@^1.5.3: version "1.5.8" resolved "https://registry.yarnpkg.com/react-perfect-scrollbar/-/react-perfect-scrollbar-1.5.8.tgz#380959387a325c5c9d0268afc08b3f73ed5b3078" @@ -9322,43 +9323,28 @@ react@^18.2.0: dependencies: loose-envify "^1.1.0" -read-cmd-shim@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-3.0.0.tgz#62b8c638225c61e6cc607f8f4b779f3b8238f155" - integrity sha512-KQDVjGqhZk92PPNRj9ZEXEuqg8bUobSKRw+q0YQ3TKI5xkce7bUJobL4Z/OtiEbAAv70yEpYIXp4iQ9L8oPVog== - -read-cmd-shim@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-3.0.1.tgz#868c235ec59d1de2db69e11aec885bc095aea087" - integrity sha512-kEmDUoYf/CDy8yZbLTmhB1X9kkjf9Q80PCNsDMb7ufrGd6zZSQA1+UyjrO+pZm5K/S4OXCWJeiIt1JA8kAsa6g== - -read-package-json-fast@^2.0.2, read-package-json-fast@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz#323ca529630da82cb34b36cc0b996693c98c2b83" - integrity sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ== - dependencies: - json-parse-even-better-errors "^2.3.0" - npm-normalize-package-bin "^1.0.1" +read-cmd-shim@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz#640a08b473a49043e394ae0c7a34dd822c73b9bb" + integrity sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q== -read-package-json@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-5.0.1.tgz#1ed685d95ce258954596b13e2e0e76c7d0ab4c26" - integrity sha512-MALHuNgYWdGW3gKzuNMuYtcSSZbGQm94fAp16xt8VsYTLBjUSc55bLMKe6gzpWue0Tfi6CBgwCSdDAqutGDhMg== +read-package-json-fast@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz#394908a9725dc7a5f14e70c8e7556dff1d2b1049" + integrity sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw== dependencies: - glob "^8.0.1" - json-parse-even-better-errors "^2.3.1" - normalize-package-data "^4.0.0" - npm-normalize-package-bin "^1.0.1" + json-parse-even-better-errors "^3.0.0" + npm-normalize-package-bin "^3.0.0" -read-package-json@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-5.0.2.tgz#b8779ccfd169f523b67208a89cc912e3f663f3fa" - integrity sha512-BSzugrt4kQ/Z0krro8zhTwV1Kd79ue25IhNN/VtHFy1mG/6Tluyi+msc0UpwaoQzxSHa28mntAjIZY6kEgfR9Q== +read-package-json@6.0.4, read-package-json@^6.0.0: + version "6.0.4" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-6.0.4.tgz#90318824ec456c287437ea79595f4c2854708836" + integrity sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw== dependencies: - glob "^8.0.1" - json-parse-even-better-errors "^2.3.1" - normalize-package-data "^4.0.0" - npm-normalize-package-bin "^2.0.0" + glob "^10.2.2" + json-parse-even-better-errors "^3.0.0" + normalize-package-data "^5.0.0" + npm-normalize-package-bin "^3.0.0" read-pkg-up@^3.0.0: version "3.0.0" @@ -9396,26 +9382,24 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -read@1, read@^1.0.7: +read@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" integrity sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ== dependencies: mute-stream "~0.0.4" -readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== +read@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/read/-/read-2.1.0.tgz#69409372c54fe3381092bc363a00650b6ac37218" + integrity sha512-bvxi1QLJHcaywCAEsAk4DG3nVoqiY2Csps3qzWalhj5hFqRn1d/OixkFXtLO1PrgHUcAP0FNaSY/5GYNfENFFQ== dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" + mute-stream "~1.0.0" readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.5, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -9425,15 +9409,14 @@ readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable string_decoder "~1.1.1" util-deprecate "~1.0.1" -readdir-scoped-modules@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" - integrity sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw== +readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: - debuglog "^1.0.1" - dezalgo "^1.0.0" - graceful-fs "^4.1.2" - once "^1.3.0" + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" readdirp@~3.6.0: version "3.6.0" @@ -9507,23 +9490,23 @@ regenerator-transform@^0.15.1: "@babel/runtime" "^7.8.4" regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + version "1.5.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" + define-properties "^1.2.0" + functions-have-names "^1.2.3" regexpp@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== -regexpu-core@^5.2.1: - version "5.3.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.0.tgz#4d0d044b76fedbad6238703ae84bfdedee2cf074" - integrity sha512-ZdhUQlng0RoscyW7jADnUZ25F5eVtHdMyXSb2PiwafvteRAOJUjFoUPEYZSIfP99fBIs3maLIRfpEddT78wAAQ== +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== dependencies: "@babel/regjsgen" "^0.8.0" regenerate "^1.4.2" @@ -9596,11 +9579,11 @@ resolve-package-path@^4.0.3: path-root "^0.1.1" resolve@^1.10.0, resolve@^1.14.2, resolve@^1.22.1, resolve@^1.3.2, resolve@^1.9.0: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + version "1.22.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.11.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -9652,6 +9635,13 @@ rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" +rimraf@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-4.4.1.tgz#bd33364f67021c5b79e93d7f4fa0568c7c21b755" + integrity sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og== + dependencies: + glob "^9.2.0" + rimraf@~2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" @@ -9699,9 +9689,9 @@ rx@2.3.24: integrity sha512-Ue4ZB7Dzbn2I9sIj8ws536nOP2S53uypyCkCz9q0vlYD5Kn6/pu4dE+wt2ZfFzd9m73hiYKnnCb1OyKqc+MRkg== rxjs@^7.5.5: - version "7.8.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" - integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== dependencies: tslib "^2.1.0" @@ -9769,24 +9759,24 @@ schema-utils@^2.6.5: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== +schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== dependencies: "@types/json-schema" "^7.0.8" ajv "^6.12.5" ajv-keywords "^3.5.2" schema-utils@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" - integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + version "4.2.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.2.0.tgz#70d7c93e153a273a805801882ebd3bff20d89c8b" + integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== dependencies: "@types/json-schema" "^7.0.9" - ajv "^8.8.0" + ajv "^8.9.0" ajv-formats "^2.1.1" - ajv-keywords "^5.0.0" + ajv-keywords "^5.1.0" seek-bzip@^1.0.5: version "1.0.6" @@ -9801,26 +9791,26 @@ semver-compare@^1.0.0: integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== "semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@7.3.4: - version "7.3.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" - integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== +semver@7.5.3: + version "7.5.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.3.tgz#161ce8c2c6b4b3bdca6caadc9fa3317a4c4fe88e" + integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== dependencies: lru-cache "^6.0.0" -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.0.0, semver@^7.1.1, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== +semver@^7.0.0, semver@^7.1.1, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" @@ -9864,7 +9854,7 @@ serialize-javascript@^5.0.1: dependencies: randombytes "^2.1.0" -serialize-javascript@^6.0.0: +serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== @@ -9937,9 +9927,9 @@ shell-path@^2.1.0: shell-env "^0.3.0" shell-quote@^1.4.3: - version "1.8.0" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.0.tgz#20d078d0eaf71d54f43bd2ba14a1b5b9bfa5c8ba" - integrity sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ== + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== shiki@^0.10.1: version "0.10.1" @@ -9964,6 +9954,20 @@ signal-exit@3.0.7, signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, s resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.0.2.tgz#ff55bb1d9ff2114c13b400688fa544ac63c36967" + integrity sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q== + +sigstore@^1.3.0, sigstore@^1.4.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-1.7.0.tgz#9186e6c8ce1ab0cba5d97b414212d40f0a01564e" + integrity sha512-KP7QULhWdlu3hlp+jw2EvgWKlOGOY9McLj/jrchLjHNlNPK0KWIwF919cbmOp6QiKXLmPijR2qH/5KYWlbtG9Q== + dependencies: + "@sigstore/protobuf-specs" "^0.1.0" + "@sigstore/tuf" "^1.0.1" + make-fetch-happen "^11.0.1" + simple-concat@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" @@ -10031,34 +10035,35 @@ socket.io-adapter@~2.5.2: ws "~8.11.0" socket.io-client@^4.5.3: - version "4.6.1" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.6.1.tgz#80d97d5eb0feca448a0fb6d69a7b222d3d547eab" - integrity sha512-5UswCV6hpaRsNg5kkEHVcbBIXEYoVbMQaHJBXJCyEQ+CiFPV1NIOY0XOFWG4XR4GZcB8Kn6AsRs/9cy9TbqVMQ== + version "4.7.1" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.7.1.tgz#48e5f703abe4fb0402182bcf9c06b7820fb3453b" + integrity sha512-Qk3Xj8ekbnzKu3faejo4wk2MzXA029XppiXtTF/PkbTg+fcwaTw1PlDrTrrrU4mKoYC4dvlApOnSeyLCKwek2w== dependencies: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.2" - engine.io-client "~6.4.0" - socket.io-parser "~4.2.1" + engine.io-client "~6.5.1" + socket.io-parser "~4.2.4" -socket.io-parser@~4.2.1: - version "4.2.3" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.3.tgz#926bcc6658e2ae0883dc9dee69acbdc76e4e3667" - integrity sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ== +socket.io-parser@~4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" + integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== dependencies: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" socket.io@^4.5.3: - version "4.6.1" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.6.1.tgz#62ec117e5fce0692fa50498da9347cfb52c3bc70" - integrity sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA== + version "4.7.1" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.7.1.tgz#9009f31bf7be25478895145e92fbc972ad1db900" + integrity sha512-W+utHys2w//dhFjy7iQQu9sGd3eokCjGbl2r59tyLqNiJJBdIebn3GAKEXBr3osqHTObJi2die/25bCx2zsaaw== dependencies: accepts "~1.3.4" base64id "~2.0.0" + cors "~2.8.5" debug "~4.3.2" - engine.io "~6.4.1" + engine.io "~6.5.0" socket.io-adapter "~2.5.2" - socket.io-parser "~4.2.1" + socket.io-parser "~4.2.4" socks-proxy-agent@^5.0.0: version "5.0.1" @@ -10148,9 +10153,9 @@ spawn-wrap@^2.0.0: which "^2.0.1" spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" @@ -10169,11 +10174,11 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.12" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" - integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== + version "3.0.13" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" + integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== -split2@^3.0.0: +split2@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== @@ -10187,7 +10192,7 @@ split@0.3: dependencies: through "2" -split@^1.0.0: +split@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== @@ -10205,17 +10210,24 @@ sprintf-js@~1.0.2: integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== ssh2@^1.5.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-1.12.0.tgz#a1ed758f69fbc816f31d04b443f4eb21ef487dc2" - integrity sha512-7mcLu8biO6/BjQQ1iCjCmuBiF0hXxo+JlHpJBPDTVsxU7evscWWiRUgYF5XIs4gLKmiPRHA0maund11QLWyDJg== + version "1.14.0" + resolved "https://registry.yarnpkg.com/ssh2/-/ssh2-1.14.0.tgz#8f68440e1b768b66942c9e4e4620b2725b3555bb" + integrity sha512-AqzD1UCqit8tbOKoj6ztDDi1ffJZ2rV2SwlgrVVrHPkV5vWqGJOVp5pmtj18PunkPJAuKQsnInyKV+/Nb2bUnA== dependencies: - asn1 "^0.2.4" + asn1 "^0.2.6" bcrypt-pbkdf "^1.0.2" optionalDependencies: - cpu-features "~0.0.6" + cpu-features "~0.0.8" nan "^2.17.0" -ssri@9.0.1, ssri@^9.0.0: +ssri@^10.0.0, ssri@^10.0.1: + version "10.0.4" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.4.tgz#5a20af378be586df139ddb2dfb3bf992cf0daba6" + integrity sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ== + dependencies: + minipass "^5.0.0" + +ssri@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== @@ -10257,6 +10269,15 @@ string-replace-loader@^3.1.0: loader-utils "^2.0.0" schema-utils "^3.0.0" +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -10266,14 +10287,14 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" string.prototype.matchall@^4.0.8: version "4.0.8" @@ -10289,6 +10310,15 @@ string.prototype.matchall@^4.0.8: regexp.prototype.flags "^1.4.3" side-channel "^1.0.4" +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + string.prototype.trimend@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" @@ -10321,6 +10351,13 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -10328,12 +10365,12 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: dependencies: ansi-regex "^2.0.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: - ansi-regex "^5.0.1" + ansi-regex "^6.0.1" strip-bom@^3.0.0: version "3.0.0" @@ -10521,13 +10558,13 @@ tar@6.1.11: yallist "^4.0.0" tar@^6.0.5, tar@^6.1.11, tar@^6.1.2: - version "6.1.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b" - integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw== + version "6.1.15" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.15.tgz#c9738b0b98845a3b344d334b8fa3041aaba53a69" + integrity sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" - minipass "^4.0.0" + minipass "^5.0.0" minizlib "^2.1.1" mkdirp "^1.0.3" yallist "^4.0.0" @@ -10552,24 +10589,24 @@ temp@^0.9.1: mkdirp "^0.5.1" rimraf "~2.6.2" -terser-webpack-plugin@^5.1.3: - version "5.3.6" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz#5590aec31aa3c6f771ce1b1acca60639eab3195c" - integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ== +terser-webpack-plugin@^5.3.7: + version "5.3.9" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1" + integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== dependencies: - "@jridgewell/trace-mapping" "^0.3.14" + "@jridgewell/trace-mapping" "^0.3.17" jest-worker "^27.4.5" schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - terser "^5.14.1" + serialize-javascript "^6.0.1" + terser "^5.16.8" -terser@^5.14.1: - version "5.16.3" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.3.tgz#3266017a9b682edfe019b8ecddd2abaae7b39c6b" - integrity sha512-v8wWLaS/xt3nE9dgKEWhNUFP6q4kngO5B8eYFUuebsu7Dw/UNAnpUod6UHo04jSSkv8TzKHjZDSd7EXdDQAl8Q== +terser@^5.16.8: + version "5.19.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.0.tgz#7b3137b01226bdd179978207b9c8148754a6da9c" + integrity sha512-JpcpGOQLOXm2jsomozdMDpd5f8ZHh1rR48OFgWUH3QsyZcfPgv2qDCYbcDEAYNd4OZRj2bWYKpwdll/udZCk/Q== dependencies: - "@jridgewell/source-map" "^0.3.2" - acorn "^8.5.0" + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" commander "^2.20.0" source-map-support "~0.5.20" @@ -10600,13 +10637,6 @@ through2@^2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -through2@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" - integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== - dependencies: - readable-stream "3" - through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.1: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -10649,9 +10679,9 @@ toidentifier@1.0.1: integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== tough-cookie@^4.0.0, tough-cookie@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" - integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== dependencies: psl "^1.1.33" punycode "^2.1.1" @@ -10694,11 +10724,6 @@ tree-kill@^1.1.0: resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== -treeverse@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/treeverse/-/treeverse-2.0.0.tgz#036dcef04bc3fd79a9b79a68d4da03e882d8a9ca" - integrity sha512-N5gJCkLu1aXccpOTtqV6ddSEi6ZmGkh3hjmbu1IjcavJK4qyOVQmi0myQKM7z5jVGmD68SJoliaVrMmVObhj6A== - trim-newlines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" @@ -10717,19 +10742,19 @@ ts-md5@^1.2.2: integrity sha512-DiwiXfwvcTeZ5wCE0z+2A9EseZsztaiZtGrtSaY5JOD7ekPnR/GoIVD5gXZAlK9Na9Kvpo9Waz5rW64WKAWApg== tsconfig-paths@^3.14.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" - integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== + version "3.14.2" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== dependencies: "@types/json5" "^0.0.29" - json5 "^1.0.1" + json5 "^1.0.2" minimist "^1.2.6" strip-bom "^3.0.0" tsconfig-paths@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.1.2.tgz#4819f861eef82e6da52fb4af1e8c930a39ed979a" - integrity sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw== + version "4.2.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" + integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== dependencies: json5 "^2.2.2" minimist "^1.2.6" @@ -10741,9 +10766,9 @@ tslib@^1.10.0, tslib@^1.8.0, tslib@^1.8.1: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + version "2.6.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.0.tgz#b295854684dbda164e181d259a22cd779dcd7bc3" + integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== tslint@^5.12.0: version "5.20.1" @@ -10778,6 +10803,15 @@ tsutils@^3.0.0, tsutils@^3.17.1, tsutils@^3.21.0: dependencies: tslib "^1.8.1" +tuf-js@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-1.1.7.tgz#21b7ae92a9373015be77dfe0cb282a80ec3bbe43" + integrity sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg== + dependencies: + "@tufjs/models" "1.0.4" + debug "^4.3.4" + make-fetch-happen "^11.1.1" + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -10802,13 +10836,6 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" @@ -10872,9 +10899,9 @@ typed-array-length@^1.0.4: is-typed-array "^1.1.9" typed-rest-client@^1.8.4: - version "1.8.9" - resolved "https://registry.yarnpkg.com/typed-rest-client/-/typed-rest-client-1.8.9.tgz#e560226bcadfe71b0fb5c416b587f8da3b8f92d8" - integrity sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g== + version "1.8.11" + resolved "https://registry.yarnpkg.com/typed-rest-client/-/typed-rest-client-1.8.11.tgz#6906f02e3c91e8d851579f255abf0fd60800a04d" + integrity sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA== dependencies: qs "^6.9.1" tunnel "0.0.6" @@ -10908,10 +10935,10 @@ typedoc@^0.22.11: minimatch "^5.1.0" shiki "^0.10.1" -"typescript@^3 || ^4": - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== +"typescript@>=3 < 6": + version "5.1.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" + integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== typescript@~4.5.5: version "4.5.5" @@ -10983,17 +11010,17 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== -unique-filename@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-2.0.1.tgz#e785f8675a9a7589e0ac77e0b5c34d2eaeac6da2" - integrity sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A== +unique-filename@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" + integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== dependencies: - unique-slug "^3.0.0" + unique-slug "^4.0.0" -unique-slug@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-3.0.0.tgz#6d347cf57c8a7a7a6044aabd0e2d74e4d76dc7c9" - integrity sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w== +unique-slug@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" + integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== dependencies: imurmurhash "^0.1.4" @@ -11037,20 +11064,20 @@ unzipper@^0.9.11: readable-stream "~2.3.6" setimmediate "~1.0.4" +upath@2.0.1, upath@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" + integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== + upath@^1.0.2: version "1.2.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -upath@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" - integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== - -update-browserslist-db@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -11092,16 +11119,21 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@8.3.2, uuid@^8.0.0, uuid@^8.3.0, uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - uuid@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== +uuid@^8.0.0, uuid@^8.3.0, uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +uuid@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" + integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== + v8-compile-cache@2.3.0, v8-compile-cache@^2.0.3, v8-compile-cache@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" @@ -11127,10 +11159,10 @@ validate-npm-package-license@3.0.4, validate-npm-package-license@^3.0.1, validat spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -validate-npm-package-name@4.0.0, validate-npm-package-name@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz#fe8f1c50ac20afdb86f177da85b3600f0ac0d747" - integrity sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q== +validate-npm-package-name@5.0.0, validate-npm-package-name@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz#f16afd48318e6f90a1ec101377fa0384cfc8c713" + integrity sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ== dependencies: builtins "^5.0.0" @@ -11151,28 +11183,28 @@ vhost@^3.0.2: resolved "https://registry.yarnpkg.com/vhost/-/vhost-3.0.2.tgz#2fb1decd4c466aa88b0f9341af33dc1aff2478d5" integrity sha512-S3pJdWrpFWrKMboRU4dLYgMrTgoPALsmYwOvyebK2M6X95b9kQrjZy5rwl3uzzpfpENe/XrNYu/2U+e7/bmT5g== -vscode-jsonrpc@8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2.tgz#f239ed2cd6004021b6550af9fd9d3e47eee3cac9" - integrity sha512-RY7HwI/ydoC1Wwg4gJ3y6LpU9FJRZAUnTYMXthqhFXXu77ErDd/xkREpGuk4MyYkk4a+XDWAMqe0S3KkelYQEQ== +vscode-jsonrpc@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.1.0.tgz#cb9989c65e219e18533cc38e767611272d274c94" + integrity sha512-6TDy/abTQk+zDGYazgbIPc+4JoXdwC8NHU9Pbn4UJP1fehUyZmM4RHp5IthX7A6L5KS30PRui+j+tbbMMMafdw== vscode-languageserver-protocol@^3.17.2: - version "3.17.2" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2.tgz#beaa46aea06ed061576586c5e11368a9afc1d378" - integrity sha512-8kYisQ3z/SQ2kyjlNeQxbkkTNmVFoQCqkmGrzLH6A9ecPlgTbp3wDTnUNqaUxYr4vlAcloxx8zwy7G5WdguYNg== + version "3.17.3" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.3.tgz#6d0d54da093f0c0ee3060b81612cce0f11060d57" + integrity sha512-924/h0AqsMtA5yK22GgMtCYiMdCOtWTSGgUOkgEDX+wk2b0x4sAfLiO4NxBxqbiVtz7K7/1/RgVrVI0NClZwqA== dependencies: - vscode-jsonrpc "8.0.2" - vscode-languageserver-types "3.17.2" + vscode-jsonrpc "8.1.0" + vscode-languageserver-types "3.17.3" vscode-languageserver-textdocument@^1.0.1: version "1.0.8" resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz#9eae94509cbd945ea44bca8dcfe4bb0c15bb3ac0" integrity sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q== -vscode-languageserver-types@3.17.2: - version "3.17.2" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz#b2c2e7de405ad3d73a883e91989b850170ffc4f2" - integrity sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA== +vscode-languageserver-types@3.17.3: + version "3.17.3" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz#72d05e47b73be93acb84d6e311b5786390f13f64" + integrity sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA== vscode-oniguruma@1.6.1: version "1.6.1" @@ -11206,11 +11238,6 @@ w3c-xmlserializer@^4.0.0: dependencies: xml-name-validator "^4.0.0" -walk-up-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-1.0.0.tgz#d4745e893dd5fd0dbb58dd0a4c6a33d9c9fec53e" - integrity sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg== - watchpack@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" @@ -11256,9 +11283,9 @@ webpack-cli@4.7.0: webpack-merge "^5.7.3" webpack-merge@^5.7.3: - version "5.8.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" - integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + version "5.9.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.9.0.tgz#dc160a1c4cf512ceca515cc231669e9ddb133826" + integrity sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg== dependencies: clone-deep "^4.0.1" wildcard "^2.0.0" @@ -11269,21 +11296,21 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.76.0: - version "5.76.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.76.2.tgz#6f80d1c1d1e3bf704db571b2504a0461fac80230" - integrity sha512-Th05ggRm23rVzEOlX8y67NkYCHa9nTNcwHPBhdg+lKG+mtiW7XgggjAeeLnADAe7mLjJ6LUNfgHAuRRh+Z6J7w== + version "5.88.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.1.tgz#21eba01e81bd5edff1968aea726e2fbfd557d3f8" + integrity sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ== dependencies: "@types/eslint-scope" "^3.7.3" - "@types/estree" "^0.0.51" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" + "@types/estree" "^1.0.0" + "@webassemblyjs/ast" "^1.11.5" + "@webassemblyjs/wasm-edit" "^1.11.5" + "@webassemblyjs/wasm-parser" "^1.11.5" acorn "^8.7.1" - acorn-import-assertions "^1.7.6" + acorn-import-assertions "^1.9.0" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.10.0" - es-module-lexer "^0.9.0" + enhanced-resolve "^5.15.0" + es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" @@ -11292,9 +11319,9 @@ webpack@^5.76.0: loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" - schema-utils "^3.1.0" + schema-utils "^3.2.0" tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" + terser-webpack-plugin "^5.3.7" watchpack "^2.4.0" webpack-sources "^3.2.3" @@ -11338,9 +11365,9 @@ which-boxed-primitive@^1.0.2: is-symbol "^1.0.3" which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== which-pm-runs@^1.0.0: version "1.1.0" @@ -11348,9 +11375,9 @@ which-pm-runs@^1.0.0: integrity sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA== which-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + version "1.1.10" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.10.tgz#74baa2789991905c2076abb317103b866c64e69e" + integrity sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA== dependencies: available-typed-arrays "^1.0.5" call-bind "^1.0.2" @@ -11373,6 +11400,13 @@ which@^1.2.0, which@^1.2.9: dependencies: isexe "^2.0.0" +which@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/which/-/which-3.0.1.tgz#89f1cd0c23f629a8105ffe69b8172791c87b4be1" + integrity sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg== + dependencies: + isexe "^2.0.0" + wide-align@^1.1.0, wide-align@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" @@ -11381,14 +11415,9 @@ wide-align@^1.1.0, wide-align@^1.1.5: string-width "^1.0.2 || 2 || 3 || 4" wildcard@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" - integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== - -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== wordwrap@^1.0.0: version "1.0.0" @@ -11413,6 +11442,15 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -11422,27 +11460,27 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -write-file-atomic@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f" - integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ== +write-file-atomic@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" + integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== dependencies: imurmurhash "^0.1.4" - signal-exit "^3.0.7" + signal-exit "^4.0.1" write-file-atomic@^2.0.0, write-file-atomic@^2.4.2: version "2.4.3" @@ -11463,14 +11501,6 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -write-file-atomic@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - write-json-file@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.3.0.tgz#2b64c8a33004d54b8698c76d585a77ceb61da32f" @@ -11539,10 +11569,10 @@ xml-name-validator@^4.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== -xml2js@^0.4.23: - version "0.4.23" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" - integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== +xml2js@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.5.0.tgz#d9440631fbb2ed800203fad106f2724f62c493b7" + integrity sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA== dependencies: sax ">=0.6.0" xmlbuilder "~11.0.0" @@ -11607,11 +11637,6 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^1.10.0: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - yargs-parser@20.2.4: version "20.2.4" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" @@ -11676,9 +11701,9 @@ yargs@^15.0.2, yargs@^15.3.1: yargs-parser "^18.1.2" yargs@^17.0.1, yargs@^17.6.2: - version "17.6.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" - integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" escalade "^3.1.1" From a9ffaa468c6c5db1f3a04bedf312ba6bf00ae823 Mon Sep 17 00:00:00 2001 From: Vlad Arama <86936229+vladarama@users.noreply.github.com> Date: Thu, 3 Aug 2023 09:02:48 -0400 Subject: [PATCH 04/79] trees: handle middle-click behavior (#12783) The commit adds appropriate handling when performing middle-lick of tree nodes. The changes also prevent the incorrect auto-scroll behavior from trees. Signed-off-by: Vlad Arama --- .../core/src/browser/tree/tree-widget.tsx | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/packages/core/src/browser/tree/tree-widget.tsx b/packages/core/src/browser/tree/tree-widget.tsx index c242c3f4e220f..252e8463b36f5 100644 --- a/packages/core/src/browser/tree/tree-widget.tsx +++ b/packages/core/src/browser/tree/tree-widget.tsx @@ -243,6 +243,9 @@ export class TreeWidget extends ReactWidget implements StatefulWidget { }), ]); } + this.node.addEventListener('mousedown', this.handleMiddleClickEvent.bind(this)); + this.node.addEventListener('mouseup', this.handleMiddleClickEvent.bind(this)); + this.node.addEventListener('auxclick', this.handleMiddleClickEvent.bind(this)); this.toDispose.pushAll([ this.model, this.model.onChanged(() => this.updateRows()), @@ -924,6 +927,7 @@ export class TreeWidget extends ReactWidget implements StatefulWidget { style, onClick: event => this.handleClickEvent(node, event), onDoubleClick: event => this.handleDblClickEvent(node, event), + onAuxClick: event => this.handleAuxClickEvent(node, event), onContextMenu: event => this.handleContextMenuEvent(node, event), }; } @@ -1238,6 +1242,30 @@ export class TreeWidget extends ReactWidget implements StatefulWidget { event.stopPropagation(); } + /** + * Handle the middle-click mouse event. + * @param node the tree node if available. + * @param event the middle-click mouse event. + */ + protected handleAuxClickEvent(node: TreeNode | undefined, event: React.MouseEvent): void { + this.model.openNode(node); + if (SelectableTreeNode.is(node)) { + this.model.selectNode(node); + } + event.stopPropagation(); + } + + /** + * Handle the middle-click mouse event. + * @param event the middle-click mouse event. + */ + protected handleMiddleClickEvent(event: MouseEvent): void { + // Prevents auto-scrolling behavior when middle-clicking. + if (event.button === 1) { + event.preventDefault(); + } + } + /** * Handle the context menu click event. * - The context menu click event is triggered by the right-click. From 79653f38b2ddfa44e6f543ac4a879d992aaccab9 Mon Sep 17 00:00:00 2001 From: Vlad Arama <86936229+vladarama@users.noreply.github.com> Date: Fri, 4 Aug 2023 08:55:25 -0400 Subject: [PATCH 05/79] getting-started: add welcome page checkbox preference (#12750) The pull-request includes a preference and checkbox to toggle the visibility of the welcome-page on startup. Signed-off-by: Vlad Arama --- .../browser/getting-started-contribution.ts | 21 ++-- .../getting-started-frontend-module.ts | 3 +- .../browser/getting-started-preferences.ts | 58 +++++++++++ .../src/browser/getting-started-widget.tsx | 97 ++++++++++++++----- .../src/browser/style/index.css | 15 +++ 5 files changed, 163 insertions(+), 31 deletions(-) create mode 100644 packages/getting-started/src/browser/getting-started-preferences.ts diff --git a/packages/getting-started/src/browser/getting-started-contribution.ts b/packages/getting-started/src/browser/getting-started-contribution.ts index f3a21ca099347..6f3d70cf1eb4f 100644 --- a/packages/getting-started/src/browser/getting-started-contribution.ts +++ b/packages/getting-started/src/browser/getting-started-contribution.ts @@ -16,7 +16,7 @@ import { injectable, inject } from '@theia/core/shared/inversify'; import { CommandRegistry, MenuModelRegistry } from '@theia/core/lib/common'; -import { CommonMenus, AbstractViewContribution, FrontendApplicationContribution, FrontendApplication } from '@theia/core/lib/browser'; +import { CommonMenus, AbstractViewContribution, FrontendApplicationContribution, FrontendApplication, NavigatableWidget, PreferenceService } from '@theia/core/lib/browser'; import { GettingStartedWidget } from './getting-started-widget'; import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; import { WorkspaceService } from '@theia/workspace/lib/browser'; @@ -38,6 +38,9 @@ export class GettingStartedContribution extends AbstractViewContribution { - if (!this.workspaceService.opened) { - this.stateService.reachedState('ready').then( - () => this.openView({ reveal: true, activate: true }) - ); - } + this.stateService.reachedState('ready').then(() => { + const editors = this.shell.widgets.filter((widget): widget is NavigatableWidget => NavigatableWidget.is(widget)); + if (editors.length === 0) { + this.preferenceService.ready.then(() => { + const showWelcomePage: boolean = this.preferenceService.get('welcome.alwaysShowWelcomePage', true); + if (showWelcomePage) { + this.openView({ reveal: true, activate: true }); + } + }); + } + }); } override registerCommands(registry: CommandRegistry): void { diff --git a/packages/getting-started/src/browser/getting-started-frontend-module.ts b/packages/getting-started/src/browser/getting-started-frontend-module.ts index a51e8b627f19c..fbcc828646f02 100644 --- a/packages/getting-started/src/browser/getting-started-frontend-module.ts +++ b/packages/getting-started/src/browser/getting-started-frontend-module.ts @@ -18,7 +18,7 @@ import { GettingStartedContribution } from './getting-started-contribution'; import { ContainerModule, interfaces } from '@theia/core/shared/inversify'; import { GettingStartedWidget } from './getting-started-widget'; import { WidgetFactory, FrontendApplicationContribution, bindViewContribution } from '@theia/core/lib/browser'; - +import { bindGettingStartedPreferences } from './getting-started-preferences'; import '../../src/browser/style/index.css'; export default new ContainerModule((bind: interfaces.Bind) => { @@ -29,4 +29,5 @@ export default new ContainerModule((bind: interfaces.Bind) => { id: GettingStartedWidget.ID, createWidget: () => context.container.get(GettingStartedWidget), })).inSingletonScope(); + bindGettingStartedPreferences(bind); }); diff --git a/packages/getting-started/src/browser/getting-started-preferences.ts b/packages/getting-started/src/browser/getting-started-preferences.ts new file mode 100644 index 0000000000000..18d1cc64e2cc3 --- /dev/null +++ b/packages/getting-started/src/browser/getting-started-preferences.ts @@ -0,0 +1,58 @@ +// ***************************************************************************** +// Copyright (C) 2023 Ericsson and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { interfaces } from '@theia/core/shared/inversify'; +import { + createPreferenceProxy, + PreferenceProxy, + PreferenceService, + PreferenceSchema, + PreferenceContribution +} from '@theia/core/lib/browser/preferences'; +import { nls } from '@theia/core/lib/common/nls'; + +export const GettingStartedPreferenceSchema: PreferenceSchema = { + 'type': 'object', + properties: { + 'welcome.alwaysShowWelcomePage': { + type: 'boolean', + description: nls.localizeByDefault('Show welcome page on startup'), + default: true + } + } +}; + +export interface GettingStartedConfiguration { + 'welcome.alwaysShowWelcomePage': boolean; +} + +export const GettingStartedPreferenceContribution = Symbol('GettingStartedPreferenceContribution'); +export const GettingStartedPreferences = Symbol('GettingStartedPreferences'); +export type GettingStartedPreferences = PreferenceProxy; + +export function createGettingStartedPreferences(preferences: PreferenceService, schema: PreferenceSchema = GettingStartedPreferenceSchema): GettingStartedPreferences { + return createPreferenceProxy(preferences, schema); +} + +export function bindGettingStartedPreferences(bind: interfaces.Bind): void { + bind(GettingStartedPreferences).toDynamicValue(ctx => { + const preferences = ctx.container.get(PreferenceService); + const contribution = ctx.container.get(GettingStartedPreferenceContribution); + return createGettingStartedPreferences(preferences, contribution.schema); + }).inSingletonScope(); + bind(GettingStartedPreferenceContribution).toConstantValue({ schema: GettingStartedPreferenceSchema }); + bind(PreferenceContribution).toService(GettingStartedPreferenceContribution); +} diff --git a/packages/getting-started/src/browser/getting-started-widget.tsx b/packages/getting-started/src/browser/getting-started-widget.tsx index d468240e7db2e..c833471122e8e 100644 --- a/packages/getting-started/src/browser/getting-started-widget.tsx +++ b/packages/getting-started/src/browser/getting-started-widget.tsx @@ -20,7 +20,7 @@ import { injectable, inject, postConstruct } from '@theia/core/shared/inversify' import { CommandRegistry, isOSX, environment, Path } from '@theia/core/lib/common'; import { WorkspaceCommands, WorkspaceService } from '@theia/workspace/lib/browser'; import { KeymapsCommands } from '@theia/keymaps/lib/browser'; -import { Message, ReactWidget, CommonCommands, LabelProvider, Key, KeyCode, codicon } from '@theia/core/lib/browser'; +import { Message, ReactWidget, CommonCommands, LabelProvider, Key, KeyCode, codicon, PreferenceService } from '@theia/core/lib/browser'; import { ApplicationInfo, ApplicationServer } from '@theia/core/lib/common/application-protocol'; import { FrontendApplicationConfigProvider } from '@theia/core/lib/browser/frontend-application-config-provider'; import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; @@ -47,7 +47,7 @@ export class GettingStartedWidget extends ReactWidget { /** * The widget `label` which is used for display purposes. */ - static readonly LABEL = nls.localizeByDefault('Get Started'); + static readonly LABEL = nls.localizeByDefault('Welcome'); /** * The `ApplicationInfo` for the application if available. @@ -97,6 +97,9 @@ export class GettingStartedWidget extends ReactWidget { @inject(WorkspaceService) protected readonly workspaceService: WorkspaceService; + @inject(PreferenceService) + protected readonly preferenceService: PreferenceService; + @postConstruct() protected init(): void { this.doInit(); @@ -126,34 +129,39 @@ export class GettingStartedWidget extends ReactWidget { * Render the content of the widget. */ protected render(): React.ReactNode { - return
- {this.renderHeader()} -
-
-
- {this.renderOpen()} + return
+
+ {this.renderHeader()} +
+
+
+ {this.renderOpen()} +
-
-
-
- {this.renderRecentWorkspaces()} +
+
+ {this.renderRecentWorkspaces()} +
-
-
-
- {this.renderSettings()} +
+
+ {this.renderSettings()} +
-
-
-
- {this.renderHelp()} +
+
+ {this.renderHelp()} +
-
-
-
- {this.renderVersion()} +
+
+ {this.renderVersion()} +
+
+ {this.renderPreferences()} +
; } @@ -364,6 +372,10 @@ export class GettingStartedWidget extends ReactWidget {
; } + protected renderPreferences(): React.ReactNode { + return ; + } + /** * Build the list of workspace paths. * @param workspaces {string[]} the list of workspaces. @@ -478,3 +490,40 @@ export class GettingStartedWidget extends ReactWidget { return Key.ENTER.keyCode === KeyCode.createKeyCode(e.nativeEvent).key?.keyCode; } } + +export interface PreferencesProps { + preferenceService: PreferenceService; +} + +function WelcomePreferences(props: PreferencesProps): JSX.Element { + const [alwaysShowWelcomePage, setAlwaysShowWelcomePage] = React.useState( + props.preferenceService.get('welcome.alwaysShowWelcomePage', true) + ); + React.useEffect(() => { + const prefListener = props.preferenceService.onPreferenceChanged(change => { + if (change.preferenceName === 'welcome.alwaysShowWelcomePage') { + const prefValue = change.newValue; + setAlwaysShowWelcomePage(prefValue); + } + }); + return () => prefListener.dispose(); + }, [props.preferenceService]); + const handleChange = (e: React.ChangeEvent) => { + const newChecked = e.target.checked; + props.preferenceService.updateValue('welcome.alwaysShowWelcomePage', newChecked); + }; + return ( +
+ + +
+ ); +} diff --git a/packages/getting-started/src/browser/style/index.css b/packages/getting-started/src/browser/style/index.css index 2a23b097fdd32..ba828730c4c0a 100644 --- a/packages/getting-started/src/browser/style/index.css +++ b/packages/getting-started/src/browser/style/index.css @@ -89,3 +89,18 @@ body { text-transform: capitalize; font-weight: 400; } + +.gs-preference-container { + display: flex; + position: absolute; + bottom: 0; + width: 100%; + justify-content: center; +} + +.gs-preference { + margin-top: 20px; + margin-bottom: 20px; + display: flex; + align-items: center; +} From ff9eb11d834b716ae56d71520999c45eeb4e686b Mon Sep 17 00:00:00 2001 From: Mark Sujew Date: Fri, 4 Aug 2023 15:44:55 +0200 Subject: [PATCH 06/79] Add localization for empty navigator (#12795) --- packages/navigator/src/browser/navigator-widget.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/navigator/src/browser/navigator-widget.tsx b/packages/navigator/src/browser/navigator-widget.tsx index a14e532956944..bf193fd0572de 100644 --- a/packages/navigator/src/browser/navigator-widget.tsx +++ b/packages/navigator/src/browser/navigator-widget.tsx @@ -175,14 +175,13 @@ export class FileNavigatorWidget extends AbstractNavigatorTreeWidget { * Instead of displaying an empty navigator tree, this will show a button to add more folders. */ protected renderEmptyMultiRootWorkspace(): React.ReactNode { - // TODO: @msujew Implement a markdown renderer and use vscode/explorerViewlet/noFolderHelp return
-
You have not yet added a folder to the workspace.
+
{nls.localizeByDefault('You have not yet added a folder to the workspace.\n{0}', '')}
-
; From 2747ee5f6c9150df4f309fa8a84cc2a8f68fe5b3 Mon Sep 17 00:00:00 2001 From: "Christian W. Damus" Date: Tue, 25 Jul 2023 16:31:42 -0400 Subject: [PATCH 07/79] terminal: Windows .exe compatibility for VSCode Support implicit '.exe' extension on the shell command in terminal profiles as in VS Code. Fixes #12734 Signed-off-by: Christian W. Damus --- .../process/src/node/terminal-process.spec.ts | 17 ++ packages/process/src/node/terminal-process.ts | 146 +++++++++++------- 2 files changed, 104 insertions(+), 59 deletions(-) diff --git a/packages/process/src/node/terminal-process.spec.ts b/packages/process/src/node/terminal-process.spec.ts index f5d144ff05e97..9e73207078d40 100644 --- a/packages/process/src/node/terminal-process.spec.ts +++ b/packages/process/src/node/terminal-process.spec.ts @@ -48,6 +48,23 @@ describe('TerminalProcess', function (): void { expect(error.code).eq('ENOENT'); }); + it('test implicit .exe (Windows only)', async function (): Promise { + const match = /^(.+)\.exe$/.exec(process.execPath); + if (!isWindows || !match) { + this.skip(); + } + + const command = match[1]; + const args = ['--version']; + const terminal = await new Promise((resolve, reject) => { + const proc = terminalProcessFactory({ command, args }); + proc.onExit(resolve); + proc.onError(reject); + }); + + expect(terminal.code).to.exist; + }); + it('test error on trying to execute a directory', async function (): Promise { const error = await new Promise((resolve, reject) => { const proc = terminalProcessFactory({ command: __dirname }); diff --git a/packages/process/src/node/terminal-process.ts b/packages/process/src/node/terminal-process.ts index 8c4790c77d395..441a1d15f7849 100644 --- a/packages/process/src/node/terminal-process.ts +++ b/packages/process/src/node/terminal-process.ts @@ -79,72 +79,100 @@ export class TerminalProcess extends Process { } this.logger.debug('Starting terminal process', JSON.stringify(options, undefined, 2)); - try { - this.terminal = spawn( - options.command, - (isWindows && options.commandLine) || options.args || [], - options.options || {} - ); - - process.nextTick(() => this.emitOnStarted()); - - // node-pty actually wait for the underlying streams to be closed before emitting exit. - // We should emulate the `exit` and `close` sequence. - this.terminal.on('exit', (code, signal) => { - // Make sure to only pass either code or signal as !undefined, not - // both. - // - // node-pty quirk: On Linux/macOS, if the process exited through the - // exit syscall (with an exit code), signal will be 0 (an invalid - // signal value). If it was terminated because of a signal, the - // signal parameter will hold the signal number and code should - // be ignored. - if (signal === undefined || signal === 0) { - this.onTerminalExit(code, undefined); - } else { - this.onTerminalExit(undefined, signame(signal)); - } - process.nextTick(() => { - if (signal === undefined || signal === 0) { - this.emitOnClose(code, undefined); - } else { - this.emitOnClose(undefined, signame(signal)); + const startTerminal = (command: string): { terminal: IPty | undefined, inputStream: Writable } => { + try { + return this.createPseudoTerminal(command, options, ringBuffer); + } catch (error) { + // Normalize the error to make it as close as possible as what + // node's child_process.spawn would generate in the same + // situation. + const message: string = error.message; + + if (message.startsWith('File not found: ') || message.endsWith(NodePtyErrors.ENOENT)) { + if (isWindows && command && !command.toLowerCase().endsWith('.exe')) { + const commandExe = command + '.exe'; + this.logger.debug(`Trying terminal command '${commandExe}' because '${command}' was not found.`); + return startTerminal(commandExe); } - }); - }); - this.terminal.on('data', (data: string) => { - ringBuffer.enq(data); - }); + // Proceed with failure, reporting the original command because it was + // the intended command and it was not found + error.errno = 'ENOENT'; + error.code = 'ENOENT'; + error.path = options.command; + } else if (message.endsWith(NodePtyErrors.EACCES)) { + // The shell program exists but was not accessible, so just fail + error.errno = 'EACCES'; + error.code = 'EACCES'; + error.path = options.command; + } - this.inputStream = new Writable({ - write: (chunk: string) => { - this.write(chunk); - }, - }); + // node-pty throws exceptions on Windows. + // Call the client error handler, but first give them a chance to register it. + this.emitOnErrorAsync(error); - } catch (error) { - this.inputStream = new DevNullStream({ autoDestroy: true }); + return { terminal: undefined, inputStream: new DevNullStream({ autoDestroy: true }) }; + } + }; + + const { terminal, inputStream } = startTerminal(options.command); + this.terminal = terminal; + this.inputStream = inputStream; + } - // Normalize the error to make it as close as possible as what - // node's child_process.spawn would generate in the same - // situation. - const message: string = error.message; - - if (message.startsWith('File not found: ') || message.endsWith(NodePtyErrors.ENOENT)) { - error.errno = 'ENOENT'; - error.code = 'ENOENT'; - error.path = options.command; - } else if (message.endsWith(NodePtyErrors.EACCES)) { - error.errno = 'EACCES'; - error.code = 'EACCES'; - error.path = options.command; + /** + * Helper for the constructor to attempt to create the pseudo-terminal encapsulating the shell process. + * + * @param command the shell command to launch + * @param options options for the shell process + * @param ringBuffer a ring buffer in which to collect terminal output + * @returns the terminal PTY and a stream by which it may be sent input + */ + private createPseudoTerminal(command: string, options: TerminalProcessOptions, ringBuffer: MultiRingBuffer): { terminal: IPty | undefined, inputStream: Writable } { + const terminal = spawn( + command, + (isWindows && options.commandLine) || options.args || [], + options.options || {} + ); + + process.nextTick(() => this.emitOnStarted()); + + // node-pty actually wait for the underlying streams to be closed before emitting exit. + // We should emulate the `exit` and `close` sequence. + terminal.onExit(({ exitCode, signal }) => { + // Make sure to only pass either code or signal as !undefined, not + // both. + // + // node-pty quirk: On Linux/macOS, if the process exited through the + // exit syscall (with an exit code), signal will be 0 (an invalid + // signal value). If it was terminated because of a signal, the + // signal parameter will hold the signal number and code should + // be ignored. + if (signal === undefined || signal === 0) { + this.onTerminalExit(exitCode, undefined); + } else { + this.onTerminalExit(undefined, signame(signal)); } + process.nextTick(() => { + if (signal === undefined || signal === 0) { + this.emitOnClose(exitCode, undefined); + } else { + this.emitOnClose(undefined, signame(signal)); + } + }); + }); - // node-pty throws exceptions on Windows. - // Call the client error handler, but first give them a chance to register it. - this.emitOnErrorAsync(error); - } + terminal.onData((data: string) => { + ringBuffer.enq(data); + }); + + const inputStream = new Writable({ + write: (chunk: string) => { + this.write(chunk); + }, + }); + + return { terminal, inputStream }; } createOutputStream(): MultiRingBufferReadableStream { From 1e16b0899e5bf857b147a8bcd2f2c2da548dd18b Mon Sep 17 00:00:00 2001 From: Johannes Faltermeier Date: Tue, 8 Aug 2023 11:02:20 +0200 Subject: [PATCH 08/79] A VS Code extension configurationDefault does not work #12713 (#12758) * A VS Code extension configurationDefault does not work #12713 * plugin contribution handler will now also register configurationDefault for non language related configuration changes * extend preference-contribution#doSetSchema to allow modifying default values for existing schemas when contributed via a special schema id * also update select options in preference-select-input, since the default value may change now, which requires the SelectOptions to recreate * Address Review Comments #12713 --- .../preferences/preference-contribution.ts | 73 +++++++++++++------ .../browser/plugin-contribution-handler.ts | 11 ++- .../components/preference-select-input.ts | 12 ++- 3 files changed, 66 insertions(+), 30 deletions(-) diff --git a/packages/core/src/browser/preferences/preference-contribution.ts b/packages/core/src/browser/preferences/preference-contribution.ts index d3a329cabac9b..a86e3e9236f0e 100644 --- a/packages/core/src/browser/preferences/preference-contribution.ts +++ b/packages/core/src/browser/preferences/preference-contribution.ts @@ -34,6 +34,8 @@ import { JSONValue } from '@phosphor/coreutils'; export const PreferenceContribution = Symbol('PreferenceContribution'); +export const DefaultOverridesPreferenceSchemaId = 'defaultOverrides'; + /** * A {@link PreferenceContribution} allows adding additional custom preferences. * For this, the {@link PreferenceContribution} has to provide a valid JSON Schema specifying which preferences @@ -202,34 +204,44 @@ export class PreferenceSchemaProvider extends PreferenceProvider { const defaultScope = PreferenceSchema.getDefaultScope(schema); const overridable = schema.overridable || false; for (const [preferenceName, rawSchemaProps] of Object.entries(schema.properties)) { - if (this.combinedSchema.properties[preferenceName]) { + if (this.combinedSchema.properties[preferenceName] && DefaultOverridesPreferenceSchemaId !== schema.id) { console.error('Preference name collision detected in the schema for property: ' + preferenceName); - } else if (!rawSchemaProps.hasOwnProperty('included') || rawSchemaProps.included) { - const schemaProps = PreferenceDataProperty.fromPreferenceSchemaProperty(rawSchemaProps, defaultScope); - if (typeof schemaProps.overridable !== 'boolean' && overridable) { - schemaProps.overridable = true; - } - if (schemaProps.overridable) { - this.overridePatternProperties.properties[preferenceName] = schemaProps; + } else { + let schemaProps; + if (this.combinedSchema.properties[preferenceName] && DefaultOverridesPreferenceSchemaId === schema.id) { + // update existing default value in schema + schemaProps = PreferenceDataProperty.fromPreferenceSchemaProperty(rawSchemaProps, defaultScope); + this.updateSchemaPropsDefault(preferenceName, schemaProps); + } else if (!rawSchemaProps.hasOwnProperty('included') || rawSchemaProps.included) { + // add overrides for languages + schemaProps = PreferenceDataProperty.fromPreferenceSchemaProperty(rawSchemaProps, defaultScope); + if (typeof schemaProps.overridable !== 'boolean' && overridable) { + schemaProps.overridable = true; + } + if (schemaProps.overridable) { + this.overridePatternProperties.properties[preferenceName] = schemaProps; + } + this.updateSchemaProps(preferenceName, schemaProps); } - this.updateSchemaProps(preferenceName, schemaProps); - - const schemaDefault = this.getDefaultValue(schemaProps); - const configuredDefault = this.getConfiguredDefault(preferenceName); - if (this.preferenceOverrideService.testOverrideValue(preferenceName, schemaDefault)) { - schemaProps.defaultValue = PreferenceSchemaProperties.is(configuredDefault) - ? PreferenceProvider.merge(schemaDefault, configuredDefault) - : schemaDefault; - if (schemaProps.defaultValue && PreferenceSchemaProperties.is(schemaProps.defaultValue)) { - for (const overriddenPreferenceName in schemaProps.defaultValue) { - const overrideValue = schemaDefault[overriddenPreferenceName]; - const overridePreferenceName = `${preferenceName}.${overriddenPreferenceName}`; - changes.push(this.doSetPreferenceValue(overridePreferenceName, overrideValue, { scope, domain })); + + if (schemaProps !== undefined) { + const schemaDefault = this.getDefaultValue(schemaProps); + const configuredDefault = this.getConfiguredDefault(preferenceName); + if (this.preferenceOverrideService.testOverrideValue(preferenceName, schemaDefault)) { + schemaProps.defaultValue = PreferenceSchemaProperties.is(configuredDefault) + ? PreferenceProvider.merge(schemaDefault, configuredDefault) + : schemaDefault; + if (schemaProps.defaultValue && PreferenceSchemaProperties.is(schemaProps.defaultValue)) { + for (const overriddenPreferenceName in schemaProps.defaultValue) { + const overrideValue = schemaDefault[overriddenPreferenceName]; + const overridePreferenceName = `${preferenceName}.${overriddenPreferenceName}`; + changes.push(this.doSetPreferenceValue(overridePreferenceName, overrideValue, { scope, domain })); + } } + } else { + schemaProps.defaultValue = configuredDefault === undefined ? schemaDefault : configuredDefault; + changes.push(this.doSetPreferenceValue(preferenceName, schemaProps.defaultValue, { scope, domain })); } - } else { - schemaProps.defaultValue = configuredDefault === undefined ? schemaDefault : configuredDefault; - changes.push(this.doSetPreferenceValue(preferenceName, schemaProps.defaultValue, { scope, domain })); } } } @@ -383,6 +395,19 @@ export class PreferenceSchemaProvider extends PreferenceProvider { } } + protected updateSchemaPropsDefault(key: string, property: PreferenceDataProperty): void { + this.combinedSchema.properties[key].default = property.default; + this.combinedSchema.properties[key].defaultValue = property.defaultValue; + if (this.workspaceSchema.properties[key]) { + this.workspaceSchema.properties[key].default = property.default; + this.workspaceSchema.properties[key].defaultValue = property.defaultValue; + } + if (this.folderSchema.properties[key]) { + this.folderSchema.properties[key].default = property.default; + this.folderSchema.properties[key].defaultValue = property.defaultValue; + } + } + protected removePropFromSchemas(key: string): void { // If we remove a key from combined, it should also be removed from all narrower scopes. delete this.combinedSchema.properties[key]; diff --git a/packages/plugin-ext/src/main/browser/plugin-contribution-handler.ts b/packages/plugin-ext/src/main/browser/plugin-contribution-handler.ts index fe671d99b6dd3..50075206eb8dd 100644 --- a/packages/plugin-ext/src/main/browser/plugin-contribution-handler.ts +++ b/packages/plugin-ext/src/main/browser/plugin-contribution-handler.ts @@ -27,7 +27,7 @@ import { LabelProviderContribution, PreferenceSchemaProvider } from '@theia/core/lib/browser'; -import { PreferenceLanguageOverrideService, PreferenceSchema, PreferenceSchemaProperties } from '@theia/core/lib/browser/preferences'; +import { DefaultOverridesPreferenceSchemaId, PreferenceLanguageOverrideService, PreferenceSchema, PreferenceSchemaProperties } from '@theia/core/lib/browser/preferences'; import { KeybindingsContributionPointHandler } from './keybindings/keybindings-contribution-handler'; import { MonacoSnippetSuggestProvider } from '@theia/monaco/lib/browser/monaco-snippet-suggest-provider'; import { PluginSharedStyle } from './plugin-shared-style'; @@ -487,7 +487,7 @@ export class PluginContributionHandler { protected updateDefaultOverridesSchema(configurationDefaults: PreferenceSchemaProperties): Disposable { const defaultOverrides: PreferenceSchema = { - id: 'defaultOverrides', + id: DefaultOverridesPreferenceSchemaId, title: 'Default Configuration Overrides', properties: {} }; @@ -495,11 +495,18 @@ export class PluginContributionHandler { for (const key in configurationDefaults) { const defaultValue = configurationDefaults[key]; if (this.preferenceOverrideService.testOverrideValue(key, defaultValue)) { + // language specific override defaultOverrides.properties[key] = { type: 'object', default: defaultValue, description: `Configure editor settings to be overridden for ${key} language.` }; + } else { + // regular configuration override + defaultOverrides.properties[key] = { + default: defaultValue, + description: `Configure default setting for ${key}.` + }; } } if (Object.keys(defaultOverrides.properties).length) { diff --git a/packages/preferences/src/browser/views/components/preference-select-input.ts b/packages/preferences/src/browser/views/components/preference-select-input.ts index 62e7cf8291754..81a806a2f7bc0 100644 --- a/packages/preferences/src/browser/views/components/preference-select-input.ts +++ b/packages/preferences/src/browser/views/components/preference-select-input.ts @@ -30,12 +30,14 @@ export class PreferenceSelectInputRenderer extends PreferenceLeafNodeRenderer(); + protected selectOptions: SelectOption[] = []; + protected get enumValues(): JSONValue[] { return this.preferenceNode.preference.data.enum!; } - protected get selectOptions(): SelectOption[] { - const items: SelectOption[] = []; + protected updateSelectOptions(): void { + const updatedSelectOptions: SelectOption[] = []; const values = this.enumValues; const preferenceData = this.preferenceNode.preference.data; const defaultValue = preferenceData.default; @@ -51,7 +53,7 @@ export class PreferenceSelectInputRenderer extends PreferenceLeafNodeRenderer Date: Tue, 8 Aug 2023 17:38:25 +0200 Subject: [PATCH 09/79] feat: can rebind the monaco editor command handler (#12785) The commit improves the extensibility of `MonacoEditorCommandHandlers` so it can be rebinded. Signed-off-by: Akos Kitta --- packages/monaco/src/browser/monaco-frontend-module.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/monaco/src/browser/monaco-frontend-module.ts b/packages/monaco/src/browser/monaco-frontend-module.ts index 3c4b2c049a7e7..e0124adf42501 100644 --- a/packages/monaco/src/browser/monaco-frontend-module.ts +++ b/packages/monaco/src/browser/monaco-frontend-module.ts @@ -153,7 +153,8 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(FrontendApplicationContribution).toService(MonacoStatusBarContribution); bind(MonacoCommandRegistry).toSelf().inSingletonScope(); - bind(CommandContribution).to(MonacoEditorCommandHandlers).inSingletonScope(); + bind(MonacoEditorCommandHandlers).toSelf().inSingletonScope(); + bind(CommandContribution).toService(MonacoEditorCommandHandlers); bind(MonacoEditorMenuContribution).toSelf().inSingletonScope(); bind(MenuContribution).toService(MonacoEditorMenuContribution); bind(MonacoKeybindingContribution).toSelf().inSingletonScope(); From f75c9a244aac878c1a6582346b0c150938480d00 Mon Sep 17 00:00:00 2001 From: Martin Fleck Date: Thu, 10 Aug 2023 10:11:00 +0200 Subject: [PATCH 10/79] Ensure we keep task type and properly support custom execution (#12770) - Make TaskProviderAdapter more resilient against undefined - Ensure task type is not lost during conversion (used for custom exec) - Ensure task type is considered during comparison Fixes https://github.com/eclipse-theia/theia/issues/12721 --- .../plugin-ext/src/common/plugin-api-rpc.ts | 4 +-- .../plugin-ext/src/main/browser/tasks-main.ts | 8 ++--- .../src/plugin/tasks/task-provider.ts | 21 ++++++------- packages/plugin-ext/src/plugin/tasks/tasks.ts | 31 +++++++++++-------- .../src/browser/task-definition-registry.ts | 3 ++ 5 files changed, 36 insertions(+), 31 deletions(-) diff --git a/packages/plugin-ext/src/common/plugin-api-rpc.ts b/packages/plugin-ext/src/common/plugin-api-rpc.ts index 917337b1b6e81..2857dbb4d106f 100644 --- a/packages/plugin-ext/src/common/plugin-api-rpc.ts +++ b/packages/plugin-ext/src/common/plugin-api-rpc.ts @@ -2175,8 +2175,8 @@ export const MAIN_RPC_CONTEXT = { export interface TasksExt { $initLoadedTasks(executions: TaskExecutionDto[]): Promise; - $provideTasks(handle: number): Promise; - $resolveTask(handle: number, task: TaskDto, token?: CancellationToken): Promise; + $provideTasks(handle: number): Promise; + $resolveTask(handle: number, task: TaskDto, token?: CancellationToken): Promise; $onDidStartTask(execution: TaskExecutionDto, terminalId: number): void; $onDidEndTask(id: number): void; $onDidStartTaskProcess(processId: number | undefined, execution: TaskExecutionDto): void; diff --git a/packages/plugin-ext/src/main/browser/tasks-main.ts b/packages/plugin-ext/src/main/browser/tasks-main.ts index 70b009814d59d..7c674d763b06e 100644 --- a/packages/plugin-ext/src/main/browser/tasks-main.ts +++ b/packages/plugin-ext/src/main/browser/tasks-main.ts @@ -184,8 +184,8 @@ export class TasksMainImpl implements TasksMain, Disposable { protected createTaskProvider(handle: number): TaskProvider { return { provideTasks: () => - this.proxy.$provideTasks(handle).then(v => - v!.map(taskDto => + this.proxy.$provideTasks(handle).then(tasks => + tasks.map(taskDto => this.toTaskConfiguration(taskDto) ) ) @@ -195,8 +195,8 @@ export class TasksMainImpl implements TasksMain, Disposable { protected createTaskResolver(handle: number): TaskResolver { return { resolveTask: taskConfig => - this.proxy.$resolveTask(handle, this.fromTaskConfiguration(taskConfig)).then(v => - this.toTaskConfiguration(v!) + this.proxy.$resolveTask(handle, this.fromTaskConfiguration(taskConfig)).then(task => + this.toTaskConfiguration(task) ) }; } diff --git a/packages/plugin-ext/src/plugin/tasks/task-provider.ts b/packages/plugin-ext/src/plugin/tasks/task-provider.ts index 4b533549818ca..6ef22841e1c05 100644 --- a/packages/plugin-ext/src/plugin/tasks/task-provider.ts +++ b/packages/plugin-ext/src/plugin/tasks/task-provider.ts @@ -15,17 +15,17 @@ // ***************************************************************************** import * as theia from '@theia/plugin'; -import * as Converter from '../type-converters'; import { TaskDto } from '../../common'; +import * as Converter from '../type-converters'; export class TaskProviderAdapter { constructor(private readonly provider: theia.TaskProvider) { } - provideTasks(token: theia.CancellationToken): Promise { + provideTasks(token: theia.CancellationToken): Promise { return Promise.resolve(this.provider.provideTasks(token)).then(tasks => { if (!Array.isArray(tasks)) { - return undefined; + return []; } const result: TaskDto[] = []; for (const task of tasks) { @@ -40,21 +40,18 @@ export class TaskProviderAdapter { }); } - resolveTask(task: TaskDto, token: theia.CancellationToken): Promise { + async resolveTask(task: TaskDto, token: theia.CancellationToken): Promise { if (typeof this.provider.resolveTask !== 'function') { - return Promise.resolve(undefined); + return task; } const item = Converter.toTask(task); if (!item) { - return Promise.resolve(undefined); + return task; } - return Promise.resolve(this.provider.resolveTask(item, token)).then(value => { - if (value) { - return Converter.fromTask(value); - } - return undefined; - }); + const resolved = await this.provider.resolveTask(item, token); + const converted = resolved ? Converter.fromTask(resolved) : Converter.fromTask(item); + return converted ?? task; } } diff --git a/packages/plugin-ext/src/plugin/tasks/tasks.ts b/packages/plugin-ext/src/plugin/tasks/tasks.ts index ab54e5e817e70..4aecc67a3e51d 100644 --- a/packages/plugin-ext/src/plugin/tasks/tasks.ts +++ b/packages/plugin-ext/src/plugin/tasks/tasks.ts @@ -158,37 +158,42 @@ export class TasksExtImpl implements TasksExt { throw new Error('Task was not successfully transformed into a task config'); } - $provideTasks(handle: number): Promise { + async $provideTasks(handle: number): Promise { const adapter = this.adaptersMap.get(handle); if (adapter) { return adapter.provideTasks(CancellationToken.None).then(tasks => { - if (tasks) { - for (const task of tasks) { - if (task.taskType === 'customExecution') { - task.executionId = this.addCustomExecution(task.callback); - task.callback = undefined; - } + for (const task of tasks) { + if (task.taskType === 'customExecution') { + this.applyCustomExecution(task); } } return tasks; }); } else { - return Promise.reject(new Error('No adapter found to provide tasks')); + throw new Error('No adapter found to provide tasks'); } } - $resolveTask(handle: number, task: TaskDto, token: theia.CancellationToken): Promise { + async $resolveTask(handle: number, task: TaskDto, token: theia.CancellationToken): Promise { const adapter = this.adaptersMap.get(handle); if (adapter) { return adapter.resolveTask(task, token).then(resolvedTask => { - if (resolvedTask && resolvedTask.taskType === 'customExecution') { - resolvedTask.executionId = this.addCustomExecution(resolvedTask.callback); - resolvedTask.callback = undefined; + // ensure we do not lose task type and execution id during resolution as we need it for custom execution + resolvedTask.taskType = resolvedTask.taskType ?? task.taskType; + if (resolvedTask.taskType === 'customExecution') { + this.applyCustomExecution(resolvedTask); } return resolvedTask; }); } else { - return Promise.reject(new Error('No adapter found to resolve task')); + throw new Error('No adapter found to resolve task'); + } + } + + private applyCustomExecution(task: TaskDto): void { + if (task.callback) { + task.executionId = this.addCustomExecution(task.callback); + task.callback = undefined; } } diff --git a/packages/task/src/browser/task-definition-registry.ts b/packages/task/src/browser/task-definition-registry.ts index 2c80374a13a85..57ef3c539c421 100644 --- a/packages/task/src/browser/task-definition-registry.ts +++ b/packages/task/src/browser/task-definition-registry.ts @@ -113,6 +113,9 @@ export class TaskDefinitionRegistry { if (oneType !== otherType) { return false; } + if (one['taskType'] !== other['taskType']) { + return false; + } const def = this.getDefinition(one); if (def) { // scope is either a string or an enum value. Anyway...they must exactly match From 9d2684dc134a22a5a0e2ee5eca62697f847a0af3 Mon Sep 17 00:00:00 2001 From: Vincent Fugnitto Date: Thu, 10 Aug 2023 10:24:41 -0400 Subject: [PATCH 11/79] repo: bump builtins to `1.79.0` (#12807) The commit includes the following updates: - bumps our builtins to `1.79.0` - bumps our extension-pack to `1.79.0` - bumps external builtins (editorconfig, eslint) to latest compatible version according to `1.79.0` Signed-off-by: vince-fugnitto --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 162832b8cc325..d7f65fd66bc24 100644 --- a/package.json +++ b/package.json @@ -100,9 +100,9 @@ ], "theiaPluginsDir": "plugins", "theiaPlugins": { - "eclipse-theia.builtin-extension-pack": "https://open-vsx.org/api/eclipse-theia/builtin-extension-pack/1.77.0/file/eclipse-theia.builtin-extension-pack-1.77.0.vsix", - "EditorConfig.EditorConfig": "https://open-vsx.org/api/EditorConfig/EditorConfig/0.14.4/file/EditorConfig.EditorConfig-0.14.4.vsix", - "dbaeumer.vscode-eslint": "https://open-vsx.org/api/dbaeumer/vscode-eslint/2.1.20/file/dbaeumer.vscode-eslint-2.1.20.vsix" + "eclipse-theia.builtin-extension-pack": "https://open-vsx.org/api/eclipse-theia/builtin-extension-pack/1.79.0/file/eclipse-theia.builtin-extension-pack-1.79.0.vsix", + "EditorConfig.EditorConfig": "https://open-vsx.org/api/EditorConfig/EditorConfig/0.16.6/file/EditorConfig.EditorConfig-0.16.6.vsix", + "dbaeumer.vscode-eslint": "https://open-vsx.org/api/dbaeumer/vscode-eslint/2.4.2/file/dbaeumer.vscode-eslint-2.4.2.vsix" }, "theiaPluginsExcludeIds": [ "ms-vscode.js-debug-companion", From 2d91943fb9d3cecf5c4606c599d42bb13cdac166 Mon Sep 17 00:00:00 2001 From: "Christian W. Damus" Date: Fri, 11 Aug 2023 10:55:55 -0400 Subject: [PATCH 12/79] editor: combine left gutter context menus (#12794) Combine the context menus created by - debug in area left of the line numbers and - editor in the line numbers, themselves into one context menu, managed by the editor extension, opened either from the line numbers or from the gutter area to their left, for consistency with the VS Code behaviour of the 'editor/lineNumber/context' contribution point. Fixes #12688 Signed-off-by: Christian W. Damus --- ...debug-frontend-application-contribution.ts | 79 ++++++++++--------- .../src/browser/editor/debug-editor-model.ts | 11 +-- .../browser/editor-linenumber-contribution.ts | 5 +- 3 files changed, 46 insertions(+), 49 deletions(-) diff --git a/packages/debug/src/browser/debug-frontend-application-contribution.ts b/packages/debug/src/browser/debug-frontend-application-contribution.ts index 160355059d3e2..af484d25cce29 100644 --- a/packages/debug/src/browser/debug-frontend-application-contribution.ts +++ b/packages/debug/src/browser/debug-frontend-application-contribution.ts @@ -19,8 +19,8 @@ import { } from '@theia/core/lib/browser'; import { injectable, inject } from '@theia/core/shared/inversify'; import * as monaco from '@theia/monaco-editor-core'; -import { MenuModelRegistry, CommandRegistry, MAIN_MENU_BAR, Command, Emitter, Mutable } from '@theia/core/lib/common'; -import { EditorKeybindingContexts, EditorManager } from '@theia/editor/lib/browser'; +import { MenuModelRegistry, CommandRegistry, MAIN_MENU_BAR, Command, Emitter, Mutable, CompoundMenuNodeRole } from '@theia/core/lib/common'; +import { EDITOR_LINENUMBER_CONTEXT_MENU, EditorKeybindingContexts, EditorManager } from '@theia/editor/lib/browser'; import { DebugSessionManager } from './debug-session-manager'; import { DebugWidget } from './view/debug-widget'; import { FunctionBreakpoint } from './breakpoint/breakpoint-marker'; @@ -627,6 +627,7 @@ export class DebugFrontendApplicationContribution extends AbstractViewContributi { ...DebugEditorContextCommands.ENABLE_LOGPOINT, label: nlsEnableBreakpoint('Logpoint') }, { ...DebugEditorContextCommands.DISABLE_LOGPOINT, label: nlsDisableBreakpoint('Logpoint') } ); + menus.linkSubmenu(EDITOR_LINENUMBER_CONTEXT_MENU, DebugEditorModel.CONTEXT_MENU, { role: CompoundMenuNodeRole.Group }); } override registerCommands(registry: CommandRegistry): void { @@ -882,59 +883,59 @@ export class DebugFrontendApplicationContribution extends AbstractViewContributi // Debug context menu commands registry.registerCommand(DebugEditorContextCommands.ADD_BREAKPOINT, { - execute: position => this.isPosition(position) && this.editors.toggleBreakpoint(position), - isEnabled: position => this.isPosition(position) && !this.editors.anyBreakpoint(position), - isVisible: position => this.isPosition(position) && !this.editors.anyBreakpoint(position) + execute: position => this.isPosition(position) && this.editors.toggleBreakpoint(this.asPosition(position)), + isEnabled: position => this.isPosition(position) && !this.editors.anyBreakpoint(this.asPosition(position)), + isVisible: position => this.isPosition(position) && !this.editors.anyBreakpoint(this.asPosition(position)) }); registry.registerCommand(DebugEditorContextCommands.ADD_CONDITIONAL_BREAKPOINT, { - execute: position => this.isPosition(position) && this.editors.addBreakpoint('condition', position), - isEnabled: position => this.isPosition(position) && !this.editors.anyBreakpoint(position), - isVisible: position => this.isPosition(position) && !this.editors.anyBreakpoint(position) + execute: position => this.isPosition(position) && this.editors.addBreakpoint('condition', this.asPosition(position)), + isEnabled: position => this.isPosition(position) && !this.editors.anyBreakpoint(this.asPosition(position)), + isVisible: position => this.isPosition(position) && !this.editors.anyBreakpoint(this.asPosition(position)) }); registry.registerCommand(DebugEditorContextCommands.ADD_LOGPOINT, { - execute: position => this.isPosition(position) && this.editors.addBreakpoint('logMessage', position), - isEnabled: position => this.isPosition(position) && !this.editors.anyBreakpoint(position), - isVisible: position => this.isPosition(position) && !this.editors.anyBreakpoint(position) + execute: position => this.isPosition(position) && this.editors.addBreakpoint('logMessage', this.asPosition(position)), + isEnabled: position => this.isPosition(position) && !this.editors.anyBreakpoint(this.asPosition(position)), + isVisible: position => this.isPosition(position) && !this.editors.anyBreakpoint(this.asPosition(position)) }); registry.registerCommand(DebugEditorContextCommands.REMOVE_BREAKPOINT, { - execute: position => this.isPosition(position) && this.editors.toggleBreakpoint(position), - isEnabled: position => this.isPosition(position) && !!this.editors.getBreakpoint(position), - isVisible: position => this.isPosition(position) && !!this.editors.getBreakpoint(position) + execute: position => this.isPosition(position) && this.editors.toggleBreakpoint(this.asPosition(position)), + isEnabled: position => this.isPosition(position) && !!this.editors.getBreakpoint(this.asPosition(position)), + isVisible: position => this.isPosition(position) && !!this.editors.getBreakpoint(this.asPosition(position)) }); registry.registerCommand(DebugEditorContextCommands.EDIT_BREAKPOINT, { - execute: position => this.isPosition(position) && this.editors.editBreakpoint(position), - isEnabled: position => this.isPosition(position) && !!this.editors.getBreakpoint(position), - isVisible: position => this.isPosition(position) && !!this.editors.getBreakpoint(position) + execute: position => this.isPosition(position) && this.editors.editBreakpoint(this.asPosition(position)), + isEnabled: position => this.isPosition(position) && !!this.editors.getBreakpoint(this.asPosition(position)), + isVisible: position => this.isPosition(position) && !!this.editors.getBreakpoint(this.asPosition(position)) }); registry.registerCommand(DebugEditorContextCommands.ENABLE_BREAKPOINT, { - execute: position => this.isPosition(position) && this.editors.setBreakpointEnabled(position, true), - isEnabled: position => this.isPosition(position) && this.editors.getBreakpointEnabled(position) === false, - isVisible: position => this.isPosition(position) && this.editors.getBreakpointEnabled(position) === false + execute: position => this.isPosition(position) && this.editors.setBreakpointEnabled(this.asPosition(position), true), + isEnabled: position => this.isPosition(position) && this.editors.getBreakpointEnabled(this.asPosition(position)) === false, + isVisible: position => this.isPosition(position) && this.editors.getBreakpointEnabled(this.asPosition(position)) === false }); registry.registerCommand(DebugEditorContextCommands.DISABLE_BREAKPOINT, { - execute: position => this.isPosition(position) && this.editors.setBreakpointEnabled(position, false), - isEnabled: position => this.isPosition(position) && !!this.editors.getBreakpointEnabled(position), - isVisible: position => this.isPosition(position) && !!this.editors.getBreakpointEnabled(position) + execute: position => this.isPosition(position) && this.editors.setBreakpointEnabled(this.asPosition(position), false), + isEnabled: position => this.isPosition(position) && !!this.editors.getBreakpointEnabled(this.asPosition(position)), + isVisible: position => this.isPosition(position) && !!this.editors.getBreakpointEnabled(this.asPosition(position)) }); registry.registerCommand(DebugEditorContextCommands.REMOVE_LOGPOINT, { - execute: position => this.isPosition(position) && this.editors.toggleBreakpoint(position), - isEnabled: position => this.isPosition(position) && !!this.editors.getLogpoint(position), - isVisible: position => this.isPosition(position) && !!this.editors.getLogpoint(position) + execute: position => this.isPosition(position) && this.editors.toggleBreakpoint(this.asPosition(position)), + isEnabled: position => this.isPosition(position) && !!this.editors.getLogpoint(this.asPosition(position)), + isVisible: position => this.isPosition(position) && !!this.editors.getLogpoint(this.asPosition(position)) }); registry.registerCommand(DebugEditorContextCommands.EDIT_LOGPOINT, { - execute: position => this.isPosition(position) && this.editors.editBreakpoint(position), - isEnabled: position => this.isPosition(position) && !!this.editors.getLogpoint(position), - isVisible: position => this.isPosition(position) && !!this.editors.getLogpoint(position) + execute: position => this.isPosition(position) && this.editors.editBreakpoint(this.asPosition(position)), + isEnabled: position => this.isPosition(position) && !!this.editors.getLogpoint(this.asPosition(position)), + isVisible: position => this.isPosition(position) && !!this.editors.getLogpoint(this.asPosition(position)) }); registry.registerCommand(DebugEditorContextCommands.ENABLE_LOGPOINT, { - execute: position => this.isPosition(position) && this.editors.setBreakpointEnabled(position, true), - isEnabled: position => this.isPosition(position) && this.editors.getLogpointEnabled(position) === false, - isVisible: position => this.isPosition(position) && this.editors.getLogpointEnabled(position) === false + execute: position => this.isPosition(position) && this.editors.setBreakpointEnabled(this.asPosition(position), true), + isEnabled: position => this.isPosition(position) && this.editors.getLogpointEnabled(this.asPosition(position)) === false, + isVisible: position => this.isPosition(position) && this.editors.getLogpointEnabled(this.asPosition(position)) === false }); registry.registerCommand(DebugEditorContextCommands.DISABLE_LOGPOINT, { - execute: position => this.isPosition(position) && this.editors.setBreakpointEnabled(position, false), - isEnabled: position => this.isPosition(position) && !!this.editors.getLogpointEnabled(position), - isVisible: position => this.isPosition(position) && !!this.editors.getLogpointEnabled(position) + execute: position => this.isPosition(position) && this.editors.setBreakpointEnabled(this.asPosition(position), false), + isEnabled: position => this.isPosition(position) && !!this.editors.getLogpointEnabled(this.asPosition(position)), + isVisible: position => this.isPosition(position) && !!this.editors.getLogpointEnabled(this.asPosition(position)) }); registry.registerCommand(DebugBreakpointWidgetCommands.ACCEPT, { @@ -1263,8 +1264,12 @@ export class DebugFrontendApplicationContribution extends AbstractViewContributi return watch && watch.selectedElement instanceof DebugWatchExpression && watch.selectedElement || undefined; } - protected isPosition(position: monaco.Position): boolean { - return (position instanceof monaco.Position); + protected isPosition(position: unknown): boolean { + return monaco.Position.isIPosition(position); + } + + protected asPosition(position: monaco.IPosition): monaco.Position { + return monaco.Position.lift(position); } registerColors(colors: ColorRegistry): void { diff --git a/packages/debug/src/browser/editor/debug-editor-model.ts b/packages/debug/src/browser/editor/debug-editor-model.ts index 1fe6b2200158b..395598e6bfbf9 100644 --- a/packages/debug/src/browser/editor/debug-editor-model.ts +++ b/packages/debug/src/browser/editor/debug-editor-model.ts @@ -407,16 +407,7 @@ export class DebugEditorModel implements Disposable { protected handleMouseDown(event: monaco.editor.IEditorMouseEvent): void { if (event.target && event.target.type === monaco.editor.MouseTargetType.GUTTER_GLYPH_MARGIN) { - if (event.event.rightButton) { - this.editor.focus(); - setTimeout(() => { - this.contextMenu.render({ - menuPath: DebugEditorModel.CONTEXT_MENU, - anchor: event.event.browserEvent, - args: [event.target.position!] - }); - }); - } else { + if (!event.event.rightButton) { this.toggleBreakpoint(event.target.position!); } } diff --git a/packages/editor/src/browser/editor-linenumber-contribution.ts b/packages/editor/src/browser/editor-linenumber-contribution.ts index a231cae263581..8dae394c8de72 100644 --- a/packages/editor/src/browser/editor-linenumber-contribution.ts +++ b/packages/editor/src/browser/editor-linenumber-contribution.ts @@ -52,7 +52,7 @@ export class EditorLineNumberContribution implements FrontendApplicationContribu } protected handleContextMenu(editor: TextEditor, event: EditorMouseEvent): void { - if (event.target && event.target.type === MouseTargetType.GUTTER_LINE_NUMBERS) { + if (event.target && (event.target.type === MouseTargetType.GUTTER_LINE_NUMBERS || event.target.type === MouseTargetType.GUTTER_GLYPH_MARGIN)) { if (event.event.button === 2) { editor.focus(); const lineNumber = lineNumberFromPosition(event.target.position); @@ -60,7 +60,8 @@ export class EditorLineNumberContribution implements FrontendApplicationContribu const uri = editor.getResourceUri()!; const args = [{ lineNumber: lineNumber, - uri: uri['codeUri'] + column: 1, // Compatible with Monaco editor IPosition API + uri: uri['codeUri'], }]; setTimeout(() => { From 04c8cf07843ea67402131132e033cdd54900c010 Mon Sep 17 00:00:00 2001 From: Akos Kitta <1405703+kittaakos@users.noreply.github.com> Date: Mon, 14 Aug 2023 10:55:28 +0200 Subject: [PATCH 13/79] feat: remove sync `fs` calls from backend+plugin code (#12798) * feat: remove sync fs calls from plugins * feat: remove sync fs calls from git * feat: remove sync fs calls from siw * feat: remove sync fs calls from workspace Signed-off-by: Akos Kitta --- CHANGELOG.md | 1 + packages/core/src/common/promise-util.spec.ts | 55 +++++++++--- packages/core/src/common/promise-util.ts | 12 +++ packages/git/src/node/dugite-git.ts | 3 +- .../src/node/git-locator/git-locator-impl.ts | 10 +-- .../src/node/hosted-instance-manager.ts | 22 ++--- .../src/node/hosted-plugins-manager.ts | 8 +- .../node/plugin-vscode-directory-handler.ts | 59 +++++++----- .../src/node/plugin-vscode-file-handler.ts | 29 ++++-- packages/plugin-ext/src/common/errors.ts | 26 ++++++ .../plugin-ext/src/common/plugin-protocol.ts | 10 +-- .../node/hosted-plugin-deployer-handler.ts | 2 +- .../src/hosted/node/plugin-reader.ts | 2 +- .../hosted/node/scanners/grammars-reader.ts | 11 +-- .../src/hosted/node/scanners/scanner-theia.ts | 90 ++++++++++--------- .../plugin-ext/src/main/node/errors.spec.ts | 37 ++++++++ .../plugin-theia-directory-handler.ts | 26 ++++-- .../handlers/plugin-theia-file-handler.ts | 24 +++-- .../main/node/paths/plugin-paths-service.ts | 15 ++-- ...deployer-directory-handler-context-impl.ts | 16 ++-- .../main/node/plugin-deployer-entry-impl.ts | 16 ++-- .../src/main/node/plugin-deployer-impl.ts | 48 +++++----- .../node/plugin-deployer-proxy-entry-impl.ts | 4 +- .../src/main/node/plugin-github-resolver.ts | 23 +++-- .../src/main/node/plugin-http-resolver.ts | 23 +++-- .../plugin-ext/src/main/node/temp-dir-util.ts | 13 ++- ...ep-search-in-workspace-server.slow-spec.ts | 20 ++--- .../ripgrep-search-in-workspace-server.ts | 20 +++-- .../src/node/default-workspace-server.ts | 18 ++-- 29 files changed, 412 insertions(+), 231 deletions(-) create mode 100644 packages/plugin-ext/src/main/node/errors.spec.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index ecd2d342c9cfb..3f821fc0e16a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,7 @@ - `visual`: Display a visual preview of the tab. (The preview support was added with this PR) - [repo] updated GitHub workflow to stop publishing `next` versions [#12699](https://github.com/eclipse-theia/theia/pull/12699) - [workspace] split `CommonWorkspaceUtils` into `WorkspaceFileService` and `UntitledWorkspaceService` [#12420](https://github.com/eclipse-theia/theia/pull/12420) +- [plugin] Removed synchronous `fs` calls from the backend application and plugins. The plugin scanner, directory and file handlers, and the plugin deploy entry has async API now. Internal `protected` APIs have been affected. [#12798](https://github.com/eclipse-theia/theia/pull/12798) ## v1.39.0 - 06/29/2023 diff --git a/packages/core/src/common/promise-util.spec.ts b/packages/core/src/common/promise-util.spec.ts index 6324c86da2be6..051cbd4fa78c7 100644 --- a/packages/core/src/common/promise-util.spec.ts +++ b/packages/core/src/common/promise-util.spec.ts @@ -13,22 +13,19 @@ // // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 // ***************************************************************************** -import * as assert from 'assert'; -import { waitForEvent } from './promise-util'; +import * as assert from 'assert/strict'; +import { firstTrue, waitForEvent } from './promise-util'; import { Emitter } from './event'; +import { CancellationError } from './cancellation'; describe('promise-util', () => { - it('should time out', async () => { - const emitter = new Emitter(); - try { - await waitForEvent(emitter.event, 1000); - assert.fail('did not time out'); - } catch (e) { - // OK - } - }); - describe('promise-util', () => { + describe('waitForEvent', () => { + it('should time out', async () => { + const emitter = new Emitter(); + await assert.rejects(waitForEvent(emitter.event, 1000), reason => reason instanceof CancellationError); + }); + it('should get event', async () => { const emitter = new Emitter(); setTimeout(() => { @@ -38,4 +35,38 @@ describe('promise-util', () => { }); }); + describe('firstTrue', () => { + it('should resolve to false when the promises arg is empty', async () => { + const actual = await firstTrue(); + assert.strictEqual(actual, false); + }); + + it('should resolve to true when the first promise resolves to true', async () => { + const signals: string[] = []; + const createPromise = (signal: string, timeout: number, result: boolean) => + new Promise(resolve => setTimeout(() => { + signals.push(signal); + resolve(result); + }, timeout)); + const actual = await firstTrue( + createPromise('a', 10, false), + createPromise('b', 20, false), + createPromise('c', 30, true), + createPromise('d', 40, false), + createPromise('e', 50, true) + ); + assert.strictEqual(actual, true); + assert.deepStrictEqual(signals, ['a', 'b', 'c']); + }); + + it('should reject when one of the promises rejects', async () => { + await assert.rejects(firstTrue( + new Promise(resolve => setTimeout(() => resolve(false), 10)), + new Promise(resolve => setTimeout(() => resolve(false), 20)), + new Promise((_, reject) => setTimeout(() => reject(new Error('my test error')), 30)), + new Promise(resolve => setTimeout(() => resolve(true), 40)), + ), /Error: my test error/); + }); + }); + }); diff --git a/packages/core/src/common/promise-util.ts b/packages/core/src/common/promise-util.ts index f54362e13c8e5..841eb0af43a27 100644 --- a/packages/core/src/common/promise-util.ts +++ b/packages/core/src/common/promise-util.ts @@ -129,3 +129,15 @@ export function waitForEvent(event: Event, ms: number, thisArg?: any, disp export function isThenable(obj: unknown): obj is Promise { return isObject>(obj) && isFunction(obj.then); } + +/** + * Returns with a promise that waits until the first promise resolves to `true`. + */ +// Based on https://stackoverflow.com/a/51160727/5529090 +export function firstTrue(...promises: readonly Promise[]): Promise { + const newPromises = promises.map(promise => new Promise( + (resolve, reject) => promise.then(result => result && resolve(true), reject) + )); + newPromises.push(Promise.all(promises).then(() => false)); + return Promise.race(newPromises); +} diff --git a/packages/git/src/node/dugite-git.ts b/packages/git/src/node/dugite-git.ts index c499659bbb24c..e72ad9dee1724 100644 --- a/packages/git/src/node/dugite-git.ts +++ b/packages/git/src/node/dugite-git.ts @@ -766,7 +766,8 @@ export class DugiteGit implements Git { const out = result.stdout; if (out && out.length !== 0) { try { - return fs.realpathSync(out.trim()); + const realpath = await fs.realpath(out.trim()); + return realpath; } catch (e) { this.logger.error(e); return undefined; diff --git a/packages/git/src/node/git-locator/git-locator-impl.ts b/packages/git/src/node/git-locator/git-locator-impl.ts index 7e84af071a1cb..8c6c8d69d9f3f 100644 --- a/packages/git/src/node/git-locator/git-locator-impl.ts +++ b/packages/git/src/node/git-locator/git-locator-impl.ts @@ -59,7 +59,7 @@ export class GitLocatorImpl implements GitLocator { } protected async doLocate(basePath: string, context: GitLocateContext): Promise { - const realBasePath = fs.realpathSync(basePath); + const realBasePath = await fs.realpath(basePath); if (context.visited.has(realBasePath)) { return []; } @@ -77,9 +77,9 @@ export class GitLocatorImpl implements GitLocator { } }); if (context.maxCount >= 0 && paths.length >= context.maxCount) { - return paths.slice(0, context.maxCount).map(GitLocatorImpl.map); + return await Promise.all(paths.slice(0, context.maxCount).map(GitLocatorImpl.map)); } - const repositoryPaths = paths.map(GitLocatorImpl.map); + const repositoryPaths = await Promise.all(paths.map(GitLocatorImpl.map)); return this.locateFrom( newContext => this.generateNested(repositoryPaths, newContext), context, @@ -145,8 +145,8 @@ export class GitLocatorImpl implements GitLocator { return result; } - static map(repository: string): string { - return fs.realpathSync(path.dirname(repository)); + static async map(repository: string): Promise { + return fs.realpath(path.dirname(repository)); } } diff --git a/packages/plugin-dev/src/node/hosted-instance-manager.ts b/packages/plugin-dev/src/node/hosted-instance-manager.ts index a0f45a66cb02c..dc11d18603478 100644 --- a/packages/plugin-dev/src/node/hosted-instance-manager.ts +++ b/packages/plugin-dev/src/node/hosted-instance-manager.ts @@ -30,6 +30,7 @@ import { HostedPluginSupport } from '@theia/plugin-ext/lib/hosted/node/hosted-pl import { MetadataScanner } from '@theia/plugin-ext/lib/hosted/node/metadata-scanner'; import { PluginDebugConfiguration } from '../common/plugin-dev-protocol'; import { HostedPluginProcess } from '@theia/plugin-ext/lib/hosted/node/hosted-plugin-process'; +import { isENOENT } from '@theia/plugin-ext/lib/common/errors'; const DEFAULT_HOSTED_PLUGIN_PORT = 3030; @@ -84,7 +85,7 @@ export interface HostedInstanceManager { * * @param uri uri to the plugin source location */ - isPluginValid(uri: URI): boolean; + isPluginValid(uri: URI): Promise; } const HOSTED_INSTANCE_START_TIMEOUT_MS = 30000; @@ -224,19 +225,18 @@ export abstract class AbstractHostedInstanceManager implements HostedInstanceMan } } - isPluginValid(uri: URI): boolean { + async isPluginValid(uri: URI): Promise { const pckPath = path.join(FileUri.fsPath(uri), 'package.json'); - if (fs.existsSync(pckPath)) { - const pck = fs.readJSONSync(pckPath); - try { - this.metadata.getScanner(pck); - return true; - } catch (e) { - console.error(e); - return false; + try { + const pck = await fs.readJSON(pckPath); + this.metadata.getScanner(pck); + return true; + } catch (err) { + if (!isENOENT(err)) { + console.error(err); } + return false; } - return false; } protected async getStartCommand(port?: number, debugConfig?: PluginDebugConfiguration): Promise { diff --git a/packages/plugin-dev/src/node/hosted-plugins-manager.ts b/packages/plugin-dev/src/node/hosted-plugins-manager.ts index db9d3dede9e08..c6eadb024a48e 100644 --- a/packages/plugin-dev/src/node/hosted-plugins-manager.ts +++ b/packages/plugin-dev/src/node/hosted-plugins-manager.ts @@ -131,15 +131,15 @@ export class HostedPluginsManagerImpl implements HostedPluginsManager { * * @param pluginPath path to plugin's root directory */ - protected checkWatchScript(pluginPath: string): boolean { + protected async checkWatchScript(pluginPath: string): Promise { const pluginPackageJsonPath = path.join(pluginPath, 'package.json'); - if (fs.existsSync(pluginPackageJsonPath)) { - const packageJson = fs.readJSONSync(pluginPackageJsonPath); + try { + const packageJson = await fs.readJSON(pluginPackageJsonPath); const scripts = packageJson['scripts']; if (scripts && scripts['watch']) { return true; } - } + } catch { } return false; } diff --git a/packages/plugin-ext-vscode/src/node/plugin-vscode-directory-handler.ts b/packages/plugin-ext-vscode/src/node/plugin-vscode-directory-handler.ts index 3dfd2c1230143..f135aead0413e 100644 --- a/packages/plugin-ext-vscode/src/node/plugin-vscode-directory-handler.ts +++ b/packages/plugin-ext-vscode/src/node/plugin-vscode-directory-handler.ts @@ -18,33 +18,47 @@ import * as path from 'path'; import * as filenamify from 'filenamify'; import * as fs from '@theia/core/shared/fs-extra'; import { inject, injectable } from '@theia/core/shared/inversify'; -import { RecursivePartial } from '@theia/core'; +import type { RecursivePartial, URI } from '@theia/core'; +import { Deferred, firstTrue } from '@theia/core/lib/common/promise-util'; +import { getTempDirPathAsync } from '@theia/plugin-ext/lib/main/node/temp-dir-util'; import { PluginDeployerDirectoryHandler, PluginDeployerEntry, PluginDeployerDirectoryHandlerContext, PluginDeployerEntryType, PluginPackage, PluginType, PluginIdentifiers } from '@theia/plugin-ext'; import { FileUri } from '@theia/core/lib/node'; -import { getTempDir } from '@theia/plugin-ext/lib/main/node/temp-dir-util'; import { PluginCliContribution } from '@theia/plugin-ext/lib/main/node/plugin-cli-contribution'; @injectable() export class PluginVsCodeDirectoryHandler implements PluginDeployerDirectoryHandler { - protected readonly deploymentDirectory = FileUri.create(getTempDir('vscode-copied')); + protected readonly deploymentDirectory: Deferred; @inject(PluginCliContribution) protected readonly pluginCli: PluginCliContribution; - accept(plugin: PluginDeployerEntry): boolean { + constructor() { + this.deploymentDirectory = new Deferred(); + getTempDirPathAsync('vscode-copied') + .then(deploymentDirectoryPath => this.deploymentDirectory.resolve(FileUri.create(deploymentDirectoryPath))); + } + + async accept(plugin: PluginDeployerEntry): Promise { console.debug(`Resolving "${plugin.id()}" as a VS Code extension...`); return this.attemptResolution(plugin); } - protected attemptResolution(plugin: PluginDeployerEntry): boolean { - return this.resolvePackage(plugin) || this.deriveMetadata(plugin); + protected async attemptResolution(plugin: PluginDeployerEntry): Promise { + if (this.resolvePackage(plugin)) { + return true; + } + return this.deriveMetadata(plugin); } - protected deriveMetadata(plugin: PluginDeployerEntry): boolean { - return this.resolveFromSources(plugin) || this.resolveFromVSIX(plugin) || this.resolveFromNpmTarball(plugin); + protected async deriveMetadata(plugin: PluginDeployerEntry): Promise { + return firstTrue( + this.resolveFromSources(plugin), + this.resolveFromVSIX(plugin), + this.resolveFromNpmTarball(plugin) + ); } async handle(context: PluginDeployerDirectoryHandlerContext): Promise { @@ -68,11 +82,12 @@ export class PluginVsCodeDirectoryHandler implements PluginDeployerDirectoryHand const origin = entry.originalPath(); const targetDir = await this.getExtensionDir(context); try { - if (fs.existsSync(targetDir) || !entry.path().startsWith(origin)) { + if (await fs.pathExists(targetDir) || !entry.path().startsWith(origin)) { console.log(`[${id}]: already copied.`); } else { console.log(`[${id}]: copying to "${targetDir}"`); - await fs.mkdirp(FileUri.fsPath(this.deploymentDirectory)); + const deploymentDirectory = await this.deploymentDirectory.promise; + await fs.mkdirp(FileUri.fsPath(deploymentDirectory)); await context.copy(origin, targetDir); entry.updatePath(targetDir); if (!this.deriveMetadata(entry)) { @@ -86,22 +101,25 @@ export class PluginVsCodeDirectoryHandler implements PluginDeployerDirectoryHand } } - protected resolveFromSources(plugin: PluginDeployerEntry): boolean { + protected async resolveFromSources(plugin: PluginDeployerEntry): Promise { const pluginPath = plugin.path(); - return this.resolvePackage(plugin, { pluginPath, pck: this.requirePackage(pluginPath) }); + const pck = await this.requirePackage(pluginPath); + return this.resolvePackage(plugin, { pluginPath, pck }); } - protected resolveFromVSIX(plugin: PluginDeployerEntry): boolean { - if (!fs.existsSync(path.join(plugin.path(), 'extension.vsixmanifest'))) { + protected async resolveFromVSIX(plugin: PluginDeployerEntry): Promise { + if (!(await fs.pathExists(path.join(plugin.path(), 'extension.vsixmanifest')))) { return false; } const pluginPath = path.join(plugin.path(), 'extension'); - return this.resolvePackage(plugin, { pluginPath, pck: this.requirePackage(pluginPath) }); + const pck = await this.requirePackage(pluginPath); + return this.resolvePackage(plugin, { pluginPath, pck }); } - protected resolveFromNpmTarball(plugin: PluginDeployerEntry): boolean { + protected async resolveFromNpmTarball(plugin: PluginDeployerEntry): Promise { const pluginPath = path.join(plugin.path(), 'package'); - return this.resolvePackage(plugin, { pluginPath, pck: this.requirePackage(pluginPath) }); + const pck = await this.requirePackage(pluginPath); + return this.resolvePackage(plugin, { pluginPath, pck }); } protected resolvePackage(plugin: PluginDeployerEntry, options?: { @@ -125,9 +143,9 @@ export class PluginVsCodeDirectoryHandler implements PluginDeployerDirectoryHand return true; } - protected requirePackage(pluginPath: string): PluginPackage | undefined { + protected async requirePackage(pluginPath: string): Promise { try { - const plugin = fs.readJSONSync(path.join(pluginPath, 'package.json')) as PluginPackage; + const plugin: PluginPackage = await fs.readJSON(path.join(pluginPath, 'package.json')); plugin.publisher ??= PluginIdentifiers.UNPUBLISHED; return plugin; } catch { @@ -136,6 +154,7 @@ export class PluginVsCodeDirectoryHandler implements PluginDeployerDirectoryHand } protected async getExtensionDir(context: PluginDeployerDirectoryHandlerContext): Promise { - return FileUri.fsPath(this.deploymentDirectory.resolve(filenamify(context.pluginEntry().id(), { replacement: '_' }))); + const deploymentDirectory = await this.deploymentDirectory.promise; + return FileUri.fsPath(deploymentDirectory.resolve(filenamify(context.pluginEntry().id(), { replacement: '_' }))); } } diff --git a/packages/plugin-ext-vscode/src/node/plugin-vscode-file-handler.ts b/packages/plugin-ext-vscode/src/node/plugin-vscode-file-handler.ts index 1786958a9373e..23e3e3e9292d3 100644 --- a/packages/plugin-ext-vscode/src/node/plugin-vscode-file-handler.ts +++ b/packages/plugin-ext-vscode/src/node/plugin-vscode-file-handler.ts @@ -18,8 +18,10 @@ import { PluginDeployerFileHandler, PluginDeployerEntry, PluginDeployerFileHandl import * as fs from '@theia/core/shared/fs-extra'; import * as path from 'path'; import * as filenamify from 'filenamify'; -import { injectable, inject } from '@theia/core/shared/inversify'; -import { getTempDir } from '@theia/plugin-ext/lib/main/node/temp-dir-util'; +import type { URI } from '@theia/core'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { Deferred } from '@theia/core/lib/common/promise-util'; +import { getTempDirPathAsync } from '@theia/plugin-ext/lib/main/node/temp-dir-util'; import { PluginVSCodeEnvironment } from '../common/plugin-vscode-environment'; import { FileUri } from '@theia/core/lib/node/file-uri'; @@ -31,13 +33,21 @@ export class PluginVsCodeFileHandler implements PluginDeployerFileHandler { @inject(PluginVSCodeEnvironment) protected readonly environment: PluginVSCodeEnvironment; - private readonly systemExtensionsDirUri = FileUri.create(getTempDir('vscode-unpacked')); + private readonly systemExtensionsDirUri: Deferred; - accept(resolvedPlugin: PluginDeployerEntry): boolean { - if (!resolvedPlugin.isFile()) { - return false; - } - return isVSCodePluginFile(resolvedPlugin.path()); + constructor() { + this.systemExtensionsDirUri = new Deferred(); + getTempDirPathAsync('vscode-unpacked') + .then(systemExtensionsDirPath => this.systemExtensionsDirUri.resolve(FileUri.create(systemExtensionsDirPath))); + } + + async accept(resolvedPlugin: PluginDeployerEntry): Promise { + return resolvedPlugin.isFile().then(file => { + if (!file) { + return false; + } + return isVSCodePluginFile(resolvedPlugin.path()); + }); } async handle(context: PluginDeployerFileHandlerContext): Promise { @@ -55,7 +65,8 @@ export class PluginVsCodeFileHandler implements PluginDeployerFileHandler { } protected async getExtensionDir(context: PluginDeployerFileHandlerContext): Promise { - return FileUri.fsPath(this.systemExtensionsDirUri.resolve(filenamify(context.pluginEntry().id(), { replacement: '_' }))); + const systemExtensionsDirUri = await this.systemExtensionsDirUri.promise; + return FileUri.fsPath(systemExtensionsDirUri.resolve(filenamify(context.pluginEntry().id(), { replacement: '_' }))); } protected async decompress(extensionDir: string, context: PluginDeployerFileHandlerContext): Promise { diff --git a/packages/plugin-ext/src/common/errors.ts b/packages/plugin-ext/src/common/errors.ts index 37b3a31560147..b81c09f4b312c 100644 --- a/packages/plugin-ext/src/common/errors.ts +++ b/packages/plugin-ext/src/common/errors.ts @@ -14,6 +14,8 @@ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 // ***************************************************************************** +import { isObject } from '@theia/core/lib/common/types'; + export function illegalArgument(message?: string): Error { if (message) { return new Error(`Illegal argument: ${message}`); @@ -35,3 +37,27 @@ export function disposed(what: string): Error { result.name = 'DISPOSED'; return result; } + +interface Errno { + readonly code: string; + readonly errno: number +} +const ENOENT = 'ENOENT' as const; + +type ErrnoException = Error & Errno; +function isErrnoException(arg: unknown): arg is ErrnoException { + return arg instanceof Error + && isObject>(arg) + && typeof arg.code === 'string' + && typeof arg.errno === 'number'; +} + +/** + * _(No such file or directory)_: Commonly raised by `fs` operations to indicate that a component of the specified pathname does not exist — no entity (file or directory) could be + * found by the given path. + */ +export function isENOENT( + arg: unknown +): arg is ErrnoException & Readonly<{ code: typeof ENOENT }> { + return isErrnoException(arg) && arg.code === ENOENT; +} diff --git a/packages/plugin-ext/src/common/plugin-protocol.ts b/packages/plugin-ext/src/common/plugin-protocol.ts index 32f27ae6178ba..ca1900bc8a6f7 100644 --- a/packages/plugin-ext/src/common/plugin-protocol.ts +++ b/packages/plugin-ext/src/common/plugin-protocol.ts @@ -348,7 +348,7 @@ export interface PluginScanner { */ getLifecycle(plugin: PluginPackage): PluginLifecycle; - getContribution(plugin: PluginPackage): PluginContribution | undefined; + getContribution(plugin: PluginPackage): Promise; /** * A mapping between a dependency as its defined in package.json @@ -376,7 +376,7 @@ export interface PluginDeployerResolver { export const PluginDeployerDirectoryHandler = Symbol('PluginDeployerDirectoryHandler'); export interface PluginDeployerDirectoryHandler { - accept(pluginDeployerEntry: PluginDeployerEntry): boolean; + accept(pluginDeployerEntry: PluginDeployerEntry): Promise; handle(context: PluginDeployerDirectoryHandlerContext): Promise; } @@ -384,7 +384,7 @@ export interface PluginDeployerDirectoryHandler { export const PluginDeployerFileHandler = Symbol('PluginDeployerFileHandler'); export interface PluginDeployerFileHandler { - accept(pluginDeployerEntry: PluginDeployerEntry): boolean; + accept(pluginDeployerEntry: PluginDeployerEntry): Promise; handle(context: PluginDeployerFileHandlerContext): Promise; } @@ -477,9 +477,9 @@ export interface PluginDeployerEntry { getChanges(): string[]; - isFile(): boolean; + isFile(): Promise; - isDirectory(): boolean; + isDirectory(): Promise; /** * Resolved if a resolver has handle this plugin diff --git a/packages/plugin-ext/src/hosted/node/hosted-plugin-deployer-handler.ts b/packages/plugin-ext/src/hosted/node/hosted-plugin-deployer-handler.ts index 218fa1f072881..f351afc73c772 100644 --- a/packages/plugin-ext/src/hosted/node/hosted-plugin-deployer-handler.ts +++ b/packages/plugin-ext/src/hosted/node/hosted-plugin-deployer-handler.ts @@ -173,7 +173,7 @@ export class HostedPluginDeployerHandler implements PluginDeployerHandler { const { type } = entry; const deployed: DeployedPlugin = { metadata, type }; - deployed.contributes = this.reader.readContribution(manifest); + deployed.contributes = await this.reader.readContribution(manifest); await this.localizationService.deployLocalizations(deployed); deployedPlugins.set(id, deployed); deployPlugin.debug(`Deployed ${entryPoint} plugin "${id}" from "${metadata.model.entryPoint[entryPoint] || pluginPath}"`); diff --git a/packages/plugin-ext/src/hosted/node/plugin-reader.ts b/packages/plugin-ext/src/hosted/node/plugin-reader.ts index 0520e887faadc..a9ba83ef0afdb 100644 --- a/packages/plugin-ext/src/hosted/node/plugin-reader.ts +++ b/packages/plugin-ext/src/hosted/node/plugin-reader.ts @@ -118,7 +118,7 @@ export class HostedPluginReader implements BackendApplicationContribution { return pluginMetadata; } - readContribution(plugin: PluginPackage): PluginContribution | undefined { + async readContribution(plugin: PluginPackage): Promise { const scanner = this.scanner.getScanner(plugin); return scanner.getContribution(plugin); } diff --git a/packages/plugin-ext/src/hosted/node/scanners/grammars-reader.ts b/packages/plugin-ext/src/hosted/node/scanners/grammars-reader.ts index e021ac03181cc..48a47b8479f52 100644 --- a/packages/plugin-ext/src/hosted/node/scanners/grammars-reader.ts +++ b/packages/plugin-ext/src/hosted/node/scanners/grammars-reader.ts @@ -22,10 +22,10 @@ import * as fs from '@theia/core/shared/fs-extra'; @injectable() export class GrammarsReader { - readGrammars(rawGrammars: PluginPackageGrammarsContribution[], pluginPath: string): GrammarsContribution[] { + async readGrammars(rawGrammars: PluginPackageGrammarsContribution[], pluginPath: string): Promise { const result = new Array(); for (const rawGrammar of rawGrammars) { - const grammar = this.readGrammar(rawGrammar, pluginPath); + const grammar = await this.readGrammar(rawGrammar, pluginPath); if (grammar) { result.push(grammar); } @@ -34,13 +34,14 @@ export class GrammarsReader { return result; } - private readGrammar(rawGrammar: PluginPackageGrammarsContribution, pluginPath: string): GrammarsContribution | undefined { + private async readGrammar(rawGrammar: PluginPackageGrammarsContribution, pluginPath: string): Promise { // TODO: validate inputs let grammar: string | object; + if (rawGrammar.path.endsWith('json')) { - grammar = fs.readJSONSync(path.resolve(pluginPath, rawGrammar.path)); + grammar = await fs.readJSON(path.resolve(pluginPath, rawGrammar.path)); } else { - grammar = fs.readFileSync(path.resolve(pluginPath, rawGrammar.path), 'utf8'); + grammar = await fs.readFile(path.resolve(pluginPath, rawGrammar.path), 'utf8'); } return { language: rawGrammar.language, diff --git a/packages/plugin-ext/src/hosted/node/scanners/scanner-theia.ts b/packages/plugin-ext/src/hosted/node/scanners/scanner-theia.ts index 28306abb2af04..d1b2c24f29115 100644 --- a/packages/plugin-ext/src/hosted/node/scanners/scanner-theia.ts +++ b/packages/plugin-ext/src/hosted/node/scanners/scanner-theia.ts @@ -62,11 +62,12 @@ import { PluginIdentifiers, TerminalProfile } from '../../../common/plugin-protocol'; -import * as fs from 'fs'; +import { promises as fs } from 'fs'; import * as path from 'path'; import { isObject, isStringArray, RecursivePartial } from '@theia/core/lib/common/types'; import { GrammarsReader } from './grammars-reader'; import { CharacterPair } from '../../../common/plugin-api-rpc'; +import { isENOENT } from '../../../common/errors'; import * as jsoncparser from 'jsonc-parser'; import { IJSONSchema } from '@theia/core/lib/common/json-schema'; import { deepClone } from '@theia/core/lib/common/objects'; @@ -144,7 +145,7 @@ export class TheiaPluginScanner implements PluginScanner { return undefined; } - getContribution(rawPlugin: PluginPackage): PluginContribution | undefined { + async getContribution(rawPlugin: PluginPackage): Promise { if (!rawPlugin.contributes && !rawPlugin.activationEvents) { return undefined; } @@ -175,15 +176,6 @@ export class TheiaPluginScanner implements PluginScanner { const configurationDefaults = rawPlugin.contributes.configurationDefaults; contributions.configurationDefaults = PreferenceSchemaProperties.is(configurationDefaults) ? configurationDefaults : undefined; - try { - if (rawPlugin.contributes.languages) { - const languages = this.readLanguages(rawPlugin.contributes.languages, rawPlugin.packagePath); - contributions.languages = languages; - } - } catch (err) { - console.error(`Could not read '${rawPlugin.name}' contribution 'languages'.`, rawPlugin.contributes.languages, err); - } - try { if (rawPlugin.contributes.submenus) { contributions.submenus = this.readSubmenus(rawPlugin.contributes.submenus, rawPlugin); @@ -192,15 +184,6 @@ export class TheiaPluginScanner implements PluginScanner { console.error(`Could not read '${rawPlugin.name}' contribution 'submenus'.`, rawPlugin.contributes.submenus, err); } - try { - if (rawPlugin.contributes.grammars) { - const grammars = this.grammarsReader.readGrammars(rawPlugin.contributes.grammars, rawPlugin.packagePath); - contributions.grammars = grammars; - } - } catch (err) { - console.error(`Could not read '${rawPlugin.name}' contribution 'grammars'.`, rawPlugin.contributes.grammars, err); - } - try { if (rawPlugin.contributes.customEditors) { const customEditors = this.readCustomEditors(rawPlugin.contributes.customEditors); @@ -354,18 +337,40 @@ export class TheiaPluginScanner implements PluginScanner { console.error(`Could not read '${rawPlugin.name}' contribution 'colors'.`, rawPlugin.contributes.colors, err); } - try { - contributions.localizations = this.readLocalizations(rawPlugin); - } catch (err) { - console.error(`Could not read '${rawPlugin.name}' contribution 'localizations'.`, rawPlugin.contributes.colors, err); - } - try { contributions.terminalProfiles = this.readTerminals(rawPlugin); } catch (err) { console.error(`Could not read '${rawPlugin.name}' contribution 'terminals'.`, rawPlugin.contributes.terminal, err); } + const [localizationsResult, languagesResult, grammarsResult] = await Promise.allSettled([ + this.readLocalizations(rawPlugin), + rawPlugin.contributes.languages ? this.readLanguages(rawPlugin.contributes.languages, rawPlugin.packagePath) : undefined, + rawPlugin.contributes.grammars ? this.grammarsReader.readGrammars(rawPlugin.contributes.grammars, rawPlugin.packagePath) : undefined + ]); + + if (localizationsResult.status === 'fulfilled') { + contributions.localizations = localizationsResult.value; + } else { + console.error(`Could not read '${rawPlugin.name}' contribution 'localizations'.`, rawPlugin.contributes.localizations, localizationsResult.reason); + } + + if (rawPlugin.contributes.languages) { + if (languagesResult.status === 'fulfilled') { + contributions.languages = languagesResult.value; + } else { + console.error(`Could not read '${rawPlugin.name}' contribution 'languages'.`, rawPlugin.contributes.languages, languagesResult.reason); + } + } + + if (rawPlugin.contributes.grammars) { + if (grammarsResult.status === 'fulfilled') { + contributions.grammars = grammarsResult.value; + } else { + console.error(`Could not read '${rawPlugin.name}' contribution 'grammars'.`, rawPlugin.contributes.grammars, grammarsResult.reason); + } + } + return contributions; } @@ -376,26 +381,26 @@ export class TheiaPluginScanner implements PluginScanner { return pck.contributes.terminal.profiles.filter(profile => profile.id && profile.title); } - protected readLocalizations(pck: PluginPackage): Localization[] | undefined { + protected async readLocalizations(pck: PluginPackage): Promise { if (!pck.contributes || !pck.contributes.localizations) { return undefined; } - return pck.contributes.localizations.map(e => this.readLocalization(e, pck.packagePath)); + return Promise.all(pck.contributes.localizations.map(e => this.readLocalization(e, pck.packagePath))); } - protected readLocalization({ languageId, languageName, localizedLanguageName, translations }: PluginPackageLocalization, pluginPath: string): Localization { + protected async readLocalization({ languageId, languageName, localizedLanguageName, translations }: PluginPackageLocalization, pluginPath: string): Promise { const local: Localization = { languageId, languageName, localizedLanguageName, translations: [] }; - local.translations = translations.map(e => this.readTranslation(e, pluginPath)); + local.translations = await Promise.all(translations.map(e => this.readTranslation(e, pluginPath))); return local; } - protected readTranslation(packageTranslation: PluginPackageTranslation, pluginPath: string): Translation { - const translation = this.readJson(path.resolve(pluginPath, packageTranslation.path)); + protected async readTranslation(packageTranslation: PluginPackageTranslation, pluginPath: string): Promise { + const translation = await this.readJson(path.resolve(pluginPath, packageTranslation.path)); if (!translation) { throw new Error(`Could not read json file '${packageTranslation.path}'.`); } @@ -529,15 +534,18 @@ export class TheiaPluginScanner implements PluginScanner { return result; } - protected readJson(filePath: string): T | undefined { - const content = this.readFileSync(filePath); + protected async readJson(filePath: string): Promise { + const content = await this.readFile(filePath); return content ? jsoncparser.parse(content, undefined, { disallowComments: false }) : undefined; } - protected readFileSync(filePath: string): string { + protected async readFile(filePath: string): Promise { try { - return fs.existsSync(filePath) ? fs.readFileSync(filePath, 'utf8') : ''; + const content = await fs.readFile(filePath, { encoding: 'utf8' }); + return content; } catch (e) { - console.error(e); + if (!isENOENT(e)) { + console.error(e); + } return ''; } } @@ -644,8 +652,8 @@ export class TheiaPluginScanner implements PluginScanner { return result; } - private readLanguages(rawLanguages: PluginPackageLanguageContribution[], pluginPath: string): LanguageContribution[] { - return rawLanguages.map(language => this.readLanguage(language, pluginPath)); + private async readLanguages(rawLanguages: PluginPackageLanguageContribution[], pluginPath: string): Promise { + return Promise.all(rawLanguages.map(language => this.readLanguage(language, pluginPath))); } private readSubmenus(rawSubmenus: PluginPackageSubmenu[], plugin: PluginPackage): Submenu[] { @@ -662,7 +670,7 @@ export class TheiaPluginScanner implements PluginScanner { } - private readLanguage(rawLang: PluginPackageLanguageContribution, pluginPath: string): LanguageContribution { + private async readLanguage(rawLang: PluginPackageLanguageContribution, pluginPath: string): Promise { // TODO: add validation to all parameters const result: LanguageContribution = { id: rawLang.id, @@ -674,7 +682,7 @@ export class TheiaPluginScanner implements PluginScanner { mimetypes: rawLang.mimetypes }; if (rawLang.configuration) { - const rawConfiguration = this.readJson(path.resolve(pluginPath, rawLang.configuration)); + const rawConfiguration = await this.readJson(path.resolve(pluginPath, rawLang.configuration)); if (rawConfiguration) { const configuration: LanguageConfiguration = { brackets: rawConfiguration.brackets, diff --git a/packages/plugin-ext/src/main/node/errors.spec.ts b/packages/plugin-ext/src/main/node/errors.spec.ts new file mode 100644 index 0000000000000..56a20052ba287 --- /dev/null +++ b/packages/plugin-ext/src/main/node/errors.spec.ts @@ -0,0 +1,37 @@ +// ***************************************************************************** +// Copyright (C) 2023 Arduino SA and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { rejects } from 'assert'; +import { strictEqual } from 'assert/strict'; +import { promises as fs } from 'fs'; +import { v4 } from 'uuid'; +import { isENOENT } from '../../common/errors'; + +describe('errors', () => { + describe('errno-exception', () => { + it('should be ENOENT error', async () => { + await rejects(fs.readFile(v4()), reason => isENOENT(reason)); + }); + + it('should not be ENOENT error (no code)', () => { + strictEqual(isENOENT(new Error('I am not ENOENT')), false); + }); + + it('should not be ENOENT error (other code)', async () => { + await rejects(fs.readdir(__filename), reason => !isENOENT(reason)); + }); + }); +}); diff --git a/packages/plugin-ext/src/main/node/handlers/plugin-theia-directory-handler.ts b/packages/plugin-ext/src/main/node/handlers/plugin-theia-directory-handler.ts index 284c33f1a3bd2..a33fa57a72f23 100644 --- a/packages/plugin-ext/src/main/node/handlers/plugin-theia-directory-handler.ts +++ b/packages/plugin-ext/src/main/node/handlers/plugin-theia-directory-handler.ts @@ -17,27 +17,35 @@ import * as path from 'path'; import * as filenamify from 'filenamify'; import * as fs from '@theia/core/shared/fs-extra'; +import type { URI } from '@theia/core'; import { inject, injectable } from '@theia/core/shared/inversify'; +import { Deferred } from '@theia/core/lib/common/promise-util'; import { FileUri } from '@theia/core/lib/node'; import { PluginDeployerDirectoryHandler, PluginDeployerEntry, PluginPackage, PluginDeployerDirectoryHandlerContext, PluginDeployerEntryType, PluginType, PluginIdentifiers } from '../../../common/plugin-protocol'; import { PluginCliContribution } from '../plugin-cli-contribution'; -import { getTempDir } from '../temp-dir-util'; +import { getTempDirPathAsync } from '../temp-dir-util'; @injectable() export class PluginTheiaDirectoryHandler implements PluginDeployerDirectoryHandler { - protected readonly deploymentDirectory = FileUri.create(getTempDir('theia-copied')); + protected readonly deploymentDirectory: Deferred; @inject(PluginCliContribution) protected readonly pluginCli: PluginCliContribution; - accept(resolvedPlugin: PluginDeployerEntry): boolean { + constructor() { + this.deploymentDirectory = new Deferred(); + getTempDirPathAsync('theia-copied') + .then(deploymentDirectory => this.deploymentDirectory.resolve(FileUri.create(deploymentDirectory))); + } + + async accept(resolvedPlugin: PluginDeployerEntry): Promise { console.debug('PluginTheiaDirectoryHandler: accepting plugin with path', resolvedPlugin.path()); // handle only directories - if (resolvedPlugin.isFile()) { + if (await resolvedPlugin.isFile()) { return false; } @@ -47,7 +55,7 @@ export class PluginTheiaDirectoryHandler implements PluginDeployerDirectoryHandl try { let packageJson = resolvedPlugin.getValue('package.json'); if (!packageJson) { - packageJson = fs.readJSONSync(packageJsonPath); + packageJson = await fs.readJSON(packageJsonPath); packageJson.publisher ??= PluginIdentifiers.UNPUBLISHED; resolvedPlugin.storeValue('package.json', packageJson); } @@ -81,11 +89,12 @@ export class PluginTheiaDirectoryHandler implements PluginDeployerDirectoryHandl const origin = entry.originalPath(); const targetDir = await this.getExtensionDir(context); try { - if (fs.existsSync(targetDir) || !entry.path().startsWith(origin)) { + if (await fs.pathExists(targetDir) || !entry.path().startsWith(origin)) { console.log(`[${id}]: already copied.`); } else { console.log(`[${id}]: copying to "${targetDir}"`); - await fs.mkdirp(FileUri.fsPath(this.deploymentDirectory)); + const deploymentDirectory = await this.deploymentDirectory.promise; + await fs.mkdirp(FileUri.fsPath(deploymentDirectory)); await context.copy(origin, targetDir); entry.updatePath(targetDir); if (!this.accept(entry)) { @@ -100,6 +109,7 @@ export class PluginTheiaDirectoryHandler implements PluginDeployerDirectoryHandl } protected async getExtensionDir(context: PluginDeployerDirectoryHandlerContext): Promise { - return FileUri.fsPath(this.deploymentDirectory.resolve(filenamify(context.pluginEntry().id(), { replacement: '_' }))); + const deploymentDirectory = await this.deploymentDirectory.promise; + return FileUri.fsPath(deploymentDirectory.resolve(filenamify(context.pluginEntry().id(), { replacement: '_' }))); } } diff --git a/packages/plugin-ext/src/main/node/handlers/plugin-theia-file-handler.ts b/packages/plugin-ext/src/main/node/handlers/plugin-theia-file-handler.ts index 337d60ca4b9a0..28983e18b15af 100644 --- a/packages/plugin-ext/src/main/node/handlers/plugin-theia-file-handler.ts +++ b/packages/plugin-ext/src/main/node/handlers/plugin-theia-file-handler.ts @@ -15,8 +15,10 @@ // ***************************************************************************** import { PluginDeployerFileHandler, PluginDeployerEntry, PluginDeployerFileHandlerContext, PluginType } from '../../../common/plugin-protocol'; -import { injectable, inject } from '@theia/core/shared/inversify'; -import { getTempDir } from '../temp-dir-util'; +import type { URI } from '@theia/core'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { Deferred } from '@theia/core/lib/common/promise-util'; +import { getTempDirPathAsync } from '../temp-dir-util'; import * as fs from '@theia/core/shared/fs-extra'; import * as filenamify from 'filenamify'; import { FileUri } from '@theia/core/lib/node/file-uri'; @@ -25,13 +27,22 @@ import { PluginTheiaEnvironment } from '../../common/plugin-theia-environment'; @injectable() export class PluginTheiaFileHandler implements PluginDeployerFileHandler { - private readonly systemPluginsDirUri = FileUri.create(getTempDir('theia-unpacked')); + private readonly systemPluginsDirUri: Deferred; @inject(PluginTheiaEnvironment) protected readonly environment: PluginTheiaEnvironment; - accept(resolvedPlugin: PluginDeployerEntry): boolean { - return resolvedPlugin.isFile() && resolvedPlugin.path() !== null && resolvedPlugin.path().endsWith('.theia'); + constructor() { + this.systemPluginsDirUri = new Deferred(); + getTempDirPathAsync('theia-unpacked') + .then(systemPluginsDirPath => this.systemPluginsDirUri.resolve(FileUri.create(systemPluginsDirPath))); + } + + async accept(resolvedPlugin: PluginDeployerEntry): Promise { + if (resolvedPlugin.path() !== null && resolvedPlugin.path().endsWith('.theia')) { + return resolvedPlugin.isFile(); + } + return false; } async handle(context: PluginDeployerFileHandlerContext): Promise { @@ -49,6 +60,7 @@ export class PluginTheiaFileHandler implements PluginDeployerFileHandler { } protected async getPluginDir(context: PluginDeployerFileHandlerContext): Promise { - return FileUri.fsPath(this.systemPluginsDirUri.resolve(filenamify(context.pluginEntry().id(), { replacement: '_' }))); + const systemPluginsDirUri = await this.systemPluginsDirUri.promise; + return FileUri.fsPath(systemPluginsDirUri.resolve(filenamify(context.pluginEntry().id(), { replacement: '_' }))); } } diff --git a/packages/plugin-ext/src/main/node/paths/plugin-paths-service.ts b/packages/plugin-ext/src/main/node/paths/plugin-paths-service.ts index e9c5918a19ded..d35880e6cb4ad 100644 --- a/packages/plugin-ext/src/main/node/paths/plugin-paths-service.ts +++ b/packages/plugin-ext/src/main/node/paths/plugin-paths-service.ts @@ -18,7 +18,8 @@ import { injectable, inject } from '@theia/core/shared/inversify'; import URI from '@theia/core/lib/common/uri'; import * as path from 'path'; import * as fs from '@theia/core/shared/fs-extra'; -import { readdir, remove } from '@theia/core/shared/fs-extra'; +import { readdir } from 'fs/promises'; +import { remove } from '@theia/core/shared/fs-extra'; import * as crypto from 'crypto'; import { ILogger } from '@theia/core'; import { FileUri } from '@theia/core/lib/node'; @@ -139,15 +140,9 @@ export class PluginPathsServiceImpl implements PluginPathsService { } private async cleanupOldLogs(parentLogsDir: string): Promise { - // @ts-ignore - fs-extra types (Even latest version) is not updated with the `withFileTypes` option. - const dirEntries = await readdir(parentLogsDir, { withFileTypes: true }) as string[]; - // `Dirent` type is defined in @types/node since 10.10.0 - // However, upgrading the @types/node in theia to 10.11 (as defined in engine field) - // Causes other packages to break in compilation, so we are using the infamous `any` type... - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const subDirEntries = dirEntries.filter((dirent: any) => dirent.isDirectory()); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const subDirNames = subDirEntries.map((dirent: any) => dirent.name); + const dirEntries = await readdir(parentLogsDir, { withFileTypes: true }); + const subDirEntries = dirEntries.filter(dirent => dirent.isDirectory()); + const subDirNames = subDirEntries.map(dirent => dirent.name); // We never clean a folder that is not a Theia logs session folder. // Even if it does appears under the `parentLogsDir`... const sessionSubDirNames = subDirNames.filter((dirName: string) => SESSION_TIMESTAMP_PATTERN.test(dirName)); diff --git a/packages/plugin-ext/src/main/node/plugin-deployer-directory-handler-context-impl.ts b/packages/plugin-ext/src/main/node/plugin-deployer-directory-handler-context-impl.ts index e9258876d7788..3e484fab1ca15 100644 --- a/packages/plugin-ext/src/main/node/plugin-deployer-directory-handler-context-impl.ts +++ b/packages/plugin-ext/src/main/node/plugin-deployer-directory-handler-context-impl.ts @@ -15,7 +15,7 @@ // ***************************************************************************** import * as path from 'path'; -import * as fs from '@theia/core/shared/fs-extra'; +import { promises as fs } from 'fs'; import { PluginDeployerEntry, PluginDeployerDirectoryHandlerContext } from '../../common/plugin-protocol'; export class PluginDeployerDirectoryHandlerContextImpl implements PluginDeployerDirectoryHandlerContext { @@ -23,17 +23,17 @@ export class PluginDeployerDirectoryHandlerContextImpl implements PluginDeployer constructor(private readonly pluginDeployerEntry: PluginDeployerEntry) { } async copy(origin: string, target: string): Promise { - const contents = await fs.readdir(origin); - await fs.mkdirp(target); - await Promise.all(contents.map(async item => { + const entries = await fs.readdir(origin, { withFileTypes: true }); + await fs.mkdir(target, { recursive: true }); + await Promise.all(entries.map(async entry => { + const item = entry.name; const itemPath = path.resolve(origin, item); const targetPath = path.resolve(target, item); - const stat = await fs.stat(itemPath); - if (stat.isDirectory()) { + if (entry.isDirectory()) { return this.copy(itemPath, targetPath); } - if (stat.isFile()) { - return new Promise((resolve, reject) => fs.copyFile(itemPath, targetPath, e => e === null ? resolve() : reject(e))); + if (entry.isFile()) { + return fs.copyFile(itemPath, targetPath); } })); } diff --git a/packages/plugin-ext/src/main/node/plugin-deployer-entry-impl.ts b/packages/plugin-ext/src/main/node/plugin-deployer-entry-impl.ts index 3f1cdbefadd6e..c05912c9ff4de 100644 --- a/packages/plugin-ext/src/main/node/plugin-deployer-entry-impl.ts +++ b/packages/plugin-ext/src/main/node/plugin-deployer-entry-impl.ts @@ -15,7 +15,7 @@ // ***************************************************************************** import { PluginDeployerEntry, PluginDeployerEntryType, PluginType } from '../../common/plugin-protocol'; -import * as fs from 'fs'; +import { promises as fs } from 'fs'; export class PluginDeployerEntryImpl implements PluginDeployerEntry { @@ -73,17 +73,19 @@ export class PluginDeployerEntryImpl implements PluginDeployerEntry { getChanges(): string[] { return this.changes; } - isFile(): boolean { + async isFile(): Promise { try { - return fs.statSync(this.currentPath).isFile(); - } catch (e) { + const stat = await fs.stat(this.currentPath); + return stat.isFile(); + } catch { return false; } } - isDirectory(): boolean { + async isDirectory(): Promise { try { - return fs.statSync(this.currentPath).isDirectory(); - } catch (e) { + const stat = await fs.stat(this.currentPath); + return stat.isDirectory(); + } catch { return false; } } diff --git a/packages/plugin-ext/src/main/node/plugin-deployer-impl.ts b/packages/plugin-ext/src/main/node/plugin-deployer-impl.ts index 11f9be68ac4fa..18e7783efcade 100644 --- a/packages/plugin-ext/src/main/node/plugin-deployer-impl.ts +++ b/packages/plugin-ext/src/main/node/plugin-deployer-impl.ts @@ -21,8 +21,8 @@ import * as semver from 'semver'; import { PluginDeployerResolver, PluginDeployerFileHandler, PluginDeployerDirectoryHandler, PluginDeployerEntry, PluginDeployer, PluginDeployerParticipant, PluginDeployerStartContext, - PluginDeployerResolverInit, PluginDeployerFileHandlerContext, - PluginDeployerDirectoryHandlerContext, PluginDeployerEntryType, PluginDeployerHandler, PluginType, UnresolvedPluginEntry, PluginIdentifiers, PluginDeployOptions + PluginDeployerResolverInit, + PluginDeployerEntryType, PluginDeployerHandler, PluginType, UnresolvedPluginEntry, PluginIdentifiers, PluginDeployOptions } from '../../common/plugin-protocol'; import { PluginDeployerEntryImpl } from './plugin-deployer-entry-impl'; import { @@ -295,41 +295,33 @@ export class PluginDeployerImpl implements PluginDeployer { /** * If there are some single files, try to see if we can work on these files (like unpacking it, etc) */ - public async applyFileHandlers(pluginDeployerEntries: PluginDeployerEntry[]): Promise { - const waitPromises: Array> = []; - - pluginDeployerEntries.filter(pluginDeployerEntry => pluginDeployerEntry.isResolved()).map(pluginDeployerEntry => { - this.pluginDeployerFileHandlers.map(pluginFileHandler => { + public async applyFileHandlers(pluginDeployerEntries: PluginDeployerEntry[]): Promise { + const waitPromises = pluginDeployerEntries.filter(pluginDeployerEntry => pluginDeployerEntry.isResolved()).flatMap(pluginDeployerEntry => + this.pluginDeployerFileHandlers.map(async pluginFileHandler => { const proxyPluginDeployerEntry = new ProxyPluginDeployerEntry(pluginFileHandler, (pluginDeployerEntry) as PluginDeployerEntryImpl); - if (pluginFileHandler.accept(proxyPluginDeployerEntry)) { - const pluginDeployerFileHandlerContext: PluginDeployerFileHandlerContext = new PluginDeployerFileHandlerContextImpl(proxyPluginDeployerEntry); - const promise: Promise = pluginFileHandler.handle(pluginDeployerFileHandlerContext); - waitPromises.push(promise); + if (await pluginFileHandler.accept(proxyPluginDeployerEntry)) { + const pluginDeployerFileHandlerContext = new PluginDeployerFileHandlerContextImpl(proxyPluginDeployerEntry); + await pluginFileHandler.handle(pluginDeployerFileHandlerContext); } - }); - - }); - return Promise.all(waitPromises); + }) + ); + await Promise.all(waitPromises); } /** * Check for all registered directories to see if there are some plugins that can be accepted to be deployed. */ - public async applyDirectoryFileHandlers(pluginDeployerEntries: PluginDeployerEntry[]): Promise { - const waitPromises: Array> = []; - - pluginDeployerEntries.filter(pluginDeployerEntry => pluginDeployerEntry.isResolved()).map(pluginDeployerEntry => { - this.pluginDeployerDirectoryHandlers.map(pluginDirectoryHandler => { + public async applyDirectoryFileHandlers(pluginDeployerEntries: PluginDeployerEntry[]): Promise { + const waitPromises = pluginDeployerEntries.filter(pluginDeployerEntry => pluginDeployerEntry.isResolved()).flatMap(pluginDeployerEntry => + this.pluginDeployerDirectoryHandlers.map(async pluginDirectoryHandler => { const proxyPluginDeployerEntry = new ProxyPluginDeployerEntry(pluginDirectoryHandler, (pluginDeployerEntry) as PluginDeployerEntryImpl); - if (pluginDirectoryHandler.accept(proxyPluginDeployerEntry)) { - const pluginDeployerDirectoryHandlerContext: PluginDeployerDirectoryHandlerContext = new PluginDeployerDirectoryHandlerContextImpl(proxyPluginDeployerEntry); - const promise: Promise = pluginDirectoryHandler.handle(pluginDeployerDirectoryHandlerContext); - waitPromises.push(promise); + if (await pluginDirectoryHandler.accept(proxyPluginDeployerEntry)) { + const pluginDeployerDirectoryHandlerContext = new PluginDeployerDirectoryHandlerContextImpl(proxyPluginDeployerEntry); + await pluginDirectoryHandler.handle(pluginDeployerDirectoryHandlerContext); } - }); - - }); - return Promise.all(waitPromises); + }) + ); + await Promise.all(waitPromises); } /** diff --git a/packages/plugin-ext/src/main/node/plugin-deployer-proxy-entry-impl.ts b/packages/plugin-ext/src/main/node/plugin-deployer-proxy-entry-impl.ts index 93c5b5c067761..fe9f4f5758041 100644 --- a/packages/plugin-ext/src/main/node/plugin-deployer-proxy-entry-impl.ts +++ b/packages/plugin-ext/src/main/node/plugin-deployer-proxy-entry-impl.ts @@ -54,11 +54,11 @@ export class ProxyPluginDeployerEntry implements PluginDeployerEntry { return this.delegate.getChanges(); } - isFile(): boolean { + isFile(): Promise { return this.delegate.isFile(); } - isDirectory(): boolean { + isDirectory(): Promise { return this.delegate.isDirectory(); } isResolved(): boolean { diff --git a/packages/plugin-ext/src/main/node/plugin-github-resolver.ts b/packages/plugin-ext/src/main/node/plugin-github-resolver.ts index a0ccb087e941b..27fb6a0bc2d34 100644 --- a/packages/plugin-ext/src/main/node/plugin-github-resolver.ts +++ b/packages/plugin-ext/src/main/node/plugin-github-resolver.ts @@ -16,10 +16,11 @@ import { RequestContext, RequestService } from '@theia/core/shared/@theia/request'; import { inject, injectable } from '@theia/core/shared/inversify'; -import { promises as fs, existsSync, mkdirSync } from 'fs'; -import * as os from 'os'; +import { Deferred } from '@theia/core/lib/common/promise-util'; +import { promises as fs } from 'fs'; import * as path from 'path'; import { PluginDeployerResolver, PluginDeployerResolverContext } from '../../common'; +import { getTempDirPathAsync } from './temp-dir-util'; /** * Resolver that handle the github: protocol @@ -33,16 +34,21 @@ export class GithubPluginDeployerResolver implements PluginDeployerResolver { private static GITHUB_ENDPOINT = 'https://github.com/'; - private unpackedFolder: string; + private unpackedFolder: Deferred; @inject(RequestService) protected readonly request: RequestService; constructor() { - this.unpackedFolder = path.resolve(os.tmpdir(), 'github-remote'); - if (!existsSync(this.unpackedFolder)) { - mkdirSync(this.unpackedFolder); - } + this.unpackedFolder = new Deferred(); + getTempDirPathAsync('github-remote').then(async unpackedFolder => { + try { + await fs.mkdir(unpackedFolder, { recursive: true }); + this.unpackedFolder.resolve(unpackedFolder); + } catch (err) { + this.unpackedFolder.reject(err); + } + }); } /** @@ -106,7 +112,8 @@ export class GithubPluginDeployerResolver implements PluginDeployerResolver { * Grab the github file specified by the plugin's ID */ protected async grabGithubFile(pluginResolverContext: PluginDeployerResolverContext, orgName: string, repoName: string, filename: string, version: string): Promise { - const unpackedPath = path.resolve(this.unpackedFolder, path.basename(version + filename)); + const unpackedFolder = await this.unpackedFolder.promise; + const unpackedPath = path.resolve(unpackedFolder, path.basename(version + filename)); try { await fs.access(unpackedPath); // use of cache. If file is already there use it directly diff --git a/packages/plugin-ext/src/main/node/plugin-http-resolver.ts b/packages/plugin-ext/src/main/node/plugin-http-resolver.ts index 971ba3d0d8d22..a8b20b4f50a63 100644 --- a/packages/plugin-ext/src/main/node/plugin-http-resolver.ts +++ b/packages/plugin-ext/src/main/node/plugin-http-resolver.ts @@ -16,11 +16,12 @@ import { RequestContext, RequestService } from '@theia/core/shared/@theia/request'; import { inject, injectable } from '@theia/core/shared/inversify'; -import { promises as fs, existsSync, mkdirSync } from 'fs'; -import * as os from 'os'; +import { Deferred } from '@theia/core/lib/common/promise-util'; +import { promises as fs } from 'fs'; import * as path from 'path'; import * as url from 'url'; import { PluginDeployerResolver, PluginDeployerResolverContext } from '../../common'; +import { getTempDirPathAsync } from './temp-dir-util'; /** * Resolver that handle the http(s): protocol @@ -30,16 +31,21 @@ import { PluginDeployerResolver, PluginDeployerResolverContext } from '../../com @injectable() export class HttpPluginDeployerResolver implements PluginDeployerResolver { - private unpackedFolder: string; + private unpackedFolder: Deferred; @inject(RequestService) protected readonly request: RequestService; constructor() { - this.unpackedFolder = path.resolve(os.tmpdir(), 'http-remote'); - if (!existsSync(this.unpackedFolder)) { - mkdirSync(this.unpackedFolder); - } + this.unpackedFolder = new Deferred(); + getTempDirPathAsync('http-remote').then(async unpackedFolder => { + try { + await fs.mkdir(unpackedFolder, { recursive: true }); + this.unpackedFolder.resolve(unpackedFolder); + } catch (err) { + this.unpackedFolder.reject(err); + } + }); } /** @@ -58,7 +64,8 @@ export class HttpPluginDeployerResolver implements PluginDeployerResolver { const dirname = path.dirname(link.pathname); const basename = path.basename(link.pathname); const filename = dirname.replace(/\W/g, '_') + ('-') + basename; - const unpackedPath = path.resolve(this.unpackedFolder, path.basename(filename)); + const unpackedFolder = await this.unpackedFolder.promise; + const unpackedPath = path.resolve(unpackedFolder, path.basename(filename)); try { await fs.access(unpackedPath); diff --git a/packages/plugin-ext/src/main/node/temp-dir-util.ts b/packages/plugin-ext/src/main/node/temp-dir-util.ts index c0285be99c802..4e5aeb63e80b1 100644 --- a/packages/plugin-ext/src/main/node/temp-dir-util.ts +++ b/packages/plugin-ext/src/main/node/temp-dir-util.ts @@ -15,13 +15,22 @@ // ***************************************************************************** import * as os from 'os'; import * as path from 'path'; -import * as fs from 'fs'; +import { realpathSync, promises as fs } from 'fs'; export function getTempDir(name: string): string { let tempDir = os.tmpdir(); // for mac os 'os.tmpdir()' return symlink, but we need real path if (process.platform === 'darwin') { - tempDir = fs.realpathSync(tempDir); + tempDir = realpathSync(tempDir); + } + return path.resolve(tempDir, name); +} + +export async function getTempDirPathAsync(name: string): Promise { + let tempDir = os.tmpdir(); + // for mac os 'os.tmpdir()' return symlink, but we need real path + if (process.platform === 'darwin') { + tempDir = await fs.realpath(tempDir); } return path.resolve(tempDir, name); } diff --git a/packages/search-in-workspace/src/node/ripgrep-search-in-workspace-server.slow-spec.ts b/packages/search-in-workspace/src/node/ripgrep-search-in-workspace-server.slow-spec.ts index b35ff8b168ba9..70f659b355bd0 100644 --- a/packages/search-in-workspace/src/node/ripgrep-search-in-workspace-server.slow-spec.ts +++ b/packages/search-in-workspace/src/node/ripgrep-search-in-workspace-server.slow-spec.ts @@ -957,10 +957,10 @@ describe('ripgrep-search-in-workspace-server', function (): void { describe('#extractSearchPathsFromIncludes', function (): void { this.timeout(10000); - it('should not resolve paths from a not absolute / relative pattern', function (): void { + it('should not resolve paths from a not absolute / relative pattern', async () => { const pattern = 'carrots'; const options = { include: [pattern] }; - const searchPaths = ripgrepServer['extractSearchPathsFromIncludes']([rootDirA], options); + const searchPaths = await ripgrepServer['extractSearchPathsFromIncludes']([rootDirA], options); // Same root directory expect(searchPaths.length).equal(1); expect(searchPaths[0]).equal(rootDirA); @@ -970,21 +970,21 @@ describe('#extractSearchPathsFromIncludes', function (): void { expect(options.include[0]).equals(pattern); }); - it('should resolve pattern to path for relative filename', function (): void { + it('should resolve pattern to path for relative filename', async () => { const filename = 'carrots'; const pattern = `./${filename}`; - checkResolvedPathForPattern(pattern, path.join(rootDirA, filename)); + await checkResolvedPathForPattern(pattern, path.join(rootDirA, filename)); }); - it('should resolve relative pattern with sub-folders glob', function (): void { + it('should resolve relative pattern with sub-folders glob', async () => { const filename = 'carrots'; const pattern = `./${filename}/**`; - checkResolvedPathForPattern(pattern, path.join(rootDirA, filename)); + await checkResolvedPathForPattern(pattern, path.join(rootDirA, filename)); }); - it('should resolve absolute path pattern', function (): void { + it('should resolve absolute path pattern', async () => { const pattern = `${rootDirA}/carrots`; - checkResolvedPathForPattern(pattern, pattern); + await checkResolvedPathForPattern(pattern, pattern); }); }); @@ -1064,9 +1064,9 @@ describe('#addGlobArgs', function (): void { }); }); -function checkResolvedPathForPattern(pattern: string, expectedPath: string): void { +async function checkResolvedPathForPattern(pattern: string, expectedPath: string): Promise { const options = { include: [pattern] }; - const searchPaths = ripgrepServer['extractSearchPathsFromIncludes']([rootDirA], options); + const searchPaths = await ripgrepServer['extractSearchPathsFromIncludes']([rootDirA], options); expect(searchPaths.length).equal(1, 'searchPath result should contain exactly one element'); expect(options.include.length).equals(0, 'options.include should be empty'); expect(searchPaths[0]).equal(path.normalize(expectedPath)); diff --git a/packages/search-in-workspace/src/node/ripgrep-search-in-workspace-server.ts b/packages/search-in-workspace/src/node/ripgrep-search-in-workspace-server.ts index 499a81db50a73..f22ccaf9ed731 100644 --- a/packages/search-in-workspace/src/node/ripgrep-search-in-workspace-server.ts +++ b/packages/search-in-workspace/src/node/ripgrep-search-in-workspace-server.ts @@ -216,7 +216,7 @@ export class RipgrepSearchInWorkspaceServer implements SearchInWorkspaceServer { const rootPaths = rootUris.map(root => FileUri.fsPath(root)); // If there are absolute paths in `include` we will remove them and use // those as paths to search from. - const searchPaths = this.extractSearchPathsFromIncludes(rootPaths, options); + const searchPaths = await this.extractSearchPathsFromIncludes(rootPaths, options); options.include = this.replaceRelativeToAbsolute(searchPaths, options.include); options.exclude = this.replaceRelativeToAbsolute(searchPaths, options.exclude); const rgArgs = this.getArgs(options); @@ -388,23 +388,27 @@ export class RipgrepSearchInWorkspaceServer implements SearchInWorkspaceServer { * Any pattern that resulted in a valid search path will be removed from the 'include' list as it is * provided as an equivalent search path instead. */ - protected extractSearchPathsFromIncludes(rootPaths: string[], options: SearchInWorkspaceOptions): string[] { + protected async extractSearchPathsFromIncludes(rootPaths: string[], options: SearchInWorkspaceOptions): Promise { if (!options.include) { return rootPaths; } const resolvedPaths = new Set(); - options.include = options.include.filter(pattern => { + const include: string[] = []; + for (const pattern of options.include) { let keep = true; for (const root of rootPaths) { - const absolutePath = this.getAbsolutePathFromPattern(root, pattern); + const absolutePath = await this.getAbsolutePathFromPattern(root, pattern); // undefined means the pattern cannot be converted into an absolute path if (absolutePath) { resolvedPaths.add(absolutePath); keep = false; } } - return keep; - }); + if (keep) { + include.push(pattern); + } + } + options.include = include; return resolvedPaths.size > 0 ? Array.from(resolvedPaths) : rootPaths; @@ -417,7 +421,7 @@ export class RipgrepSearchInWorkspaceServer implements SearchInWorkspaceServer { * * @returns undefined if the pattern cannot be converted into an absolute path. */ - protected getAbsolutePathFromPattern(root: string, pattern: string): string | undefined { + protected async getAbsolutePathFromPattern(root: string, pattern: string): Promise { pattern = pattern.replace(/\\/g, '/'); // The pattern is not referring to a single file or folder, i.e. not to be converted if (!path.isAbsolute(pattern) && !pattern.startsWith('./')) { @@ -429,7 +433,7 @@ export class RipgrepSearchInWorkspaceServer implements SearchInWorkspaceServer { } // if `pattern` is absolute then `root` will be ignored by `path.resolve()` const targetPath = path.resolve(root, pattern); - if (fs.existsSync(targetPath)) { + if (await fs.pathExists(targetPath)) { return targetPath; } return undefined; diff --git a/packages/workspace/src/node/default-workspace-server.ts b/packages/workspace/src/node/default-workspace-server.ts index b97ff3a1fbde1..ff03c57657ea8 100644 --- a/packages/workspace/src/node/default-workspace-server.ts +++ b/packages/workspace/src/node/default-workspace-server.ts @@ -25,6 +25,7 @@ import { Deferred } from '@theia/core/lib/common/promise-util'; import { WorkspaceServer, UntitledWorkspaceService } from '../common'; import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; import URI from '@theia/core/lib/common/uri'; +import { notEmpty } from '@theia/core'; @injectable() export class WorkspaceCliContribution implements CliContribution { @@ -150,22 +151,17 @@ export class DefaultWorkspaceServer implements WorkspaceServer, BackendApplicati } async getRecentWorkspaces(): Promise { - const listUri: string[] = []; const data = await this.readRecentWorkspacePathsFromUserHome(); if (data && data.recentRoots) { - data.recentRoots.forEach(element => { - if (element.length > 0) { - if (this.workspaceStillExist(element)) { - listUri.push(element); - } - } - }); + const allRootUris = await Promise.all(data.recentRoots.map(async element => + element && await this.workspaceStillExist(element) ? element : undefined)); + return allRootUris.filter(notEmpty); } - return listUri; + return []; } - protected workspaceStillExist(workspaceRootUri: string): boolean { - return fs.pathExistsSync(FileUri.fsPath(workspaceRootUri)); + protected async workspaceStillExist(workspaceRootUri: string): Promise { + return fs.pathExists(FileUri.fsPath(workspaceRootUri)); } protected async getWorkspaceURIFromCli(): Promise { From 8ef8e2d29ba1c741effd469d99d281c6af385803 Mon Sep 17 00:00:00 2001 From: Mark Sujew Date: Wed, 16 Aug 2023 14:09:14 +0200 Subject: [PATCH 14/79] Fix plugin menu icon background on hover (#12827) --- packages/plugin-ext/src/main/browser/plugin-shared-style.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/plugin-ext/src/main/browser/plugin-shared-style.ts b/packages/plugin-ext/src/main/browser/plugin-shared-style.ts index 49c2abbe72191..72a708b261ef7 100644 --- a/packages/plugin-ext/src/main/browser/plugin-shared-style.ts +++ b/packages/plugin-ext/src/main/browser/plugin-shared-style.ts @@ -110,7 +110,8 @@ export class PluginSharedStyle { const lightIconUrl = PluginSharedStyle.toExternalIconUrl(`${typeof iconUrl === 'object' ? iconUrl.light : iconUrl}`); const iconClass = 'plugin-icon-' + this.iconSequence++; const toDispose = new DisposableCollection(); - toDispose.push(this.insertRule('.' + iconClass, theme => ` + toDispose.push(this.insertRule('.' + iconClass + '::before', theme => ` + content: ""; background-position: 2px; width: ${size}px; height: ${size}px; From f84e7d63c530040ea9bc9781c0ac2647102c33ce Mon Sep 17 00:00:00 2001 From: FernandoAscencio <48699277+FernandoAscencio@users.noreply.github.com> Date: Thu, 17 Aug 2023 07:55:25 -0400 Subject: [PATCH 15/79] Style: close icon highlights on tab hover (#12806) This fixes a small issue where the close icon is highlighted when mouse hovers over tab instead of over button only. Signed-By: Fernando Ascencio --- packages/core/src/browser/style/tabs.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/src/browser/style/tabs.css b/packages/core/src/browser/style/tabs.css index 5887da069b338..ea2f48940e510 100644 --- a/packages/core/src/browser/style/tabs.css +++ b/packages/core/src/browser/style/tabs.css @@ -254,8 +254,8 @@ } .p-TabBar.theia-app-centers - .p-TabBar-tab:hover.p-mod-closable - > .p-TabBar-tabCloseIcon { + .p-TabBar-tab.p-mod-closable + > .p-TabBar-tabCloseIcon:hover { border-radius: 5px; background-color: rgba(50%, 50%, 50%, 0.2); } From b5bc517e4e0c735e5635d052ea43956293177837 Mon Sep 17 00:00:00 2001 From: Vincent Fugnitto Date: Thu, 17 Aug 2023 10:46:37 -0400 Subject: [PATCH 16/79] repo: add js-debug builtins (#12835) Due to an issue when publishing the builtin extension-pack for `1.79.0` we need to manually add the `js-debug` and `js-debug-companion` plugins for JavaScript debugging support. Signed-off-by: vince-fugnitto --- doc/Migration.md | 21 ++++++++++++++++++--- package.json | 4 +++- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/doc/Migration.md b/doc/Migration.md index 70b26953306a9..29e36e1ace3bb 100644 --- a/doc/Migration.md +++ b/doc/Migration.md @@ -9,6 +9,21 @@ Please see the latest version (`master`) for the most up-to-date information. Pl ### General +_Builtin Extension Pack_: + +If you are using the [`eclipse-theia.builtin-extension-pack@1.79.0`](https://open-vsx.org/extension/eclipse-theia/builtin-extension-pack) extension pack you may need to include the [`ms-vscode.js-debug`](https://open-vsx.org/extension/ms-vscode/js-debug) and [`ms-vscode.js-debug-companion`](https://open-vsx.org/extension/ms-vscode/js-debug-companion) plugins for JavaScript debug support. +There was an issue when the publishing of the pack which excluded these necessary builtins. + +For example, in your application's `package.json`: + +```json +"theiaPlugins": { + "eclipse-theia.builtin-extension-pack": "https://open-vsx.org/api/eclipse-theia/builtin-extension-pack/1.79.0/file/eclipse-theia.builtin-extension-pack-1.79.0.vsix", + "ms-vscode.js-debug": "https://open-vsx.org/api/ms-vscode/js-debug/1.78.0/file/ms-vscode.js-debug-1.78.0.vsix", + "ms-vscode.js-debug-companion": "https://open-vsx.org/api/ms-vscode/js-debug-companion/1.1.2/file/ms-vscode.js-debug-companion-1.1.2.vsix" +} +``` + _msgpackr_: If you're experiencing [`maximum callstack exceeded`](https://github.com/eclipse-theia/theia/issues/12499) errors you may need to downgrade the version of `msgpackr` pulled using a [yarn resolution](https://classic.yarnpkg.com/lang/en/docs/selective-version-resolutions/). @@ -72,15 +87,15 @@ For 2., `@postConstruct` methods can be refactored into a sync and an async meth ```diff -@postConstruct() -protected async init(): Promise { -- await longRunningOperation(); +- await longRunningOperation(); -} +@postConstruct() +protected init(): void { -+ this.doInit(); ++ this.doInit(); +} + +protected async doInit(): Promise { -+ await longRunningOperation(); ++ await longRunningOperation(); +} ``` diff --git a/package.json b/package.json index d7f65fd66bc24..1b0aa68d29fbc 100644 --- a/package.json +++ b/package.json @@ -102,7 +102,9 @@ "theiaPlugins": { "eclipse-theia.builtin-extension-pack": "https://open-vsx.org/api/eclipse-theia/builtin-extension-pack/1.79.0/file/eclipse-theia.builtin-extension-pack-1.79.0.vsix", "EditorConfig.EditorConfig": "https://open-vsx.org/api/EditorConfig/EditorConfig/0.16.6/file/EditorConfig.EditorConfig-0.16.6.vsix", - "dbaeumer.vscode-eslint": "https://open-vsx.org/api/dbaeumer/vscode-eslint/2.4.2/file/dbaeumer.vscode-eslint-2.4.2.vsix" + "dbaeumer.vscode-eslint": "https://open-vsx.org/api/dbaeumer/vscode-eslint/2.4.2/file/dbaeumer.vscode-eslint-2.4.2.vsix", + "ms-vscode.js-debug": "https://open-vsx.org/api/ms-vscode/js-debug/1.78.0/file/ms-vscode.js-debug-1.78.0.vsix", + "ms-vscode.js-debug-companion": "https://open-vsx.org/api/ms-vscode/js-debug-companion/1.1.2/file/ms-vscode.js-debug-companion-1.1.2.vsix" }, "theiaPluginsExcludeIds": [ "ms-vscode.js-debug-companion", From bc97676bb86436828904312adc920d08868e12e1 Mon Sep 17 00:00:00 2001 From: Vlad Arama <86936229+vladarama@users.noreply.github.com> Date: Thu, 17 Aug 2023 11:20:30 -0400 Subject: [PATCH 17/79] tree: fix right-clicking tree nodes bug (#12801) The commit fixes a regression which caused a right-click on tree-nodes (to trigger the context-menu) to actually trigger the middle-click handler which opened the node. Signed-off-by: Vlad Arama --- packages/core/src/browser/tree/tree-widget.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/core/src/browser/tree/tree-widget.tsx b/packages/core/src/browser/tree/tree-widget.tsx index 252e8463b36f5..0809cc59fc725 100644 --- a/packages/core/src/browser/tree/tree-widget.tsx +++ b/packages/core/src/browser/tree/tree-widget.tsx @@ -1248,9 +1248,11 @@ export class TreeWidget extends ReactWidget implements StatefulWidget { * @param event the middle-click mouse event. */ protected handleAuxClickEvent(node: TreeNode | undefined, event: React.MouseEvent): void { - this.model.openNode(node); - if (SelectableTreeNode.is(node)) { - this.model.selectNode(node); + if (event.button === 1) { + this.model.openNode(node); + if (SelectableTreeNode.is(node)) { + this.model.selectNode(node); + } } event.stopPropagation(); } From 20e377123c595b2b998d214fc48d169082520b01 Mon Sep 17 00:00:00 2001 From: "Christian W. Damus" Date: Mon, 21 Aug 2023 03:54:56 -0400 Subject: [PATCH 18/79] plugins: view/title menus in all non-editor views (#12763) In VS Code, contributions of menus to the "view/title" contribution point are supposed to be included in all views that are not editors, so long as the "when" condition (if any) is satisfied. So the contribution handler is updated to register the menu delegate in all non-editors. Fixes #12705 Signed-off-by: Christian W. Damus --- .../src/main/browser/menus/menus-contribution-handler.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/plugin-ext/src/main/browser/menus/menus-contribution-handler.ts b/packages/plugin-ext/src/main/browser/menus/menus-contribution-handler.ts index 6ae93cfef2f0f..19adea7d2a3ca 100644 --- a/packages/plugin-ext/src/main/browser/menus/menus-contribution-handler.ts +++ b/packages/plugin-ext/src/main/browser/menus/menus-contribution-handler.ts @@ -22,7 +22,6 @@ import { MenuModelRegistry } from '@theia/core/lib/common'; import { TabBarToolbarRegistry } from '@theia/core/lib/browser/shell/tab-bar-toolbar'; import { DeployedPlugin, IconUrl, Menu } from '../../../common'; import { ScmWidget } from '@theia/scm/lib/browser/scm-widget'; -import { PluginViewWidget } from '../view/plugin-view-widget'; import { QuickCommandService } from '@theia/core/lib/browser'; import { CodeEditorWidgetUtil, codeToTheiaMappings, ContributionPoint, @@ -58,7 +57,7 @@ export class MenusContributionPointHandler { this.tabBarToolbar.registerMenuDelegate(PLUGIN_EDITOR_TITLE_MENU, widget => this.codeEditorWidgetUtil.is(widget)); this.tabBarToolbar.registerMenuDelegate(PLUGIN_EDITOR_TITLE_RUN_MENU, widget => this.codeEditorWidgetUtil.is(widget)); this.tabBarToolbar.registerMenuDelegate(PLUGIN_SCM_TITLE_MENU, widget => widget instanceof ScmWidget); - this.tabBarToolbar.registerMenuDelegate(PLUGIN_VIEW_TITLE_MENU, widget => widget instanceof PluginViewWidget); + this.tabBarToolbar.registerMenuDelegate(PLUGIN_VIEW_TITLE_MENU, widget => !this.codeEditorWidgetUtil.is(widget)); this.tabBarToolbar.registerItem({ id: 'plugin-menu-contribution-title-contribution', command: '_never_', onDidChange: this.onDidChangeTitleContributionEmitter.event }); this.contextKeyService.onDidChange(event => { if (event.affects(this.titleContributionContextKeys)) { From c483ccb06c0cc99d5055f9a310700ed6e8bf5780 Mon Sep 17 00:00:00 2001 From: Carey Williams Date: Mon, 21 Aug 2023 12:54:26 +0100 Subject: [PATCH 19/79] fix scm history going out of sync after commit (with fixed avatar cache) (#12837) * fix scm history going out of sync after commit and cache commit avatars Signed-off-by: Carey Williams Co-authored-by: Erez Odier <2045191+erezmus@users.noreply.github.com> --- .../browser/history/scm-history-widget.tsx | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/packages/scm-extra/src/browser/history/scm-history-widget.tsx b/packages/scm-extra/src/browser/history/scm-history-widget.tsx index 6eb4f110e49cf..3e09781c98f7a 100644 --- a/packages/scm-extra/src/browser/history/scm-history-widget.tsx +++ b/packages/scm-extra/src/browser/history/scm-history-widget.tsx @@ -179,7 +179,6 @@ export class ScmHistoryWidget extends ScmNavigableListWidget } protected async addCommits(options?: HistoryWidgetOptions): Promise { - // const repository: Repository | undefined = this.repositoryProvider.findRepositoryOrSelected(options); const repository = this.scmService.selectedRepository; this.cancelIndicator.cancel(); @@ -189,19 +188,17 @@ export class ScmHistoryWidget extends ScmNavigableListWidget if (repository) { if (this.historySupport) { try { - const currentCommits = this.status.state === 'ready' ? this.status.commits : []; - - let history = await this.historySupport.getCommitHistory(options); + const history = await this.historySupport.getCommitHistory(options); if (token.isCancellationRequested || !this.hasMoreCommits) { return; } - if (options && ((options.maxCount && history.length < options.maxCount) || (!options.maxCount && currentCommits))) { + if (options && (options.maxCount && history.length < options.maxCount)) { this.hasMoreCommits = false; } - if (currentCommits.length > 0) { - history = history.slice(1); - } + + const avatarCache = new Map(); + const commits: ScmCommitNode[] = []; for (const commit of history) { const fileChangeNodes: ScmFileChangeNode[] = []; @@ -211,7 +208,14 @@ export class ScmHistoryWidget extends ScmNavigableListWidget }); })); - const avatarUrl = await this.avatarService.getAvatar(commit.authorEmail); + let avatarUrl = ''; + if (avatarCache.has(commit.authorEmail)) { + avatarUrl = avatarCache.get(commit.authorEmail)!; + } else { + avatarUrl = await this.avatarService.getAvatar(commit.authorEmail); + avatarCache.set(commit.authorEmail, avatarUrl); + } + commits.push({ commitDetails: commit, authorAvatar: avatarUrl, @@ -220,8 +224,7 @@ export class ScmHistoryWidget extends ScmNavigableListWidget selected: false }); } - currentCommits.push(...commits); - this.status = { state: 'ready', commits: currentCommits }; + this.status = { state: 'ready', commits }; } catch (error) { if (options && options.uri && repository) { this.hasMoreCommits = false; From de2e7e1d2d249fe2925b1010a68f1b200d267eb4 Mon Sep 17 00:00:00 2001 From: Jonah Iden Date: Mon, 21 Aug 2023 14:01:23 +0200 Subject: [PATCH 20/79] Support the `file/newFile` menu path (#12819) Signed-off-by: Jonah Iden --- .../src/tests/theia-main-menu.test.ts | 12 +-- .../browser/common-frontend-contribution.ts | 80 +++++++++++++++++-- .../core/src/browser/window-contribution.ts | 2 +- .../src/browser/workspace-commands.ts | 2 +- 4 files changed, 81 insertions(+), 15 deletions(-) diff --git a/examples/playwright/src/tests/theia-main-menu.test.ts b/examples/playwright/src/tests/theia-main-menu.test.ts index aad8595efcd83..cc305bed2696d 100644 --- a/examples/playwright/src/tests/theia-main-menu.test.ts +++ b/examples/playwright/src/tests/theia-main-menu.test.ts @@ -41,20 +41,20 @@ test.describe('Theia Main Menu', () => { expect(await mainMenu.isOpen()).toBe(true); }); - test("should show the menu items 'New File' and 'New Folder'", async () => { + test("should show the menu items 'New Text File' and 'New Folder'", async () => { const mainMenu = await menuBar.openMenu('File'); const menuItems = await mainMenu.visibleMenuItems(); - expect(menuItems).toContain('New File...'); + expect(menuItems).toContain('New Text File'); expect(menuItems).toContain('New Folder...'); }); - test("should return menu item by name 'New File'", async () => { + test("should return menu item by name 'New Text File'", async () => { const mainMenu = await menuBar.openMenu('File'); - const menuItem = await mainMenu.menuItemByName('New File...'); + const menuItem = await mainMenu.menuItemByName('New Text File'); expect(menuItem).toBeDefined(); const label = await menuItem?.label(); - expect(label).toBe('New File...'); + expect(label).toBe('New Text File'); const shortCut = await menuItem?.shortCut(); expect(shortCut).toBe(OSUtil.isMacOS ? '⌥ N' : 'Alt+N'); @@ -65,7 +65,7 @@ test.describe('Theia Main Menu', () => { test('should detect whether menu item has submenu', async () => { const mainMenu = await menuBar.openMenu('File'); - const newFileItem = await mainMenu.menuItemByName('New File...'); + const newFileItem = await mainMenu.menuItemByName('New Text File'); const settingsItem = await mainMenu.menuItemByName('Preferences'); expect(await newFileItem?.hasSubmenu()).toBe(false); diff --git a/packages/core/src/browser/common-frontend-contribution.ts b/packages/core/src/browser/common-frontend-contribution.ts index c9c7cf350db39..2e95ea0a8eaa9 100644 --- a/packages/core/src/browser/common-frontend-contribution.ts +++ b/packages/core/src/browser/common-frontend-contribution.ts @@ -52,7 +52,7 @@ import { UTF8 } from '../common/encodings'; import { EnvVariablesServer } from '../common/env-variables'; import { AuthenticationService } from './authentication-service'; import { FormatType, Saveable, SaveOptions } from './saveable'; -import { QuickInputService, QuickPickItem, QuickPickItemOrSeparator } from './quick-input'; +import { QuickInputService, QuickPickItem, QuickPickItemOrSeparator, QuickPickSeparator } from './quick-input'; import { AsyncLocalizationProvider } from '../common/i18n/localization'; import { nls } from '../common/nls'; import { CurrentWidgetCommandAdapter } from './shell/current-widget-command-adapter'; @@ -69,6 +69,7 @@ import { LanguageQuickPickService } from './i18n/language-quick-pick-service'; export namespace CommonMenus { export const FILE = [...MAIN_MENU_BAR, '1_file']; + export const FILE_NEW_TEXT = [...FILE, '1_new_text']; export const FILE_NEW = [...FILE, '1_new']; export const FILE_OPEN = [...FILE, '2_open']; export const FILE_SAVE = [...FILE, '3_save']; @@ -79,6 +80,8 @@ export namespace CommonMenus { export const FILE_SETTINGS_SUBMENU_THEME = [...FILE_SETTINGS_SUBMENU, '2_settings_submenu_theme']; export const FILE_CLOSE = [...FILE, '6_close']; + export const FILE_NEW_CONTRIBUTIONS = 'file/newFile'; + export const EDIT = [...MAIN_MENU_BAR, '2_edit']; export const EDIT_UNDO = [...EDIT, '1_undo']; export const EDIT_CLIPBOARD = [...EDIT, '2_clipboard']; @@ -108,6 +111,7 @@ export namespace CommonCommands { export const FILE_CATEGORY = 'File'; export const VIEW_CATEGORY = 'View'; + export const CREATE_CATEGORY = 'Create'; export const PREFERENCES_CATEGORY = 'Preferences'; export const FILE_CATEGORY_KEY = nls.getDefaultKey(FILE_CATEGORY); export const VIEW_CATEGORY_KEY = nls.getDefaultKey(VIEW_CATEGORY); @@ -272,11 +276,16 @@ export namespace CommonCommands { category: VIEW_CATEGORY, label: 'Toggle Menu Bar' }); - export const NEW_UNTITLED_FILE = Command.toDefaultLocalizedCommand({ - id: 'workbench.action.files.newUntitledFile', + export const NEW_UNTITLED_TEXT_FILE = Command.toDefaultLocalizedCommand({ + id: 'workbench.action.files.newUntitledTextFile', category: FILE_CATEGORY, label: 'New Untitled Text File' }); + export const NEW_UNTITLED_FILE = Command.toDefaultLocalizedCommand({ + id: 'workbench.action.files.newUntitledFile', + category: CREATE_CATEGORY, + label: 'New File...' + }); export const SAVE = Command.toDefaultLocalizedCommand({ id: 'core.save', category: FILE_CATEGORY, @@ -371,6 +380,9 @@ export class CommonFrontendContribution implements FrontendApplicationContributi @inject(CommandRegistry) protected readonly commandRegistry: CommandRegistry; + @inject(MenuModelRegistry) + protected readonly menuRegistry: MenuModelRegistry; + @inject(StorageService) protected readonly storageService: StorageService; @@ -545,6 +557,9 @@ export class CommonFrontendContribution implements FrontendApplicationContributi registry.registerSubmenu(CommonMenus.VIEW, nls.localizeByDefault('View')); registry.registerSubmenu(CommonMenus.HELP, nls.localizeByDefault('Help')); + // For plugins contributing create new file commands/menu-actions + registry.registerIndependentSubmenu(CommonMenus.FILE_NEW_CONTRIBUTIONS, nls.localizeByDefault('New File...')); + registry.registerMenuAction(CommonMenus.FILE_SAVE, { commandId: CommonCommands.SAVE.id }); @@ -693,10 +708,16 @@ export class CommonFrontendContribution implements FrontendApplicationContributi registry.registerSubmenu(CommonMenus.VIEW_APPEARANCE_SUBMENU, nls.localizeByDefault('Appearance')); - registry.registerMenuAction(CommonMenus.FILE_NEW, { + registry.registerMenuAction(CommonMenus.FILE_NEW_TEXT, { + commandId: CommonCommands.NEW_UNTITLED_TEXT_FILE.id, + label: nls.localizeByDefault('New Text File'), + order: 'a' + }); + + registry.registerMenuAction(CommonMenus.FILE_NEW_TEXT, { commandId: CommonCommands.NEW_UNTITLED_FILE.id, label: nls.localizeByDefault('New File...'), - order: 'a' + order: 'a1' }); } @@ -941,13 +962,17 @@ export class CommonFrontendContribution implements FrontendApplicationContributi execute: () => this.toggleBreadcrumbs(), isToggled: () => this.isBreadcrumbsEnabled(), }); - commandRegistry.registerCommand(CommonCommands.NEW_UNTITLED_FILE, { + commandRegistry.registerCommand(CommonCommands.NEW_UNTITLED_TEXT_FILE, { execute: async () => { const untitledUri = this.untitledResourceResolver.createUntitledURI('', await this.workingDirProvider.getUserWorkingDir()); this.untitledResourceResolver.resolve(untitledUri); return open(this.openerService, untitledUri); } }); + commandRegistry.registerCommand(CommonCommands.NEW_UNTITLED_FILE, { + execute: async () => this.showNewFilePicker() + }); + for (const [index, ordinal] of this.getOrdinalNumbers().entries()) { commandRegistry.registerCommand({ id: `workbench.action.focus${ordinal}EditorGroup`, label: index === 0 ? nls.localizeByDefault('Focus First Editor Group') : '', category: nls.localize(CommonCommands.VIEW_CATEGORY_KEY, CommonCommands.VIEW_CATEGORY) }, { isEnabled: () => this.shell.mainAreaTabBars.length > index, @@ -1097,8 +1122,12 @@ export class CommonFrontendContribution implements FrontendApplicationContributi when: 'activeEditorIsPinned' }, { - command: CommonCommands.NEW_UNTITLED_FILE.id, + command: CommonCommands.NEW_UNTITLED_TEXT_FILE.id, keybinding: this.isElectron() ? 'ctrlcmd+n' : 'alt+n', + }, + { + command: CommonCommands.NEW_UNTITLED_FILE.id, + keybinding: 'ctrlcmd+alt+n' } ); for (const [index, ordinal] of this.getOrdinalNumbers().entries()) { @@ -1294,6 +1323,43 @@ export class CommonFrontendContribution implements FrontendApplicationContributi }); } + /** + * @todo https://github.com/eclipse-theia/theia/issues/12824 + */ + protected async showNewFilePicker(): Promise { + const newFileContributions = this.menuRegistry.getMenuNode(CommonMenus.FILE_NEW_CONTRIBUTIONS); // Add menus + const items: QuickPickItemOrSeparator[] = [ + { + label: nls.localizeByDefault('New Text File'), + execute: async () => this.commandRegistry.executeCommand(CommonCommands.NEW_UNTITLED_TEXT_FILE.id) + }, + ...newFileContributions.children + .flatMap(node => { + if (node.children && node.children.length > 0) { + return node.children; + } + return node; + }) + .filter(node => node.role || node.command) + .map(node => { + if (node.role) { + return { type: 'separator' } as QuickPickSeparator; + } + const command = this.commandRegistry.getCommand(node.command!); + return { + label: command!.label!, + execute: async () => this.commandRegistry.executeCommand(command!.id!) + }; + + }) + ]; + this.quickInputService.showQuickPick(items, { + title: nls.localizeByDefault('New File...'), + placeholder: nls.localizeByDefault('Select File Type or Enter File Name...'), + canSelectMany: false + }); + } + registerColors(colors: ColorRegistry): void { colors.register( // Base Colors should be aligned with https://code.visualstudio.com/api/references/theme-color#base-colors diff --git a/packages/core/src/browser/window-contribution.ts b/packages/core/src/browser/window-contribution.ts index 9dcfd1be0d091..14fd338fe8ab4 100644 --- a/packages/core/src/browser/window-contribution.ts +++ b/packages/core/src/browser/window-contribution.ts @@ -51,7 +51,7 @@ export class WindowContribution implements CommandContribution, KeybindingContri } registerMenus(registry: MenuModelRegistry): void { - registry.registerMenuAction(CommonMenus.FILE_NEW, { + registry.registerMenuAction(CommonMenus.FILE_NEW_TEXT, { commandId: WindowCommands.NEW_WINDOW.id, order: 'c' }); diff --git a/packages/workspace/src/browser/workspace-commands.ts b/packages/workspace/src/browser/workspace-commands.ts index 6f7264b584be8..2e7625f434485 100644 --- a/packages/workspace/src/browser/workspace-commands.ts +++ b/packages/workspace/src/browser/workspace-commands.ts @@ -153,7 +153,7 @@ export namespace WorkspaceCommands { export class FileMenuContribution implements MenuContribution { registerMenus(registry: MenuModelRegistry): void { - registry.registerMenuAction(CommonMenus.FILE_NEW, { + registry.registerMenuAction(CommonMenus.FILE_NEW_TEXT, { commandId: WorkspaceCommands.NEW_FOLDER.id, order: 'b' }); From a472e722dc7857c7b49b79fefdd3fb88bbca65b9 Mon Sep 17 00:00:00 2001 From: Johannes Faltermeier Date: Mon, 21 Aug 2023 15:25:30 +0200 Subject: [PATCH 21/79] Submenu contribution to editor/title and view/title not working #12706 (#12814) * introduce option in RenderContextMenuOptions to ask renderer to not render a menu with single submenu. Instead render only the children * add helper method to menu-model-registry to remove the parent nodes from a menu node as described above * adjust renderers and callers accordingly --- .../core/src/browser/context-menu-renderer.ts | 5 ++ .../menu/browser-context-menu-renderer.ts | 4 +- .../src/browser/menu/browser-menu-plugin.ts | 4 +- .../shell/tab-bar-toolbar/tab-bar-toolbar.tsx | 7 ++- packages/core/src/browser/style/tabs.css | 4 ++ .../src/common/menu/menu-model-registry.ts | 50 +++++++++++++++++++ .../menu/electron-context-menu-renderer.ts | 4 +- .../menu/electron-main-menu-factory.ts | 4 +- 8 files changed, 73 insertions(+), 9 deletions(-) diff --git a/packages/core/src/browser/context-menu-renderer.ts b/packages/core/src/browser/context-menu-renderer.ts index d0caac8e1a5bd..e8f88586f7c35 100644 --- a/packages/core/src/browser/context-menu-renderer.ts +++ b/packages/core/src/browser/context-menu-renderer.ts @@ -120,4 +120,9 @@ export interface RenderContextMenuOptions { context?: HTMLElement; contextKeyService?: ContextMatcher; onHide?: () => void; + /** + * If true a single submenu in the context menu is not rendered but its children are rendered on the top level. + * Default is `false`. + */ + skipSingleRootNode?: boolean; } diff --git a/packages/core/src/browser/menu/browser-context-menu-renderer.ts b/packages/core/src/browser/menu/browser-context-menu-renderer.ts index 63f3a35af36bc..775efaec0e28f 100644 --- a/packages/core/src/browser/menu/browser-context-menu-renderer.ts +++ b/packages/core/src/browser/menu/browser-context-menu-renderer.ts @@ -34,8 +34,8 @@ export class BrowserContextMenuRenderer extends ContextMenuRenderer { super(); } - protected doRender({ menuPath, anchor, args, onHide, context, contextKeyService }: RenderContextMenuOptions): ContextMenuAccess { - const contextMenu = this.menuFactory.createContextMenu(menuPath, args, context, contextKeyService); + protected doRender({ menuPath, anchor, args, onHide, context, contextKeyService, skipSingleRootNode }: RenderContextMenuOptions): ContextMenuAccess { + const contextMenu = this.menuFactory.createContextMenu(menuPath, args, context, contextKeyService, skipSingleRootNode); const { x, y } = coordinateFromAnchor(anchor); if (onHide) { contextMenu.aboutToClose.connect(() => onHide!()); diff --git a/packages/core/src/browser/menu/browser-menu-plugin.ts b/packages/core/src/browser/menu/browser-menu-plugin.ts index 5af54f00fa3ca..81b85487c9bec 100644 --- a/packages/core/src/browser/menu/browser-menu-plugin.ts +++ b/packages/core/src/browser/menu/browser-menu-plugin.ts @@ -108,8 +108,8 @@ export class BrowserMainMenuFactory implements MenuWidgetFactory { } } - createContextMenu(path: MenuPath, args?: unknown[], context?: HTMLElement, contextKeyService?: ContextMatcher): MenuWidget { - const menuModel = this.menuProvider.getMenu(path); + createContextMenu(path: MenuPath, args?: unknown[], context?: HTMLElement, contextKeyService?: ContextMatcher, skipSingleRootNode?: boolean): MenuWidget { + const menuModel = skipSingleRootNode ? this.menuProvider.removeSingleRootNode(this.menuProvider.getMenu(path), path) : this.menuProvider.getMenu(path); const menuCommandRegistry = this.createMenuCommandRegistry(menuModel, args).snapshot(path); const contextMenu = this.createMenuWidget(menuModel, { commands: menuCommandRegistry, context, rootMenuPath: path, contextKeyService }); return contextMenu; diff --git a/packages/core/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.tsx b/packages/core/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.tsx index dac2d86a66425..491a26a4f2529 100644 --- a/packages/core/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.tsx +++ b/packages/core/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.tsx @@ -224,6 +224,10 @@ export class TabBarToolbar extends ReactWidget { if (this.commandIsToggled(item.command)) { classNames.push('toggled'); } + } else { + if (this.isEnabled(item)) { + classNames.push('enabled'); + } } return classNames; } @@ -281,7 +285,8 @@ export class TabBarToolbar extends ReactWidget { args: [this.current], anchor, context: this.current?.node, - onHide: () => toDisposeOnHide.dispose() + onHide: () => toDisposeOnHide.dispose(), + skipSingleRootNode: true, }); } diff --git a/packages/core/src/browser/style/tabs.css b/packages/core/src/browser/style/tabs.css index ea2f48940e510..7a8cc548080cc 100644 --- a/packages/core/src/browser/style/tabs.css +++ b/packages/core/src/browser/style/tabs.css @@ -459,6 +459,10 @@ cursor: pointer; } +.p-TabBar-toolbar .item.enabled .action-label::before { + display: flex; +} + .p-TabBar-toolbar :not(.item.enabled) .action-label { background: transparent; cursor: default; diff --git a/packages/core/src/common/menu/menu-model-registry.ts b/packages/core/src/common/menu/menu-model-registry.ts index 6bbb5e1d3a450..c29d69ecf3cad 100644 --- a/packages/core/src/common/menu/menu-model-registry.ts +++ b/packages/core/src/common/menu/menu-model-registry.ts @@ -254,6 +254,56 @@ export class MenuModelRegistry { return this.findGroup(menuPath); } + /** + * Checks the given menu model whether it will show a menu with a single submenu. + * + * @param fullMenuModel the menu model to analyze + * @param menuPath the menu's path + * @returns if the menu will show a single submenu this returns a menu that will show the child elements of the submenu, + * otherwise the given `fullMenuModel` is return + */ + removeSingleRootNode(fullMenuModel: MutableCompoundMenuNode, menuPath: MenuPath): CompoundMenuNode { + // check whether all children are compound menus and that there is only one child that has further children + if (!this.allChildrenCompound(fullMenuModel.children)) { + return fullMenuModel; + } + let nonEmptyNode = undefined; + for (const child of fullMenuModel.children) { + if (!this.isEmpty(child.children || [])) { + if (nonEmptyNode === undefined) { + nonEmptyNode = child; + } else { + return fullMenuModel; + } + } + } + + if (CompoundMenuNode.is(nonEmptyNode) && nonEmptyNode.children.length === 1 && CompoundMenuNode.is(nonEmptyNode.children[0])) { + nonEmptyNode = nonEmptyNode.children[0]; + } + + return CompoundMenuNode.is(nonEmptyNode) ? nonEmptyNode : fullMenuModel; + } + + protected allChildrenCompound(children: ReadonlyArray): boolean { + return children.every(CompoundMenuNode.is); + } + + protected isEmpty(children: ReadonlyArray): boolean { + if (children.length === 0) { + return true; + } + if (!this.allChildrenCompound(children)) { + return false; + } + for (const child of children) { + if (!this.isEmpty(child.children || [])) { + return false; + } + } + return true; + } + /** * Returns the {@link MenuPath path} at which a given menu node can be accessed from this registry, if it can be determined. * Returns `undefined` if the `parent` of any node in the chain is unknown. diff --git a/packages/core/src/electron-browser/menu/electron-context-menu-renderer.ts b/packages/core/src/electron-browser/menu/electron-context-menu-renderer.ts index 4509570645d44..8ed8b1cebd1a8 100644 --- a/packages/core/src/electron-browser/menu/electron-context-menu-renderer.ts +++ b/packages/core/src/electron-browser/menu/electron-context-menu-renderer.ts @@ -100,8 +100,8 @@ export class ElectronContextMenuRenderer extends BrowserContextMenuRenderer { protected override doRender(options: RenderContextMenuOptions): ContextMenuAccess { if (this.useNativeStyle) { - const { menuPath, anchor, args, onHide, context, contextKeyService } = options; - const menu = this.electronMenuFactory.createElectronContextMenu(menuPath, args, context, contextKeyService); + const { menuPath, anchor, args, onHide, context, contextKeyService, skipSingleRootNode } = options; + const menu = this.electronMenuFactory.createElectronContextMenu(menuPath, args, context, contextKeyService, skipSingleRootNode); const { x, y } = coordinateFromAnchor(anchor); const menuHandle = window.electronTheiaCore.popup(menu, x, y, () => { diff --git a/packages/core/src/electron-browser/menu/electron-main-menu-factory.ts b/packages/core/src/electron-browser/menu/electron-main-menu-factory.ts index 4ff411d93c48d..162b4dca9235c 100644 --- a/packages/core/src/electron-browser/menu/electron-main-menu-factory.ts +++ b/packages/core/src/electron-browser/menu/electron-main-menu-factory.ts @@ -125,8 +125,8 @@ export class ElectronMainMenuFactory extends BrowserMainMenuFactory { return undefined; } - createElectronContextMenu(menuPath: MenuPath, args?: any[], context?: HTMLElement, contextKeyService?: ContextMatcher): MenuDto[] { - const menuModel = this.menuProvider.getMenu(menuPath); + createElectronContextMenu(menuPath: MenuPath, args?: any[], context?: HTMLElement, contextKeyService?: ContextMatcher, skipSingleRootNode?: boolean): MenuDto[] { + const menuModel = skipSingleRootNode ? this.menuProvider.removeSingleRootNode(this.menuProvider.getMenu(menuPath), menuPath) : this.menuProvider.getMenu(menuPath); return this.fillMenuTemplate([], menuModel, args, { showDisabled: true, context, rootMenuPath: menuPath, contextKeyService }); } From 3a49fcaea3502d6c307044a9f76409eef197368a Mon Sep 17 00:00:00 2001 From: Vlad Arama <86936229+vladarama@users.noreply.github.com> Date: Mon, 21 Aug 2023 10:45:24 -0400 Subject: [PATCH 22/79] getting-started: fix styling for small viewports (#12825) This commit adds a `className` and styling to the main div containing the getting-started content and the preferences which fixes the overlapping checkbox for small viewports. Signed-off-by: Vlad Arama --- .../src/browser/getting-started-widget.tsx | 4 ++-- .../getting-started/src/browser/style/index.css | 13 ++++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/getting-started/src/browser/getting-started-widget.tsx b/packages/getting-started/src/browser/getting-started-widget.tsx index c833471122e8e..4da274562f0e8 100644 --- a/packages/getting-started/src/browser/getting-started-widget.tsx +++ b/packages/getting-started/src/browser/getting-started-widget.tsx @@ -129,8 +129,8 @@ export class GettingStartedWidget extends ReactWidget { * Render the content of the widget. */ protected render(): React.ReactNode { - return
-
+ return
+
{this.renderHeader()}
diff --git a/packages/getting-started/src/browser/style/index.css b/packages/getting-started/src/browser/style/index.css index ba828730c4c0a..17216da4df9da 100644 --- a/packages/getting-started/src/browser/style/index.css +++ b/packages/getting-started/src/browser/style/index.css @@ -39,10 +39,17 @@ body { } .gs-container { + display: flex; + flex-direction: column; + justify-content: space-between; + height: 100%; +} + +.gs-content-container { padding: 20px; } -.gs-container a { +.gs-content-container a { cursor: pointer; } @@ -92,14 +99,10 @@ body { .gs-preference-container { display: flex; - position: absolute; - bottom: 0; - width: 100%; justify-content: center; } .gs-preference { - margin-top: 20px; margin-bottom: 20px; display: flex; align-items: center; From d8f77294e660dde27b7721ed3fa5f88f9b76809b Mon Sep 17 00:00:00 2001 From: Vincent Fugnitto Date: Tue, 22 Aug 2023 08:17:47 -0400 Subject: [PATCH 23/79] docs: update publishing documentation (#12817) The commit updates the `publishing` documentation with the latest information, and lerna workarounds. Signed-off-by: vince-fugnitto --- doc/Publishing.md | 232 +++++++++++++++++++++------------------------- 1 file changed, 108 insertions(+), 124 deletions(-) diff --git a/doc/Publishing.md b/doc/Publishing.md index 72e8cb14fa21f..6ca655a3a7d5a 100644 --- a/doc/Publishing.md +++ b/doc/Publishing.md @@ -1,166 +1,150 @@ # Publishing +The documentation describes the various steps and information regarding the release of Eclipse Theia for maintainers. ## Release Procedure -- [**Yarn Upgrade**](#yarn-upgrade) -- [**Announce Release**](#announce-release) -- [**Pre-Publishing Steps**](#pre-publishing-steps) -- [**Login to NPM Registry**](#login-to-npm-registry) -- [**Publish Packages**](#publish-packages) -- [**Commit Updated Versions**](#commit-updated-version) -- [**Create Release**](#create-release) -- [**Update Eclipse Release Page**](#update-eclipse-release-page) -- [**Post-Release**](#post-release) - - [Announce Release is Completed](#announce-release-is-completed) - -## Yarn Upgrade - -Before a release (Monday of the same week), it is a good time to perform a `yarn upgrade` on the repository to update the `yarn.lock`. -Updating the `yarn.lock` helps identify potential problems with our dependency version ranges, and is more representative of what downstream adopters may pull when building their own applications. - -To successfully complete a `yarn upgrade`, one must: -- Perform `yarn upgrade` at the root of the repository. -- Fix any compilation errors, typing issues, and failing tests that may be introduced. - -## Announce Release - -It's good to give a heads-up to the Theia developers some hours before a release. One can use whatever forum is appropriate. At the time of writing this is [`Discourse`](https://community.theia-ide.org/). - -Here is an [example](https://community.theia-ide.org/t/0-11-0-release/373). - +- [**Pre-Release Steps**](#pre-release-steps) + - [Yarn Upgrade](#yarn-upgrade) + - [Announce Release](#announce-release) + - [Localization](#localization) + - [Changelog](#changelog) + - [Update Milestone](#update-milestone) +- [**Release**](#publishing) + - [Community Releases](#community-releases) +- [**Post-Release Steps**](#post-release-steps) + - [Eclipse Release](#eclipse-release) + - [Announce Release is Completed](#announce-release-is-completed) + - [Update Future Milestones](#update-future-milestones) + - [Publish GitHub Pages](#publish-github-pages) +- [**Troubleshooting**](#troubleshooting) + - [**Failures During Publishing**](#failures-during-publishing) ## Pre-Release Steps -- Ensure that the [changelog](https://github.com/eclipse-theia/theia/blob/master/CHANGELOG.md) is updated and merged for the release. - - The `changelog` should reflect updates included in the release: - - Notable features, improvements and bug fixes. - - Any possible breaking changes. - - The `changelog` should follow the format of previous releases: - - Include the version, and date. - - Include a link to the appropriate milestone. - - Include all breaking changes in a separate section. - - Prefix entries by their most appropriate extension name (ex: `[core]`). - - Entries should include a link to their corresponding pull-request. - - Entries should be in alphabetical order. - - Entries should be in the past tense (ex: 'Added support...'). -- Ensure that merged pull-requests for the given release are added to the corresponding release [milestone](https://github.com/eclipse-theia/theia/milestones): - - Generally, milestones are automatically added on merge however not for forks. It is therefore important to manually add such contributions to the milestone for the time being. -- Run the [automatic translation workflow](https://github.com/eclipse-theia/theia/actions/workflows/translation.yml) and merge the created pull request if necessary. - - -## Pre-Publishing Steps - -Before publishing, it's important to make sure that a functional Theia application can be made from the latest `next` version of the platform. Else we will have problems with "latest" after publishing. - -- Update the forum release post to ask committers to hold-off merging any PR while the release is ongoing. - - -## Login to NPM Registry +### Yarn Upgrade -Follow this [instruction](https://docs.npmjs.com/cli/adduser) to login to the npm registry with a user account. +In general, it is recommended to perform a `yarn upgrade` on the repository prior to a release to update the `yarn.lock`. +The upgrade helps to: -If you don't have an account contact [Theia organization](https://www.npmjs.com/~theia) to request one. +- Better represents what adopters will pull during a release. +- Validate dependencies with our declared version ranges. +- Fix known security vulnerabilities from dependencies. +In order to successfully perform a `yarn upgrade` one must: -## Publish Packages +- Perform a `yarn upgrade` at the root of the repository. +- Fix any potential compilation errors, typing errors, and failing tests that may have been introduced. +- Confirm licenses and wait for the "IP Check" to complete ([example](https://gitlab.eclipse.org/eclipsefdn/emo-team/iplab/-/issues/9377)). - yarn run publish +### Announce Release -This command will rebuild all packages, test them, publish to npm and bump versions. +It is a good idea to give a heads-up to developers and the community some hours before a release. +At the time of writing this is [Discourse](https://community.theia-ide.org/). Here is an [example](https://community.theia-ide.org/t/eclipse-theia-v1-40-0-release/3112/5). -If publishing of an individual package failed then publish it with `npm publish` from its root after resolving outstanding issues. +### Localization +The localization (`nls`) updates should be performed before a release ([example](https://github.com/eclipse-theia/theia/pull/12665)). +To help we have an [automatic translation](https://github.com/eclipse-theia/theia/actions/workflows/translation.yml) workflow which can be triggered. +Note that due to the required CI check (`lint`) we will need for force-push the branch that the bot creates to properly trigger CI. -## Commit Updated Version +### Changelog - git add * - git commit -m "publish v${published.version}" -s - git push ${remote for main Theia repo} master:${branch} +The [changelog](https://github.com/eclipse-theia/theia/blob/master/CHANGELOG.md) should be updated and merged for the release. +The updates should document the release as thoroughly as possible: -The version picked during package publishing should be used as `${published.version}`. +- Notable new features, improvements and bug fixes. +- Potential breaking changes. -For example, if you picked `0.1.0` as a version and your git remote for the main Theia repo is named `origin`, then you should run: +The `changelog` should follow the same format as previous releases: - git add * - git commit -m "publish v0.1.0" -s - git push origin master:release_0_1_0 +- Include the version, and date. +- Add a link to the appropriate milestone. +- Document all breaking changes in a separate section. +- Entries should be formatted in the following way: + - Prefix by their most appropriate extension name (ex: `[core]`). + - Add a link to their corresponding pull-request. + - Should be in alphabetical order. + - Should be in the past tense (ex: 'Added support...'). -Then from the project's [main page](https://github.com/eclipse-theia/theia), create a pull request from the branch just pushed. Have another committer on standby to quickly review and approve the PR, then merge it. +### Update Milestone +The given release [milestone](https://github.com/eclipse-theia/theia/milestones) should be updated to include all commits that composed the release. +Generally, milestones are automatically added on merge but not necessarily for forks. It is therefore important to manually add such contributions to the milestone for the time being. -## Create Release +## Release -The next step is to create a new [**Release**](https://github.com/eclipse-theia/theia/releases). -This will create a new `tag`, `release` with the appropriate assets (`.zip`, `tar.gz`) and notify subscribers. +The release instructions are as follows: -In order to create a new release, one must: -- Navigate to the releases [page](https://github.com/eclipse-theia/theia/releases). -- Select the _"Draft a new release"_ button. -- Input the appropriate release `tag` version (ex: `v1.2.0`). -- Input the appropriate release `name` (ex: `Eclipse Theia v1.2.0`). -- Include a release `description` to include a reference to the `changelog` at the respective `sha` and release version: +- Checkout `master` with the latest changes (`git pull` to pull the latest changes). +- Confirm the latest changes are present (`git log`). +- Build the changes (`yarn`). +- Confirm the changes are built (individual `@theia` extensions should have their `lib/` folders present). +- Perform the release using `yarn publish:latest` - choose an appropriate version. +- Keep the `packages/core/README.md` updates in a separate commit ([example](https://github.com/eclipse-theia/theia/commit/21fa2ec688e4a8bcf10203d6dc0f730af43a7f58)). +- Prepare a release - create a branch with the pattern `release/x.y.z` (ex: `release/1.40.x`). +- Once approved, merge using `Rebase and Merge` (**DO NOT `Squash and Merge`**). +- Once the pull-request is merged, pull the changes locally and tag the publishing commit (ex: `git tag -a "${version} ${sha} -m "${version}"`). +- Publish the tag to GitHub. +- Create a GitHub release: + - Navigate to the releases [page](https://github.com/eclipse-theia/theia/releases). + - Select the _"Draft a new release"_ button. + - Input the appropriate release `tag` version (ex: `v1.2.0`). + - Input the appropriate release `name` (ex: `Eclipse Theia v1.2.0`). + - Use the `generate release notes` button to generate the list of contributors (including new ones), and format them similarly to other releases. + - Include a release `description` to include a reference to the `changelog` at the respective `sha` and release version. + - Include a reference to the migration guide in the release description. + - Select _"Publish Release"_ bottom at the bottom of the page. + - For additional information, please consult the official GitHub documentation regarding [creating releases](https://help.github.com/en/github/administering-a-repository/managing-releases-in-a-repository#creating-a-release). - ```md - [Release Changelog](https://github.com/eclipse-theia/theia/blob/${sha}/CHANGELOG.md#${changelog-version-header}) - ``` +### Community Releases - For example (version `v1.2.0`): +For the most part community releases are similar to regular releases but with fewer steps (ex: no need to submit a pull-request). +In order to perform a community releases we want to: - ```md - [Release Changelog](https://github.com/eclipse-theia/theia/blob/2aa2fa1ab091ec36ef851c4e364b322301cddb40/CHANGELOG.md#v120) - ``` +- Prepare the community release branch which branches off from a specific release `tag`. +- Cherry-pick any changes we want to apply on top of the `tag` (ex: patches that fix regressions, security vulnerabilities). +- Perform the release as usual (we want to use a `dist-tag` of `community`). -- Include a reference to the migration guide in the release description: +## Post-Release Steps - ```md - [Migration Guide](https://github.com/eclipse-theia/theia/blob/master/doc/Migration.md) - ``` +### Eclipse Release -- Select _"Publish Release"_ bottom at the bottom of the page. - -For additional information, please consult the official GitHub documentation regarding [creating releases](https://help.github.com/en/github/administering-a-repository/managing-releases-in-a-repository#creating-a-release). - - -## Update Eclipse Release Page - -Login to [Eclipse Foundation Theia project page]( https://projects.eclipse.org/projects/ecd.theia) -- On the right side panel, select Release / Create a new release - - Create a new version - - Name: enter the new version for this release. (ex: 1.2.0). - - Date: enter the date for this release. - - Select the edit tab - - In "The Basic" section - - Select the "Type A" in the IP Due Diligence type. - - In the "Project Plan" - - Deliverables section - - Paste the content of the changelog.md. - - Compatibility section - - Paste the content of the "Breaking changes" +- Login to [Eclipse Foundation Theia project page]( https://projects.eclipse.org/projects/ecd.theia) +- On the right side menu, select `Release` / `Create a new release` + - `Release Date`: enter the date for the release. + - `Name`: enter the version of the release (ex: `1.40.0`). +- Select `Create and edit`. +- In the `projects` section: + - Add the changelog link to `deliverables`. + - Add the breaking changes link to `compatibility`. +- Save the changes. +- To confirm the release is successful: + - Open the [project page](https://projects.eclipse.org/projects/ecd.theia) + - Select the version you just created. + - Open the Review plan section, you should see the data provided before. +### Announce Release is Completed -- When completing the edition, select "Save" at the bottom of the page. -- To confirm the release is successful, - - Open the page https://projects.eclipse.org/projects/ecd.theia - - Select the version you just created. - - Open the Review plan section, you should see the data provided before. +- Update the forum release post to announce that the release has completed. +- Submit to "Theia News", so that a Tweet will be created by the Twitter managers. Use [this template](https://github.com/eclipse-theia/theia/wiki/Eclipse-Theia-Twitter-strategy#release-announcement-no-review) for the message and post it [here](https://forms.gle/ccS6qawpS54FQZht5). +### Update Future Milestones -## Post Release +- Close current release [milestone](https://github.com/eclipse-theia/theia/milestones). +- Create the next two milestones in the case they do not already exist. Generally, the release is performed on the last Thursday of the month, but there may be exceptions (bug fix release, holidays, etc.). -### Announce Release is Completed +### Publish GitHub Pages -- Update the forum release post to announce that the release has completed. -- Submit to "Theia News", so that a Tweet will be created by the Twitter managers. Use [this template](https://github.com/eclipse-theia/theia/wiki/Eclipse-Theia-Twitter-strategy#release-announcement-no-review) for the message and post it [here](https://forms.gle/ccS6qawpS54FQZht5). +Following a release we should publish the `latest` documentation with our [GitHub Pages](https://github.com/eclipse-theia/theia/actions/workflows/publish-gh-pages.yml) workflow. The publishing should be performed manually using the `manual_dispatch` job. -### Update Milestones +## Troubleshooting -* Close current release [milestone](https://github.com/eclipse-theia/theia/milestones). -* Create the next two milestones in the case they do not already exist. Generally, the release is performed on the last Thursday of the month, but there may be exceptions (bug fix release, holidays, etc.). +### Failures During Publishing -### Update Roadmap +Sometimes `lerna` will fail during publishing (ex: socket errors). If such a case happens we should `git reset --hard` and retry publishing of only unpublished +packages using a workaround command: -* If the current release is the last in a quarter, ask the team to update the [roadmap](https://github.com/eclipse-theia/theia/wiki/Eclipse-Theia-Roadmap) of the past quarter (close, remove or move items). -* If the current release is the second in a quarter, create [roadmap template](https://github.com/eclipse-theia/theia/wiki/Eclipse-Theia-Roadmap) for the next quarter, ask the team to contribute to it and add it to the agenda of the Theia dev meeting. +```bash +npx lerna publish from-package --no-git-reset --no-git-tag-version --no-push +``` From a2a42b71b9370d8f0fb0b38ab68ab22aa85c12ae Mon Sep 17 00:00:00 2001 From: Nina Doschek Date: Mon, 21 Aug 2023 12:14:37 +0200 Subject: [PATCH 24/79] playwright: Update to latest versions and add new page objects - Update `playwright` to the latest version - Extend page objects for compact and nested folders - Extend ExplorerView tests with compact folders Signed-off-by: Nina Doschek --- examples/playwright/package.json | 6 +-- .../src/tests/theia-explorer-view.test.ts | 45 +++++++++++++++++++ .../playwright/src/theia-explorer-view.ts | 44 +++++++++++++----- examples/playwright/src/theia-tree-node.ts | 12 +++++ yarn.lock | 44 +++++++++--------- 5 files changed, 115 insertions(+), 36 deletions(-) diff --git a/examples/playwright/package.json b/examples/playwright/package.json index 33e4af44653cf..190afc368a583 100644 --- a/examples/playwright/package.json +++ b/examples/playwright/package.json @@ -29,13 +29,13 @@ "src" ], "dependencies": { - "@playwright/test": "^1.32.1", + "@playwright/test": "^1.37.1", "fs-extra": "^9.0.8" }, "devDependencies": { "@types/fs-extra": "^9.0.8", - "allure-commandline": "^2.21.0", - "allure-playwright": "^2.1.0", + "allure-commandline": "^2.23.1", + "allure-playwright": "^2.5.0", "rimraf": "^2.6.1", "typescript": "~4.5.5" }, diff --git a/examples/playwright/src/tests/theia-explorer-view.test.ts b/examples/playwright/src/tests/theia-explorer-view.test.ts index 7977acfb2ad8a..fccbe5b55efe6 100644 --- a/examples/playwright/src/tests/theia-explorer-view.test.ts +++ b/examples/playwright/src/tests/theia-explorer-view.test.ts @@ -110,8 +110,11 @@ test.describe('Theia Explorer View', () => { }); test('should be able to check if compact folder "sampleFolderCompact/nestedFolder1/nestedFolder2" exists', async () => { + const fileStatElements = await explorer.visibleFileStatNodes(); // default setting `explorer.compactFolders=true` renders folders in a compact form - single child folders will be compressed in a combined tree element expect(await explorer.existsDirectoryNode('sampleFolderCompact/nestedFolder1/nestedFolder2', true /* compact */)).toBe(true); + // the `existsDirectoryNode` function will expand the folder, hence we wait for the file nodes to increase as we expect a txt child file node + await explorer.waitForFileNodesToIncrease(fileStatElements.length); }); test('should provide file stat node by path of compact folder "sampleFolderCompact/nestedFolder1/nestedFolder2/sampleFile1-1.txt"', async () => { @@ -141,4 +144,46 @@ test.describe('Theia Explorer View', () => { expect(await explorer.existsFileNode('sample.txt')).toBe(true); }); + test('should open context menu on nested folder segment "nestedFolder1"', async () => { + expect(await explorer.existsDirectoryNode('sampleFolderCompact/nestedFolder1/nestedFolder2', true /* compact */)).toBe(true); + const folder = await explorer.getFileStatNodeByLabel('sampleFolderCompact/nestedFolder1/nestedFolder2', true /* compact */); + const menu = await folder.openContextMenuOnSegment('nestedFolder1'); + expect(await menu.isOpen()).toBe(true); + + const menuItems = await menu.visibleMenuItems(); + expect(menuItems).toContain('New File...'); + expect(menuItems).toContain('New Folder...'); + expect(menuItems).toContain('Open in Terminal'); + expect(menuItems).toContain('Find in Folder...'); + + await menu.close(); + expect(await menu.isOpen()).toBe(false); + }); + + test('should rename compact folder "sampleFolderCompact" to "sampleDirectoryCompact', async () => { + expect(await explorer.existsDirectoryNode('sampleFolderCompact/nestedFolder1/nestedFolder2', true /* compact */)).toBe(true); + await explorer.renameNode( + 'sampleFolderCompact/nestedFolder1/nestedFolder2', 'sampleDirectoryCompact', + true /* confirm */, 'sampleFolderCompact' /* nodeSegmentLabel */); + expect(await explorer.existsDirectoryNode('sampleDirectoryCompact/nestedFolder1/nestedFolder2', true /* compact */)).toBe(true); + }); + + test('should delete nested folder "sampleDirectoryCompact/nestedFolder1/nestedFolder2"', async () => { + const fileStatElements = await explorer.visibleFileStatNodes(); + expect(await explorer.existsDirectoryNode('sampleDirectoryCompact/nestedFolder1/nestedFolder2', true /* compact */)).toBe(true); + await explorer.deleteNode('sampleDirectoryCompact/nestedFolder1/nestedFolder2', true /* confirm */, 'nestedFolder2' /* nodeSegmentLabel */); + await explorer.waitForFileNodesToDecrease(fileStatElements.length); + const updatedFileStatElements = await explorer.visibleFileStatNodes(); + expect(updatedFileStatElements.length).toBe(fileStatElements.length - 1); + }); + + test('should delete compact folder "sampleDirectoryCompact/nestedFolder1"', async () => { + const fileStatElements = await explorer.visibleFileStatNodes(); + expect(await explorer.existsDirectoryNode('sampleDirectoryCompact/nestedFolder1', true /* compact */)).toBe(true); + await explorer.deleteNode('sampleDirectoryCompact/nestedFolder1', true /* confirm */, 'sampleDirectoryCompact' /* nodeSegmentLabel */); + await explorer.waitForFileNodesToDecrease(fileStatElements.length); + const updatedFileStatElements = await explorer.visibleFileStatNodes(); + expect(updatedFileStatElements.length).toBe(fileStatElements.length - 1); + }); + }); diff --git a/examples/playwright/src/theia-explorer-view.ts b/examples/playwright/src/theia-explorer-view.ts index 9d70214086628..45d66d572a7dc 100644 --- a/examples/playwright/src/theia-explorer-view.ts +++ b/examples/playwright/src/theia-explorer-view.ts @@ -47,8 +47,8 @@ export class TheiaExplorerFileStatNode extends TheiaTreeNode { return elementContainsClass(this.elementHandle, 'theia-DirNode'); } - async getMenuItemByNamePath(...names: string[]): Promise { - const contextMenu = await this.openContextMenu(); + async getMenuItemByNamePath(names: string[], nodeSegmentLabel?: string): Promise { + const contextMenu = nodeSegmentLabel ? await this.openContextMenuOnSegment(nodeSegmentLabel) : await this.openContextMenu(); const menuItem = await contextMenu.menuItemByNamePath(...names); if (!menuItem) { throw Error('MenuItem could not be retrieved by path'); } return menuItem; @@ -106,8 +106,8 @@ export class TheiaExplorerView extends TheiaView { return []; } - async getFileStatNodeByLabel(label: string): Promise { - const file = await this.fileStatNode(label); + async getFileStatNodeByLabel(label: string, compact = false): Promise { + const file = await this.fileStatNode(label, compact); if (!file) { throw Error('File stat node could not be retrieved by path fragments'); } return file; } @@ -202,11 +202,11 @@ export class TheiaExplorerView extends TheiaView { return nodeId; } - async clickContextMenuItem(file: string, path: string[]): Promise { + async clickContextMenuItem(file: string, path: string[], nodeSegmentLabel?: string): Promise { await this.activate(); - const fileStatNode = await this.fileStatNode(file); + const fileStatNode = await this.fileStatNode(file, !!nodeSegmentLabel); if (!fileStatNode) { throw Error('File stat node could not be retrieved by path fragments'); } - const menuItem = await fileStatNode.getMenuItemByNamePath(...path); + const menuItem = await fileStatNode.getMenuItemByNamePath(path, nodeSegmentLabel); await menuItem.click(); } @@ -248,9 +248,9 @@ export class TheiaExplorerView extends TheiaView { return fileStatElements.length; } - async deleteNode(path: string, confirm = true): Promise { + async deleteNode(path: string, confirm = true, nodeSegmentLabel?: string): Promise { await this.activate(); - await this.clickContextMenuItem(path, ['Delete']); + await this.clickContextMenuItem(path, ['Delete'], nodeSegmentLabel); const confirmDialog = new TheiaDialog(this.app); await confirmDialog.waitForVisible(); @@ -258,9 +258,9 @@ export class TheiaExplorerView extends TheiaView { await confirmDialog.waitForClosed(); } - async renameNode(path: string, newName: string, confirm = true): Promise { + async renameNode(path: string, newName: string, confirm = true, nodeSegmentLabel?: string): Promise { await this.activate(); - await this.clickContextMenuItem(path, ['Rename']); + await this.clickContextMenuItem(path, ['Rename'], nodeSegmentLabel); const renameDialog = new TheiaRenameDialog(this.app); await renameDialog.waitForVisible(); @@ -285,4 +285,26 @@ export class TheiaExplorerView extends TheiaView { } } + async waitForFileNodesToIncrease(numberBefore: number): Promise { + const fileStatNodesSelector = `${this.viewSelector} .theia-FileStatNode`; + await this.page.waitForFunction( + (predicate: { selector: string; numberBefore: number; }) => { + const elements = document.querySelectorAll(predicate.selector); + return !!elements && elements.length > predicate.numberBefore; + }, + { selector: fileStatNodesSelector, numberBefore } + ); + } + + async waitForFileNodesToDecrease(numberBefore: number): Promise { + const fileStatNodesSelector = `${this.viewSelector} .theia-FileStatNode`; + await this.page.waitForFunction( + (predicate: { selector: string; numberBefore: number; }) => { + const elements = document.querySelectorAll(predicate.selector); + return !!elements && elements.length < predicate.numberBefore; + }, + { selector: fileStatNodesSelector, numberBefore } + ); + } + } diff --git a/examples/playwright/src/theia-tree-node.ts b/examples/playwright/src/theia-tree-node.ts index 6114bbbf89c12..27967ea8593d5 100644 --- a/examples/playwright/src/theia-tree-node.ts +++ b/examples/playwright/src/theia-tree-node.ts @@ -23,6 +23,7 @@ import { TheiaMenu } from './theia-menu'; export class TheiaTreeNode { labelElementCssClass = '.theia-TreeNodeSegmentGrow'; + nodeSegmentLabelCssClass = '.theia-tree-compressed-label-part'; expansionToggleCssClass = '.theia-ExpansionToggle'; collapsedCssClass = '.theia-mod-collapsed'; @@ -66,4 +67,15 @@ export class TheiaTreeNode { return TheiaContextMenu.open(this.app, () => this.elementHandle.waitForSelector(this.labelElementCssClass)); } + async openContextMenuOnSegment(nodeSegmentLabel: string): Promise { + const treeNodeLabel = await this.elementHandle.waitForSelector(this.labelElementCssClass); + const treeNodeLabelSegments = await treeNodeLabel.$$(`span${this.nodeSegmentLabelCssClass}`); + for (const segmentLabel of treeNodeLabelSegments) { + if (await segmentLabel.textContent() === nodeSegmentLabel) { + return TheiaContextMenu.open(this.app, () => Promise.resolve(segmentLabel)); + } + } + throw new Error('Could not find tree node segment label "' + nodeSegmentLabel + '"'); + } + } diff --git a/yarn.lock b/yarn.lock index 7b80f2c2101fc..c89541b2757fd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1556,13 +1556,13 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@playwright/test@^1.32.1": - version "1.35.1" - resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.35.1.tgz#a596b61e15b980716696f149cc7a2002f003580c" - integrity sha512-b5YoFe6J9exsMYg0pQAobNDR85T1nLumUYgUTtKm4d21iX2L7WqKq9dW8NGJ+2vX0etZd+Y7UeuqsxDXm9+5ZA== +"@playwright/test@^1.37.1": + version "1.37.1" + resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.37.1.tgz#e7f44ae0faf1be52d6360c6bbf689fd0057d9b6f" + integrity sha512-bq9zTli3vWJo8S3LwB91U0qDNQDpEXnw7knhxLM0nwDvexQAwx9tO8iKDZSqqneVq+URd/WIoz+BALMqUTgdSg== dependencies: "@types/node" "*" - playwright-core "1.35.1" + playwright-core "1.37.1" optionalDependencies: fsevents "2.3.2" @@ -2733,25 +2733,25 @@ ajv@^8.0.0, ajv@^8.0.1, ajv@^8.6.3, ajv@^8.9.0: require-from-string "^2.0.2" uri-js "^4.2.2" -allure-commandline@^2.21.0: - version "2.23.0" - resolved "https://registry.yarnpkg.com/allure-commandline/-/allure-commandline-2.23.0.tgz#fdea57adee905808c0953ac51a234e474e9f5c27" - integrity sha512-bfAbyQzke0Gj48bxIAhHOcJ6DluYeR4uz3iQ1wJWx7TgGA1gazN1PXUtpr+wnX9eXCTRApEuggaJIduLik7Wsg== +allure-commandline@^2.23.1: + version "2.23.1" + resolved "https://registry.yarnpkg.com/allure-commandline/-/allure-commandline-2.23.1.tgz#b72ee444f586ab6ea403006960dfb4e641524c76" + integrity sha512-Qi1P8aFTwcD2XOYr4xqysPbgXFrl5JLY9jDBVQfOb6xkZ7/UtISfW6j0sAyVgMXyXQqYiQDSBcVS2wr1bm1Xlg== -allure-js-commons@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/allure-js-commons/-/allure-js-commons-2.4.0.tgz#1f75ff0ac153e30aaf4a4eb835fc6e55ee6610c6" - integrity sha512-mIQKAA91ihtMPzHJh7fQib/8MhZaUQ0oYtqFzS//5/Q+ILbMWW3WD2ISWtwniFAF2XWdRFjZ013IfUuKusbh1g== +allure-js-commons@2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/allure-js-commons/-/allure-js-commons-2.5.0.tgz#ea589a25d61bbd9b117ba62d06ee2bc3e138bfad" + integrity sha512-CqhzJciKfM0fxImbfRSctPXTxnzxhD2rM1tX/ZkcyKyWzNmjdCn1n5j3/r5gPYeRfIT1NthLYcUF802tJ05QDg== dependencies: properties "^1.2.1" uuid "^8.3.0" -allure-playwright@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/allure-playwright/-/allure-playwright-2.4.0.tgz#8b8ce4ac27290dbc87120029d12aefc8b1477b75" - integrity sha512-YtOdQXKPUFFfXVEPUaH5ebNf/2tLmJ1q898l+TPCPBeTQWVpKxLJm5yQkBbu+cmbsN+FGCsfDHFiqcS/r6f71w== +allure-playwright@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/allure-playwright/-/allure-playwright-2.5.0.tgz#734662971a4377f32ba341555c141f128a8ef453" + integrity sha512-DjkC9PLwmakzr9TrJ7jjv2tZBtO0i1vTDuvJcO9EhcqhejkGecupc5VtczxrDAlR7wWS4GCeOHTCT8mchBonxQ== dependencies: - allure-js-commons "2.4.0" + allure-js-commons "2.5.0" anser@^2.0.1: version "2.1.1" @@ -8895,10 +8895,10 @@ pkg-up@^3.1.0: dependencies: find-up "^3.0.0" -playwright-core@1.35.1: - version "1.35.1" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.35.1.tgz#52c1e6ffaa6a8c29de1a5bdf8cce0ce290ffb81d" - integrity sha512-pNXb6CQ7OqmGDRspEjlxE49w+4YtR6a3X6mT1hZXeJHWmsEz7SunmvZeiG/+y1yyMZdHnnn73WKYdtV1er0Xyg== +playwright-core@1.37.1: + version "1.37.1" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.37.1.tgz#cb517d52e2e8cb4fa71957639f1cd105d1683126" + integrity sha512-17EuQxlSIYCmEMwzMqusJ2ztDgJePjrbttaefgdsiqeLWidjYz9BxXaTaZWxH1J95SHGk6tjE+dwgWILJoUZfA== postcss-modules-extract-imports@^3.0.0: version "3.0.0" From 628d6d22a38956a7e08497cb64f8f53d5b3c47c1 Mon Sep 17 00:00:00 2001 From: Mark Sujew Date: Tue, 22 Aug 2023 15:56:35 +0200 Subject: [PATCH 25/79] Bundle `trash` dependency helpers in backend (#12797) --- .../src/native-webpack-plugin.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/dev-packages/native-webpack-plugin/src/native-webpack-plugin.ts b/dev-packages/native-webpack-plugin/src/native-webpack-plugin.ts index 56bcec68b4f6c..e3324c1d400f4 100644 --- a/dev-packages/native-webpack-plugin/src/native-webpack-plugin.ts +++ b/dev-packages/native-webpack-plugin/src/native-webpack-plugin.ts @@ -91,6 +91,7 @@ export class NativeWebpackPlugin { } ); compiler.hooks.afterEmit.tapAsync(NativeWebpackPlugin.name, async () => { + await this.copyTrashHelper(compiler); if (this.options.ripgrep) { await this.copyRipgrep(compiler); } @@ -127,6 +128,21 @@ export class NativeWebpackPlugin { } } + protected async copyTrashHelper(compiler: Compiler): Promise { + let sourceFile: string | undefined; + let targetFile: string | undefined; + if (process.platform === 'win32') { + sourceFile = require.resolve('trash/lib/windows-trash.exe'); + targetFile = path.join(compiler.outputPath, 'windows-trash.exe'); + } else if (process.platform === 'darwin') { + sourceFile = require.resolve('trash/lib/macos-trash'); + targetFile = path.join(compiler.outputPath, 'macos-trash'); + } + if (sourceFile && targetFile) { + await this.copyExecutable(sourceFile, targetFile); + } + } + protected async copyExecutable(source: string, target: string): Promise { const targetDirectory = path.dirname(target); await fs.promises.mkdir(targetDirectory, { recursive: true }); From 1890fbcfa31462fe2834f7b2f2f39302eec375bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=A4der?= Date: Thu, 24 Aug 2023 08:34:33 +0200 Subject: [PATCH 26/79] Implement VS Code tree view checkbox API. (#12836) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Contributed on behalf of STMicroelectronics Signed-off-by: Thomas Mäder --- CHANGELOG.md | 2 +- packages/core/src/browser/tree/tree-model.ts | 8 ++ .../core/src/browser/tree/tree-widget.tsx | 36 +++++++++ packages/core/src/browser/tree/tree.ts | 27 +++++++ .../plugin-ext/src/common/plugin-api-rpc.ts | 11 +++ .../main/browser/view/tree-view-widget.tsx | 38 +++++++++- .../src/main/browser/view/tree-views-main.ts | 8 ++ .../plugin-ext/src/plugin/plugin-context.ts | 2 + .../plugin-ext/src/plugin/tree/tree-views.ts | 64 ++++++++++++++-- packages/plugin-ext/src/plugin/types-impl.ts | 11 +++ packages/plugin/src/theia.d.ts | 73 +++++++++++++++++++ 11 files changed, 270 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f821fc0e16a0..33cad2171f03b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ - [Previous Changelogs](https://github.com/eclipse-theia/theia/tree/master/doc/changelogs/) ## v1.41.0 - - [application-package] Quit Electron app when back end fails to start [#12778](https://github.com/eclipse-theia/theia/pull/12778) - Contributed on behalf of STMicroelectronics. - +- [vscode] added support for tree checkbox api [#12836](https://github.com/eclipse-theia/theia/pull/12836) - Contributed on behalf of STMicroelectronics ## v1.40.0 - 07/27/2023 - [application-package] bumped the default supported VS Code API from `1.78.0` to `1.79.0` [#12764](https://github.com/eclipse-theia/theia/pull/12764) - Contributed on behalf of STMicroelectronics. diff --git a/packages/core/src/browser/tree/tree-model.ts b/packages/core/src/browser/tree/tree-model.ts index da808e5b2f0f7..97526a3da4c0d 100644 --- a/packages/core/src/browser/tree/tree-model.ts +++ b/packages/core/src/browser/tree/tree-model.ts @@ -472,6 +472,14 @@ export class TreeModelImpl implements TreeModel, SelectionProvider { + return this.tree.onDidUpdate; + } + + markAsChecked(node: TreeNode, checked: boolean): void { + this.tree.markAsChecked(node, checked); + } + } export namespace TreeModelImpl { export interface State { diff --git a/packages/core/src/browser/tree/tree-widget.tsx b/packages/core/src/browser/tree/tree-widget.tsx index 0809cc59fc725..d2034c3fd0421 100644 --- a/packages/core/src/browser/tree/tree-widget.tsx +++ b/packages/core/src/browser/tree/tree-widget.tsx @@ -252,6 +252,7 @@ export class TreeWidget extends ReactWidget implements StatefulWidget { this.model.onSelectionChanged(() => this.scheduleUpdateScrollToRow({ resize: false })), this.focusService.onDidChangeFocus(() => this.scheduleUpdateScrollToRow({ resize: false })), this.model.onDidChangeBusy(() => this.update()), + this.model.onDidUpdate(() => this.update()), this.model.onNodeRefreshed(() => this.updateDecorations()), this.model.onExpansionChanged(() => this.updateDecorations()), this.decoratorService, @@ -578,6 +579,40 @@ export class TreeWidget extends ReactWidget implements StatefulWidget {
; } + /** + * Render the node expansion toggle. + * @param node the tree node. + * @param props the node properties. + */ + protected renderCheckbox(node: TreeNode, props: NodeProps): React.ReactNode { + if (node.checkboxInfo === undefined) { + // eslint-disable-next-line no-null/no-null + return null; + } + return this.toggleChecked(event)} />; + } + + protected toggleChecked(event: React.MouseEvent): void { + const nodeId = event.currentTarget.getAttribute('data-node-id'); + if (nodeId) { + const node = this.model.getNode(nodeId); + if (node) { + this.model.markAsChecked(node, !node.checkboxInfo!.checked); + } else { + this.handleClickEvent(node, event); + } + } + event.preventDefault(); + event.stopPropagation(); + } /** * Render the tree node caption given the node properties. * @param node the tree node. @@ -905,6 +940,7 @@ export class TreeWidget extends ReactWidget implements StatefulWidget { const attributes = this.createNodeAttributes(node, props); const content =
{this.renderExpansionToggle(node, props)} + {this.renderCheckbox(node, props)} {this.decorateIcon(node, this.renderIcon(node, props))} {this.renderCaptionAffixes(node, props, 'captionPrefixes')} {this.renderCaption(node, props)} diff --git a/packages/core/src/browser/tree/tree.ts b/packages/core/src/browser/tree/tree.ts index 8289639e41fb4..3e78cab724d47 100644 --- a/packages/core/src/browser/tree/tree.ts +++ b/packages/core/src/browser/tree/tree.ts @@ -20,6 +20,7 @@ import { Disposable, DisposableCollection } from '../../common/disposable'; import { CancellationToken, CancellationTokenSource } from '../../common/cancellation'; import { timeout } from '../../common/promise-util'; import { isObject, Mutable } from '../../common'; +import { AccessibilityInformation } from '../../common/accessibility'; export const Tree = Symbol('Tree'); @@ -70,6 +71,19 @@ export interface Tree extends Disposable { * A token source of the given token should be canceled to unmark. */ markAsBusy(node: Readonly, ms: number, token: CancellationToken): Promise; + + /** + * An update to the tree node occurred, but the tree structure remains unchanged + */ + readonly onDidUpdate: Event; + + markAsChecked(node: TreeNode, checked: boolean): void; +} + +export interface TreeViewItemCheckboxInfo { + checked: boolean; + tooltip?: string; + accessibilityInformation?: AccessibilityInformation } /** @@ -120,6 +134,11 @@ export interface TreeNode { * Whether this node is busy. Greater than 0 then busy; otherwise not. */ readonly busy?: number; + + /** + * Whether this node is checked. + */ + readonly checkboxInfo?: TreeViewItemCheckboxInfo; } export namespace TreeNode { @@ -238,6 +257,8 @@ export class TreeImpl implements Tree { protected readonly onDidChangeBusyEmitter = new Emitter(); readonly onDidChangeBusy = this.onDidChangeBusyEmitter.event; + protected readonly onDidUpdateEmitter = new Emitter(); + readonly onDidUpdate = this.onDidUpdateEmitter.event; protected nodes: { [id: string]: Mutable | undefined @@ -368,6 +389,12 @@ export class TreeImpl implements Tree { await this.doMarkAsBusy(node, ms, token); } } + + markAsChecked(node: Mutable, checked: boolean): void { + node.checkboxInfo!.checked = checked; + this.onDidUpdateEmitter.fire([node]); + } + protected async doMarkAsBusy(node: Mutable, ms: number, token: CancellationToken): Promise { try { await timeout(ms, token); diff --git a/packages/plugin-ext/src/common/plugin-api-rpc.ts b/packages/plugin-ext/src/common/plugin-api-rpc.ts index 2857dbb4d106f..394f38a174da6 100644 --- a/packages/plugin-ext/src/common/plugin-api-rpc.ts +++ b/packages/plugin-ext/src/common/plugin-api-rpc.ts @@ -118,6 +118,7 @@ import { isString, isObject, PickOptions, QuickInputButtonHandle } from '@theia/ import { Severity } from '@theia/core/lib/common/severity'; import { DebugConfiguration, DebugSessionOptions } from '@theia/debug/lib/common/debug-configuration'; import { LanguagePackBundle } from './language-pack-service'; +import { AccessibilityInformation } from '@theia/core/lib/common/accessibility'; export interface PreferenceData { [scope: number]: any; @@ -736,6 +737,7 @@ export interface DialogsMain { } export interface RegisterTreeDataProviderOptions { + manageCheckboxStateManually?: boolean; showCollapseAll?: boolean canSelectMany?: boolean dragMimeTypes?: string[] @@ -768,6 +770,7 @@ export class DataTransferFileDTO { } export interface TreeViewsExt { + $checkStateChanged(treeViewId: string, itemIds: { id: string, checked: boolean }[]): Promise; $dragStarted(treeViewId: string, treeItemIds: string[], token: CancellationToken): Promise; $dragEnd(treeViewId: string): Promise; $drop(treeViewId: string, treeItemId: string | undefined, dataTransferItems: [string, string | DataTransferFileDTO][], token: CancellationToken): Promise; @@ -779,6 +782,12 @@ export interface TreeViewsExt { $setVisible(treeViewId: string, visible: boolean): Promise; } +export interface TreeViewItemCheckboxInfo { + checked: boolean; + tooltip?: string; + accessibilityInformation?: AccessibilityInformation +} + export interface TreeViewItem { id: string; @@ -801,6 +810,8 @@ export interface TreeViewItem { collapsibleState?: TreeViewItemCollapsibleState; + checkboxInfo?: TreeViewItemCheckboxInfo; + contextValue?: string; command?: Command; diff --git a/packages/plugin-ext/src/main/browser/view/tree-view-widget.tsx b/packages/plugin-ext/src/main/browser/view/tree-view-widget.tsx index 1d34ac5658dc9..f1f47f3aafa47 100644 --- a/packages/plugin-ext/src/main/browser/view/tree-view-widget.tsx +++ b/packages/plugin-ext/src/main/browser/view/tree-view-widget.tsx @@ -50,7 +50,7 @@ import { AccessibilityInformation } from '@theia/plugin'; import { ColorRegistry } from '@theia/core/lib/browser/color-registry'; import { DecoratedTreeNode } from '@theia/core/lib/browser/tree/tree-decorator'; import { WidgetDecoration } from '@theia/core/lib/browser/widget-decoration'; -import { CancellationTokenSource, CancellationToken } from '@theia/core/lib/common'; +import { CancellationTokenSource, CancellationToken, Mutable } from '@theia/core/lib/common'; import { mixin } from '../../../common/types'; import { Deferred } from '@theia/core/lib/common/promise-util'; import { DnDFileContentStore } from './dnd-file-content-store'; @@ -165,6 +165,7 @@ export namespace CompositeTreeViewNode { @injectable() export class TreeViewWidgetOptions { id: string; + manageCheckboxStateManually: boolean | undefined; showCollapseAll: boolean | undefined; multiSelect: boolean | undefined; dragMimeTypes: string[] | undefined; @@ -272,6 +273,37 @@ export class PluginTree extends TreeImpl { }, update); } + override markAsChecked(node: Mutable, checked: boolean): void { + function findParentsToChange(child: TreeNode, nodes: TreeNode[]): void { + if ((child.parent?.checkboxInfo !== undefined && child.parent.checkboxInfo.checked !== checked) && + (!checked || !child.parent.children.some(candidate => candidate !== child && candidate.checkboxInfo?.checked === false))) { + nodes.push(child.parent); + findParentsToChange(child.parent, nodes); + } + } + + function findChildrenToChange(parent: TreeNode, nodes: TreeNode[]): void { + if (CompositeTreeNode.is(parent)) { + parent.children.forEach(child => { + if (child.checkboxInfo !== undefined && child.checkboxInfo.checked !== checked) { + nodes.push(child); + } + findChildrenToChange(child, nodes); + }); + } + } + + const nodesToChange = [node]; + if (!this.options.manageCheckboxStateManually) { + findParentsToChange(node, nodesToChange); + findChildrenToChange(node, nodesToChange); + + } + nodesToChange.forEach(n => n.checkboxInfo!.checked = checked); + this.onDidUpdateEmitter.fire(nodesToChange); + this.proxy?.$checkStateChanged(this.options.id, [{ id: node.id, checked: checked }]); + } + /** Creates a resolvable tree node. If a node already exists, reset it because the underlying TreeViewItem might have been disposed in the backend. */ protected createResolvableTreeNode(item: TreeViewItem, parent: CompositeTreeNode): TreeNode { const update: Partial = this.createTreeNodeUpdate(item); @@ -328,6 +360,7 @@ export class PluginTree extends TreeImpl { tooltip: item.tooltip, contextValue: item.contextValue, command: item.command, + checkboxInfo: item.checkboxInfo, accessibilityInformation: item.accessibilityInformation, }; } @@ -496,6 +529,7 @@ export class TreeViewWidget extends TreeViewWelcomeWidget { ...attrs, onMouseLeave: () => source?.cancel(), onMouseEnter: async event => { + const target = event.currentTarget; // event.currentTarget will be null after awaiting node resolve() if (configuredTip) { if (MarkdownString.is(node.tooltip)) { this.hoverService.requestHover({ @@ -524,7 +558,7 @@ export class TreeViewWidget extends TreeViewWelcomeWidget { const title = node.tooltip || (node.resourceUri && this.labelProvider.getLongName(new URI(node.resourceUri))) || this.toNodeName(node); - event.currentTarget.title = title; + target.title = title; } configuredTip = true; } diff --git a/packages/plugin-ext/src/main/browser/view/tree-views-main.ts b/packages/plugin-ext/src/main/browser/view/tree-views-main.ts index 9bd9edb22d073..7809098732fbf 100644 --- a/packages/plugin-ext/src/main/browser/view/tree-views-main.ts +++ b/packages/plugin-ext/src/main/browser/view/tree-views-main.ts @@ -63,6 +63,7 @@ export class TreeViewsMainImpl implements TreeViewsMain, Disposable { this.treeViewProviders.set(treeViewId, this.viewRegistry.registerViewDataProvider(treeViewId, async ({ state, viewInfo }) => { const options: TreeViewWidgetOptions = { id: treeViewId, + manageCheckboxStateManually: $options.manageCheckboxStateManually, showCollapseAll: $options.showCollapseAll, multiSelect: $options.canSelectMany, dragMimeTypes: $options.dragMimeTypes, @@ -183,6 +184,13 @@ export class TreeViewsMainImpl implements TreeViewsMain, Disposable { } } + async setChecked(treeViewWidget: TreeViewWidget, changedNodes: TreeViewNode[]): Promise { + await this.proxy.$checkStateChanged(treeViewWidget.id, changedNodes.map(node => ({ + id: node.id, + checked: !!node.checkboxInfo?.checked + }))); + } + protected handleTreeEvents(treeViewId: string, treeViewWidget: TreeViewWidget): void { this.toDispose.push(treeViewWidget.model.onExpansionChanged(event => { this.proxy.$setExpanded(treeViewId, event.id, event.expanded); diff --git a/packages/plugin-ext/src/plugin/plugin-context.ts b/packages/plugin-ext/src/plugin/plugin-context.ts index 90ca33946d3dc..e29d624f91b79 100644 --- a/packages/plugin-ext/src/plugin/plugin-context.ts +++ b/packages/plugin-ext/src/plugin/plugin-context.ts @@ -98,6 +98,7 @@ import { DataTransfer, TreeItem, TreeItemCollapsibleState, + TreeItemCheckboxState, DocumentSymbol, SymbolTag, WorkspaceEdit, @@ -1291,6 +1292,7 @@ export function createAPIFactory( DataTransfer, TreeItem, TreeItemCollapsibleState, + TreeItemCheckboxState, SymbolKind, SymbolTag, DocumentSymbol, diff --git a/packages/plugin-ext/src/plugin/tree/tree-views.ts b/packages/plugin-ext/src/plugin/tree/tree-views.ts index 6715ee9d6a715..1b62c35505bfc 100644 --- a/packages/plugin-ext/src/plugin/tree/tree-views.ts +++ b/packages/plugin-ext/src/plugin/tree/tree-views.ts @@ -18,14 +18,14 @@ import { TreeDataProvider, TreeView, TreeViewExpansionEvent, TreeItem, TreeItemLabel, - TreeViewSelectionChangeEvent, TreeViewVisibilityChangeEvent, CancellationToken, DataTransferFile, TreeViewOptions, ViewBadge + TreeViewSelectionChangeEvent, TreeViewVisibilityChangeEvent, CancellationToken, DataTransferFile, TreeViewOptions, ViewBadge, TreeCheckboxChangeEvent } from '@theia/plugin'; // TODO: extract `@theia/util` for event, disposable, cancellation and common types // don't use @theia/core directly from plugin host import { Emitter } from '@theia/core/lib/common/event'; import { basename } from '@theia/core/lib/common/paths'; import { Disposable, DisposableCollection } from '@theia/core/lib/common/disposable'; -import { DataTransfer, DataTransferItem, Disposable as PluginDisposable, ThemeIcon } from '../types-impl'; +import { DataTransfer, DataTransferItem, Disposable as PluginDisposable, ThemeIcon, TreeItemCheckboxState } from '../types-impl'; import { Plugin, PLUGIN_RPC_CONTEXT, TreeViewsExt, TreeViewsMain, TreeViewItem, TreeViewRevealOptions, DataTransferFileDTO } from '../../common/plugin-api-rpc'; import { RPCProtocol } from '../../common/rpc-protocol'; import { CommandRegistryImpl, CommandsConverter } from '../command-registry'; @@ -33,6 +33,7 @@ import { TreeViewItemReference } from '../../common'; import { PluginIconPath } from '../plugin-icon-path'; import { URI } from '@theia/core/shared/vscode-uri'; import { UriComponents } from '@theia/core/lib/common/uri'; +import { isObject } from '@theia/core'; export class TreeViewsExtImpl implements TreeViewsExt { private proxy: TreeViewsMain; @@ -54,6 +55,9 @@ export class TreeViewsExtImpl implements TreeViewsExt { } }); } + $checkStateChanged(treeViewId: string, itemIds: { id: string; checked: boolean; }[]): Promise { + return this.getTreeView(treeViewId).checkStateChanged(itemIds); + } $dragStarted(treeViewId: string, treeItemIds: string[], token: CancellationToken): Promise { return this.getTreeView(treeViewId).onDragStarted(treeItemIds, token); } @@ -107,6 +111,9 @@ export class TreeViewsExtImpl implements TreeViewsExt { get onDidChangeVisibility() { return treeView.onDidChangeVisibility; }, + get onDidChangeCheckboxState() { + return treeView.onDidChangeCheckboxState; + }, get message(): string { return treeView.message; }, @@ -211,6 +218,9 @@ class TreeViewExtImpl implements Disposable { private readonly onDidChangeVisibilityEmitter = new Emitter(); readonly onDidChangeVisibility = this.onDidChangeVisibilityEmitter.event; + private readonly onDidChangeCheckboxStateEmitter = new Emitter>(); + readonly onDidChangeCheckboxState = this.onDidChangeCheckboxStateEmitter.event; + private readonly nodes = new Map>(); private pendingRefresh = Promise.resolve(); @@ -234,7 +244,12 @@ class TreeViewExtImpl implements Disposable { // make copies of optionally provided MIME types: const dragMimeTypes = options.dragAndDropController?.dragMimeTypes?.slice(); const dropMimeTypes = options.dragAndDropController?.dropMimeTypes?.slice(); - proxy.$registerTreeDataProvider(treeViewId, { showCollapseAll: options.showCollapseAll, canSelectMany: options.canSelectMany, dragMimeTypes, dropMimeTypes }); + proxy.$registerTreeDataProvider(treeViewId, { + manageCheckboxStateManually: options.manageCheckboxStateManually, + showCollapseAll: options.showCollapseAll, + canSelectMany: options.canSelectMany, + dragMimeTypes, dropMimeTypes + }); this.toDispose.push(Disposable.create(() => this.proxy.$unregisterTreeDataProvider(treeViewId))); options.treeDataProvider.onDidChangeTreeData?.(() => { this.pendingRefresh = proxy.$refresh(treeViewId); @@ -399,7 +414,7 @@ class TreeViewExtImpl implements Disposable { const treeItem = await this.options.treeDataProvider.getTreeItem(value); // Convert theia.TreeItem to the TreeViewItem - const label = this.getItemLabel(treeItem); + const label = this.getItemLabel(treeItem) || ''; const highlights = this.getTreeItemLabelHighlights(treeItem); // Generate the ID @@ -433,7 +448,22 @@ class TreeViewExtImpl implements Disposable { iconUrl = PluginIconPath.toUrl(iconPath, this.plugin); } - const treeViewItem = { + let checkboxInfo; + if (treeItem.checkboxState === undefined) { + checkboxInfo = undefined; + } else if (isObject(treeItem.checkboxState)) { + checkboxInfo = { + checked: treeItem.checkboxState.state === TreeItemCheckboxState.Checked, + tooltip: treeItem.checkboxState.tooltip, + accessibilityInformation: treeItem.accessibilityInformation + }; + } else { + checkboxInfo = { + checked: treeItem.checkboxState === TreeItemCheckboxState.Checked + }; + } + + const treeViewItem: TreeViewItem = { id, label, highlights, @@ -443,11 +473,12 @@ class TreeViewExtImpl implements Disposable { description: treeItem.description, resourceUri: treeItem.resourceUri, tooltip: treeItem.tooltip, - collapsibleState: treeItem.collapsibleState, + collapsibleState: treeItem.collapsibleState?.valueOf(), + checkboxInfo: checkboxInfo, contextValue: treeItem.contextValue, command: this.commandsConverter.toSafeCommand(treeItem.command, toDisposeElement), accessibilityInformation: treeItem.accessibilityInformation - } as TreeViewItem; + }; node.treeViewItem = treeViewItem; return treeViewItem; @@ -511,6 +542,25 @@ class TreeViewExtImpl implements Disposable { } } + async checkStateChanged(items: readonly { id: string; checked: boolean; }[]): Promise { + const transformed: [T, TreeItemCheckboxState][] = []; + items.forEach(item => { + const node = this.nodes.get(item.id); + if (node) { + if (node.value) { + transformed.push([node.value, item.checked ? TreeItemCheckboxState.Checked : TreeItemCheckboxState.Unchecked]); + } + if (node.treeViewItem) { + node.treeViewItem.checkboxInfo!.checked = item.checked; + } + } + }); + + this.onDidChangeCheckboxStateEmitter.fire({ + items: transformed + }); + } + async resolveTreeItem(treeItemId: string, token: CancellationToken): Promise { if (!this.options.treeDataProvider.resolveTreeItem) { return undefined; diff --git a/packages/plugin-ext/src/plugin/types-impl.ts b/packages/plugin-ext/src/plugin/types-impl.ts index 012e8f128e90b..18b15b374b8dc 100644 --- a/packages/plugin-ext/src/plugin/types-impl.ts +++ b/packages/plugin-ext/src/plugin/types-impl.ts @@ -1908,6 +1908,12 @@ export class TreeItem { contextValue?: string; + checkboxState?: theia.TreeItemCheckboxState | { + readonly state: theia.TreeItemCheckboxState; + readonly tooltip?: string; + readonly accessibilityInformation?: AccessibilityInformation + }; + constructor(label: string | theia.TreeItemLabel, collapsibleState?: theia.TreeItemCollapsibleState) constructor(resourceUri: URI, collapsibleState?: theia.TreeItemCollapsibleState) constructor(arg1: string | theia.TreeItemLabel | URI, public collapsibleState: theia.TreeItemCollapsibleState = TreeItemCollapsibleState.None) { @@ -1925,6 +1931,11 @@ export enum TreeItemCollapsibleState { Expanded = 2 } +export enum TreeItemCheckboxState { + Unchecked = 0, + Checked = 1 +} + export enum SymbolTag { Deprecated = 1 } diff --git a/packages/plugin/src/theia.d.ts b/packages/plugin/src/theia.d.ts index 46655c88d1b19..c55570f398331 100644 --- a/packages/plugin/src/theia.d.ts +++ b/packages/plugin/src/theia.d.ts @@ -5944,6 +5944,44 @@ export module '@theia/plugin' { * array containing all selected tree items. */ canSelectMany?: boolean; + + /** + * By default, when the children of a tree item have already been fetched, child checkboxes are automatically managed based on the checked state of the parent tree item. + * If the tree item is collapsed by default (meaning that the children haven't yet been fetched) then child checkboxes will not be updated. + * To override this behavior and manage child and parent checkbox state in the extension, set this to `true`. + * + * Examples where {@link TreeViewOptions.manageCheckboxStateManually} is false, the default behavior: + * + * 1. A tree item is checked, then its children are fetched. The children will be checked. + * + * 2. A tree item's parent is checked. The tree item and all of it's siblings will be checked. + * - [ ] Parent + * - [ ] Child 1 + * - [ ] Child 2 + * When the user checks Parent, the tree will look like this: + * - [x] Parent + * - [x] Child 1 + * - [x] Child 2 + * + * 3. A tree item and all of it's siblings are checked. The parent will be checked. + * - [ ] Parent + * - [ ] Child 1 + * - [ ] Child 2 + * When the user checks Child 1 and Child 2, the tree will look like this: + * - [x] Parent + * - [x] Child 1 + * - [x] Child 2 + * + * 4. A tree item is unchecked. The parent will be unchecked. + * - [x] Parent + * - [x] Child 1 + * - [x] Child 2 + * When the user unchecks Child 1, the tree will look like this: + * - [ ] Parent + * - [ ] Child 1 + * - [x] Child 2 + */ + manageCheckboxStateManually?: boolean; } /** @@ -6157,6 +6195,16 @@ export module '@theia/plugin' { readonly value: number; } + /** + * An event describing the change in a tree item's checkbox state. + */ + export interface TreeCheckboxChangeEvent { + /** + * The items that were checked or unchecked. + */ + readonly items: ReadonlyArray<[T, TreeItemCheckboxState]>; + } + /** * Represents a Tree view */ @@ -6192,6 +6240,11 @@ export module '@theia/plugin' { */ readonly onDidChangeVisibility: Event; + /** + * An event to signal that an element or root has either been checked or unchecked. + */ + readonly onDidChangeCheckboxState: Event>; + /** * An optional human-readable message that will be rendered in the view. * Setting the message to null, undefined, or empty string will remove the message from the view. @@ -6364,6 +6417,12 @@ export module '@theia/plugin' { */ accessibilityInformation?: AccessibilityInformation; + /** + * {@link TreeItemCheckboxState TreeItemCheckboxState} of the tree item. + * {@link TreeDataProvider.onDidChangeTreeData onDidChangeTreeData} should be fired when {@link TreeItem.checkboxState checkboxState} changes. + */ + checkboxState?: TreeItemCheckboxState | { readonly state: TreeItemCheckboxState; readonly tooltip?: string; readonly accessibilityInformation?: AccessibilityInformation }; + /** * @param label A human-readable string describing this item * @param collapsibleState {@link TreeItemCollapsibleState TreeItemCollapsibleState} of the tree item. Default is [TreeItemCollapsibleState.None](#TreeItemCollapsibleState.None) @@ -6412,6 +6471,20 @@ export module '@theia/plugin' { highlights?: [number, number][]; } + /** + * Checkbox state of the tree item + */ + export enum TreeItemCheckboxState { + /** + * Determines an item is unchecked + */ + Unchecked = 0, + /** + * Determines an item is checked + */ + Checked = 1 + } + /** * Represents the configuration. It is a merged view of * From 0184f1692b68177fd08ce3d444f39181fde9bdbb Mon Sep 17 00:00:00 2001 From: vatsal-uppal-1997 Date: Thu, 24 Aug 2023 15:03:42 +0530 Subject: [PATCH 27/79] Fix for WebviewPanelSerializer not working in Theia (#12854) * Fixed webviews fail to restore on application start * Activate by event should be called with preserveWebview --- .../src/hosted/browser/hosted-plugin.ts | 23 ++++++++----------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/packages/plugin-ext/src/hosted/browser/hosted-plugin.ts b/packages/plugin-ext/src/hosted/browser/hosted-plugin.ts index df424168e1531..500d6f4b8d611 100644 --- a/packages/plugin-ext/src/hosted/browser/hosted-plugin.ts +++ b/packages/plugin-ext/src/hosted/browser/hosted-plugin.ts @@ -304,8 +304,6 @@ export class HostedPluginSupport { await this.startPlugins(contributionsByHost, toDisconnect); this.deferredDidStart.resolve(); - - this.restoreWebviews(); } /** @@ -757,7 +755,7 @@ export class HostedPluginSupport { return `${plugins} plugin${plugins === 1 ? '' : 's'}`; } - protected readonly webviewsToRestore = new Set(); + protected readonly webviewsToRestore = new Map(); protected readonly webviewRevivers = new Map Promise>(); registerWebviewReviver(viewType: string, reviver: (webview: WebviewWidget) => Promise): void { @@ -765,6 +763,10 @@ export class HostedPluginSupport { throw new Error(`Reviver for ${viewType} already registered`); } this.webviewRevivers.set(viewType, reviver); + + if (this.webviewsToRestore.has(viewType)) { + this.restoreWebview(this.webviewsToRestore.get(viewType) as WebviewWidget); + } } unregisterWebviewReviver(viewType: string): void { @@ -785,21 +787,14 @@ export class HostedPluginSupport { } protected preserveWebview(webview: WebviewWidget): void { - if (!this.webviewsToRestore.has(webview)) { - this.webviewsToRestore.add(webview); - webview.disposed.connect(() => this.webviewsToRestore.delete(webview)); - } - } - - protected restoreWebviews(): void { - for (const webview of this.webviewsToRestore) { - this.restoreWebview(webview); + if (!this.webviewsToRestore.has(webview.viewType)) { + this.activateByEvent(`onWebviewPanel:${webview.viewType}`); + this.webviewsToRestore.set(webview.viewType, webview); + webview.disposed.connect(() => this.webviewsToRestore.delete(webview.viewType)); } - this.webviewsToRestore.clear(); } protected async restoreWebview(webview: WebviewWidget): Promise { - await this.activateByEvent(`onWebviewPanel:${webview.viewType}`); const restore = this.webviewRevivers.get(webview.viewType); if (restore) { try { From 1f94559e1cc2e789d345e4b82c3ec010b6aa5aa2 Mon Sep 17 00:00:00 2001 From: Martin Fleck Date: Thu, 24 Aug 2023 17:14:34 +0200 Subject: [PATCH 28/79] Properly re-render problem widget and fix problem matching (#12802) - Ensure we re-render the tree model if the problem widget is activated - Update Ansi stripping to catch Windows 'clear screen' and other codes - Consistently use Theia URI in problem matcher protocol - Report exit status to terminal widget to avoid resize warning https://github.com/eclipse-theia/theia/issues/12724 --- .../src/browser/problem/problem-widget.tsx | 7 +- packages/process/src/node/terminal-process.ts | 68 ++++++++++++++++++- packages/task/src/browser/task-service.ts | 2 +- .../src/common/problem-matcher-protocol.ts | 3 +- .../task/src/node/process/process-task.ts | 17 ++--- .../src/node/task-abstract-line-matcher.ts | 13 ++-- .../src/node/task-problem-collector.spec.ts | 28 ++++---- .../src/browser/terminal-widget-impl.ts | 18 +++-- .../src/common/base-terminal-protocol.ts | 5 +- .../terminal/src/node/base-terminal-server.ts | 27 ++++++-- 10 files changed, 136 insertions(+), 52 deletions(-) diff --git a/packages/markers/src/browser/problem/problem-widget.tsx b/packages/markers/src/browser/problem/problem-widget.tsx index 567506a3c3cb8..079c74b5c2a35 100644 --- a/packages/markers/src/browser/problem/problem-widget.tsx +++ b/packages/markers/src/browser/problem/problem-widget.tsx @@ -21,7 +21,7 @@ import { ProblemTreeModel } from './problem-tree-model'; import { MarkerInfoNode, MarkerNode, MarkerRootNode } from '../marker-tree'; import { TreeWidget, TreeProps, ContextMenuRenderer, TreeNode, NodeProps, TreeModel, - ApplicationShell, Navigatable, ExpandableTreeNode, SelectableTreeNode, TREE_NODE_INFO_CLASS, codicon + ApplicationShell, Navigatable, ExpandableTreeNode, SelectableTreeNode, TREE_NODE_INFO_CLASS, codicon, Message } from '@theia/core/lib/browser'; import { DiagnosticSeverity } from '@theia/core/shared/vscode-languageserver-protocol'; import * as React from '@theia/core/shared/react'; @@ -73,6 +73,11 @@ export class ProblemWidget extends TreeWidget { })); } + protected override onActivateRequest(msg: Message): void { + super.onActivateRequest(msg); + this.update(); + } + protected updateFollowActiveEditor(): void { this.toDisposeOnCurrentWidgetChanged.dispose(); this.toDispose.push(this.toDisposeOnCurrentWidgetChanged); diff --git a/packages/process/src/node/terminal-process.ts b/packages/process/src/node/terminal-process.ts index 441a1d15f7849..f6879af71a08d 100644 --- a/packages/process/src/node/terminal-process.ts +++ b/packages/process/src/node/terminal-process.ts @@ -15,7 +15,7 @@ // ***************************************************************************** import { injectable, inject, named } from '@theia/core/shared/inversify'; -import { isWindows } from '@theia/core'; +import { Disposable, DisposableCollection, Emitter, Event, isWindows } from '@theia/core'; import { ILogger } from '@theia/core/lib/common'; import { Process, ProcessType, ProcessOptions, /* ProcessErrorEvent */ } from './process'; import { ProcessManager } from './process-manager'; @@ -54,6 +54,8 @@ export enum NodePtyErrors { export class TerminalProcess extends Process { protected readonly terminal: IPty | undefined; + private _delayedResizer: DelayedResizer | undefined; + private _exitCode: number | undefined; readonly outputStream = this.createOutputStream(); readonly errorStream = new DevNullStream({ autoDestroy: true }); @@ -79,6 +81,19 @@ export class TerminalProcess extends Process { } this.logger.debug('Starting terminal process', JSON.stringify(options, undefined, 2)); + // Delay resizes to avoid conpty not respecting very early resize calls + // see https://github.com/microsoft/vscode/blob/a1c783c/src/vs/platform/terminal/node/terminalProcess.ts#L177 + if (isWindows) { + this._delayedResizer = new DelayedResizer(); + this._delayedResizer.onTrigger(dimensions => { + this._delayedResizer?.dispose(); + this._delayedResizer = undefined; + if (dimensions.cols && dimensions.rows) { + this.resize(dimensions.cols, dimensions.rows); + } + }); + } + const startTerminal = (command: string): { terminal: IPty | undefined, inputStream: Writable } => { try { return this.createPseudoTerminal(command, options, ringBuffer); @@ -148,6 +163,7 @@ export class TerminalProcess extends Process { // signal value). If it was terminated because of a signal, the // signal parameter will hold the signal number and code should // be ignored. + this._exitCode = exitCode; if (signal === undefined || signal === 0) { this.onTerminalExit(exitCode, undefined); } else { @@ -208,8 +224,32 @@ export class TerminalProcess extends Process { } resize(cols: number, rows: number): void { + if (typeof cols !== 'number' || typeof rows !== 'number' || isNaN(cols) || isNaN(rows)) { + return; + } this.checkTerminal(); - this.terminal!.resize(cols, rows); + try { + // Ensure that cols and rows are always >= 1, this prevents a native exception in winpty. + cols = Math.max(cols, 1); + rows = Math.max(rows, 1); + + // Delay resize if needed + if (this._delayedResizer) { + this._delayedResizer.cols = cols; + this._delayedResizer.rows = rows; + return; + } + + this.terminal!.resize(cols, rows); + } catch (error) { + // swallow error if the pty has already exited + // see also https://github.com/microsoft/vscode/blob/a1c783c/src/vs/platform/terminal/node/terminalProcess.ts#L549 + if (this._exitCode !== undefined && + error.message !== 'ioctl(2) failed, EBADF' && + error.message !== 'Cannot resize a pty that has already exited') { + throw error; + } + } } write(data: string): void { @@ -224,3 +264,27 @@ export class TerminalProcess extends Process { } } + +/** + * Tracks the latest resize event to be trigger at a later point. + */ +class DelayedResizer extends DisposableCollection { + rows: number | undefined; + cols: number | undefined; + private _timeout: NodeJS.Timeout; + + private readonly _onTrigger = new Emitter<{ rows?: number; cols?: number }>(); + get onTrigger(): Event<{ rows?: number; cols?: number }> { return this._onTrigger.event; } + + constructor() { + super(); + this.push(this._onTrigger); + this._timeout = setTimeout(() => this._onTrigger.fire({ rows: this.rows, cols: this.cols }), 1000); + this.push(Disposable.create(() => clearTimeout(this._timeout))); + } + + override dispose(): void { + super.dispose(); + clearTimeout(this._timeout); + } +} diff --git a/packages/task/src/browser/task-service.ts b/packages/task/src/browser/task-service.ts index 5cbe911a62a56..fe863c06dc2d9 100644 --- a/packages/task/src/browser/task-service.ts +++ b/packages/task/src/browser/task-service.ts @@ -249,7 +249,7 @@ export class TaskService implements TaskConfigurationClient { } } } - const uri = new URI(problem.resource.path).withScheme(problem.resource.scheme); + const uri = problem.resource.withScheme(problem.resource.scheme); const document = this.monacoWorkspace.getTextDocument(uri.toString()); if (problem.description.applyTo === ApplyToKind.openDocuments && !!document || problem.description.applyTo === ApplyToKind.closedDocuments && !document || diff --git a/packages/task/src/common/problem-matcher-protocol.ts b/packages/task/src/common/problem-matcher-protocol.ts index df69afacf746c..bae7bbbcfe12a 100644 --- a/packages/task/src/common/problem-matcher-protocol.ts +++ b/packages/task/src/common/problem-matcher-protocol.ts @@ -21,10 +21,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { URI } from '@theia/core'; import { Severity } from '@theia/core/lib/common/severity'; import { Diagnostic } from '@theia/core/shared/vscode-languageserver-protocol'; -// TODO use URI from `@theia/core` instead -import { URI } from '@theia/core/shared/vscode-uri'; export enum ApplyToKind { allDocuments, diff --git a/packages/task/src/node/process/process-task.ts b/packages/task/src/node/process/process-task.ts index b8adfd3d516a2..8fa4a6570d9d8 100644 --- a/packages/task/src/node/process/process-task.ts +++ b/packages/task/src/node/process/process-task.ts @@ -27,21 +27,18 @@ import { TaskManager } from '../task-manager'; import { ProcessType, ProcessTaskInfo } from '../../common/process/task-protocol'; import { TaskExitedEvent } from '../../common/task-protocol'; -// copied from https://github.com/Microsoft/vscode/blob/1.33.1/src/vs/base/common/strings.ts -// Escape codes -// http://en.wikipedia.org/wiki/ANSI_escape_code -const EL = /\x1B\x5B[12]?K/g; // Erase in line -const COLOR_START = /\x1b\[\d+(;\d+)*m/g; // Color -const COLOR_END = /\x1b\[0?m/g; // Color +// copied from https://github.com/microsoft/vscode/blob/1.79.0/src/vs/base/common/strings.ts#L736 +const CSI_SEQUENCE = /(:?\x1b\[|\x9B)[=?>!]?[\d;:]*["$#'* ]?[a-zA-Z@^`{}|~]/g; + +// Plus additional markers for custom `\x1b]...\x07` instructions. +const CSI_CUSTOM_SEQUENCE = /\x1b\].*?\x07/g; export function removeAnsiEscapeCodes(str: string): string { if (str) { - str = str.replace(EL, ''); - str = str.replace(COLOR_START, ''); - str = str.replace(COLOR_END, ''); + str = str.replace(CSI_SEQUENCE, '').replace(CSI_CUSTOM_SEQUENCE, ''); } - return str.trimRight(); + return str.trimEnd(); } export const TaskProcessOptions = Symbol('TaskProcessOptions'); diff --git a/packages/task/src/node/task-abstract-line-matcher.ts b/packages/task/src/node/task-abstract-line-matcher.ts index 9aa4796b425b7..85a487a070534 100644 --- a/packages/task/src/node/task-abstract-line-matcher.ts +++ b/packages/task/src/node/task-abstract-line-matcher.ts @@ -26,10 +26,9 @@ import { ProblemMatch, ProblemMatchData, ProblemLocationKind } from '../common/problem-matcher-protocol'; import URI from '@theia/core/lib/common/uri'; -// TODO use only URI from '@theia/core' -import { URI as vscodeURI } from '@theia/core/shared/vscode-uri'; import { Severity } from '@theia/core/lib/common/severity'; import { MAX_SAFE_INTEGER } from '@theia/core/lib/common/numbers'; +import { join } from 'path'; const endOfLine: string = EOL; @@ -247,7 +246,7 @@ export abstract class AbstractLineMatcher { return Severity.toDiagnosticSeverity(result); } - private getResource(filename: string, matcher: ProblemMatcher): vscodeURI { + private getResource(filename: string, matcher: ProblemMatcher): URI { const kind = matcher.fileLocation; let fullPath: string | undefined; if (kind === FileLocationKind.Absolute) { @@ -257,19 +256,15 @@ export abstract class AbstractLineMatcher { if (relativeFileName.startsWith('./')) { relativeFileName = relativeFileName.slice(2); } - fullPath = new URI(matcher.filePrefix).resolve(relativeFileName).path.toString(); + fullPath = join(matcher.filePrefix, relativeFileName); } if (fullPath === undefined) { throw new Error('FileLocationKind is not actionable. Does the matcher have a filePrefix? This should never happen.'); } - fullPath = fullPath.replace(/\\/g, '/'); - if (fullPath[0] !== '/') { - fullPath = '/' + fullPath; - } if (matcher.uriProvider !== undefined) { return matcher.uriProvider(fullPath); } else { - return vscodeURI.file(fullPath); + return URI.fromFilePath(fullPath); } } diff --git a/packages/task/src/node/task-problem-collector.spec.ts b/packages/task/src/node/task-problem-collector.spec.ts index c86c62fb22fa8..56c42644c0e6a 100644 --- a/packages/task/src/node/task-problem-collector.spec.ts +++ b/packages/task/src/node/task-problem-collector.spec.ts @@ -14,11 +14,11 @@ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 // ***************************************************************************** -import { expect } from 'chai'; +import { Severity } from '@theia/core/lib/common/severity'; import { DiagnosticSeverity } from '@theia/core/shared/vscode-languageserver-protocol'; -import { ProblemCollector } from './task-problem-collector'; +import { expect } from 'chai'; import { ApplyToKind, FileLocationKind, ProblemLocationKind, ProblemMatch, ProblemMatchData, ProblemMatcher } from '../common/problem-matcher-protocol'; -import { Severity } from '@theia/core/lib/common/severity'; +import { ProblemCollector } from './task-problem-collector'; const startStopMatcher1: ProblemMatcher = { owner: 'test1', @@ -130,7 +130,7 @@ describe('ProblemCollector', () => { expect(allMatches.length).to.eq(3); - expect((allMatches[0] as ProblemMatchData).resource!.path).eq('/home/test/hello.go'); + expect((allMatches[0] as ProblemMatchData).resource!.path.toString()).eq('/home/test/hello.go'); expect((allMatches[0] as ProblemMatchData).marker).deep.equal({ range: { start: { line: 8, character: 1 }, end: { line: 8, character: 1 } }, severity: DiagnosticSeverity.Error, @@ -138,7 +138,7 @@ describe('ProblemCollector', () => { message: 'undefined: fmt.Pntln' }); - expect((allMatches[1] as ProblemMatchData).resource!.path).eq('/home/test/hello.go'); + expect((allMatches[1] as ProblemMatchData).resource!.path.toString()).eq('/home/test/hello.go'); expect((allMatches[1] as ProblemMatchData).marker).deep.equal({ range: { start: { line: 9, character: 5 }, end: { line: 9, character: 5 } }, severity: DiagnosticSeverity.Error, @@ -146,7 +146,7 @@ describe('ProblemCollector', () => { message: 'undefined: numb' }); - expect((allMatches[2] as ProblemMatchData).resource!.path).eq('/home/test/hello.go'); + expect((allMatches[2] as ProblemMatchData).resource!.path.toString()).eq('/home/test/hello.go'); expect((allMatches[2] as ProblemMatchData).marker).deep.equal({ range: { start: { line: 14, character: 8 }, end: { line: 14, character: 8 } }, severity: DiagnosticSeverity.Error, @@ -176,7 +176,7 @@ describe('ProblemCollector', () => { expect(allMatches.length).to.eq(4); - expect((allMatches[0] as ProblemMatchData).resource!.path).eq('/home/test/test-dir.js'); + expect((allMatches[0] as ProblemMatchData).resource!.path.toString()).eq('/home/test/test-dir.js'); expect((allMatches[0] as ProblemMatchData).marker).deep.equal({ range: { start: { line: 13, character: 20 }, end: { line: 13, character: 20 } }, severity: DiagnosticSeverity.Warning, @@ -185,7 +185,7 @@ describe('ProblemCollector', () => { code: 'semi' }); - expect((allMatches[1] as ProblemMatchData).resource!.path).eq('/home/test/test-dir.js'); + expect((allMatches[1] as ProblemMatchData).resource!.path.toString()).eq('/home/test/test-dir.js'); expect((allMatches[1] as ProblemMatchData).marker).deep.equal({ range: { start: { line: 14, character: 22 }, end: { line: 14, character: 22 } }, severity: DiagnosticSeverity.Warning, @@ -194,7 +194,7 @@ describe('ProblemCollector', () => { code: 'semi' }); - expect((allMatches[2] as ProblemMatchData).resource!.path).eq('/home/test/test-dir.js'); + expect((allMatches[2] as ProblemMatchData).resource!.path.toString()).eq('/home/test/test-dir.js'); expect((allMatches[2] as ProblemMatchData).marker).deep.equal({ range: { start: { line: 102, character: 8 }, end: { line: 102, character: 8 } }, severity: DiagnosticSeverity.Error, @@ -202,7 +202,7 @@ describe('ProblemCollector', () => { message: 'Parsing error: Unexpected token inte' }); - expect((allMatches[3] as ProblemMatchData).resource!.path).eq('/home/test/more-test.js'); + expect((allMatches[3] as ProblemMatchData).resource!.path.toString()).eq('/home/test/more-test.js'); expect((allMatches[3] as ProblemMatchData).marker).deep.equal({ range: { start: { line: 12, character: 8 }, end: { line: 12, character: 8 } }, severity: DiagnosticSeverity.Error, @@ -232,7 +232,7 @@ describe('ProblemCollector', () => { expect(allMatches.length).to.eq(4); - expect((allMatches[0] as ProblemMatchData).resource?.path).eq('/home/test/test-dir.js'); + expect((allMatches[0] as ProblemMatchData).resource?.path.toString()).eq('/home/test/test-dir.js'); expect((allMatches[0] as ProblemMatchData).marker).deep.equal({ range: { start: { line: 0, character: 0 }, end: { line: 0, character: 0 } }, severity: DiagnosticSeverity.Warning, @@ -241,7 +241,7 @@ describe('ProblemCollector', () => { code: 'semi' }); - expect((allMatches[1] as ProblemMatchData).resource?.path).eq('/home/test/test-dir.js'); + expect((allMatches[1] as ProblemMatchData).resource?.path.toString()).eq('/home/test/test-dir.js'); expect((allMatches[1] as ProblemMatchData).marker).deep.equal({ range: { start: { line: 0, character: 0 }, end: { line: 0, character: 0 } }, severity: DiagnosticSeverity.Warning, @@ -250,7 +250,7 @@ describe('ProblemCollector', () => { code: 'semi' }); - expect((allMatches[2] as ProblemMatchData).resource?.path).eq('/home/test/test-dir.js'); + expect((allMatches[2] as ProblemMatchData).resource?.path.toString()).eq('/home/test/test-dir.js'); expect((allMatches[2] as ProblemMatchData).marker).deep.equal({ range: { start: { line: 0, character: 0 }, end: { line: 0, character: 0 } }, severity: DiagnosticSeverity.Error, @@ -258,7 +258,7 @@ describe('ProblemCollector', () => { message: 'Parsing error: Unexpected token inte' }); - expect((allMatches[3] as ProblemMatchData).resource?.path).eq('/home/test/more-test.js'); + expect((allMatches[3] as ProblemMatchData).resource?.path.toString()).eq('/home/test/more-test.js'); expect((allMatches[3] as ProblemMatchData).marker).deep.equal({ range: { start: { line: 0, character: 0 }, end: { line: 0, character: 0 } }, severity: DiagnosticSeverity.Error, diff --git a/packages/terminal/src/browser/terminal-widget-impl.ts b/packages/terminal/src/browser/terminal-widget-impl.ts index 0fb4695889033..76eddef0ba81c 100644 --- a/packages/terminal/src/browser/terminal-widget-impl.ts +++ b/packages/terminal/src/browser/terminal-widget-impl.ts @@ -206,21 +206,25 @@ export class TerminalWidgetImpl extends TerminalWidget implements StatefulWidget }); this.toDispose.push(titleChangeListenerDispose); - this.toDispose.push(this.terminalWatcher.onTerminalError(({ terminalId, error }) => { + this.toDispose.push(this.terminalWatcher.onTerminalError(({ terminalId, error, attached }) => { if (terminalId === this.terminalId) { this.exitStatus = { code: undefined, reason: TerminalExitReason.Process }; - this.dispose(); this.logger.error(`The terminal process terminated. Cause: ${error}`); + if (!attached) { + this.dispose(); + } } })); - this.toDispose.push(this.terminalWatcher.onTerminalExit(({ terminalId, code, reason }) => { + this.toDispose.push(this.terminalWatcher.onTerminalExit(({ terminalId, code, reason, attached }) => { if (terminalId === this.terminalId) { if (reason) { this.exitStatus = { code, reason }; } else { this.exitStatus = { code, reason: TerminalExitReason.Process }; } - this.dispose(); + if (!attached) { + this.dispose(); + } } })); this.toDispose.push(this.toDisposeOnConnect); @@ -502,6 +506,8 @@ export class TerminalWidgetImpl extends TerminalWidget implements StatefulWidget protected async attachTerminal(id: number): Promise { const terminalId = await this.shellTerminalServer.attach(id); if (IBaseTerminalServer.validateId(terminalId)) { + // reset exit status if a new terminal process is attached + this.exitStatus = undefined; return terminalId; } this.logger.warn(`Failed attaching to terminal id ${id}, the terminal is most likely gone. Starting up a new terminal instead.`); @@ -776,7 +782,9 @@ export class TerminalWidgetImpl extends TerminalWidget implements StatefulWidget return; } if (!IBaseTerminalServer.validateId(this.terminalId) - || !this.terminalService.getById(this.id)) { + || this.exitStatus + || !this.terminalService.getById(this.id) + ) { return; } const { cols, rows } = this.term; diff --git a/packages/terminal/src/common/base-terminal-protocol.ts b/packages/terminal/src/common/base-terminal-protocol.ts index 23474b66e50f7..c597b97bf856a 100644 --- a/packages/terminal/src/common/base-terminal-protocol.ts +++ b/packages/terminal/src/common/base-terminal-protocol.ts @@ -67,6 +67,8 @@ export interface IBaseTerminalExitEvent { code?: number; reason?: TerminalExitReason; signal?: string; + + attached?: boolean; } export enum TerminalExitReason { @@ -79,7 +81,8 @@ export enum TerminalExitReason { export interface IBaseTerminalErrorEvent { terminalId: number; - error: Error + error: Error; + attached?: boolean; } export interface IBaseTerminalClient { diff --git a/packages/terminal/src/node/base-terminal-server.ts b/packages/terminal/src/node/base-terminal-server.ts index 786ebb440f47e..ae86faf5fcec5 100644 --- a/packages/terminal/src/node/base-terminal-server.ts +++ b/packages/terminal/src/node/base-terminal-server.ts @@ -77,6 +77,8 @@ export abstract class BaseTerminalServer implements IBaseTerminalServer { // Didn't execute `unregisterProcess` on terminal `exit` event to enable attaching task output to terminal, // Fixes https://github.com/eclipse-theia/theia/issues/2961 terminal.unregisterProcess(); + } else { + this.postAttachAttempted(terminal); } } } @@ -142,7 +144,7 @@ export abstract class BaseTerminalServer implements IBaseTerminalServer { this.client.updateTerminalEnvVariables(); } - protected postCreate(term: TerminalProcess): void { + protected notifyClientOnExit(term: TerminalProcess): DisposableCollection { const toDispose = new DisposableCollection(); toDispose.push(term.onError(error => { @@ -150,8 +152,9 @@ export abstract class BaseTerminalServer implements IBaseTerminalServer { if (this.client !== undefined) { this.client.onTerminalError({ - 'terminalId': term.id, - 'error': new Error(`Failed to execute terminal process (${error.code})`), + terminalId: term.id, + error: new Error(`Failed to execute terminal process (${error.code})`), + attached: term instanceof TaskTerminalProcess && term.attachmentAttempted }); } })); @@ -159,14 +162,24 @@ export abstract class BaseTerminalServer implements IBaseTerminalServer { toDispose.push(term.onExit(event => { if (this.client !== undefined) { this.client.onTerminalExitChanged({ - 'terminalId': term.id, - 'code': event.code, - 'reason': TerminalExitReason.Process, - 'signal': event.signal + terminalId: term.id, + code: event.code, + reason: TerminalExitReason.Process, + signal: event.signal, + attached: term instanceof TaskTerminalProcess && term.attachmentAttempted }); } })); + return toDispose; + } + + protected postCreate(term: TerminalProcess): void { + const toDispose = this.notifyClientOnExit(term); + this.terminalToDispose.set(term.id, toDispose); + } + protected postAttachAttempted(term: TaskTerminalProcess): void { + const toDispose = this.notifyClientOnExit(term); this.terminalToDispose.set(term.id, toDispose); } From 572072403a5eecb5c769a30964d134e4b1b93d78 Mon Sep 17 00:00:00 2001 From: Johannes Faltermeier Date: Fri, 25 Aug 2023 12:18:54 +0200 Subject: [PATCH 29/79] [vscode] Support EnvironmentVariableCollection description #12696 (#12838) * add new field to EnvironmentVariableCollection and implement interface * add description to SerializableExtensionEnvironmentVariableCollection and use as DTO in $setEnvironmentVariableCollection * add fromMarkdownOrString method to converter * allow widgets to customize the enhanced preview node * implement enhanced preview for terminal widget Contributed on behalf of STMicroelectronics Signed-off-by: Johannes Faltermeier --- packages/core/src/browser/shell/tab-bars.ts | 9 ++- .../widgets/enhanced-preview-widget.ts | 27 ++++++++ .../plugin-ext/src/common/plugin-api-rpc.ts | 4 +- .../src/main/browser/terminal-main.ts | 10 +-- .../plugin-ext/src/plugin/terminal-ext.ts | 14 +++- .../plugin-ext/src/plugin/type-converters.ts | 10 +++ packages/plugin/src/theia.d.ts | 6 ++ .../src/browser/base/terminal-widget.ts | 4 ++ .../browser/terminal-frontend-contribution.ts | 2 +- .../src/browser/terminal-widget-impl.ts | 66 ++++++++++++++++++- .../src/common/base-terminal-protocol.ts | 8 ++- .../terminal/src/node/base-terminal-server.ts | 20 +++++- 12 files changed, 164 insertions(+), 16 deletions(-) create mode 100644 packages/core/src/browser/widgets/enhanced-preview-widget.ts diff --git a/packages/core/src/browser/shell/tab-bars.ts b/packages/core/src/browser/shell/tab-bars.ts index 6d02fa6cdb84b..c43f42c73bbcf 100644 --- a/packages/core/src/browser/shell/tab-bars.ts +++ b/packages/core/src/browser/shell/tab-bars.ts @@ -38,6 +38,7 @@ import { Root, createRoot } from 'react-dom/client'; import { SelectComponent } from '../widgets/select-component'; import { createElement } from 'react'; import { PreviewableWidget } from '../widgets/previewable-widget'; +import { EnhancedPreviewWidget } from '../widgets/enhanced-preview-widget'; /** The class name added to hidden content nodes, which are required to render vertical side bars. */ const HIDDEN_CONTENT_CLASS = 'theia-TabBar-hidden-content'; @@ -504,7 +505,13 @@ export class TabBarRenderer extends TabBar.Renderer { labelElement.classList.add('theia-horizontal-tabBar-hover-title'); labelElement.textContent = title.label; hoverBox.append(labelElement); - if (title.caption) { + const widget = title.owner; + if (EnhancedPreviewWidget.is(widget)) { + const enhancedPreviewNode = widget.getEnhancedPreviewNode(); + if (enhancedPreviewNode) { + hoverBox.appendChild(enhancedPreviewNode); + } + } else if (title.caption) { const captionElement = document.createElement('p'); captionElement.classList.add('theia-horizontal-tabBar-hover-caption'); captionElement.textContent = title.caption; diff --git a/packages/core/src/browser/widgets/enhanced-preview-widget.ts b/packages/core/src/browser/widgets/enhanced-preview-widget.ts new file mode 100644 index 0000000000000..923394da08035 --- /dev/null +++ b/packages/core/src/browser/widgets/enhanced-preview-widget.ts @@ -0,0 +1,27 @@ +// ***************************************************************************** +// Copyright (C) 2023 STMicroelectronics and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { isFunction, isObject } from '../../common'; + +export interface EnhancedPreviewWidget { + getEnhancedPreviewNode(): Node | undefined; +} + +export namespace EnhancedPreviewWidget { + export function is(arg: unknown): arg is EnhancedPreviewWidget { + return isObject(arg) && isFunction(arg.getEnhancedPreviewNode); + } +} diff --git a/packages/plugin-ext/src/common/plugin-api-rpc.ts b/packages/plugin-ext/src/common/plugin-api-rpc.ts index 394f38a174da6..f6273b5eddc58 100644 --- a/packages/plugin-ext/src/common/plugin-api-rpc.ts +++ b/packages/plugin-ext/src/common/plugin-api-rpc.ts @@ -111,7 +111,7 @@ import type { TimelineChangeEvent, TimelineProviderDescriptor } from '@theia/timeline/lib/common/timeline-model'; -import { SerializableEnvironmentVariableCollection } from '@theia/terminal/lib/common/base-terminal-protocol'; +import { SerializableEnvironmentVariableCollection, SerializableExtensionEnvironmentVariableCollection } from '@theia/terminal/lib/common/base-terminal-protocol'; import { ThemeType } from '@theia/core/lib/common/theme'; import { Disposable } from '@theia/core/lib/common/disposable'; import { isString, isObject, PickOptions, QuickInputButtonHandle } from '@theia/core/lib/common'; @@ -405,7 +405,7 @@ export interface TerminalServiceMain { */ $disposeByTerminalId(id: number, waitOnExit?: boolean | string): void; - $setEnvironmentVariableCollection(extensionIdentifier: string, persistent: boolean, collection: SerializableEnvironmentVariableCollection | undefined): void; + $setEnvironmentVariableCollection(persistent: boolean, collection: SerializableExtensionEnvironmentVariableCollection): void; /** * Set the terminal widget name. diff --git a/packages/plugin-ext/src/main/browser/terminal-main.ts b/packages/plugin-ext/src/main/browser/terminal-main.ts index 61bb2912df614..b68d5a800881f 100644 --- a/packages/plugin-ext/src/main/browser/terminal-main.ts +++ b/packages/plugin-ext/src/main/browser/terminal-main.ts @@ -22,7 +22,7 @@ import { TerminalService } from '@theia/terminal/lib/browser/base/terminal-servi import { TerminalServiceMain, TerminalServiceExt, MAIN_RPC_CONTEXT } from '../../common/plugin-api-rpc'; import { RPCProtocol } from '../../common/rpc-protocol'; import { Disposable, DisposableCollection } from '@theia/core/lib/common/disposable'; -import { SerializableEnvironmentVariableCollection } from '@theia/terminal/lib/common/base-terminal-protocol'; +import { SerializableEnvironmentVariableCollection, SerializableExtensionEnvironmentVariableCollection } from '@theia/terminal/lib/common/base-terminal-protocol'; import { ShellTerminalServerProxy } from '@theia/terminal/lib/common/shell-terminal-protocol'; import { TerminalLink, TerminalLinkProvider } from '@theia/terminal/lib/browser/terminal-link-provider'; import { URI } from '@theia/core/lib/common/uri'; @@ -75,11 +75,11 @@ export class TerminalServiceMainImpl implements TerminalServiceMain, TerminalLin return this.extProxy.$startProfile(id, CancellationToken.None); } - $setEnvironmentVariableCollection(extensionIdentifier: string, persistent: boolean, collection: SerializableEnvironmentVariableCollection | undefined): void { - if (collection) { - this.shellTerminalServer.setCollection(extensionIdentifier, persistent, collection); + $setEnvironmentVariableCollection(persistent: boolean, collection: SerializableExtensionEnvironmentVariableCollection): void { + if (collection.collection) { + this.shellTerminalServer.setCollection(collection.extensionIdentifier, persistent, collection.collection, collection.description); } else { - this.shellTerminalServer.deleteCollection(extensionIdentifier); + this.shellTerminalServer.deleteCollection(collection.extensionIdentifier); } } diff --git a/packages/plugin-ext/src/plugin/terminal-ext.ts b/packages/plugin-ext/src/plugin/terminal-ext.ts index f062d28b97a7c..0cdfaeb886d4b 100644 --- a/packages/plugin-ext/src/plugin/terminal-ext.ts +++ b/packages/plugin-ext/src/plugin/terminal-ext.ts @@ -20,6 +20,7 @@ import { RPCProtocol } from '../common/rpc-protocol'; import { Event, Emitter } from '@theia/core/lib/common/event'; import { Deferred } from '@theia/core/lib/common/promise-util'; import * as theia from '@theia/plugin'; +import * as Converter from './type-converters'; import { Disposable, EnvironmentVariableMutatorType, TerminalExitReason, ThemeIcon } from './types-impl'; import { SerializableEnvironmentVariableCollection } from '@theia/terminal/lib/common/base-terminal-protocol'; import { ProvidedTerminalLink } from '../common/plugin-api-rpc-model'; @@ -313,7 +314,11 @@ export class TerminalServiceExtImpl implements TerminalServiceExt { private syncEnvironmentVariableCollection(extensionIdentifier: string, collection: EnvironmentVariableCollection): void { const serialized = [...collection.map.entries()]; - this.proxy.$setEnvironmentVariableCollection(extensionIdentifier, collection.persistent, serialized.length === 0 ? undefined : serialized); + this.proxy.$setEnvironmentVariableCollection(collection.persistent, { + extensionIdentifier, + collection: serialized.length === 0 ? undefined : serialized, + description: Converter.fromMarkdownOrString(collection.description) + }); } private setEnvironmentVariableCollection(extensionIdentifier: string, collection: EnvironmentVariableCollection): void { @@ -339,8 +344,15 @@ export class TerminalServiceExtImpl implements TerminalServiceExt { export class EnvironmentVariableCollection implements theia.EnvironmentVariableCollection { readonly map: Map = new Map(); + private _description?: string | theia.MarkdownString; private _persistent: boolean = true; + public get description(): string | theia.MarkdownString | undefined { return this._description; } + public set description(value: string | theia.MarkdownString | undefined) { + this._description = value; + this.onDidChangeCollectionEmitter.fire(); + } + public get persistent(): boolean { return this._persistent; } public set persistent(value: boolean) { this._persistent = value; diff --git a/packages/plugin-ext/src/plugin/type-converters.ts b/packages/plugin-ext/src/plugin/type-converters.ts index f3c123fb0cec7..797758b79c3cd 100644 --- a/packages/plugin-ext/src/plugin/type-converters.ts +++ b/packages/plugin-ext/src/plugin/type-converters.ts @@ -201,6 +201,16 @@ export function fromMarkdown(markup: theia.MarkdownString | theia.MarkedString): } } +export function fromMarkdownOrString(value: string | theia.MarkdownString | undefined): string | MarkdownStringDTO | undefined { + if (value === undefined) { + return undefined; + } else if (typeof value === 'string') { + return value; + } else { + return fromMarkdown(value); + } +} + export function toMarkdown(value: MarkdownStringDTO): PluginMarkdownStringImpl { const implemented = new PluginMarkdownStringImpl(value.value, value.supportThemeIcons); implemented.isTrusted = value.isTrusted; diff --git a/packages/plugin/src/theia.d.ts b/packages/plugin/src/theia.d.ts index c55570f398331..6bb9ec8aa30ee 100644 --- a/packages/plugin/src/theia.d.ts +++ b/packages/plugin/src/theia.d.ts @@ -3585,6 +3585,12 @@ export module '@theia/plugin' { * A collection of mutations that an extension can apply to a process environment. */ export interface EnvironmentVariableCollection { + + /** + * A description for the environment variable collection, this will be used to describe the changes in the UI. + */ + description: string | MarkdownString | undefined; + /** * Whether the collection should be cached for the workspace and applied to the terminal * across window reloads. When true the collection will be active immediately such when the diff --git a/packages/terminal/src/browser/base/terminal-widget.ts b/packages/terminal/src/browser/base/terminal-widget.ts index f5a5497fdc84c..b47b322299030 100644 --- a/packages/terminal/src/browser/base/terminal-widget.ts +++ b/packages/terminal/src/browser/base/terminal-widget.ts @@ -20,6 +20,7 @@ import { CommandLineOptions } from '@theia/process/lib/common/shell-command-buil import { TerminalSearchWidget } from '../search/terminal-search-widget'; import { TerminalProcessInfo, TerminalExitReason } from '../../common/base-terminal-protocol'; import URI from '@theia/core/lib/common/uri'; +import { MarkdownString } from '@theia/core/lib/common/markdown-rendering/markdown-string'; export interface TerminalDimensions { cols: number; @@ -58,6 +59,9 @@ export abstract class TerminalWidget extends BaseWidget { */ abstract processInfo: Promise; + /** The ids of extensions contributing to the environment of this terminal mapped to the provided description for their changes. */ + abstract envVarCollectionDescriptionsByExtension: Promise>; + /** Terminal kind that indicates whether a terminal is created by a user or by some extension for a user */ abstract readonly kind: 'user' | string; diff --git a/packages/terminal/src/browser/terminal-frontend-contribution.ts b/packages/terminal/src/browser/terminal-frontend-contribution.ts index bd31ca3a32968..5916ab41f399e 100644 --- a/packages/terminal/src/browser/terminal-frontend-contribution.ts +++ b/packages/terminal/src/browser/terminal-frontend-contribution.ts @@ -250,7 +250,7 @@ export class TerminalFrontendContribution implements FrontendApplicationContribu this.storageService.getData(ENVIRONMENT_VARIABLE_COLLECTIONS_KEY).then(data => { if (data) { const collectionsJson: SerializableExtensionEnvironmentVariableCollection[] = JSON.parse(data); - collectionsJson.forEach(c => this.shellTerminalServer.setCollection(c.extensionIdentifier, true, c.collection)); + collectionsJson.forEach(c => this.shellTerminalServer.setCollection(c.extensionIdentifier, true, c.collection ? c.collection : [], c.description)); } }); }); diff --git a/packages/terminal/src/browser/terminal-widget-impl.ts b/packages/terminal/src/browser/terminal-widget-impl.ts index 76eddef0ba81c..1508c92a12bbe 100644 --- a/packages/terminal/src/browser/terminal-widget-impl.ts +++ b/packages/terminal/src/browser/terminal-widget-impl.ts @@ -43,6 +43,9 @@ import { Key } from '@theia/core/lib/browser/keys'; import { nls } from '@theia/core/lib/common/nls'; import { TerminalMenus } from './terminal-frontend-contribution'; import debounce = require('p-debounce'); +import { MarkdownString, MarkdownStringImpl } from '@theia/core/lib/common/markdown-rendering/markdown-string'; +import { EnhancedPreviewWidget } from '@theia/core/lib/browser/widgets/enhanced-preview-widget'; +import { MarkdownRenderer, MarkdownRendererFactory } from '@theia/core/lib/browser/markdown-rendering/markdown-renderer'; export const TERMINAL_WIDGET_FACTORY_ID = 'terminal'; @@ -57,7 +60,7 @@ export interface TerminalContribution { } @injectable() -export class TerminalWidgetImpl extends TerminalWidget implements StatefulWidget, ExtractableWidget { +export class TerminalWidgetImpl extends TerminalWidget implements StatefulWidget, ExtractableWidget, EnhancedPreviewWidget { readonly isExtractable: boolean = true; secondaryWindow: Window | undefined; location: TerminalLocationOptions; @@ -81,6 +84,7 @@ export class TerminalWidgetImpl extends TerminalWidget implements StatefulWidget protected lastMousePosition: { x: number, y: number } | undefined; protected isAttachedCloseListener: boolean = false; protected shown = false; + protected enhancedPreviewNode: Node | undefined; override lastCwd = new URI(); @inject(WorkspaceService) protected readonly workspaceService: WorkspaceService; @@ -98,6 +102,13 @@ export class TerminalWidgetImpl extends TerminalWidget implements StatefulWidget @inject(TerminalThemeService) protected readonly themeService: TerminalThemeService; @inject(ShellCommandBuilder) protected readonly shellCommandBuilder: ShellCommandBuilder; @inject(ContextMenuRenderer) protected readonly contextMenuRenderer: ContextMenuRenderer; + @inject(MarkdownRendererFactory) protected readonly markdownRendererFactory: MarkdownRendererFactory; + + protected _markdownRenderer: MarkdownRenderer | undefined; + protected get markdownRenderer(): MarkdownRenderer { + this._markdownRenderer ||= this.markdownRendererFactory(); + return this._markdownRenderer; + } protected readonly onDidOpenEmitter = new Emitter(); readonly onDidOpen: Event = this.onDidOpenEmitter.event; @@ -426,6 +437,13 @@ export class TerminalWidgetImpl extends TerminalWidget implements StatefulWidget return this.shellTerminalServer.getProcessInfo(this.terminalId); } + get envVarCollectionDescriptionsByExtension(): Promise> { + if (!IBaseTerminalServer.validateId(this.terminalId)) { + return Promise.reject(new Error('terminal is not started')); + } + return this.shellTerminalServer.getEnvVarCollectionDescriptionsByExtension(this.terminalId); + } + get terminalId(): number { return this._terminalId; } @@ -762,6 +780,10 @@ export class TerminalWidgetImpl extends TerminalWidget implements StatefulWidget if (this.exitStatus) { this.onTermDidClose.fire(this); } + if (this.enhancedPreviewNode) { + // don't use preview node anymore. rendered markdown will be disposed on super call + this.enhancedPreviewNode = undefined; + } super.dispose(); } @@ -867,4 +889,46 @@ export class TerminalWidgetImpl extends TerminalWidget implements StatefulWidget private disableEnterWhenAttachCloseListener(): boolean { return this.isAttachedCloseListener; } + + getEnhancedPreviewNode(): Node | undefined { + if (this.enhancedPreviewNode) { + return this.enhancedPreviewNode; + } + + this.enhancedPreviewNode = document.createElement('div'); + + Promise.all([this.envVarCollectionDescriptionsByExtension, this.processId, this.processInfo]) + .then((values: [Map, number, TerminalProcessInfo]) => { + const extensions = values[0]; + const processId = values[1]; + const processInfo = values[2]; + + const markdown = new MarkdownStringImpl(); + markdown.appendMarkdown('Process ID: ' + processId + '\\\n'); + markdown.appendMarkdown('Command line: ' + + processInfo.executable + + ' ' + + processInfo.arguments.join(' ') + + '\n\n---\n\n'); + markdown.appendMarkdown('The following extensions have contributed to this terminal\'s environment:\n'); + extensions.forEach((value, key) => { + if (value === undefined) { + markdown.appendMarkdown('* ' + key + '\n'); + } else if (typeof value === 'string') { + markdown.appendMarkdown('* ' + key + ': ' + value + '\n'); + } else { + markdown.appendMarkdown('* ' + key + ': ' + value.value + '\n'); + } + }); + + const enhancedPreviewNode = this.enhancedPreviewNode; + if (!this.isDisposed && enhancedPreviewNode) { + const result = this.markdownRenderer.render(markdown); + this.toDispose.push(result); + enhancedPreviewNode.appendChild(result.element); + } + }); + + return this.enhancedPreviewNode; + } } diff --git a/packages/terminal/src/common/base-terminal-protocol.ts b/packages/terminal/src/common/base-terminal-protocol.ts index c597b97bf856a..0655bd42dd94b 100644 --- a/packages/terminal/src/common/base-terminal-protocol.ts +++ b/packages/terminal/src/common/base-terminal-protocol.ts @@ -16,6 +16,7 @@ import { RpcServer } from '@theia/core/lib/common/messaging/proxy-factory'; import { Disposable } from '@theia/core'; +import { MarkdownString } from '@theia/core/lib/common/markdown-rendering/markdown-string'; export interface TerminalProcessInfo { executable: string @@ -28,6 +29,7 @@ export interface IBaseTerminalServer extends RpcServer { create(IBaseTerminalServerOptions: object): Promise; getProcessId(id: number): Promise; getProcessInfo(id: number): Promise; + getEnvVarCollectionDescriptionsByExtension(id: number): Promise>; getCwdURI(id: number): Promise; resize(id: number, cols: number, rows: number): Promise; attach(id: number): Promise; @@ -48,7 +50,7 @@ export interface IBaseTerminalServer extends RpcServer { /** * Sets an extension's environment variable collection. */ - setCollection(extensionIdentifier: string, persistent: boolean, collection: SerializableEnvironmentVariableCollection): void; + setCollection(extensionIdentifier: string, persistent: boolean, collection: SerializableEnvironmentVariableCollection, description: string | MarkdownString | undefined): void; /** * Deletes an extension's environment variable collection. */ @@ -157,6 +159,7 @@ export interface EnvironmentVariableCollection { export interface EnvironmentVariableCollectionWithPersistence extends EnvironmentVariableCollection { readonly persistent: boolean; + readonly description: string | MarkdownString | undefined; } export enum EnvironmentVariableMutatorType { @@ -189,7 +192,8 @@ export interface MergedEnvironmentVariableCollection { export interface SerializableExtensionEnvironmentVariableCollection { extensionIdentifier: string, - collection: SerializableEnvironmentVariableCollection + collection: SerializableEnvironmentVariableCollection | undefined, + description: string | MarkdownString | undefined } export type SerializableEnvironmentVariableCollection = [string, EnvironmentVariableMutator][]; diff --git a/packages/terminal/src/node/base-terminal-server.ts b/packages/terminal/src/node/base-terminal-server.ts index ae86faf5fcec5..d36b153649a53 100644 --- a/packages/terminal/src/node/base-terminal-server.ts +++ b/packages/terminal/src/node/base-terminal-server.ts @@ -33,6 +33,7 @@ import { } from '../common/base-terminal-protocol'; import { TerminalProcess, ProcessManager, TaskTerminalProcess } from '@theia/process/lib/node'; import { ShellProcess } from './shell-process'; +import { MarkdownString } from '@theia/core/lib/common/markdown-rendering/markdown-string'; @injectable() export abstract class BaseTerminalServer implements IBaseTerminalServer { @@ -102,6 +103,18 @@ export abstract class BaseTerminalServer implements IBaseTerminalServer { }; } + async getEnvVarCollectionDescriptionsByExtension(id: number): Promise> { + const terminal = this.processManager.get(id); + if (!(terminal instanceof TerminalProcess)) { + throw new Error(`terminal "${id}" does not exist`); + } + const result = new Map(); + this.collections.forEach((value, key) => { + result.set(key, value.description); + }); + return result; + } + async getCwdURI(id: number): Promise { const terminal = this.processManager.get(id); if (!(terminal instanceof TerminalProcess)) { @@ -189,8 +202,8 @@ export abstract class BaseTerminalServer implements IBaseTerminalServer { *--------------------------------------------------------------------------------------------*/ // some code copied and modified from https://github.com/microsoft/vscode/blob/1.49.0/src/vs/workbench/contrib/terminal/common/environmentVariableService.ts - setCollection(extensionIdentifier: string, persistent: boolean, collection: SerializableEnvironmentVariableCollection): void { - const translatedCollection = { persistent, map: new Map(collection) }; + setCollection(extensionIdentifier: string, persistent: boolean, collection: SerializableEnvironmentVariableCollection, description: string | MarkdownString | undefined): void { + const translatedCollection = { persistent, description, map: new Map(collection) }; this.collections.set(extensionIdentifier, translatedCollection); this.updateCollections(); } @@ -211,7 +224,8 @@ export abstract class BaseTerminalServer implements IBaseTerminalServer { if (collection.persistent) { collectionsJson.push({ extensionIdentifier, - collection: [...this.collections.get(extensionIdentifier)!.map.entries()] + collection: [...this.collections.get(extensionIdentifier)!.map.entries()], + description: collection.description }); } }); From 90015089638adf020268814b86bbebb68b577abe Mon Sep 17 00:00:00 2001 From: Martin Fleck Date: Fri, 25 Aug 2023 12:47:02 +0200 Subject: [PATCH 30/79] Ensure contributed problem patterns are found correctly (#12805) - Resolve pattern names correctly by removing leading '$' - Introduce utility function for dealing with variable names - Ensure 'ready' promises are already available with object creation Fixes https://github.com/eclipse-theia/theia/issues/12725 --- .../task/src/browser/task-configurations.ts | 5 ++- .../browser/task-problem-matcher-registry.ts | 18 ++++---- .../browser/task-problem-pattern-registry.ts | 9 ++-- .../task/src/browser/task-schema-updater.ts | 4 +- packages/task/src/browser/task-service.ts | 15 +++---- packages/task/src/common/index.ts | 1 + packages/task/src/common/task-util.ts | 43 +++++++++++++++++++ 7 files changed, 69 insertions(+), 26 deletions(-) create mode 100644 packages/task/src/common/task-util.ts diff --git a/packages/task/src/browser/task-configurations.ts b/packages/task/src/browser/task-configurations.ts index dac50d6a2b4b1..2ec5a9d24272e 100644 --- a/packages/task/src/browser/task-configurations.ts +++ b/packages/task/src/browser/task-configurations.ts @@ -21,7 +21,8 @@ import { TaskDefinition, TaskOutputPresentation, TaskConfigurationScope, - TaskScope + TaskScope, + asVariableName } from '../common'; import { TaskDefinitionRegistry } from './task-definition-registry'; import { ProvidedTaskConfigurations } from './provided-task-configurations'; @@ -349,7 +350,7 @@ export class TaskConfigurations implements Disposable { } else if (task.problemMatcher) { problemMatcher.push(task.problemMatcher.name!); } - customization.problemMatcher = problemMatcher.map(name => name.startsWith('$') ? name : `$${name}`); + customization.problemMatcher = problemMatcher.map(asVariableName); } if (task.group) { customization.group = task.group; diff --git a/packages/task/src/browser/task-problem-matcher-registry.ts b/packages/task/src/browser/task-problem-matcher-registry.ts index 63e05e26334e0..2c1438529759d 100644 --- a/packages/task/src/browser/task-problem-matcher-registry.ts +++ b/packages/task/src/browser/task-problem-matcher-registry.ts @@ -24,16 +24,18 @@ import { Event, Emitter } from '@theia/core/lib/common'; import { Disposable, DisposableCollection } from '@theia/core/lib/common/disposable'; import { ApplyToKind, FileLocationKind, NamedProblemMatcher, - ProblemPattern, ProblemMatcher, ProblemMatcherContribution, WatchingMatcher + ProblemPattern, ProblemMatcher, ProblemMatcherContribution, WatchingMatcher, + fromVariableName } from '../common'; import { ProblemPatternRegistry } from './task-problem-pattern-registry'; import { Severity } from '@theia/core/lib/common/severity'; +import { Deferred } from '@theia/core/lib/common/promise-util'; @injectable() export class ProblemMatcherRegistry { private readonly matchers = new Map(); - private readyPromise: Promise; + private readyPromise = new Deferred(); @inject(ProblemPatternRegistry) protected readonly problemPatternRegistry: ProblemPatternRegistry; @@ -47,13 +49,13 @@ export class ProblemMatcherRegistry { protected init(): void { this.problemPatternRegistry.onReady().then(() => { this.fillDefaults(); - this.readyPromise = new Promise((res, rej) => res(undefined)); + this.readyPromise.resolve(); this.onDidChangeProblemMatcherEmitter.fire(undefined); }); } onReady(): Promise { - return this.readyPromise; + return this.readyPromise.promise; } /** @@ -73,6 +75,7 @@ export class ProblemMatcherRegistry { this.doRegister(matcher, toDispose).then(() => this.onDidChangeProblemMatcherEmitter.fire(undefined)); return toDispose; } + protected async doRegister(matcher: ProblemMatcherContribution, toDispose: DisposableCollection): Promise { const problemMatcher = await this.getProblemMatcherFromContribution(matcher); if (toDispose.disposed) { @@ -88,10 +91,7 @@ export class ProblemMatcherRegistry { * @return the problem matcher. If the task definition is not found, `undefined` is returned. */ get(name: string): NamedProblemMatcher | undefined { - if (name.startsWith('$')) { - return this.matchers.get(name.slice(1)); - } - return this.matchers.get(name); + return this.matchers.get(fromVariableName(name)); } /** @@ -132,7 +132,7 @@ export class ProblemMatcherRegistry { if (matcher.pattern) { if (typeof matcher.pattern === 'string') { await this.problemPatternRegistry.onReady(); - const registeredPattern = this.problemPatternRegistry.get(matcher.pattern); + const registeredPattern = this.problemPatternRegistry.get(fromVariableName(matcher.pattern)); if (Array.isArray(registeredPattern)) { patterns.push(...registeredPattern); } else if (!!registeredPattern) { diff --git a/packages/task/src/browser/task-problem-pattern-registry.ts b/packages/task/src/browser/task-problem-pattern-registry.ts index 4c03c330bfaa3..3feb7e3711c52 100644 --- a/packages/task/src/browser/task-problem-pattern-registry.ts +++ b/packages/task/src/browser/task-problem-pattern-registry.ts @@ -19,23 +19,24 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { Disposable, DisposableCollection } from '@theia/core/lib/common/disposable'; +import { Deferred } from '@theia/core/lib/common/promise-util'; import { injectable, postConstruct } from '@theia/core/shared/inversify'; import { NamedProblemPattern, ProblemLocationKind, ProblemPattern, ProblemPatternContribution } from '../common'; -import { Disposable, DisposableCollection } from '@theia/core/lib/common/disposable'; @injectable() export class ProblemPatternRegistry { private readonly patterns = new Map(); - private readyPromise: Promise; + private readyPromise = new Deferred(); @postConstruct() protected init(): void { this.fillDefaults(); - this.readyPromise = new Promise((res, rej) => res(undefined)); + this.readyPromise.resolve(); } onReady(): Promise { - return this.readyPromise; + return this.readyPromise.promise; } /** diff --git a/packages/task/src/browser/task-schema-updater.ts b/packages/task/src/browser/task-schema-updater.ts index ad5231af090cf..6c03dfea1f295 100644 --- a/packages/task/src/browser/task-schema-updater.ts +++ b/packages/task/src/browser/task-schema-updater.ts @@ -30,7 +30,7 @@ import { inputsSchema } from '@theia/variable-resolver/lib/browser/variable-inpu import URI from '@theia/core/lib/common/uri'; import { ProblemMatcherRegistry } from './task-problem-matcher-registry'; import { TaskDefinitionRegistry } from './task-definition-registry'; -import { TaskServer } from '../common'; +import { TaskServer, asVariableName } from '../common'; import { UserStorageUri } from '@theia/userstorage/lib/browser'; import { WorkspaceService } from '@theia/workspace/lib/browser'; import { JSONObject } from '@theia/core/shared/@phosphor/coreutils'; @@ -213,7 +213,7 @@ export class TaskSchemaUpdater implements JsonSchemaContribution { /** Gets the most up-to-date names of problem matchers from the registry and update the task schema */ private updateProblemMatcherNames(): void { - const matcherNames = this.problemMatcherRegistry.getAll().map(m => m.name.startsWith('$') ? m.name : `$${m.name}`); + const matcherNames = this.problemMatcherRegistry.getAll().map(m => asVariableName(m.name)); problemMatcherNames.length = 0; problemMatcherNames.push(...matcherNames); this.update(); diff --git a/packages/task/src/browser/task-service.ts b/packages/task/src/browser/task-service.ts index fe863c06dc2d9..16557cfed57b5 100644 --- a/packages/task/src/browser/task-service.ts +++ b/packages/task/src/browser/task-service.ts @@ -48,7 +48,8 @@ import { TaskInfo, TaskOutputPresentation, TaskOutputProcessedEvent, - TaskServer + TaskServer, + asVariableName } from '../common'; import { TaskWatcher } from '../common/task-watcher'; import { ProvidedTaskConfigurations } from './provided-task-configurations'; @@ -908,13 +909,9 @@ export class TaskService implements TaskConfigurationClient { async updateTaskConfiguration(token: number, task: TaskConfiguration, update: { [name: string]: any }): Promise { if (update.problemMatcher) { if (Array.isArray(update.problemMatcher)) { - update.problemMatcher.forEach((name, index) => { - if (!name.startsWith('$')) { - update.problemMatcher[index] = `$${update.problemMatcher[index]}`; - } - }); - } else if (!update.problemMatcher.startsWith('$')) { - update.problemMatcher = `$${update.problemMatcher}`; + update.problemMatcher.forEach((_name, index) => update.problemMatcher[index] = asVariableName(update.problemMatcher[index])); + } else { + update.problemMatcher = asVariableName(update.problemMatcher); } } this.taskConfigurations.updateTaskConfig(token, task, update); @@ -1041,7 +1038,7 @@ export class TaskService implements TaskConfigurationClient { ({ label: matcher.label, value: { problemMatchers: [matcher] }, - description: matcher.name.startsWith('$') ? matcher.name : `$${matcher.name}` + description: asVariableName(matcher.name) }) )); return items; diff --git a/packages/task/src/common/index.ts b/packages/task/src/common/index.ts index d44cfdac92e1b..40b71394e5169 100644 --- a/packages/task/src/common/index.ts +++ b/packages/task/src/common/index.ts @@ -17,3 +17,4 @@ export * from './task-protocol'; export * from './task-watcher'; export * from './problem-matcher-protocol'; +export * from './task-util'; diff --git a/packages/task/src/common/task-util.ts b/packages/task/src/common/task-util.ts new file mode 100644 index 0000000000000..b4532f818ca4f --- /dev/null +++ b/packages/task/src/common/task-util.ts @@ -0,0 +1,43 @@ +// ***************************************************************************** +// Copyright (C) 2023 EclipseSource and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +/** + * Converts the given standard name to a variable name starting with '$' if not already present. + * + * Variable names are used, for instance, to reference problem matchers, within task configurations. + * + * @param name standard name + * @returns variable name with leading '$' if not already present. + * + * @see {@link fromVariableName} for the reverse conversion. + */ +export function asVariableName(name: string): string { + return name.startsWith('$') ? name : `$${name}`; +} + +/** + * Converts a given variable name to a standard name, effectively removing a leading '$' if present. + * + * Standard names are used, for instance, in registries to store variable objects + * + * @param name variable name + * @returns variable name without leading '$' if present. + * + * @see {@link asVariableName} for the reverse conversion. + */ +export function fromVariableName(name: string): string { + return name.startsWith('$') ? name.slice(1) : name; +} From 2d3149059811c25ab8f4677907d4ad2048858951 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20Mar=C3=A9chal?= Date: Mon, 28 Aug 2023 09:19:13 -0400 Subject: [PATCH 31/79] repo: upgrade from node `16` to node `>=18` (#12711) The commit includes the following changes: - update deps for node 18.x - update breaking changes - update workflows - make sure node-gyp is installed - update logger tests - update docs - force ipv4 and improve ipv6 support - fix backend address messaging - update backend cli options - update runtime policy - fix backend cli - use node 18.x in gitpod image - keep using node 16.x in workflow Using Node 20.x it seems like Yarn complains about missing `node-gyp`. It will actually shortcut the first call to `yarn install` when it is missing in order to automatically install it. Instead we'll explicitly make sure that node-gyp is installed. --- .github/workflows/ci-cd.yml | 8 +++-- .github/workflows/license-check.yml | 2 +- .github/workflows/performance-tests.yml | 7 ++-- .github/workflows/playwright.yml | 7 ++-- .github/workflows/publish-gh-pages.yml | 5 +-- .github/workflows/translation.yml | 5 +-- .gitpod.dockerfile | 2 +- CHANGELOG.md | 10 +++++- .../src/generator/backend-generator.ts | 4 +-- dev-packages/cli/src/run-test.ts | 8 +++-- doc/Developing.md | 4 +-- doc/runtime-policy.md | 3 +- package.json | 6 ++-- packages/core/src/node/backend-application.ts | 35 ++++++++++++++++--- .../src/node/logger-cli-contribution.spec.ts | 2 +- packages/core/src/node/main.ts | 7 +--- packages/plugin-ext/package.json | 2 +- packages/plugin-ext/src/typings/index.d.ts | 25 ------------- yarn.lock | 16 ++++----- 19 files changed, 85 insertions(+), 73 deletions(-) delete mode 100644 packages/plugin-ext/src/typings/index.d.ts diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml index ec70347f5a8e1..3273d4f7dd4a7 100644 --- a/.github/workflows/ci-cd.yml +++ b/.github/workflows/ci-cd.yml @@ -20,10 +20,10 @@ jobs: - name: Checkout uses: actions/checkout@v3 - - name: Use Node.js 16.x + - name: Use Node.js 18.x uses: actions/setup-node@v3 with: - node-version: 16.x + node-version: 18.x registry-url: 'https://registry.npmjs.org' - name: Use Python 3.x @@ -34,6 +34,7 @@ jobs: - name: Install and Build shell: bash run: | + yarn global add node-gyp yarn --skip-integrity-check --network-timeout 100000 ./scripts/check_git_status.sh env: @@ -51,7 +52,7 @@ jobs: fail-fast: false matrix: os: [windows-2019, ubuntu-latest, macos-11] - node: [16.x] + node: [16.x, 18.x, 20.x] runs-on: ${{ matrix.os }} timeout-minutes: 60 @@ -74,6 +75,7 @@ jobs: - name: Install shell: bash run: | + yarn global add node-gyp yarn --skip-integrity-check --network-timeout 100000 ./scripts/check_git_status.sh env: diff --git a/.github/workflows/license-check.yml b/.github/workflows/license-check.yml index b130974e52550..82a562fa2adeb 100644 --- a/.github/workflows/license-check.yml +++ b/.github/workflows/license-check.yml @@ -20,7 +20,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest] - node: ['16.x'] + node: ['18.x'] java: ['11'] runs-on: ${{ matrix.os }} diff --git a/.github/workflows/performance-tests.yml b/.github/workflows/performance-tests.yml index 1ac5e5742e4e7..065de46991490 100644 --- a/.github/workflows/performance-tests.yml +++ b/.github/workflows/performance-tests.yml @@ -6,7 +6,7 @@ on: jobs: build-and-test-performance: name: Performance Tests - + runs-on: ubuntu-latest timeout-minutes: 30 @@ -14,10 +14,10 @@ jobs: - name: Checkout uses: actions/checkout@v3 - - name: Use Node.js 16.x + - name: Use Node.js 18.x uses: actions/setup-node@v3 with: - node-version: "16.x" + node-version: "18.x" registry-url: "https://registry.npmjs.org" - name: Use Python 3.x @@ -28,6 +28,7 @@ jobs: - name: Build shell: bash run: | + yarn global add node-gyp yarn --skip-integrity-check --network-timeout 100000 --ignore-engines yarn build:examples env: diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index dce1bde8f6678..7746e7a2e251f 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -13,7 +13,7 @@ on: jobs: build-and-test-playwright: - name: Playwright Tests (ubuntu-latest, Node.js 16.x) + name: Playwright Tests (ubuntu-latest, Node.js 18.x) runs-on: ubuntu-latest timeout-minutes: 60 @@ -22,10 +22,10 @@ jobs: - name: Checkout uses: actions/checkout@v3 - - name: Use Node.js "16.x" + - name: Use Node.js "18.x" uses: actions/setup-node@v3 with: - node-version: "16.x" + node-version: "18.x" registry-url: "https://registry.npmjs.org" - name: Use Python 3.x @@ -36,6 +36,7 @@ jobs: - name: Build Browser shell: bash run: | + yarn global add node-gyp yarn --skip-integrity-check --network-timeout 100000 yarn browser build env: diff --git a/.github/workflows/publish-gh-pages.yml b/.github/workflows/publish-gh-pages.yml index 1d524d4857e9a..68e5311ca3004 100644 --- a/.github/workflows/publish-gh-pages.yml +++ b/.github/workflows/publish-gh-pages.yml @@ -19,10 +19,10 @@ jobs: with: fetch-depth: 0 # To fetch all history for all branches and tags. (Will be required for caching with lerna: https://github.com/markuplint/markuplint/pull/111) - - name: Use Node.js 16.x + - name: Use Node.js 18.x uses: actions/setup-node@v3 with: - node-version: '16.x' + node-version: '18.x' registry-url: 'https://registry.npmjs.org' - name: Use Python 3.x @@ -32,6 +32,7 @@ jobs: - name: Pre-npm-Publish run: | + yarn global add node-gyp yarn --skip-integrity-check --network-timeout 100000 env: NODE_OPTIONS: --max_old_space_size=4096 diff --git a/.github/workflows/translation.yml b/.github/workflows/translation.yml index cf7b792940cfc..c341e4637e830 100644 --- a/.github/workflows/translation.yml +++ b/.github/workflows/translation.yml @@ -12,10 +12,10 @@ jobs: - name: Checkout uses: actions/checkout@v3 - - name: Use Node.js 16.x + - name: Use Node.js 18.x uses: actions/setup-node@v3 with: - node-version: 16.x + node-version: 18.x registry-url: "https://registry.npmjs.org" - name: Use Python 3.x @@ -26,6 +26,7 @@ jobs: - name: Install and Build shell: bash run: | + yarn global add node-gyp yarn --skip-integrity-check --network-timeout 100000 env: NODE_OPTIONS: --max_old_space_size=4096 diff --git a/.gitpod.dockerfile b/.gitpod.dockerfile index 156d7aa676e31..4ca3b09bb0137 100644 --- a/.gitpod.dockerfile +++ b/.gitpod.dockerfile @@ -17,7 +17,7 @@ RUN sudo apt-get update \ ENV SHELL=/bin/bash -ENV NODE_VERSION="16.14.0" +ENV NODE_VERSION="18.17.0" RUN bash -c ". .nvm/nvm.sh \ && nvm install $NODE_VERSION \ && nvm use $NODE_VERSION \ diff --git a/CHANGELOG.md b/CHANGELOG.md index 33cad2171f03b..9aa2b61c9c882 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,9 +3,17 @@ ## History - [Previous Changelogs](https://github.com/eclipse-theia/theia/tree/master/doc/changelogs/) -## v1.41.0 - + +## v1.41.0 + - [application-package] Quit Electron app when back end fails to start [#12778](https://github.com/eclipse-theia/theia/pull/12778) - Contributed on behalf of STMicroelectronics. - [vscode] added support for tree checkbox api [#12836](https://github.com/eclipse-theia/theia/pull/12836) - Contributed on behalf of STMicroelectronics +- [core] Add `--dnsDefaultResultOrder ` CLI argument where `value` is one of `ipv4first`, `verbatim` or `nodeDefault`. It controls how domain names are resolved. + +[Breaking Changes:](#breaking_changes_1.41.0) + +- [deps] Bumped supported Node.js version from 16.x to >=18, you may need to update your environments. + ## v1.40.0 - 07/27/2023 - [application-package] bumped the default supported VS Code API from `1.78.0` to `1.79.0` [#12764](https://github.com/eclipse-theia/theia/pull/12764) - Contributed on behalf of STMicroelectronics. diff --git a/dev-packages/application-manager/src/generator/backend-generator.ts b/dev-packages/application-manager/src/generator/backend-generator.ts index d48e9484aa669..0a4a9f36edd17 100644 --- a/dev-packages/application-manager/src/generator/backend-generator.ts +++ b/dev-packages/application-manager/src/generator/backend-generator.ts @@ -161,9 +161,9 @@ BackendApplicationConfigProvider.set(${this.prettyStringify(this.pck.props.backe const serverModule = require('./server'); const serverAddress = main.start(serverModule()); -serverAddress.then(({ port, address }) => { +serverAddress.then(({ port, address, family }) => { if (process && process.send) { - process.send({ port, address }); + process.send({ port, address, family }); } }); diff --git a/dev-packages/cli/src/run-test.ts b/dev-packages/cli/src/run-test.ts index eab504cd5190e..2895d63481fae 100644 --- a/dev-packages/cli/src/run-test.ts +++ b/dev-packages/cli/src/run-test.ts @@ -79,7 +79,9 @@ export default async function runTest(options: TestOptions): Promise { } } }); - - const server = await start(); - await testPage.goto(`http://${server.address}:${server.port}`); + const { address, port } = await start(); + const url = net.isIPv6(address) + ? `http://[${address}]:${port}` + : `http://${address}:${port}`; + await testPage.goto(url); } diff --git a/doc/Developing.md b/doc/Developing.md index aa2f458af821d..cc19249bc041d 100644 --- a/doc/Developing.md +++ b/doc/Developing.md @@ -52,7 +52,7 @@ For Windows instructions [click here](#building-on-windows). ## Prerequisites - - Node.js `>= 16.14.0` and `< 17`. + - Node.js `>= 18.17.0` and `< 21`. - If you are interested in Theia's VS Code Extension support then you should use a Node version at least compatible with the one included in the version of Electron used by [VS Code](https://github.com/microsoft/vscode). - [Yarn package manager](https://yarnpkg.com/en/docs/install) `>= 1.7.0` **AND** `< 2.x.x`. - git (If you would like to use the Git-extension too, you will need to have git version 2.11.0 or higher.) @@ -508,7 +508,7 @@ etc.) by opening `packages//coverage/index.html`. - Install [`scoop`](https://github.com/lukesampson/scoop#installation). - Install [`nvm`](https://github.com/coreybutler/nvm-windows) with scoop: `scoop install nvm`. - - Install Node.js with `nvm`: `nvm install 16.15.1`, then use it: `nvm use 16.15.1`. You can list all available Node.js versions with `nvm list available` if you want to pick another version. + - Install Node.js with `nvm`: `nvm install 18.17.0`, then use it: `nvm use 18.17.0`. You can list all available Node.js versions with `nvm list available` if you want to pick another version. - Install `yarn`: `scoop install yarn`. - If you need to install `windows-build-tools`, see [`Installing Windows Build Tools`](#installing-windows-build-tools). - If you run into problems with installing the required build tools, the `node-gyp` documentation offers a useful [guide](https://github.com/nodejs/node-gyp#on-windows) how to install the dependencies manually. The versions required for building Theia are: diff --git a/doc/runtime-policy.md b/doc/runtime-policy.md index 2357b262486fe..551b1513c4b04 100644 --- a/doc/runtime-policy.md +++ b/doc/runtime-policy.md @@ -2,7 +2,7 @@ ## Version Support Policy -We try to support Node.js versions from 12 up to the current _Active LTS_ version. +We aim to support Node.js current _Active LTS_ version. See https://nodejs.org/en/about/releases/ to see the status of Node.js versions. @@ -15,6 +15,7 @@ Note that the Node.js version you should use depends on your own project's depen - Follow Node.js LTS cadence and initiate the update when a new Node.js version becomes _Active LTS_. - Use `@types/node` for the oldest supported Node version (backward compatibility). - Update the CI matrix to include the new Node.js versions to support. +- Update the documentation referencing recommended Node versions. - Update the CHANGELOG. # Electron diff --git a/package.json b/package.json index 1b0aa68d29fbc..ff123fe48011f 100644 --- a/package.json +++ b/package.json @@ -4,17 +4,17 @@ "version": "0.0.0", "engines": { "yarn": ">=1.7.0 <2", - "node": ">=16.14.0 <17" + "node": ">=16" }, "resolutions": { - "**/@types/node": "16" + "**/@types/node": "18" }, "devDependencies": { "@types/chai": "4.3.0", "@types/chai-spies": "1.0.3", "@types/chai-string": "^1.4.0", "@types/jsdom": "^21.1.1", - "@types/node": "16", + "@types/node": "18", "@types/sinon": "^10.0.6", "@types/temp": "^0.9.1", "@types/uuid": "^7.0.3", diff --git a/packages/core/src/node/backend-application.ts b/packages/core/src/node/backend-application.ts index 1f68370959219..92ec60c1e8c71 100644 --- a/packages/core/src/node/backend-application.ts +++ b/packages/core/src/node/backend-application.ts @@ -14,6 +14,7 @@ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 // ***************************************************************************** +import * as dns from 'dns'; import * as path from 'path'; import * as http from 'http'; import * as https from 'https'; @@ -29,6 +30,8 @@ import { AddressInfo } from 'net'; import { ApplicationPackage } from '@theia/application-package'; import { ProcessUtils } from './process-utils'; +export type DnsResultOrder = 'ipv4first' | 'verbatim' | 'nodeDefault'; + const APP_PROJECT_PATH = 'app-project-path'; const TIMER_WARNING_THRESHOLD = 50; @@ -36,6 +39,7 @@ const TIMER_WARNING_THRESHOLD = 50; const DEFAULT_PORT = environment.electron.is() ? 0 : 3000; const DEFAULT_HOST = 'localhost'; const DEFAULT_SSL = false; +const DEFAULT_DNS_DEFAULT_RESULT_ORDER: DnsResultOrder = 'ipv4first'; export const BackendApplicationServer = Symbol('BackendApplicationServer'); /** @@ -107,6 +111,7 @@ export class BackendApplicationCliContribution implements CliContribution { port: number; hostname: string | undefined; + dnsDefaultResultOrder: DnsResultOrder = DEFAULT_DNS_DEFAULT_RESULT_ORDER; ssl: boolean | undefined; cert: string | undefined; certkey: string | undefined; @@ -119,6 +124,12 @@ export class BackendApplicationCliContribution implements CliContribution { conf.option('cert', { description: 'Path to SSL certificate.', type: 'string' }); conf.option('certkey', { description: 'Path to SSL certificate key.', type: 'string' }); conf.option(APP_PROJECT_PATH, { description: 'Sets the application project directory', default: this.appProjectPath() }); + conf.option('dnsDefaultResultOrder', { + type: 'string', + description: 'Configure Node\'s DNS resolver default behavior, see https://nodejs.org/docs/latest-v18.x/api/dns.html#dnssetdefaultresultorderorder', + choices: ['ipv4first', 'verbatim', 'nodeDefault'], + default: DEFAULT_DNS_DEFAULT_RESULT_ORDER + }); } setArguments(args: yargs.Arguments): void { @@ -128,6 +139,7 @@ export class BackendApplicationCliContribution implements CliContribution { this.cert = args.cert as string; this.certkey = args.certkey as string; this.projectPath = args[APP_PROJECT_PATH] as string; + this.dnsDefaultResultOrder = args.dnsDefaultResultOrder as DnsResultOrder; } protected appProjectPath(): string { @@ -234,9 +246,13 @@ export class BackendApplication { this.app.use(...handlers); } - async start(aPort?: number, aHostname?: string): Promise { - const hostname = aHostname !== undefined ? aHostname : this.cliParams.hostname; - const port = aPort !== undefined ? aPort : this.cliParams.port; + async start(port?: number, hostname?: string): Promise { + hostname ??= this.cliParams.hostname; + port ??= this.cliParams.port; + + if (this.cliParams.dnsDefaultResultOrder !== 'nodeDefault') { + dns.setDefaultResultOrder(this.cliParams.dnsDefaultResultOrder); + } const deferred = new Deferred(); let server: http.Server | https.Server; @@ -279,8 +295,10 @@ export class BackendApplication { }); server.listen(port, hostname, () => { - const scheme = this.cliParams.ssl ? 'https' : 'http'; - console.info(`Theia app listening on ${scheme}://${hostname || 'localhost'}:${(server.address() as AddressInfo).port}.`); + // address should be defined at this point + const address = server.address()!; + const url = typeof address === 'string' ? address : this.getHttpUrl(address, this.cliParams.ssl); + console.info(`Theia app listening on ${url}.`); deferred.resolve(server); }); @@ -301,6 +319,13 @@ export class BackendApplication { return this.stopwatch.startAsync('server', 'Finished starting backend application', () => deferred.promise); } + protected getHttpUrl({ address, port, family }: AddressInfo, ssl?: boolean): string { + const scheme = ssl ? 'https' : 'http'; + return family.toLowerCase() === 'ipv6' + ? `${scheme}://[${address}]:${port}` + : `${scheme}://${address}:${port}`; + } + protected onStop(): void { console.info('>>> Stopping backend contributions...'); for (const contrib of this.contributionsProvider.getContributions()) { diff --git a/packages/core/src/node/logger-cli-contribution.spec.ts b/packages/core/src/node/logger-cli-contribution.spec.ts index 204bd51104ef2..bc9c0a419a489 100644 --- a/packages/core/src/node/logger-cli-contribution.spec.ts +++ b/packages/core/src/node/logger-cli-contribution.spec.ts @@ -137,7 +137,7 @@ describe('log-level-cli-contribution', () => { const args: yargs.Arguments = yargs.parse(['--log-config', file.path]); await cli.setArguments(args); - sinon.assert.calledWithMatch(consoleErrorSpy, 'Unexpected token { in JSON at position 1'); + sinon.assert.calledWithMatch(consoleErrorSpy, 'Error reading log config file'); }); // Skip this test because it is flaky, sometimes we don't receive the event. diff --git a/packages/core/src/node/main.ts b/packages/core/src/node/main.ts index 4201405592221..6fc72783ce6b9 100644 --- a/packages/core/src/node/main.ts +++ b/packages/core/src/node/main.ts @@ -26,12 +26,7 @@ process.on('unhandledRejection', (reason, promise) => { throw reason; }); -export interface Address { - readonly port: number; - readonly address: string; -} - -export async function start(serverModule: MaybePromise): Promise
{ +export async function start(serverModule: MaybePromise): Promise { const server = await serverModule; return server.address() as AddressInfo; } diff --git a/packages/plugin-ext/package.json b/packages/plugin-ext/package.json index c34ce9a3abdc2..f2e7160f14885 100644 --- a/packages/plugin-ext/package.json +++ b/packages/plugin-ext/package.json @@ -39,7 +39,7 @@ "is-electron": "^2.2.0", "jsonc-parser": "^2.2.0", "lodash.clonedeep": "^4.5.0", - "macaddress": "^0.2.9", + "macaddress": "^0.5.3", "mime": "^2.4.4", "ps-tree": "^1.2.0", "semver": "^7.5.4", diff --git a/packages/plugin-ext/src/typings/index.d.ts b/packages/plugin-ext/src/typings/index.d.ts deleted file mode 100644 index 79f281800eab5..0000000000000 --- a/packages/plugin-ext/src/typings/index.d.ts +++ /dev/null @@ -1,25 +0,0 @@ -// ***************************************************************************** -// Copyright (C) 2019 Red Hat, Inc. and others. -// -// This program and the accompanying materials are made available under the -// terms of the Eclipse Public License v. 2.0 which is available at -// http://www.eclipse.org/legal/epl-2.0. -// -// This Source Code may also be made available under the following Secondary -// Licenses when the conditions for such availability set forth in the Eclipse -// Public License v. 2.0 are satisfied: GNU General Public License, version 2 -// with the GNU Classpath Exception which is available at -// https://www.gnu.org/software/classpath/license.html. -// -// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 -// ***************************************************************************** - -/* eslint-disable @typescript-eslint/no-explicit-any */ - -declare module 'macaddress' { - export type MacAddresCallback = (err: any, data: any) => void; - export type MacAddressOneCallback = (err: any, mac: string) => void; - export function one(ifaceOrCallback: string | MacAddressOneCallback, callback?: MacAddressOneCallback): void; - export function all(callback: MacAddresCallback): void; - export function networkInterfaces(): any; -} diff --git a/yarn.lock b/yarn.lock index c89541b2757fd..ee3f8d062c298 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2029,10 +2029,10 @@ "@types/node" "*" form-data "^3.0.0" -"@types/node@*", "@types/node@16", "@types/node@>=10.0.0", "@types/node@^10.14.22", "@types/node@^16.11.26": - version "16.18.38" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.38.tgz#1dcdb6c54d02b323f621213745f2e44af30c73e6" - integrity sha512-6sfo1qTulpVbkxECP+AVrHV9OoJqhzCsfTNp5NIG+enM4HyM3HvZCO798WShIXBN0+QtDIcutJCjsVYnQP5rIQ== +"@types/node@*", "@types/node@18", "@types/node@>=10.0.0", "@types/node@^10.14.22", "@types/node@^16.11.26": + version "18.16.19" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.16.19.tgz#cb03fca8910fdeb7595b755126a8a78144714eea" + integrity sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -7355,10 +7355,10 @@ lzma-native@^8.0.5: node-gyp-build "^4.2.1" readable-stream "^3.6.0" -macaddress@^0.2.9: - version "0.2.9" - resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.9.tgz#3579b8b9acd5b96b4553abf0f394185a86813cb3" - integrity sha512-k4F1JUof6cQXxNFzx3thLby4oJzXTXQueAOOts944Vqizn+Rjc2QNFenT9FJSLU1CH3PmrHRSyZs2E+Cqw+P2w== +macaddress@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.5.3.tgz#2b9d6832be934cb775749f30f57d6537184a2bda" + integrity sha512-vGBKTA+jwM4KgjGZ+S/8/Mkj9rWzePyGY6jManXPGhiWu63RYwW8dKPyk5koP+8qNVhPhHgFa1y/MJ4wrjsNrg== make-dir@3.1.0, make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: version "3.1.0" From 72bd9c92f0f70dd1458e7608a0b7c1b25d60c835 Mon Sep 17 00:00:00 2001 From: Tobias Ortmayr Date: Mon, 28 Aug 2023 15:54:28 +0200 Subject: [PATCH 32/79] Capture stopwatch results (#12812) Introduce `MeasurementResults` that capture a stopwatch execution in a serializable format. Add `onMeasurementResult` event emitter to stopwatch class and introduce optional caching of results. Add a metrics contribution to `@theia/metrics` that collects all measurement results of frontend and backend processes Contributed on behalf of STMicroelectronics --- .../browser/performance/frontend-stopwatch.ts | 7 +- .../src/common/performance/measurement.ts | 26 +++++++ .../core/src/common/performance/stopwatch.ts | 50 ++++++++++--- .../src/node/performance/node-stopwatch.ts | 2 +- packages/metrics/package.json | 1 + ...trics-frontend-application-contribution.ts | 51 +++++++++++++ .../src/browser/metrics-frontend-module.ts | 28 +++++++ packages/metrics/src/common/index.ts | 17 +++++ .../measurement-notification-service.ts | 29 +++++++ .../node/measurement-metrics-contribution.ts | 75 +++++++++++++++++++ .../src/node/metrics-backend-module.ts | 10 ++- 11 files changed, 280 insertions(+), 16 deletions(-) create mode 100644 packages/metrics/src/browser/metrics-frontend-application-contribution.ts create mode 100644 packages/metrics/src/browser/metrics-frontend-module.ts create mode 100644 packages/metrics/src/common/index.ts create mode 100644 packages/metrics/src/common/measurement-notification-service.ts create mode 100644 packages/metrics/src/node/measurement-metrics-contribution.ts diff --git a/packages/core/src/browser/performance/frontend-stopwatch.ts b/packages/core/src/browser/performance/frontend-stopwatch.ts index 396c9fb9e7f19..f8759d011ff46 100644 --- a/packages/core/src/browser/performance/frontend-stopwatch.ts +++ b/packages/core/src/browser/performance/frontend-stopwatch.ts @@ -40,6 +40,7 @@ export class FrontendStopwatch extends Stopwatch { performance.mark(endMarker); let duration: number; + let startTime: number; try { performance.measure(name, startMarker, endMarker); @@ -47,16 +48,18 @@ export class FrontendStopwatch extends Stopwatch { const entries = performance.getEntriesByName(name); // If no entries, then performance measurement was disabled or failed, so // signal that with a `NaN` result - duration = entries.length > 0 ? entries[0].duration : Number.NaN; + duration = entries[0].duration ?? Number.NaN; + startTime = entries[0].startTime ?? Number.NaN; } catch (e) { console.warn(e); duration = Number.NaN; + startTime = Number.NaN; } performance.clearMeasures(name); performance.clearMarks(startMarker); performance.clearMarks(endMarker); - return duration; + return { startTime, duration }; }, options); } }; diff --git a/packages/core/src/common/performance/measurement.ts b/packages/core/src/common/performance/measurement.ts index db3e547779459..8647071d7d6c2 100644 --- a/packages/core/src/common/performance/measurement.ts +++ b/packages/core/src/common/performance/measurement.ts @@ -101,4 +101,30 @@ export interface MeasurementOptions { * @see {@link thresholdLogLevel} */ thresholdMillis?: number; + + /** + * Flag to indicate whether the stopwatch should store measurement results for later retrieval. + * For example the cache can be used to retrieve measurements which were taken during startup before a listener had a chance to register. + */ + storeResults?: boolean +} + +/** + * Captures the result of a {@link Measurement} in a serializable format. + */ +export interface MeasurementResult { + /** The measurement name. This may show up in the performance measurement framework appropriate to the application context. */ + name: string; + + /** The time when the measurement recording has been started */ + startTime: number; + + /** + * The elapsed time measured, if it has been {@link stop stopped} and measured, or `NaN` if the platform disabled + * performance measurement. + */ + elapsed: number; + + /** An optional label for the application the start of which (in real time) is the basis of all measurements. */ + owner?: string; } diff --git a/packages/core/src/common/performance/stopwatch.ts b/packages/core/src/common/performance/stopwatch.ts index 4475bef57a78a..a86e0d6cd6742 100644 --- a/packages/core/src/common/performance/stopwatch.ts +++ b/packages/core/src/common/performance/stopwatch.ts @@ -19,7 +19,8 @@ import { inject, injectable } from 'inversify'; import { ILogger, LogLevel } from '../logger'; import { MaybePromise } from '../types'; -import { Measurement, MeasurementOptions } from './measurement'; +import { Measurement, MeasurementOptions, MeasurementResult } from './measurement'; +import { Emitter, Event } from '../event'; /** The default log level for measurements that are not otherwise configured with a default. */ const DEFAULT_LOG_LEVEL = LogLevel.INFO; @@ -50,10 +51,20 @@ export abstract class Stopwatch { @inject(ILogger) protected readonly logger: ILogger; + protected _storedMeasurements: MeasurementResult[] = []; + + protected onDidAddMeasurementResultEmitter = new Emitter(); + get onDidAddMeasurementResult(): Event { + return this.onDidAddMeasurementResultEmitter.event; + } + constructor(protected readonly defaultLogOptions: LogOptions) { if (!defaultLogOptions.defaultLogLevel) { defaultLogOptions.defaultLogLevel = DEFAULT_LOG_LEVEL; } + if (defaultLogOptions.storeResults === undefined) { + defaultLogOptions.storeResults = true; + } } /** @@ -91,25 +102,36 @@ export abstract class Stopwatch { return result; } - protected createMeasurement(name: string, measurement: () => number, options?: MeasurementOptions): Measurement { + protected createMeasurement(name: string, measure: () => { startTime: number, duration: number }, options?: MeasurementOptions): Measurement { const logOptions = this.mergeLogOptions(options); - const result: Measurement = { + const measurement: Measurement = { name, stop: () => { - if (result.elapsed === undefined) { - result.elapsed = measurement(); + if (measurement.elapsed === undefined) { + const { startTime, duration } = measure(); + measurement.elapsed = duration; + const result: MeasurementResult = { + name, + elapsed: duration, + startTime, + owner: logOptions.owner + }; + if (logOptions.storeResults) { + this._storedMeasurements.push(result); + } + this.onDidAddMeasurementResultEmitter.fire(result); } - return result.elapsed; + return measurement.elapsed; }, - log: (activity: string, ...optionalArgs: any[]) => this.log(result, activity, this.atLevel(logOptions, undefined, optionalArgs)), - debug: (activity: string, ...optionalArgs: any[]) => this.log(result, activity, this.atLevel(logOptions, LogLevel.DEBUG, optionalArgs)), - info: (activity: string, ...optionalArgs: any[]) => this.log(result, activity, this.atLevel(logOptions, LogLevel.INFO, optionalArgs)), - warn: (activity: string, ...optionalArgs: any[]) => this.log(result, activity, this.atLevel(logOptions, LogLevel.WARN, optionalArgs)), - error: (activity: string, ...optionalArgs: any[]) => this.log(result, activity, this.atLevel(logOptions, LogLevel.ERROR, optionalArgs)), + log: (activity: string, ...optionalArgs: any[]) => this.log(measurement, activity, this.atLevel(logOptions, undefined, optionalArgs)), + debug: (activity: string, ...optionalArgs: any[]) => this.log(measurement, activity, this.atLevel(logOptions, LogLevel.DEBUG, optionalArgs)), + info: (activity: string, ...optionalArgs: any[]) => this.log(measurement, activity, this.atLevel(logOptions, LogLevel.INFO, optionalArgs)), + warn: (activity: string, ...optionalArgs: any[]) => this.log(measurement, activity, this.atLevel(logOptions, LogLevel.WARN, optionalArgs)), + error: (activity: string, ...optionalArgs: any[]) => this.log(measurement, activity, this.atLevel(logOptions, LogLevel.ERROR, optionalArgs)), }; - return result; + return measurement; } protected mergeLogOptions(logOptions?: Partial): LogOptions { @@ -154,4 +176,8 @@ export abstract class Stopwatch { this.logger.log(level, `${whatWasMeasured}: ${elapsed.toFixed(1)} ms [${timeFromStart}]`, ...(options.arguments ?? [])); } + get storedMeasurements(): ReadonlyArray { + return this._storedMeasurements; + } + } diff --git a/packages/core/src/node/performance/node-stopwatch.ts b/packages/core/src/node/performance/node-stopwatch.ts index 57f33286c1681..42db4b6feb3e6 100644 --- a/packages/core/src/node/performance/node-stopwatch.ts +++ b/packages/core/src/node/performance/node-stopwatch.ts @@ -33,7 +33,7 @@ export class NodeStopwatch extends Stopwatch { return this.createMeasurement(name, () => { const duration = performance.now() - startTime; - return duration; + return { duration, startTime }; }, options); } diff --git a/packages/metrics/package.json b/packages/metrics/package.json index ac54923c66beb..4a833c1492295 100644 --- a/packages/metrics/package.json +++ b/packages/metrics/package.json @@ -11,6 +11,7 @@ }, "theiaExtensions": [ { + "frontend": "lib/browser/metrics-frontend-module", "backend": "lib/node/metrics-backend-module" } ], diff --git a/packages/metrics/src/browser/metrics-frontend-application-contribution.ts b/packages/metrics/src/browser/metrics-frontend-application-contribution.ts new file mode 100644 index 0000000000000..177ad53f37ad6 --- /dev/null +++ b/packages/metrics/src/browser/metrics-frontend-application-contribution.ts @@ -0,0 +1,51 @@ +// ***************************************************************************** +// Copyright (C) 2023 STMicroelectronics and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** +import { inject, injectable } from '@theia/core/shared/inversify'; +import { FrontendApplicationContribution } from '@theia/core/lib/browser'; +import { ILogger, LogLevel, MeasurementResult, Stopwatch } from '@theia/core'; +import { UUID } from '@theia/core/shared/@phosphor/coreutils'; +import { MeasurementNotificationService } from '../common'; + +@injectable() +export class MetricsFrontendApplicationContribution implements FrontendApplicationContribution { + @inject(Stopwatch) + protected stopwatch: Stopwatch; + + @inject(MeasurementNotificationService) + protected notificationService: MeasurementNotificationService; + + @inject(ILogger) + protected logger: ILogger; + + readonly id = UUID.uuid4(); + + initialize(): void { + this.doInitialize(); + } + + protected async doInitialize(): Promise { + const logLevel = await this.logger.getLogLevel(); + if (logLevel !== LogLevel.DEBUG) { + return; + } + this.stopwatch.storedMeasurements.forEach(result => this.notify(result)); + this.stopwatch.onDidAddMeasurementResult(result => this.notify(result)); + } + + protected notify(result: MeasurementResult): void { + this.notificationService.onFrontendMeasurement(this.id, result); + } +} diff --git a/packages/metrics/src/browser/metrics-frontend-module.ts b/packages/metrics/src/browser/metrics-frontend-module.ts new file mode 100644 index 0000000000000..453b9ead52dad --- /dev/null +++ b/packages/metrics/src/browser/metrics-frontend-module.ts @@ -0,0 +1,28 @@ +// ***************************************************************************** +// Copyright (C) 2023 STMicroelectronics and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { ContainerModule } from '@theia/core/shared/inversify'; +import { MetricsFrontendApplicationContribution } from './metrics-frontend-application-contribution'; +import { MeasurementNotificationService, measurementNotificationServicePath } from '../common'; +import { FrontendApplicationContribution, WebSocketConnectionProvider } from '@theia/core/lib/browser'; + +export default new ContainerModule(bind => { + bind(FrontendApplicationContribution).to(MetricsFrontendApplicationContribution).inSingletonScope(); + bind(MeasurementNotificationService).toDynamicValue(ctx => { + const connection = ctx.container.get(WebSocketConnectionProvider); + return connection.createProxy(measurementNotificationServicePath); + }); +}); diff --git a/packages/metrics/src/common/index.ts b/packages/metrics/src/common/index.ts new file mode 100644 index 0000000000000..e661e62e7f703 --- /dev/null +++ b/packages/metrics/src/common/index.ts @@ -0,0 +1,17 @@ +// ***************************************************************************** +// Copyright (C) 2023 STMicroelectronics and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +export * from './measurement-notification-service'; diff --git a/packages/metrics/src/common/measurement-notification-service.ts b/packages/metrics/src/common/measurement-notification-service.ts new file mode 100644 index 0000000000000..084297d536703 --- /dev/null +++ b/packages/metrics/src/common/measurement-notification-service.ts @@ -0,0 +1,29 @@ +// ***************************************************************************** +// Copyright (C) 2023 STMicroelectronics and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { MeasurementResult } from '@theia/core'; + +export const measurementNotificationServicePath = '/services/measurement-notification'; + +export const MeasurementNotificationService = Symbol('MeasurementNotificationService'); +export interface MeasurementNotificationService { + /** + * Notify the backend when a fronted stopwatch provides a new measurement. + * @param frontendId The unique id associated with the frontend that sends the notification + * @param result The new measurement result + */ + onFrontendMeasurement(frontendId: string, result: MeasurementResult): void; +} diff --git a/packages/metrics/src/node/measurement-metrics-contribution.ts b/packages/metrics/src/node/measurement-metrics-contribution.ts new file mode 100644 index 0000000000000..0cb8ca6b09db2 --- /dev/null +++ b/packages/metrics/src/node/measurement-metrics-contribution.ts @@ -0,0 +1,75 @@ +// ***************************************************************************** +// Copyright (C) 2023 STMicroelectronics and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** +import { inject, injectable, } from '@theia/core/shared/inversify'; +import { MetricsContribution } from './metrics-contribution'; +import { LogLevel, MeasurementResult, Stopwatch } from '@theia/core'; +import { MeasurementNotificationService } from '../common'; +import { LogLevelCliContribution } from '@theia/core/lib/node/logger-cli-contribution'; + +const backendId = 'backend'; +const metricsName = 'theia_measurements'; + +@injectable() +export class MeasurementMetricsBackendContribution implements MetricsContribution, MeasurementNotificationService { + @inject(Stopwatch) + protected backendStopwatch: Stopwatch; + + @inject(LogLevelCliContribution) + protected logLevelCli: LogLevelCliContribution; + + protected metrics = ''; + protected frontendCounters = new Map(); + + startCollecting(): void { + if (this.logLevelCli.defaultLogLevel !== LogLevel.DEBUG) { + return; + } + this.metrics += `# HELP ${metricsName} Theia stopwatch measurement results.\n`; + this.metrics += `# TYPE ${metricsName} gauge\n`; + this.backendStopwatch.storedMeasurements.forEach(result => this.onBackendMeasurement(result)); + this.backendStopwatch.onDidAddMeasurementResult(result => this.onBackendMeasurement(result)); + } + + getMetrics(): string { + return this.metrics; + } + + protected appendMetricsValue(id: string, result: MeasurementResult): void { + const { name, elapsed, startTime, owner } = result; + const labels: string = `id="${id}", name="${name}", startTime="${startTime}", owner="${owner}"`; + const metricsValue = `${metricsName}{${labels}} ${elapsed}`; + this.metrics += (metricsValue + '\n'); + } + + protected onBackendMeasurement(result: MeasurementResult): void { + this.appendMetricsValue(backendId, result); + } + + protected createFrontendCounterId(frontendId: string): string { + const counterId = `frontend-${this.frontendCounters.size + 1}`; + this.frontendCounters.set(frontendId, counterId); + return counterId; + } + + protected toCounterId(frontendId: string): string { + return this.frontendCounters.get(frontendId) ?? this.createFrontendCounterId(frontendId); + } + + onFrontendMeasurement(frontendId: string, result: MeasurementResult): void { + this.appendMetricsValue(this.toCounterId(frontendId), result); + } + +} diff --git a/packages/metrics/src/node/metrics-backend-module.ts b/packages/metrics/src/node/metrics-backend-module.ts index 9ef1dbb1997ba..2a4e7e90633a8 100644 --- a/packages/metrics/src/node/metrics-backend-module.ts +++ b/packages/metrics/src/node/metrics-backend-module.ts @@ -16,17 +16,25 @@ import { ContainerModule } from '@theia/core/shared/inversify'; import { BackendApplicationContribution } from '@theia/core/lib/node'; -import { bindContributionProvider } from '@theia/core/lib/common'; +import { ConnectionHandler, RpcConnectionHandler, bindContributionProvider } from '@theia/core/lib/common'; import { MetricsContribution } from './metrics-contribution'; import { NodeMetricsContribution } from './node-metrics-contribution'; import { ExtensionMetricsContribution } from './extensions-metrics-contribution'; import { MetricsBackendApplicationContribution } from './metrics-backend-application-contribution'; +import { measurementNotificationServicePath } from '../common'; +import { MeasurementMetricsBackendContribution } from './measurement-metrics-contribution'; export default new ContainerModule(bind => { bindContributionProvider(bind, MetricsContribution); bind(MetricsContribution).to(NodeMetricsContribution).inSingletonScope(); bind(MetricsContribution).to(ExtensionMetricsContribution).inSingletonScope(); + bind(MeasurementMetricsBackendContribution).toSelf().inSingletonScope(); + bind(MetricsContribution).toService(MeasurementMetricsBackendContribution); + bind(ConnectionHandler).toDynamicValue(ctx => + new RpcConnectionHandler(measurementNotificationServicePath, + () => ctx.container.get(MeasurementMetricsBackendContribution))); + bind(BackendApplicationContribution).to(MetricsBackendApplicationContribution).inSingletonScope(); }); From 4484f8d979d917b8606f083c8a68890d19e63d94 Mon Sep 17 00:00:00 2001 From: "Christian W. Damus" Date: Mon, 28 Aug 2023 11:11:14 -0400 Subject: [PATCH 33/79] vscode: independent editor/title/run menu (#12799) In VS Code, contributions to the "editor/title/run" menu contribution point are not added to the ellipsis menu but to a dedicated item on the toolbar. This commit makes Theia do the same, except that unlike VS Code, a pop-up menu is always presented, even if there is only one action available. Fixes #12687 Signed-off-by: Christian W. Damus --- .../tab-bar-toolbar-registry.ts | 102 ++++++++++++++++-- .../tab-bar-toolbar/tab-bar-toolbar-types.ts | 29 ++++- .../shell/tab-bar-toolbar/tab-bar-toolbar.tsx | 59 +++++++++- packages/core/src/browser/style/tabs.css | 21 ++++ .../menus/menus-contribution-handler.ts | 8 +- 5 files changed, 206 insertions(+), 13 deletions(-) diff --git a/packages/core/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.ts b/packages/core/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.ts index 8ea697a7a3ee5..92b3c5f219955 100644 --- a/packages/core/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.ts +++ b/packages/core/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.ts @@ -17,11 +17,11 @@ import debounce = require('lodash.debounce'); import { inject, injectable, named } from 'inversify'; // eslint-disable-next-line max-len -import { CommandMenuNode, CommandRegistry, CompoundMenuNode, ContributionProvider, Disposable, DisposableCollection, Emitter, Event, MenuModelRegistry, MenuPath } from '../../../common'; +import { CommandMenuNode, CommandRegistry, CompoundMenuNode, ContributionProvider, Disposable, DisposableCollection, Emitter, Event, MenuModelRegistry, MenuNode, MenuPath } from '../../../common'; import { ContextKeyService } from '../../context-key-service'; import { FrontendApplicationContribution } from '../../frontend-application'; import { Widget } from '../../widgets'; -import { MenuDelegate, ReactTabBarToolbarItem, TabBarToolbarItem } from './tab-bar-toolbar-types'; +import { AnyToolbarItem, ConditionalToolbarItem, MenuDelegate, MenuToolbarItem, ReactTabBarToolbarItem, TabBarToolbarItem } from './tab-bar-toolbar-types'; import { ToolbarMenuNodeWrapper } from './tab-bar-toolbar-menu-adapters'; /** @@ -103,10 +103,7 @@ export class TabBarToolbarRegistry implements FrontendApplicationContribution { } const result: Array = []; for (const item of this.items.values()) { - const visible = TabBarToolbarItem.is(item) - ? this.commandRegistry.isVisible(item.command, widget) - : (!item.isVisible || item.isVisible(widget)); - if (visible && (!item.when || this.contextKeyService.match(item.when, widget.node))) { + if (this.isItemVisible(item, widget)) { result.push(item); } } @@ -139,6 +136,83 @@ export class TabBarToolbarRegistry implements FrontendApplicationContribution { return result; } + /** + * Query whether a toolbar `item` should be shown in the toolbar. + * This implementation delegates to item-specific checks according to their type. + * + * @param item a menu toolbar item + * @param widget the widget that is updating the toolbar + * @returns `false` if the `item` should be suppressed, otherwise `true` + */ + protected isItemVisible(item: TabBarToolbarItem | ReactTabBarToolbarItem, widget: Widget): boolean { + if (TabBarToolbarItem.is(item) && item.command && !this.isTabBarToolbarItemVisible(item, widget)) { + return false; + } + if (MenuToolbarItem.is(item) && !this.isMenuToolbarItemVisible(item, widget)) { + return false; + } + if (AnyToolbarItem.isConditional(item) && !this.isConditionalItemVisible(item, widget)) { + return false; + } + // The item is not vetoed. Accept it + return true; + } + + /** + * Query whether a conditional toolbar `item` should be shown in the toolbar. + * This implementation delegates to the `item`'s own intrinsic conditionality. + * + * @param item a menu toolbar item + * @param widget the widget that is updating the toolbar + * @returns `false` if the `item` should be suppressed, otherwise `true` + */ + protected isConditionalItemVisible(item: ConditionalToolbarItem, widget: Widget): boolean { + if (item.isVisible && !item.isVisible(widget)) { + return false; + } + if (item.when && !this.contextKeyService.match(item.when, widget.node)) { + return false; + } + return true; + } + + /** + * Query whether a tab-bar toolbar `item` that has a command should be shown in the toolbar. + * This implementation returns `false` if the `item`'s command is not visible in the + * `widget` according to the command registry. + * + * @param item a tab-bar toolbar item that has a non-empty `command` + * @param widget the widget that is updating the toolbar + * @returns `false` if the `item` should be suppressed, otherwise `true` + */ + protected isTabBarToolbarItemVisible(item: TabBarToolbarItem, widget: Widget): boolean { + return this.commandRegistry.isVisible(item.command, widget); + } + + /** + * Query whether a menu toolbar `item` should be shown in the toolbar. + * This implementation returns `false` if the `item` does not have any actual menu to show. + * + * @param item a menu toolbar item + * @param widget the widget that is updating the toolbar + * @returns `false` if the `item` should be suppressed, otherwise `true` + */ + protected isMenuToolbarItemVisible(item: MenuToolbarItem, widget: Widget): boolean { + const menu = this.menuRegistry.getMenu(item.menuPath); + const isVisible: (node: MenuNode) => boolean = node => + node.children?.length + // Either the node is a sub-menu that has some visible child ... + ? node.children?.some(isVisible) + // ... or there is a command ... + : !!node.command + // ... that is visible ... + && this.commandRegistry.isVisible(node.command, widget) + // ... and a "when" clause does not suppress the menu node. + && (!node.when || this.contextKeyService.match(node.when, widget?.node)); + + return isVisible(menu); + } + unregisterItem(itemOrId: TabBarToolbarItem | ReactTabBarToolbarItem | string): void { const id = typeof itemOrId === 'string' ? itemOrId : itemOrId.id; if (this.items.delete(id)) { @@ -147,7 +221,7 @@ export class TabBarToolbarRegistry implements FrontendApplicationContribution { } registerMenuDelegate(menuPath: MenuPath, when?: string | ((widget: Widget) => boolean)): Disposable { - const id = menuPath.join(menuDelegateSeparator); + const id = this.toElementId(menuPath); if (!this.menuDelegates.has(id)) { const isVisible: MenuDelegate['isVisible'] = !when ? yes @@ -163,8 +237,20 @@ export class TabBarToolbarRegistry implements FrontendApplicationContribution { } unregisterMenuDelegate(menuPath: MenuPath): void { - if (this.menuDelegates.delete(menuPath.join(menuDelegateSeparator))) { + if (this.menuDelegates.delete(this.toElementId(menuPath))) { this.fireOnDidChange(); } } + + /** + * Generate a single ID string from a menu path that + * is likely to be unique amongst the items in the toolbar. + * + * @param menuPath a menubar path + * @returns a likely unique ID based on the path + */ + toElementId(menuPath: MenuPath): string { + return menuPath.join(menuDelegateSeparator); + } + } diff --git a/packages/core/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-types.ts b/packages/core/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-types.ts index 0950dd0169520..00ad879b4d761 100644 --- a/packages/core/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-types.ts +++ b/packages/core/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-types.ts @@ -83,7 +83,7 @@ export interface MenuToolbarItem { menuPath: MenuPath; } -interface ConditionalToolbarItem { +export interface ConditionalToolbarItem { /** * https://code.visualstudio.com/docs/getstarted/keybindings#_when-clause-contexts */ @@ -130,6 +130,7 @@ export interface TabBarToolbarItem extends RegisteredToolbarItem, RenderedToolbarItem, Omit, Pick, + Partial, Partial { } /** @@ -174,7 +175,33 @@ export namespace TabBarToolbarItem { } export namespace MenuToolbarItem { + /** + * Type guard for a toolbar item that actually is a menu item, amongst + * the other kinds of item that it may also be. + * + * @param item a toolbar item + * @returns whether the `item` is a menu item + */ + export function is(item: T): item is T & MenuToolbarItem { + return Array.isArray(item.menuPath); + } + export function getMenuPath(item: AnyToolbarItem): MenuPath | undefined { return Array.isArray(item.menuPath) ? item.menuPath : undefined; } } + +export namespace AnyToolbarItem { + /** + * Type guard for a toolbar item that actually manifests any of the + * features of a conditional toolbar item. + * + * @param item a toolbar item + * @returns whether the `item` is a conditional item + */ + export function isConditional(item: T): item is T & ConditionalToolbarItem { + return 'isVisible' in item && typeof item.isVisible === 'function' + || 'onDidChange' in item && typeof item.onDidChange === 'function' + || 'when' in item && typeof item.when === 'string'; + } +} diff --git a/packages/core/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.tsx b/packages/core/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.tsx index 491a26a4f2529..53fbbda8698ca 100644 --- a/packages/core/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.tsx +++ b/packages/core/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.tsx @@ -22,7 +22,7 @@ import { Anchor, ContextMenuAccess, ContextMenuRenderer } from '../../context-me import { LabelIcon, LabelParser } from '../../label-parser'; import { ACTION_ITEM, codicon, ReactWidget, Widget } from '../../widgets'; import { TabBarToolbarRegistry } from './tab-bar-toolbar-registry'; -import { AnyToolbarItem, ReactTabBarToolbarItem, TabBarDelegator, TabBarToolbarItem, TAB_BAR_TOOLBAR_CONTEXT_MENU } from './tab-bar-toolbar-types'; +import { AnyToolbarItem, ReactTabBarToolbarItem, TabBarDelegator, TabBarToolbarItem, TAB_BAR_TOOLBAR_CONTEXT_MENU, MenuToolbarItem } from './tab-bar-toolbar-types'; import { KeybindingRegistry } from '../..//keybinding'; /** @@ -149,7 +149,9 @@ export class TabBarToolbar extends ReactWidget { this.keybindingContextKeys.clear(); return {this.renderMore()} - {[...this.inline.values()].map(item => TabBarToolbarItem.is(item) ? this.renderItem(item) : item.render(this.current))} + {[...this.inline.values()].map(item => TabBarToolbarItem.is(item) + ? (MenuToolbarItem.is(item) ? this.renderMenuItem(item) : this.renderItem(item)) + : item.render(this.current))} ; } @@ -290,6 +292,59 @@ export class TabBarToolbar extends ReactWidget { }); } + /** + * Renders a toolbar item that is a menu, presenting it as a button with a little + * chevron decoration that pops up a floating menu when clicked. + * + * @param item a toolbar item that is a menu item + * @returns the rendered toolbar item + */ + protected renderMenuItem(item: TabBarToolbarItem & MenuToolbarItem): React.ReactNode { + const icon = typeof item.icon === 'function' ? item.icon() : item.icon ?? 'ellipsis'; + return
+
+
+
; + } + + /** + * Presents the menu to popup on the `event` that is the clicking of + * a menu toolbar item. + * + * @param menuPath the path of the registered menu to show + * @param event the mouse event triggering the menu + */ + protected showPopupMenu = (menuPath: MenuPath, event: React.MouseEvent) => { + event.stopPropagation(); + event.preventDefault(); + const anchor = this.toAnchor(event); + this.renderPopupMenu(menuPath, anchor); + }; + + /** + * Renders the menu popped up on a menu toolbar item. + * + * @param menuPath the path of the registered menu to render + * @param anchor a description of where to render the menu + * @returns platform-specific access to the rendered context menu + */ + protected renderPopupMenu(menuPath: MenuPath, anchor: Anchor): ContextMenuAccess { + const toDisposeOnHide = new DisposableCollection(); + this.addClass('menu-open'); + toDisposeOnHide.push(Disposable.create(() => this.removeClass('menu-open'))); + + return this.contextMenuRenderer.render({ + menuPath, + args: [this.current], + anchor, + context: this.current?.node, + onHide: () => toDisposeOnHide.dispose() + }); + } + shouldHandleMouseEvent(event: MouseEvent): boolean { return event.target instanceof Element && this.node.contains(event.target); } diff --git a/packages/core/src/browser/style/tabs.css b/packages/core/src/browser/style/tabs.css index 7a8cc548080cc..01ca9da41786e 100644 --- a/packages/core/src/browser/style/tabs.css +++ b/packages/core/src/browser/style/tabs.css @@ -500,6 +500,27 @@ background: var(--theia-icon-close) no-repeat; } +/** Configure layout of a toolbar item that shows a pop-up menu. */ +.p-TabBar-toolbar .item.menu { + display: grid; +} + +/** The elements of the item that shows a pop-up menu are stack atop one other. */ +.p-TabBar-toolbar .item.menu > div { + grid-area: 1 / 1; +} + +/** + * The chevron for the pop-up menu indication is shrunk and + * stuffed in the bottom-right corner. + */ +.p-TabBar-toolbar .item.menu > .chevron { + scale: 50%; + align-self: end; + justify-self: end; + translate: 5px 3px; +} + #theia-main-content-panel .p-TabBar:not(.theia-tabBar-active) .p-TabBar-toolbar { diff --git a/packages/plugin-ext/src/main/browser/menus/menus-contribution-handler.ts b/packages/plugin-ext/src/main/browser/menus/menus-contribution-handler.ts index 19adea7d2a3ca..2ffb27f5951cd 100644 --- a/packages/plugin-ext/src/main/browser/menus/menus-contribution-handler.ts +++ b/packages/plugin-ext/src/main/browser/menus/menus-contribution-handler.ts @@ -17,7 +17,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { inject, injectable, optional } from '@theia/core/shared/inversify'; -import { MenuPath, CommandRegistry, Disposable, DisposableCollection, ActionMenuNode, MenuCommandAdapterRegistry, Emitter } from '@theia/core'; +import { MenuPath, CommandRegistry, Disposable, DisposableCollection, ActionMenuNode, MenuCommandAdapterRegistry, Emitter, nls } from '@theia/core'; import { MenuModelRegistry } from '@theia/core/lib/common'; import { TabBarToolbarRegistry } from '@theia/core/lib/browser/shell/tab-bar-toolbar'; import { DeployedPlugin, IconUrl, Menu } from '../../../common'; @@ -55,7 +55,11 @@ export class MenusContributionPointHandler { this.initialized = true; this.commandAdapterRegistry.registerAdapter(this.commandAdapter); this.tabBarToolbar.registerMenuDelegate(PLUGIN_EDITOR_TITLE_MENU, widget => this.codeEditorWidgetUtil.is(widget)); - this.tabBarToolbar.registerMenuDelegate(PLUGIN_EDITOR_TITLE_RUN_MENU, widget => this.codeEditorWidgetUtil.is(widget)); + this.tabBarToolbar.registerItem({ + id: this.tabBarToolbar.toElementId(PLUGIN_EDITOR_TITLE_RUN_MENU), menuPath: PLUGIN_EDITOR_TITLE_RUN_MENU, + icon: 'debug-alt', text: nls.localizeByDefault('Run or Debug...'), + command: '', group: 'navigation', isVisible: widget => this.codeEditorWidgetUtil.is(widget) + }); this.tabBarToolbar.registerMenuDelegate(PLUGIN_SCM_TITLE_MENU, widget => widget instanceof ScmWidget); this.tabBarToolbar.registerMenuDelegate(PLUGIN_VIEW_TITLE_MENU, widget => !this.codeEditorWidgetUtil.is(widget)); this.tabBarToolbar.registerItem({ id: 'plugin-menu-contribution-title-contribution', command: '_never_', onDidChange: this.onDidChangeTitleContributionEmitter.event }); From 8f64a58e7eefca40718f5edc130cc63a5e8de52b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=A4der?= Date: Tue, 29 Aug 2023 09:37:52 +0200 Subject: [PATCH 34/79] Bump API version to 1.80.0 (#12866) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Contributed on behalf of ST Microelectronics Signed-off-by: Thomas Mäder --- dev-packages/application-package/src/api.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-packages/application-package/src/api.ts b/dev-packages/application-package/src/api.ts index 8b246dcebb963..3477750352347 100644 --- a/dev-packages/application-package/src/api.ts +++ b/dev-packages/application-package/src/api.ts @@ -18,4 +18,4 @@ * The default supported API version the framework supports. * The version should be in the format `x.y.z`. */ -export const DEFAULT_SUPPORTED_API_VERSION = '1.79.0'; +export const DEFAULT_SUPPORTED_API_VERSION = '1.80.0'; From 67e5eed0cb24e26ccffb11094b951527680d2db3 Mon Sep 17 00:00:00 2001 From: "Christian W. Damus" Date: Tue, 29 Aug 2023 05:18:45 -0400 Subject: [PATCH 35/79] tabbar: fix command contributions regression (#12869) The merge of #12799 introduced a regression in the rendering of MenuToolbarItems that aren't pop-up menus but instead just commands that happen to have a menu path: they were rendered as pop-up menus instead of simple buttons. This fix refines the condition for the new pop-up menu rendering to check that the menu to be rendered is not a command to be executed directly on click. Fixes #12687 Signed-off-by: Christian W. Damus --- .../core/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.tsx b/packages/core/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.tsx index 53fbbda8698ca..e00dc47c51d3e 100644 --- a/packages/core/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.tsx +++ b/packages/core/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.tsx @@ -150,7 +150,7 @@ export class TabBarToolbar extends ReactWidget { return {this.renderMore()} {[...this.inline.values()].map(item => TabBarToolbarItem.is(item) - ? (MenuToolbarItem.is(item) ? this.renderMenuItem(item) : this.renderItem(item)) + ? (MenuToolbarItem.is(item) && !item.command ? this.renderMenuItem(item) : this.renderItem(item)) : item.render(this.current))} ; } From b3e8d425155eb92bb8a68773b2b7bb2f9584183b Mon Sep 17 00:00:00 2001 From: Zebsterpasha <77332790+Zebsterpasha@users.noreply.github.com> Date: Tue, 29 Aug 2023 16:06:59 +0300 Subject: [PATCH 36/79] nls: added localization of copy to the clipboard notification (#12873) The commit adds a missing localization for the notification when successfully copying the download link to the clipboard. --- .../filesystem/src/browser/download/file-download-service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/filesystem/src/browser/download/file-download-service.ts b/packages/filesystem/src/browser/download/file-download-service.ts index 9df5fa46df400..07cae6bf6fde3 100644 --- a/packages/filesystem/src/browser/download/file-download-service.ts +++ b/packages/filesystem/src/browser/download/file-download-service.ts @@ -39,7 +39,7 @@ export class FileDownloadService { if (downloadUrl && event.clipboardData) { event.clipboardData.setData('text/plain', downloadUrl); event.preventDefault(); - this.messageService.info('Copied the download link to the clipboard.'); + this.messageService.info(nls.localize('theia/filesystem/copiedToClipboard', 'Copied the download link to the clipboard.')); } } From 96bd270d6829d1af152d37acfbc419f0da06e9b5 Mon Sep 17 00:00:00 2001 From: Mark Sujew Date: Tue, 29 Aug 2023 20:01:33 +0200 Subject: [PATCH 37/79] Update nls metadata to vscode version 1.80.0 (#12875) --- .../core/src/common/i18n/nls.metadata.json | 10975 ++++++++-------- .../src/browser/editor-widget-factory.ts | 2 +- .../filesystem/src/browser/file-service.ts | 2 +- .../src/browser/filesystem-preferences.ts | 2 +- 4 files changed, 5619 insertions(+), 5362 deletions(-) diff --git a/packages/core/src/common/i18n/nls.metadata.json b/packages/core/src/common/i18n/nls.metadata.json index 462fcfedc2955..4fb018819f051 100644 --- a/packages/core/src/common/i18n/nls.metadata.json +++ b/packages/core/src/common/i18n/nls.metadata.json @@ -1,5 +1,8 @@ { "keys": { + "vs/platform/terminal/node/ptyHostMain": [ + "ptyHost" + ], "vs/code/electron-main/main": [ "mainLog", "secondInstanceAdmin", @@ -22,9 +25,6 @@ "vs/code/node/sharedProcess/sharedProcessMain": [ "sharedLog" ], - "vs/platform/terminal/node/ptyHostMain": [ - "ptyHost" - ], "vs/code/electron-sandbox/processExplorer/processExplorerMain": [ "name", "cpu", @@ -92,6 +92,7 @@ "argv.crashReporterId", "argv.enebleProposedApi", "argv.logLevel", + "argv.disableChromiumSandbox", "argv.force-renderer-accessibility" ], "vs/workbench/services/textfile/electron-sandbox/nativeTextFileService": [ @@ -116,6 +117,14 @@ "workspaceOpenedDetail", "restartExtensionHost.reason" ], + "vs/workbench/services/secrets/electron-sandbox/secretStorageService": [ + "troubleshootingButton", + "encryptionNotAvailableJustTroubleshootingGuide", + "usePlainTextExtraSentence", + "usePlainText", + "isGnome", + "isKwallet" + ], "vs/workbench/services/localization/electron-sandbox/localeService": [ "argvInvalid", "openArgv", @@ -133,14 +142,14 @@ "local", "remote" ], - "vs/workbench/services/workingCopy/electron-sandbox/workingCopyBackupService": [ - "join.workingCopyBackups" - ], "vs/workbench/services/integrity/electron-sandbox/integrityService": [ "integrity.prompt", "integrity.moreInformation", "integrity.dontShowAgain" ], + "vs/workbench/services/workingCopy/electron-sandbox/workingCopyBackupService": [ + "join.workingCopyBackups" + ], "vs/workbench/services/extensions/electron-sandbox/nativeExtensionService": [ "extensionService.versionMismatchCrash", "relaunch", @@ -323,6 +332,56 @@ ] } ], + "vs/platform/environment/node/argv": [ + "optionsUpperCase", + "extensionsManagement", + "troubleshooting", + "cliDataDir", + "diff", + "merge", + "add", + "goto", + "newWindow", + "reuseWindow", + "wait", + "locale", + "userDataDir", + "profileName", + "help", + "extensionHomePath", + "listExtensions", + "showVersions", + "category", + "installExtension", + "install prerelease", + "uninstallExtension", + "experimentalApis", + "version", + "verbose", + "log", + "status", + "prof-startup", + "disableExtensions", + "disableExtension", + "turn sync", + "inspect-extensions", + "inspect-brk-extensions", + "disableGPU", + "disableChromiumSandbox", + "telemetry", + "deprecated.useInstead", + "paths", + "usage", + "options", + "stdinWindows", + "stdinUnix", + "subcommands", + "unknownVersion", + "unknownCommit" + ], + "vs/platform/terminal/node/ptyService": [ + "terminal-history-restored" + ], "vs/editor/common/config/editorOptions": [ "accessibilitySupport.auto", "accessibilitySupport.on", @@ -504,6 +563,7 @@ "editor.suggest.showUsers", "editor.suggest.showIssues", "selectLeadingAndTrailingWhitespace", + "selectSubwords", "wrappingIndent.none", "wrappingIndent.same", "wrappingIndent.indent", @@ -548,6 +608,10 @@ "codeLensFontFamily", "codeLensFontSize", "colorDecorators", + "editor.colorDecoratorActivatedOn.clickAndHover", + "editor.colorDecoratorActivatedOn.hover", + "editor.colorDecoratorActivatedOn.click", + "colorDecoratorActivatedOn", "colorDecoratorsLimit", "columnSelection", "copyWithSyntaxHighlighting", @@ -851,6 +915,15 @@ "notInstalleddOnLocation", "notInstalled" ], + "vs/platform/extensionManagement/common/extensionsScannerService": [ + "fileReadFail", + "jsonParseFail", + "jsonParseInvalidType", + "jsonsParseReportErrors", + "jsonInvalidFormat", + "jsonsParseReportErrors", + "jsonInvalidFormat" + ], "vs/platform/extensionManagement/node/extensionManagementService": [ "incompatible", "MarketPlaceDisabled", @@ -862,61 +935,6 @@ "restartCode", "restartCode" ], - "vs/platform/environment/node/argv": [ - "optionsUpperCase", - "extensionsManagement", - "troubleshooting", - "cliDataDir", - "diff", - "merge", - "add", - "goto", - "newWindow", - "reuseWindow", - "wait", - "locale", - "userDataDir", - "profileName", - "help", - "extensionHomePath", - "listExtensions", - "showVersions", - "category", - "installExtension", - "install prerelease", - "uninstallExtension", - "experimentalApis", - "version", - "verbose", - "log", - "status", - "prof-startup", - "disableExtensions", - "disableExtension", - "turn sync", - "inspect-extensions", - "inspect-brk-extensions", - "disableGPU", - "telemetry", - "deprecated.useInstead", - "paths", - "usage", - "options", - "stdinWindows", - "stdinUnix", - "subcommands", - "unknownVersion", - "unknownCommit" - ], - "vs/platform/extensionManagement/common/extensionsScannerService": [ - "fileReadFail", - "jsonParseFail", - "jsonParseInvalidType", - "jsonsParseReportErrors", - "jsonInvalidFormat", - "jsonsParseReportErrors", - "jsonInvalidFormat" - ], "vs/platform/languagePacks/common/languagePacks": [ "currentDisplayLanguage" ], @@ -1049,8 +1067,101 @@ }, "remoteTunnelService.openTunnel" ], - "vs/platform/terminal/node/ptyService": [ - "terminal-history-restored" + "vs/workbench/browser/workbench": [ + "loaderErrorNative" + ], + "vs/workbench/electron-sandbox/window": [ + "restart", + "configure", + "learnMore", + "keychainWriteError", + "troubleshooting", + "runningTranslated", + "downloadArmBuild", + "proxyAuthRequired", + { + "key": "loginButton", + "comment": [ + "&& denotes a mnemonic" + ] + }, + "username", + "password", + "proxyDetail", + "rememberCredentials", + "quitMessageMac", + "quitMessage", + "closeWindowMessage", + { + "key": "quitButtonLabel", + "comment": [ + "&& denotes a mnemonic" + ] + }, + { + "key": "exitButtonLabel", + "comment": [ + "&& denotes a mnemonic" + ] + }, + { + "key": "closeWindowButtonLabel", + "comment": [ + "&& denotes a mnemonic" + ] + }, + "doNotAskAgain", + "shutdownErrorDetail", + "willShutdownDetail", + "shutdownErrorClose", + "shutdownErrorQuit", + "shutdownErrorReload", + "shutdownErrorLoad", + "shutdownTitleClose", + "shutdownTitleQuit", + "shutdownTitleReload", + "shutdownTitleLoad", + "shutdownForceClose", + "shutdownForceQuit", + "shutdownForceReload", + "shutdownForceLoad", + "loaderCycle", + "runningAsRoot", + "appRootWarning.banner", + "windowseolmessage", + "windowseolBannerLearnMore", + "windowseolarialabel", + "learnMore", + "macoseolmessage", + "macoseolBannerLearnMore", + "macoseolarialabel", + "learnMore", + "resolveShellEnvironment", + "learnMore" + ], + "vs/workbench/services/configuration/browser/configurationService": [ + "configurationDefaults.description", + "experimental" + ], + "vs/platform/workspace/common/workspace": [ + "codeWorkspace" + ], + "vs/workbench/services/remote/electron-sandbox/remoteAgentService": [ + "devTools", + "directUrl", + "connectionError" + ], + "vs/workbench/services/log/electron-sandbox/logService": [ + "rendererLog" + ], + "vs/platform/workspace/common/workspaceTrust": [ + "trusted", + "untrusted" + ], + "vs/workbench/services/userDataProfile/common/userDataProfile": [ + "defaultProfileIcon", + "profiles", + "profile" ], "vs/platform/list/browser/listService": [ "workbenchConfigurationTitle", @@ -1095,6 +1206,9 @@ "sev.warning", "sev.info" ], + "vs/platform/contextkey/browser/contextKeyService": [ + "getContextKeyInfo" + ], "vs/platform/contextkey/common/contextkey": [ "contextkey.parser.error.emptyString", "contextkey.parser.error.emptyString.hint", @@ -1108,8 +1222,13 @@ "contextkey.scanner.errorForLinterWithHint", "contextkey.scanner.errorForLinter" ], - "vs/platform/contextkey/browser/contextKeyService": [ - "getContextKeyInfo" + "vs/workbench/browser/actions/textInputActions": [ + "undo", + "redo", + "cut", + "copy", + "paste", + "selectAll" ], "vs/workbench/browser/workbench.contribution": [ "workbench.editor.titleScrollbarSizing.default", @@ -1171,7 +1290,18 @@ ], "key": "tabSizing" }, - "workbench.editor.tabSizingFixedMaxWidth", + { + "comment": [ + "This is the description for a setting. Values surrounded by single quotes are not to be translated." + ], + "key": "workbench.editor.tabSizingFixedMinWidth" + }, + { + "comment": [ + "This is the description for a setting. Values surrounded by single quotes are not to be translated." + ], + "key": "workbench.editor.tabSizingFixedMaxWidth" + }, "workbench.editor.pinnedTabSizing.normal", "workbench.editor.pinnedTabSizing.compact", "workbench.editor.pinnedTabSizing.shrink", @@ -1181,6 +1311,7 @@ ], "key": "pinnedTabSizing" }, + "workbench.editor.splitSizingAuto", "workbench.editor.splitSizingDistribute", "workbench.editor.splitSizingSplit", { @@ -1217,6 +1348,12 @@ "workbench.editor.splitInGroupLayoutHorizontal", "centeredLayoutAutoResize", "centeredLayoutDynamicWidth", + { + "comment": [ + "This is the description for a setting. Values surrounded by single quotes are not to be translated." + ], + "key": "doubleClickTabToToggleEditorGroupSizes" + }, "limitEditorsEnablement", "limitEditorsMaximum", "limitEditorsExcludeDirty", @@ -1436,14 +1573,6 @@ ] } ], - "vs/workbench/browser/actions/textInputActions": [ - "undo", - "redo", - "cut", - "copy", - "paste", - "selectAll" - ], "vs/workbench/browser/actions/layoutActions": [ "menuBarIcon", "activityBarLeft", @@ -1750,6 +1879,14 @@ "addFolderToWorkspaceTitle", "workspaceFolderPickerPlaceholder" ], + "vs/workbench/browser/actions/quickAccessActions": [ + "quickOpen", + "quickOpenWithModes", + "quickNavigateNext", + "quickNavigatePrevious", + "quickSelectNext", + "quickSelectPrevious" + ], "vs/workbench/services/actions/common/menusExtensionPoint": [ "menus.commandPalette", "menus.touchBar", @@ -1870,14 +2007,6 @@ "missing.submenu", "submenuItem.duplicate" ], - "vs/workbench/browser/actions/quickAccessActions": [ - "quickOpen", - "quickOpenWithModes", - "quickNavigateNext", - "quickNavigatePrevious", - "quickSelectNext", - "quickSelectPrevious" - ], "vs/workbench/api/common/configurationExtensionPoint": [ "vscode.extension.contributes.configuration.title", "vscode.extension.contributes.configuration.order", @@ -2498,9 +2627,6 @@ "cancel", "dismiss" ], - "vs/workbench/services/configuration/common/jsonEditingService": [ - "errorInvalidFile" - ], "vs/workbench/services/preferences/browser/preferencesService": [ "openFolderFirst", "emptyKeybindingsHeader", @@ -2508,6 +2634,9 @@ "defaultKeybindings", "fail.createSettings" ], + "vs/workbench/services/configuration/common/jsonEditingService": [ + "errorInvalidFile" + ], "vs/workbench/services/editor/browser/editorResolverService": [ "editorResolver.conflictingDefaults", "editorResolver.configureDefault", @@ -2623,15 +2752,6 @@ "neverShowAgain", "neverShowAgain" ], - "vs/workbench/services/userDataProfile/browser/userDataProfileManagement": [ - "reload message when removed", - "reload message when removed", - "cannotRenameDefaultProfile", - "cannotDeleteDefaultProfile", - "switch profile", - "reload message", - "reload button" - ], "vs/workbench/services/userDataProfile/browser/userDataProfileImportExportService": [ "profile import error", "resolving uri", @@ -2639,6 +2759,8 @@ "import profile", "export", "close", + "troubleshoot issue", + "troubleshoot profile progress", "profiles.exporting", "export success", { @@ -2677,7 +2799,6 @@ "progress extensions", "switching profile", "select profile content handler", - "preview", "profile already exists", { "key": "overwrite", @@ -2705,16 +2826,99 @@ "export profile title", "profile name required" ], + "vs/workbench/services/userDataProfile/browser/userDataProfileManagement": [ + "reload message when removed", + "reload message when removed", + "cannotRenameDefaultProfile", + "cannotDeleteDefaultProfile", + "switch profile", + "reload message", + "reload button" + ], "vs/workbench/services/remote/common/remoteExplorerService": [ "tunnel.source.user", "tunnel.source.auto", "remote.localPortMismatch.single", "tunnel.staticallyForwarded" ], + "vs/workbench/services/filesConfiguration/common/filesConfigurationService": [ + "providerReadonly", + { + "key": "sessionReadonly", + "comment": [ + "Please do not translate the word \"command\", it is part of our internal syntax which must not change", + "{Locked=\"](command:{0})\"}" + ] + }, + { + "key": "configuredReadonly", + "comment": [ + "Please do not translate the word \"command\", it is part of our internal syntax which must not change", + "{Locked=\"](command:{0})\"}" + ] + }, + { + "key": "fileLocked", + "comment": [ + "Please do not translate the word \"command\", it is part of our internal syntax which must not change", + "{Locked=\"](command:{0})\"}" + ] + }, + "fileReadonly" + ], "vs/workbench/services/views/browser/viewDescriptorService": [ "hideView", "resetViewLocation" ], + "vs/workbench/services/authentication/browser/authenticationService": [ + "authentication.id", + "authentication.label", + { + "key": "authenticationExtensionPoint", + "comment": [ + "'Contributes' means adds here" + ] + }, + "authentication.Placeholder", + "authentication.missingId", + "authentication.missingLabel", + "authentication.idConflict", + "loading", + "sign in", + "confirmAuthenticationAccess", + { + "key": "allow", + "comment": [ + "&& denotes a mnemonic" + ] + }, + { + "key": "deny", + "comment": [ + "&& denotes a mnemonic" + ] + }, + "useOtherAccount", + { + "key": "selectAccount", + "comment": [ + "The placeholder {0} is the name of an extension. {1} is the name of the type of account, such as Microsoft or GitHub." + ] + }, + "getSessionPlateholder", + { + "key": "accessRequest", + "comment": [ + "The placeholder {0} will be replaced with an authentication provider''s label. {1} will be replaced with an extension name. (1) is to indicate that this menu item contributes to a badge count" + ] + }, + { + "key": "signInRequest", + "comment": [ + "The placeholder {0} will be replaced with an authentication provider's label. {1} will be replaced with an extension name. (1) is to indicate that this menu item contributes to a badge count." + ] + } + ], "vs/workbench/services/userDataSync/browser/userDataSyncWorkbenchService": [ "no authentication providers", "no account", @@ -2765,52 +2969,53 @@ "others", "sign in using account" ], - "vs/workbench/services/authentication/browser/authenticationService": [ - "authentication.id", - "authentication.label", - { - "key": "authenticationExtensionPoint", - "comment": [ - "'Contributes' means adds here" - ] - }, - "authentication.Placeholder", - "authentication.missingId", - "authentication.missingLabel", - "authentication.idConflict", - "loading", - "sign in", - "confirmAuthenticationAccess", - { - "key": "allow", - "comment": [ - "&& denotes a mnemonic" - ] - }, + "vs/workbench/services/assignment/common/assignmentService": [ + "workbench.enableExperiments" + ], + "vs/workbench/services/issue/browser/issueTroubleshoot": [ + "troubleshoot issue", + "detail.start", { - "key": "deny", + "key": "msg", "comment": [ "&& denotes a mnemonic" ] }, - "useOtherAccount", - { - "key": "selectAccount", - "comment": [ - "The placeholder {0} is the name of an extension. {1} is the name of the type of account, such as Microsoft or GitHub." - ] - }, - "getSessionPlateholder", + "profile.extensions.disabled", + "empty.profile", + "issue is with configuration", + "issue is in core", + "I cannot reproduce", + "This is Bad", + "Stop", + "troubleshoot issue", + "use insiders", + "troubleshoot issue", + "download insiders", + "report anyway", + "ask to download insiders", + "troubleshoot issue", + "good", + "bad", + "stop", + "ask to reproduce issue", + "troubleshootIssue", + "title.stop" + ], + "vs/workbench/contrib/preferences/browser/keybindingsEditorContribution": [ + "defineKeybinding.kbLayoutErrorMessage", { - "key": "accessRequest", + "key": "defineKeybinding.kbLayoutLocalAndUSMessage", "comment": [ - "The placeholder {0} will be replaced with an authentication provider''s label. {1} will be replaced with an extension name. (1) is to indicate that this menu item contributes to a badge count" + "Please translate maintaining the stars (*) around the placeholders such that they will be rendered in bold.", + "The placeholders will contain a keyboard combination e.g. Ctrl+Shift+/" ] }, { - "key": "signInRequest", + "key": "defineKeybinding.kbLayoutLocalMessage", "comment": [ - "The placeholder {0} will be replaced with an authentication provider's label. {1} will be replaced with an extension name. (1) is to indicate that this menu item contributes to a badge count." + "Please translate maintaining the stars (*) around the placeholder such that it will be rendered in bold.", + "The placeholder will contain a keyboard combination e.g. Ctrl+Shift+/" ] } ], @@ -2882,22 +3087,11 @@ ] } ], - "vs/workbench/contrib/preferences/browser/keybindingsEditorContribution": [ - "defineKeybinding.kbLayoutErrorMessage", - { - "key": "defineKeybinding.kbLayoutLocalAndUSMessage", - "comment": [ - "Please translate maintaining the stars (*) around the placeholders such that they will be rendered in bold.", - "The placeholders will contain a keyboard combination e.g. Ctrl+Shift+/" - ] - }, - { - "key": "defineKeybinding.kbLayoutLocalMessage", - "comment": [ - "Please translate maintaining the stars (*) around the placeholder such that it will be rendered in bold.", - "The placeholder will contain a keyboard combination e.g. Ctrl+Shift+/" - ] - } + "vs/workbench/contrib/performance/browser/performance.contribution": [ + "show.label", + "cycles", + "insta.trace", + "emitter" ], "vs/workbench/contrib/notebook/browser/notebook.contribution": [ "notebook.editorOptions.experimentalCustomization", @@ -2943,12 +3137,6 @@ "notebook.confirmDeleteRunningCell", "notebook.findScope" ], - "vs/workbench/contrib/performance/browser/performance.contribution": [ - "show.label", - "cycles", - "insta.trace", - "emitter" - ], "vs/workbench/contrib/chat/browser/chat.contribution": [ "interactiveSessionConfigurationTitle", "interactiveSession.editor.fontSize", @@ -2956,9 +3144,9 @@ "interactiveSession.editor.fontWeight", "interactiveSession.editor.wordWrap", "interactiveSession.editor.lineHeight", - "interactiveSession.experimental.quickQuestion.enable", "chat", - "chat" + "chat", + "chatAccessibleView" ], "vs/workbench/contrib/interactive/browser/interactive.contribution": [ "interactiveWindow", @@ -2974,8 +3162,7 @@ "interactive.history.focus", "interactive.activeCodeBorder", "interactive.inactiveCodeBorder", - "interactiveWindow.alwaysScrollOnNewCell", - "interactiveWindow.restore" + "interactiveWindow.alwaysScrollOnNewCell" ], "vs/workbench/contrib/testing/browser/testing.contribution": [ "test", @@ -3077,46 +3264,6 @@ ] } ], - "vs/workbench/contrib/bulkEdit/browser/bulkEditService": [ - "summary.0", - "summary.nm", - "summary.n0", - "summary.textFiles", - "workspaceEdit", - "workspaceEdit", - "nothing", - "closeTheWindow.message", - { - "key": "closeTheWindow", - "comment": [ - "&& denotes a mnemonic" - ] - }, - "changeWorkspace.message", - { - "key": "changeWorkspace", - "comment": [ - "&& denotes a mnemonic" - ] - }, - "reloadTheWindow.message", - { - "key": "reloadTheWindow", - "comment": [ - "&& denotes a mnemonic" - ] - }, - "quit.message", - { - "key": "quit", - "comment": [ - "&& denotes a mnemonic" - ] - }, - "areYouSureQuiteBulkEdit.detail", - "fileOperation", - "refactoring.autoSave" - ], "vs/workbench/contrib/files/browser/fileActions.contribution": [ "copyPath", "copyRelativePath", @@ -3274,6 +3421,8 @@ "askUser", "overwriteFileOnDisk", "files.saveConflictResolution", + "defaultPathErrorMessage", + "fileDialogDefaultPath", "files.simpleDialog.enable", "files.participants.timeout", "formatOnSave", @@ -3363,34 +3512,70 @@ "fileNestingPatterns", "fileNesting.description" ], - "vs/workbench/contrib/bulkEdit/browser/preview/bulkEdit.contribution": [ - "overlap", - "detail", + "vs/workbench/contrib/bulkEdit/browser/bulkEditService": [ + "summary.0", + "summary.nm", + "summary.n0", + "summary.textFiles", + "workspaceEdit", + "workspaceEdit", + "nothing", + "closeTheWindow.message", { - "key": "continue", + "key": "closeTheWindow", "comment": [ "&& denotes a mnemonic" ] }, - "apply", - "cat", - "Discard", - "cat", - "toogleSelection", - "cat", - "groupByFile", - "cat", - "groupByType", - "cat", - "groupByType", - "cat", - "refactorPreviewViewIcon", - "panel", - "panel" + "changeWorkspace.message", + { + "key": "changeWorkspace", + "comment": [ + "&& denotes a mnemonic" + ] + }, + "reloadTheWindow.message", + { + "key": "reloadTheWindow", + "comment": [ + "&& denotes a mnemonic" + ] + }, + "quit.message", + { + "key": "quit", + "comment": [ + "&& denotes a mnemonic" + ] + }, + "areYouSureQuiteBulkEdit.detail", + "fileOperation", + "refactoring.autoSave" ], - "vs/workbench/contrib/sash/browser/sash.contribution": [ - "sashSize", - "sashHoverDelay" + "vs/workbench/contrib/bulkEdit/browser/preview/bulkEdit.contribution": [ + "overlap", + "detail", + { + "key": "continue", + "comment": [ + "&& denotes a mnemonic" + ] + }, + "apply", + "cat", + "Discard", + "cat", + "toogleSelection", + "cat", + "groupByFile", + "cat", + "groupByType", + "cat", + "groupByType", + "cat", + "refactorPreviewViewIcon", + "panel", + "panel" ], "vs/workbench/contrib/search/browser/search.contribution": [ "name", @@ -3495,6 +3680,10 @@ "searchEditor.action.selectAllSearchEditorMatches", "search.openNewEditor" ], + "vs/workbench/contrib/sash/browser/sash.contribution": [ + "sashSize", + "sashHoverDelay" + ], "vs/workbench/contrib/search/browser/searchView": [ "searchCanceled", "moreSearch", @@ -4031,7 +4220,13 @@ "comments.openView.firstFile", "comments.openView", "useRelativeTime", - "comments.visible" + "comments.visible", + "comments.maxHeight" + ], + "vs/workbench/contrib/url/browser/url.contribution": [ + "openUrl", + "urlToOpen", + "workbench.trustedDomains.promptInTrustedWorkspace" ], "vs/workbench/contrib/webview/browser/webview.contribution": [ "cut", @@ -4041,10 +4236,51 @@ "vs/workbench/contrib/webviewPanel/browser/webviewPanel.contribution": [ "webview.editor.label" ], - "vs/workbench/contrib/url/browser/url.contribution": [ - "openUrl", - "urlToOpen", - "workbench.trustedDomains.promptInTrustedWorkspace" + "vs/workbench/contrib/extensions/browser/extensionsViewlet": [ + { + "key": "remote", + "comment": [ + "Remote as in remote machine" + ] + }, + "installed", + "select and install local extensions", + "install remote in local", + "popularExtensions", + "recommendedExtensions", + "enabledExtensions", + "disabledExtensions", + "marketPlace", + "installed", + "recently updated", + "enabled", + "disabled", + "availableUpdates", + "builtin", + "workspaceUnsupported", + "workspaceRecommendedExtensions", + "otherRecommendedExtensions", + "builtinFeatureExtensions", + "builtInThemesExtensions", + "builtinProgrammingLanguageExtensions", + "untrustedUnsupportedExtensions", + "untrustedPartiallySupportedExtensions", + "virtualUnsupportedExtensions", + "virtualPartiallySupportedExtensions", + "deprecated", + "searchExtensions", + "extensionFoundInSection", + "extensionFound", + "extensionsFoundInSection", + "extensionsFound", + "suggestProxyError", + "open user settings", + "extensionToUpdate", + "extensionsToUpdate", + "extensionToReload", + "extensionsToReload", + "malicious warning", + "reloadNow" ], "vs/workbench/contrib/extensions/browser/extensions.contribution": [ "manageExtensionsQuickAccessPlaceholder", @@ -4197,58 +4433,6 @@ "extensions", "extensions" ], - "vs/workbench/contrib/extensions/browser/extensionsViewlet": [ - { - "key": "remote", - "comment": [ - "Remote as in remote machine" - ] - }, - "installed", - "select and install local extensions", - "install remote in local", - "popularExtensions", - "recommendedExtensions", - "enabledExtensions", - "disabledExtensions", - "marketPlace", - "installed", - "recently updated", - "enabled", - "disabled", - "availableUpdates", - "builtin", - "workspaceUnsupported", - "workspaceRecommendedExtensions", - "otherRecommendedExtensions", - "builtinFeatureExtensions", - "builtInThemesExtensions", - "builtinProgrammingLanguageExtensions", - "untrustedUnsupportedExtensions", - "untrustedPartiallySupportedExtensions", - "virtualUnsupportedExtensions", - "virtualPartiallySupportedExtensions", - "deprecated", - "searchExtensions", - "extensionFoundInSection", - "extensionFound", - "extensionsFoundInSection", - "extensionsFound", - "suggestProxyError", - "open user settings", - "extensionToUpdate", - "extensionsToUpdate", - "extensionToReload", - "extensionsToReload", - "malicious warning", - "reloadNow" - ], - "vs/workbench/contrib/output/browser/outputView": [ - "output model title", - "channel", - "output", - "outputViewAriaLabel" - ], "vs/workbench/contrib/output/browser/output.contribution": [ "outputViewIcon", "output", @@ -4275,6 +4459,7 @@ "extensionLogs", "selectlog", "openLogFile", + "logFile", "selectlogFile", "output", "output.smartScroll.enabled" @@ -4440,11 +4625,6 @@ "vs/workbench/contrib/keybindings/browser/keybindings.contribution": [ "toggleKeybindingsLog" ], - "vs/workbench/contrib/folding/browser/folding.contribution": [ - "null", - "nullFormatterDescription", - "formatter.default" - ], "vs/workbench/contrib/snippets/browser/snippets.contribution": [ "editor.snippets.codeActions.enabled", "snippetSchema.json.prefix", @@ -4457,6 +4637,17 @@ "snippetSchema.json", "snippetSchema.json.scope" ], + "vs/workbench/contrib/output/browser/outputView": [ + "output model title", + "channel", + "output", + "outputViewAriaLabel" + ], + "vs/workbench/contrib/folding/browser/folding.contribution": [ + "null", + "nullFormatterDescription", + "formatter.default" + ], "vs/workbench/contrib/limitIndicator/browser/limitIndicator.contribution": [ "status.button.configure", "colorDecoratorsStatusItem.name", @@ -4720,9 +4911,6 @@ "name.pattern", "reset" ], - "vs/workbench/contrib/experiments/browser/experiments.contribution": [ - "workbench.enableExperiments" - ], "vs/workbench/contrib/userDataSync/browser/userDataSync.contribution": [ { "key": "local too many requests - reload", @@ -4963,7 +5151,10 @@ "audioCues.diffLineDeleted", "audioCues.diffLineModified", "audioCues.notebookCellCompleted", - "audioCues.notebookCellFailed" + "audioCues.notebookCellFailed", + "audioCues.chatRequestSent", + "audioCues.chatResponsePending", + "audioCues.chatResponseReceived" ], "vs/workbench/contrib/deprecatedExtensionMigrator/browser/deprecatedExtensionMigrator.contribution": [ "bracketPairColorizer.notification", @@ -4971,150 +5162,62 @@ "bracketPairColorizer.notification.action.enableNative", "bracketPairColorizer.notification.action.showMoreInfo" ], + "vs/workbench/contrib/accessibility/browser/accessibility.contribution": [ + "editor-help", + "hoverAccessibleView" + ], "vs/workbench/contrib/share/browser/share.contribution": [ "share", "generating link", + "shareTextSuccess", "shareSuccess", "close", - "open link" + "open link", + "experimental.share.enabled" ], - "vs/workbench/browser/workbench": [ - "loaderErrorNative" + "vs/platform/configuration/common/configurationRegistry": [ + "defaultLanguageConfigurationOverrides.title", + "defaultLanguageConfiguration.description", + "overrideSettings.defaultDescription", + "overrideSettings.errorMessage", + "overrideSettings.defaultDescription", + "overrideSettings.errorMessage", + "config.property.empty", + "config.property.languageDefault", + "config.property.duplicate", + "config.policy.duplicate" ], - "vs/workbench/electron-sandbox/window": [ - "restart", - "configure", - "learnMore", - "keychainWriteError", - "troubleshooting", - "proxyAuthRequired", + "vs/workbench/electron-sandbox/actions/developerActions": [ + "toggleDevTools", + "configureRuntimeArguments", + "reloadWindowWithExtensionsDisabled", + "openUserDataFolder" + ], + "vs/workbench/electron-sandbox/actions/windowActions": [ + "closeWindow", { - "key": "loginButton", + "key": "miCloseWindow", "comment": [ "&& denotes a mnemonic" ] }, - "username", - "password", - "proxyDetail", - "rememberCredentials", - "quitMessageMac", - "quitMessage", - "closeWindowMessage", + "zoomIn", { - "key": "quitButtonLabel", + "key": "miZoomIn", "comment": [ "&& denotes a mnemonic" ] }, + "zoomOut", { - "key": "exitButtonLabel", + "key": "miZoomOut", "comment": [ "&& denotes a mnemonic" ] }, + "zoomReset", { - "key": "closeWindowButtonLabel", - "comment": [ - "&& denotes a mnemonic" - ] - }, - "doNotAskAgain", - "shutdownErrorDetail", - "willShutdownDetail", - "shutdownErrorClose", - "shutdownErrorQuit", - "shutdownErrorReload", - "shutdownErrorLoad", - "shutdownTitleClose", - "shutdownTitleQuit", - "shutdownTitleReload", - "shutdownTitleLoad", - "shutdownForceClose", - "shutdownForceQuit", - "shutdownForceReload", - "shutdownForceLoad", - "loaderCycle", - "runningAsRoot", - "appRootWarning.banner", - "windowseolmessage", - "windowseolBannerLearnMore", - "windowseolarialabel", - "learnMore", - "macoseolmessage", - "macoseolBannerLearnMore", - "macoseolarialabel", - "learnMore", - "resolveShellEnvironment", - "learnMore" - ], - "vs/workbench/services/configuration/browser/configurationService": [ - "configurationDefaults.description", - "experimental" - ], - "vs/platform/workspace/common/workspace": [ - "codeWorkspace" - ], - "vs/workbench/services/remote/electron-sandbox/remoteAgentService": [ - "devTools", - "directUrl", - "connectionError" - ], - "vs/workbench/services/log/electron-sandbox/logService": [ - "rendererLog" - ], - "vs/platform/workspace/common/workspaceTrust": [ - "trusted", - "untrusted" - ], - "vs/workbench/services/userDataProfile/common/userDataProfile": [ - "defaultProfileIcon", - "profiles", - "profile" - ], - "vs/platform/configuration/common/configurationRegistry": [ - "defaultLanguageConfigurationOverrides.title", - "defaultLanguageConfiguration.description", - "overrideSettings.defaultDescription", - "overrideSettings.errorMessage", - "overrideSettings.defaultDescription", - "overrideSettings.errorMessage", - "config.property.empty", - "config.property.languageDefault", - "config.property.duplicate", - "config.policy.duplicate" - ], - "vs/workbench/electron-sandbox/actions/developerActions": [ - "toggleDevTools", - "configureRuntimeArguments", - "reloadWindowWithExtensionsDisabled", - "openUserDataFolder" - ], - "vs/workbench/electron-sandbox/actions/windowActions": [ - "closeWindow", - { - "key": "miCloseWindow", - "comment": [ - "&& denotes a mnemonic" - ] - }, - "zoomIn", - { - "key": "miZoomIn", - "comment": [ - "&& denotes a mnemonic" - ] - }, - "zoomOut", - { - "key": "miZoomOut", - "comment": [ - "&& denotes a mnemonic" - ] - }, - "zoomReset", - { - "key": "miZoomReset", + "key": "miZoomReset", "comment": [ "&& denotes a mnemonic" ] @@ -5138,6 +5241,13 @@ "productQualityType", "inputFocus" ], + "vs/workbench/electron-sandbox/actions/installActions": [ + "shellCommand", + "install", + "successIn", + "uninstall", + "successFrom" + ], "vs/workbench/common/contextkeys": [ "workbenchState", "workspaceFolderCount", @@ -5200,13 +5310,6 @@ "resourceSet", "isFileSystemResource" ], - "vs/workbench/electron-sandbox/actions/installActions": [ - "shellCommand", - "install", - "successIn", - "uninstall", - "successFrom" - ], "vs/workbench/common/configuration": [ "applicationConfigurationTitle", "workbenchConfigurationTitle", @@ -5411,6 +5514,8 @@ "diffEditorBorder", "diffDiagonalFill", "diffEditor.unchangedRegionBackground", + "diffEditor.unchangedRegionForeground", + "diffEditor.unchangedCodeBackground", "listFocusBackground", "listFocusForeground", "listFocusOutline", @@ -5625,6 +5730,12 @@ "vs/base/common/actions": [ "submenu.empty" ], + "vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService": [ + "save", + "saveWorkspace", + "errorInvalidTaskConfiguration", + "openWorkspaceConfigurationFile" + ], "vs/workbench/services/configurationResolver/browser/baseConfigurationResolverService": [ "commandVariable.noStringType", "inputVariable.noInputSection", @@ -5697,6 +5808,12 @@ "revertBeforeShutdown", "discardBackupsBeforeShutdown" ], + "vs/workbench/services/workingCopy/common/workingCopyHistoryService": [ + "default.source", + "moved.source", + "renamed.source", + "join.workingCopyHistory" + ], "vs/platform/action/common/actionCommonCategories": [ "view", "help", @@ -5710,12 +5827,6 @@ ] } ], - "vs/workbench/services/workingCopy/common/workingCopyHistoryService": [ - "default.source", - "moved.source", - "renamed.source", - "join.workingCopyHistory" - ], "vs/workbench/services/extensions/common/abstractExtensionService": [ "looping", "looping", @@ -5728,12 +5839,6 @@ "extensionService.crash", "restart" ], - "vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService": [ - "save", - "saveWorkspace", - "errorInvalidTaskConfiguration", - "openWorkspaceConfigurationFile" - ], "vs/workbench/services/extensions/electron-sandbox/cachedExtensionScanner": [ "extensionCache.invalid", "reloadWindow" @@ -5919,11 +6024,6 @@ "sync category", "syncViewIcon" ], - "vs/workbench/contrib/tasks/common/tasks": [ - "tasks.taskRunningContext", - "tasksCategory", - "TaskDefinition.missingRequiredProperty" - ], "vs/workbench/contrib/performance/electron-sandbox/startupProfiler": [ "prof.message", "prof.detail", @@ -5943,6 +6043,11 @@ ] } ], + "vs/workbench/contrib/tasks/common/tasks": [ + "tasks.taskRunningContext", + "tasksCategory", + "TaskDefinition.missingRequiredProperty" + ], "vs/workbench/contrib/tasks/common/taskService": [ "tasks.customExecutionSupported", "tasks.shellExecutionSupported", @@ -5950,6 +6055,11 @@ "tasks.processExecutionSupported", "tasks.serverlessWebContext" ], + "vs/workbench/common/views": [ + "defaultViewIcon", + "duplicateId", + "treeView.notRegistered" + ], "vs/workbench/contrib/tasks/browser/abstractTaskService": [ "ConfigureTaskRunnerAction.label", "tasks", @@ -6110,15 +6220,14 @@ "audioCues.notebookCellFailed", "audioCues.diffLineInserted", "audioCues.diffLineDeleted", - "audioCues.diffLineModified" - ], - "vs/workbench/common/views": [ - "defaultViewIcon", - "duplicateId", - "treeView.notRegistered" + "audioCues.diffLineModified", + "audioCues.chatRequestSent", + "audioCues.chatResponseReceived", + "audioCues.chatResponsePending" ], "vs/workbench/contrib/terminal/common/terminalContextKey": [ "terminalFocusContextKey", + "terminalFocusInAnyContextKey", "terminalAccessibleBufferFocusContextKey", "terminalEditorFocusContextKey", "terminalCountContextKey", @@ -6128,6 +6237,7 @@ "terminalSuggestWidgetVisible", "terminalViewShowing", "terminalTextSelectedContextKey", + "terminalTextSelectedInFocusedContextKey", "terminalProcessSupportedContextKey", "terminalTabsSingularSelectedContextKey", "isSplitTerminalContextKey", @@ -6138,17 +6248,17 @@ "openToolsLabel", "iframeWebviewAlert" ], + "vs/workbench/contrib/localHistory/electron-sandbox/localHistoryCommands": [ + "revealInWindows", + "revealInMac", + "openContainer" + ], "vs/workbench/contrib/mergeEditor/electron-sandbox/devCommands": [ "mergeEditor", "merge.dev.openState", "mergeEditor.enterJSON", "merge.dev.openSelectionInTemporaryMergeEditor" ], - "vs/workbench/contrib/localHistory/electron-sandbox/localHistoryCommands": [ - "revealInWindows", - "revealInMac", - "openContainer" - ], "vs/workbench/api/common/extHostExtensionService": [ "extensionTestError1", "extensionTestError" @@ -6167,13 +6277,19 @@ "worker", "local" ], - "vs/workbench/api/node/extHostTunnelService": [ - "tunnelPrivacy.private", - "tunnelPrivacy.public" + "vs/platform/terminal/node/terminalProcess": [ + "launchFail.cwdNotDirectory", + "launchFail.cwdDoesNotExist", + "launchFail.executableDoesNotExist", + "launchFail.executableIsNotFileOrSymlink" ], "vs/workbench/api/node/extHostDebugService": [ "debug.terminal.title" ], + "vs/workbench/api/node/extHostTunnelService": [ + "tunnelPrivacy.private", + "tunnelPrivacy.public" + ], "vs/platform/dialogs/electron-main/dialogMainService": [ "open", "openFolder", @@ -6253,6 +6369,14 @@ "cantUninstall", "sourceMissing" ], + "vs/platform/workspaces/electron-main/workspacesHistoryMainService": [ + "newWindow", + "newWindowDesc", + "recentFoldersAndWorkspaces", + "recentFolders", + "untitledWorkspace", + "workspaceName" + ], "vs/platform/windows/electron-main/windowsMainService": [ { "key": "ok", @@ -6286,14 +6410,6 @@ "confirmOpenDetail", "doNotAskAgain" ], - "vs/platform/workspaces/electron-main/workspacesHistoryMainService": [ - "newWindow", - "newWindowDesc", - "recentFoldersAndWorkspaces", - "recentFolders", - "untitledWorkspace", - "workspaceName" - ], "vs/platform/workspaces/electron-main/workspacesManagementMainService": [ { "key": "ok", @@ -6327,6 +6443,20 @@ "versionSpecificity2", "versionMismatch" ], + "vs/base/common/jsonErrorMessages": [ + "error.invalidSymbol", + "error.invalidNumberFormat", + "error.propertyNameExpected", + "error.valueExpected", + "error.colonExpected", + "error.commaExpected", + "error.closeBraceExpected", + "error.closeBracketExpected", + "error.endOfFileExpected" + ], + "vs/platform/extensionManagement/common/extensionNls": [ + "missingNLSKey" + ], "vs/base/node/zip": [ "invalid file", "incompleteExtract", @@ -6349,20 +6479,6 @@ "vs/platform/extensionManagement/node/extensionManagementUtil": [ "invalidManifest" ], - "vs/base/common/jsonErrorMessages": [ - "error.invalidSymbol", - "error.invalidNumberFormat", - "error.propertyNameExpected", - "error.valueExpected", - "error.colonExpected", - "error.commaExpected", - "error.closeBraceExpected", - "error.closeBracketExpected", - "error.endOfFileExpected" - ], - "vs/platform/extensionManagement/common/extensionNls": [ - "missingNLSKey" - ], "vs/base/browser/ui/button/button": [ "button dropdown more actions" ], @@ -6447,12 +6563,6 @@ "session expired", "turned off machine" ], - "vs/platform/terminal/node/terminalProcess": [ - "launchFail.cwdNotDirectory", - "launchFail.cwdDoesNotExist", - "launchFail.executableDoesNotExist", - "launchFail.executableIsNotFileOrSymlink" - ], "vs/base/browser/ui/tree/abstractTree": [ "filter", "fuzzySearch", @@ -6469,60 +6579,167 @@ "previousChangeIcon", "nextChangeIcon" ], - "vs/editor/common/core/editorColorRegistry": [ - "lineHighlight", - "lineHighlightBorderBox", - "rangeHighlight", - "rangeHighlightBorder", - "symbolHighlight", - "symbolHighlightBorder", - "caret", - "editorCursorBackground", - "editorWhitespaces", - "editorIndentGuides", - "editorActiveIndentGuide", - "editorLineNumbers", - "editorActiveLineNumber", - "deprecatedEditorActiveLineNumber", - "editorActiveLineNumber", - "editorDimmedLineNumber", - "editorRuler", - "editorCodeLensForeground", - "editorBracketMatchBackground", - "editorBracketMatchBorder", - "editorOverviewRulerBorder", - "editorOverviewRulerBackground", - "editorGutter", - "unnecessaryCodeBorder", - "unnecessaryCodeOpacity", - "editorGhostTextBorder", - "editorGhostTextForeground", - "editorGhostTextBackground", - "overviewRulerRangeHighlight", - "overviewRuleError", - "overviewRuleWarning", - "overviewRuleInfo", - "editorBracketHighlightForeground1", - "editorBracketHighlightForeground2", - "editorBracketHighlightForeground3", - "editorBracketHighlightForeground4", - "editorBracketHighlightForeground5", - "editorBracketHighlightForeground6", - "editorBracketHighlightUnexpectedBracketForeground", - "editorBracketPairGuide.background1", - "editorBracketPairGuide.background2", - "editorBracketPairGuide.background3", - "editorBracketPairGuide.background4", - "editorBracketPairGuide.background5", - "editorBracketPairGuide.background6", - "editorBracketPairGuide.activeBackground1", - "editorBracketPairGuide.activeBackground2", - "editorBracketPairGuide.activeBackground3", - "editorBracketPairGuide.activeBackground4", - "editorBracketPairGuide.activeBackground5", - "editorBracketPairGuide.activeBackground6", - "editorUnicodeHighlight.border", - "editorUnicodeHighlight.background" + "vs/workbench/browser/parts/notifications/notificationsAlerts": [ + "alertErrorMessage", + "alertWarningMessage", + "alertInfoMessage" + ], + "vs/workbench/browser/parts/notifications/notificationsCenter": [ + "notificationsEmpty", + "notifications", + "notificationsToolbar", + "notificationsCenterWidgetAriaLabel" + ], + "vs/workbench/browser/parts/notifications/notificationsStatus": [ + "status.notifications", + "status.notifications", + "status.doNotDisturb", + "status.doNotDisturbTooltip", + "hideNotifications", + "zeroNotifications", + "noNotifications", + "oneNotification", + { + "key": "notifications", + "comment": [ + "{0} will be replaced by a number" + ] + }, + { + "key": "noNotificationsWithProgress", + "comment": [ + "{0} will be replaced by a number" + ] + }, + { + "key": "oneNotificationWithProgress", + "comment": [ + "{0} will be replaced by a number" + ] + }, + { + "key": "notificationsWithProgress", + "comment": [ + "{0} and {1} will be replaced by a number" + ] + }, + "status.message" + ], + "vs/workbench/browser/parts/notifications/notificationsCommands": [ + "notifications", + "showNotifications", + "hideNotifications", + "clearAllNotifications", + "acceptNotificationPrimaryAction", + "toggleDoNotDisturbMode", + "focusNotificationToasts" + ], + "vs/workbench/browser/parts/notifications/notificationsToasts": [ + "notificationAriaLabel", + "notificationWithSourceAriaLabel" + ], + "vs/platform/actions/browser/menuEntryActionViewItem": [ + "titleAndKb", + "titleAndKb", + "titleAndKbAndAlt" + ], + "vs/workbench/services/configuration/common/configurationEditing": [ + "openTasksConfiguration", + "openLaunchConfiguration", + "open", + "openTasksConfiguration", + "openLaunchConfiguration", + "saveAndRetry", + "saveAndRetry", + "open", + "errorPolicyConfiguration", + "errorUnknownKey", + "errorInvalidWorkspaceConfigurationApplication", + "errorInvalidWorkspaceConfigurationMachine", + "errorInvalidFolderConfiguration", + "errorInvalidUserTarget", + "errorInvalidWorkspaceTarget", + "errorInvalidFolderTarget", + "errorInvalidResourceLanguageConfiguration", + "errorNoWorkspaceOpened", + "errorInvalidTaskConfiguration", + "errorInvalidLaunchConfiguration", + "errorInvalidConfiguration", + "errorInvalidRemoteConfiguration", + "errorInvalidConfigurationWorkspace", + "errorInvalidConfigurationFolder", + "errorTasksConfigurationFileDirty", + "errorLaunchConfigurationFileDirty", + "errorConfigurationFileDirty", + "errorRemoteConfigurationFileDirty", + "errorConfigurationFileDirtyWorkspace", + "errorConfigurationFileDirtyFolder", + "errorTasksConfigurationFileModifiedSince", + "errorLaunchConfigurationFileModifiedSince", + "errorConfigurationFileModifiedSince", + "errorRemoteConfigurationFileModifiedSince", + "errorConfigurationFileModifiedSinceWorkspace", + "errorConfigurationFileModifiedSinceFolder", + "errorUnknown", + "userTarget", + "remoteUserTarget", + "workspaceTarget", + "folderTarget" + ], + "vs/editor/common/core/editorColorRegistry": [ + "lineHighlight", + "lineHighlightBorderBox", + "rangeHighlight", + "rangeHighlightBorder", + "symbolHighlight", + "symbolHighlightBorder", + "caret", + "editorCursorBackground", + "editorWhitespaces", + "editorIndentGuides", + "editorActiveIndentGuide", + "editorLineNumbers", + "editorActiveLineNumber", + "deprecatedEditorActiveLineNumber", + "editorActiveLineNumber", + "editorDimmedLineNumber", + "editorRuler", + "editorCodeLensForeground", + "editorBracketMatchBackground", + "editorBracketMatchBorder", + "editorOverviewRulerBorder", + "editorOverviewRulerBackground", + "editorGutter", + "unnecessaryCodeBorder", + "unnecessaryCodeOpacity", + "editorGhostTextBorder", + "editorGhostTextForeground", + "editorGhostTextBackground", + "overviewRulerRangeHighlight", + "overviewRuleError", + "overviewRuleWarning", + "overviewRuleInfo", + "editorBracketHighlightForeground1", + "editorBracketHighlightForeground2", + "editorBracketHighlightForeground3", + "editorBracketHighlightForeground4", + "editorBracketHighlightForeground5", + "editorBracketHighlightForeground6", + "editorBracketHighlightUnexpectedBracketForeground", + "editorBracketPairGuide.background1", + "editorBracketPairGuide.background2", + "editorBracketPairGuide.background3", + "editorBracketPairGuide.background4", + "editorBracketPairGuide.background5", + "editorBracketPairGuide.background6", + "editorBracketPairGuide.activeBackground1", + "editorBracketPairGuide.activeBackground2", + "editorBracketPairGuide.activeBackground3", + "editorBracketPairGuide.activeBackground4", + "editorBracketPairGuide.activeBackground5", + "editorBracketPairGuide.activeBackground6", + "editorUnicodeHighlight.border", + "editorUnicodeHighlight.background" ], "vs/platform/contextkey/common/scanner": [ "contextkey.scanner.hint.didYouMean1", @@ -6536,6 +6753,10 @@ "stickydesc", "removedCursor" ], + "vs/editor/browser/widget/codeEditorWidget": [ + "cursors.maximum", + "goToSetting" + ], "vs/editor/contrib/anchorSelect/browser/anchorSelect": [ "selectionAnchor", "anchorSet", @@ -6544,10 +6765,6 @@ "selectFromAnchorToCursor", "cancelSelectionAnchor" ], - "vs/editor/contrib/caretOperations/browser/caretOperations": [ - "caret.moveLeft", - "caret.moveRight" - ], "vs/editor/contrib/bracketMatching/browser/bracketMatching": [ "overviewRulerBracketMatchForeground", "smartSelect.jumpBracket", @@ -6560,6 +6777,20 @@ ] } ], + "vs/editor/browser/widget/diffEditorWidget": [ + "diffInsertIcon", + "diffRemoveIcon", + "diff-aria-navigation-tip", + "diff.tooLarge", + "revertChangeHoverMessage" + ], + "vs/editor/contrib/caretOperations/browser/caretOperations": [ + "caret.moveLeft", + "caret.moveRight" + ], + "vs/editor/contrib/caretOperations/browser/transpose": [ + "transposeLetters.label" + ], "vs/editor/contrib/clipboard/browser/clipboard": [ { "key": "miCut", @@ -6595,26 +6826,33 @@ "actions.clipboard.pasteLabel", "actions.clipboard.copyWithSyntaxHighlightingLabel" ], - "vs/editor/browser/widget/codeEditorWidget": [ - "cursors.maximum", - "goToSetting" - ], - "vs/editor/browser/widget/diffEditorWidget": [ - "diffInsertIcon", - "diffRemoveIcon", - "diff-aria-navigation-tip", - "diff.tooLarge", - "revertChangeHoverMessage" - ], - "vs/editor/contrib/caretOperations/browser/transpose": [ - "transposeLetters.label" - ], "vs/editor/contrib/codeAction/browser/codeActionContributions": [ "showCodeActionHeaders" ], "vs/editor/contrib/codelens/browser/codelensController": [ "showLensOnLine" ], + "vs/editor/contrib/colorPicker/browser/standaloneColorPickerActions": [ + "showOrFocusStandaloneColorPicker", + { + "key": "mishowOrFocusStandaloneColorPicker", + "comment": [ + "&& denotes a mnemonic" + ] + }, + { + "key": "hideColorPicker", + "comment": [ + "Action that hides the color picker" + ] + }, + { + "key": "insertColorWithStandaloneColorPicker", + "comment": [ + "Action that inserts color with standalone color picker" + ] + } + ], "vs/editor/contrib/comment/browser/comment": [ "comment.line", { @@ -6645,27 +6883,6 @@ "context.minimap.slider.always", "action.showContextMenu.label" ], - "vs/editor/contrib/colorPicker/browser/standaloneColorPickerActions": [ - "showOrFocusStandaloneColorPicker", - { - "key": "mishowOrFocusStandaloneColorPicker", - "comment": [ - "&& denotes a mnemonic" - ] - }, - { - "key": "hideColorPicker", - "comment": [ - "Action that hides the color picker" - ] - }, - { - "key": "insertColorWithStandaloneColorPicker", - "comment": [ - "Action that inserts color with standalone color picker" - ] - } - ], "vs/editor/contrib/cursorUndo/browser/cursorUndo": [ "cursor.undo", "cursor.redo" @@ -6705,11 +6922,6 @@ ] } ], - "vs/editor/contrib/fontZoom/browser/fontZoom": [ - "EditorFontZoomIn.label", - "EditorFontZoomOut.label", - "EditorFontZoomReset.label" - ], "vs/editor/contrib/folding/browser/folding": [ "unfoldAction.label", "unFoldRecursivelyAction.label", @@ -6734,6 +6946,11 @@ "formatDocument.label", "formatSelection.label" ], + "vs/editor/contrib/fontZoom/browser/fontZoom": [ + "EditorFontZoomIn.label", + "EditorFontZoomOut.label", + "EditorFontZoomReset.label" + ], "vs/editor/contrib/gotoSymbol/browser/goToCommands": [ "peek.submenu", "def.title", @@ -6800,9 +7017,6 @@ "generic.noResult", "ref.title" ], - "vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition": [ - "multipleResults" - ], "vs/editor/contrib/gotoError/browser/gotoError": [ "markerAction.next.label", "nextMarkerIcon", @@ -6823,6 +7037,9 @@ ] } ], + "vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition": [ + "multipleResults" + ], "vs/editor/contrib/hover/browser/hover": [ { "key": "showOrFocusHover", @@ -7099,7 +7316,17 @@ "vs/editor/contrib/tokenization/browser/tokenization": [ "forceRetokenize" ], - "vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter": [ + "vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode": [ + { + "key": "toggle.tabMovesFocus", + "comment": [ + "Turn on/off use of tab key for moving focus around VS Code" + ] + }, + "toggle.tabMovesFocus.on", + "toggle.tabMovesFocus.off" + ], + "vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter": [ "warningIcon", "unicodeHighlighting.thisDocumentHasManyNonBasicAsciiUnicodeCharacters", "unicodeHighlighting.thisDocumentHasManyAmbiguousUnicodeCharacters", @@ -7149,23 +7376,8 @@ "editor.simple.readonly", "editor.readonly" ], - "vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode": [ - { - "key": "toggle.tabMovesFocus", - "comment": [ - "Turn on/off use of tab key for moving focus around VS Code" - ] - }, - "toggle.tabMovesFocus.on", - "toggle.tabMovesFocus.off" - ], "vs/editor/common/standaloneStrings": [ - "noSelection", - "singleSelectionRange", - "singleSelection", - "multiSelectionRange", - "multiSelection", - "emergencyConfOn", + "accessibilityHelpTitle", "openingDocs", "readonlyDiffEditor", "editableDiffEditor", @@ -7179,11 +7391,7 @@ "tabFocusModeOnMsgNoKb", "tabFocusModeOffMsg", "tabFocusModeOffMsgNoKb", - "openDocMac", - "openDocWinLinux", - "outroMsg", "showAccessibilityHelpAction", - "accessibilityHelpTitle", "inspectTokens", "gotoLineActionLabel", "helpQuickAccess", @@ -7196,6 +7404,35 @@ "toggleHighContrast", "bulkEditServiceSummary" ], + "vs/workbench/api/common/jsonValidationExtensionPoint": [ + "contributes.jsonValidation", + "contributes.jsonValidation.fileMatch", + "contributes.jsonValidation.url", + "invalid.jsonValidation", + "invalid.fileMatch", + "invalid.url", + "invalid.path.1", + "invalid.url.fileschema", + "invalid.url.schema" + ], + "vs/workbench/services/themes/common/colorExtensionPoint": [ + "contributes.color", + "contributes.color.id", + "contributes.color.id.format", + "contributes.color.description", + "contributes.defaults.light", + "contributes.defaults.dark", + "contributes.defaults.highContrast", + "contributes.defaults.highContrastLight", + "invalid.colorConfiguration", + "invalid.default.colorType", + "invalid.id", + "invalid.id.format", + "invalid.description", + "invalid.defaults", + "invalid.defaults.highContrast", + "invalid.defaults.highContrastLight" + ], "vs/workbench/services/themes/common/iconExtensionPoint": [ "contributes.icons", "contributes.icon.id", @@ -7211,6 +7448,46 @@ "invalid.icons.default.fontPath.path", "invalid.icons.default" ], + "vs/workbench/services/themes/common/tokenClassificationExtensionPoint": [ + "contributes.semanticTokenTypes", + "contributes.semanticTokenTypes.id", + "contributes.semanticTokenTypes.id.format", + "contributes.semanticTokenTypes.superType", + "contributes.semanticTokenTypes.superType.format", + "contributes.color.description", + "contributes.semanticTokenModifiers", + "contributes.semanticTokenModifiers.id", + "contributes.semanticTokenModifiers.id.format", + "contributes.semanticTokenModifiers.description", + "contributes.semanticTokenScopes", + "contributes.semanticTokenScopes.languages", + "contributes.semanticTokenScopes.scopes", + "invalid.id", + "invalid.id.format", + "invalid.superType.format", + "invalid.description", + "invalid.semanticTokenTypeConfiguration", + "invalid.semanticTokenModifierConfiguration", + "invalid.semanticTokenScopes.configuration", + "invalid.semanticTokenScopes.language", + "invalid.semanticTokenScopes.scopes", + "invalid.semanticTokenScopes.scopes.value", + "invalid.semanticTokenScopes.scopes.selector" + ], + "vs/workbench/api/browser/statusBarExtensionPoint": [ + "id", + "name", + "text", + "tooltip", + "command", + "alignment", + "priority", + "accessibilityInformation", + "accessibilityInformation.role", + "accessibilityInformation.label", + "vscode.extension.contributes.statusBarItems", + "invalid" + ], "vs/workbench/contrib/codeEditor/browser/languageConfigurationExtensionPoint": [ "parseErrors", "formatError", @@ -7276,41 +7553,8 @@ "schema.onEnterRules.action.appendText", "schema.onEnterRules.action.removeText" ], - "vs/workbench/api/browser/statusBarExtensionPoint": [ - "id", - "name", - "text", - "command", - "alignment", - "priority", - "vscode.extension.contributes.statusBarItems", - "invalid" - ], - "vs/workbench/services/themes/common/tokenClassificationExtensionPoint": [ - "contributes.semanticTokenTypes", - "contributes.semanticTokenTypes.id", - "contributes.semanticTokenTypes.id.format", - "contributes.semanticTokenTypes.superType", - "contributes.semanticTokenTypes.superType.format", - "contributes.color.description", - "contributes.semanticTokenModifiers", - "contributes.semanticTokenModifiers.id", - "contributes.semanticTokenModifiers.id.format", - "contributes.semanticTokenModifiers.description", - "contributes.semanticTokenScopes", - "contributes.semanticTokenScopes.languages", - "contributes.semanticTokenScopes.scopes", - "invalid.id", - "invalid.id.format", - "invalid.superType.format", - "invalid.description", - "invalid.semanticTokenTypeConfiguration", - "invalid.semanticTokenModifierConfiguration", - "invalid.semanticTokenScopes.configuration", - "invalid.semanticTokenScopes.language", - "invalid.semanticTokenScopes.scopes", - "invalid.semanticTokenScopes.scopes.value", - "invalid.semanticTokenScopes.scopes.selector" + "vs/workbench/api/browser/mainThreadCLICommands": [ + "cannot be installed" ], "vs/workbench/api/browser/mainThreadExtensionService": [ "reload window", @@ -7325,21 +7569,6 @@ "install missing dep", "unknownDep" ], - "vs/workbench/api/browser/mainThreadCLICommands": [ - "cannot be installed" - ], - "vs/workbench/api/browser/mainThreadMessageService": [ - "extensionSource", - "defaultSource", - "manageExtension", - "cancel", - { - "key": "ok", - "comment": [ - "&& denotes a mnemonic" - ] - } - ], "vs/workbench/api/browser/mainThreadFileSystemEventService": [ "ask.1.create", "ask.1.copy", @@ -7395,38 +7624,21 @@ "vs/workbench/api/browser/mainThreadProgress": [ "manageExtension" ], - "vs/workbench/services/themes/common/colorExtensionPoint": [ - "contributes.color", - "contributes.color.id", - "contributes.color.id.format", - "contributes.color.description", - "contributes.defaults.light", - "contributes.defaults.dark", - "contributes.defaults.highContrast", - "contributes.defaults.highContrastLight", - "invalid.colorConfiguration", - "invalid.default.colorType", - "invalid.id", - "invalid.id.format", - "invalid.description", - "invalid.defaults", - "invalid.defaults.highContrast", - "invalid.defaults.highContrastLight" + "vs/workbench/api/browser/mainThreadMessageService": [ + "extensionSource", + "defaultSource", + "manageExtension", + "cancel", + { + "key": "ok", + "comment": [ + "&& denotes a mnemonic" + ] + } ], "vs/workbench/api/browser/mainThreadSaveParticipant": [ "timeout.onWillSave" ], - "vs/workbench/api/common/jsonValidationExtensionPoint": [ - "contributes.jsonValidation", - "contributes.jsonValidation.fileMatch", - "contributes.jsonValidation.url", - "invalid.jsonValidation", - "invalid.fileMatch", - "invalid.url", - "invalid.path.1", - "invalid.url.fileschema", - "invalid.url.schema" - ], "vs/workbench/api/browser/mainThreadEditSessionIdentityParticipant": [ "timeout.onWillCreateEditSessionIdentity" ], @@ -7652,6 +7864,14 @@ "treeView.toggleCollapseAll", "command-error" ], + "vs/workbench/browser/parts/views/viewPaneContainer": [ + "views", + "viewMoveUp", + "viewMoveLeft", + "viewMoveDown", + "viewMoveRight", + "viewsMove" + ], "vs/workbench/contrib/debug/common/debug": [ "debugType", "debugConfigurationType", @@ -7707,14 +7927,6 @@ "debuggerDisabled", "internalConsoleOptions" ], - "vs/workbench/browser/parts/views/viewPaneContainer": [ - "views", - "viewMoveUp", - "viewMoveLeft", - "viewMoveDown", - "viewMoveRight", - "viewsMove" - ], "vs/workbench/contrib/files/common/files": [ "explorerViewletVisible", "foldersViewVisible", @@ -7749,21 +7961,12 @@ "remote.tunnelsView.makePublic", "remote.tunnelsView.elevationButton" ], - "vs/workbench/browser/parts/editor/editorGroupView": [ - "ariaLabelGroupActions", - "emptyEditorGroup", - "groupLabel", - "groupAriaLabel" - ], - "vs/workbench/browser/parts/editor/editorDropTarget": [ - "dropIntoEditorPrompt" + "vs/workbench/common/editor/sideBySideEditorInput": [ + "sideBySideLabels" ], "vs/workbench/browser/parts/editor/sideBySideEditor": [ "sideBySideEditor" ], - "vs/workbench/common/editor/sideBySideEditorInput": [ - "sideBySideLabels" - ], "vs/workbench/common/editor/diffEditorInput": [ "sideBySideLabels" ], @@ -7775,49 +7978,6 @@ "vs/workbench/browser/parts/editor/binaryDiffEditor": [ "metadataDiff" ], - "vs/workbench/browser/parts/editor/editorCommands": [ - "editorCommand.activeEditorMove.description", - "editorCommand.activeEditorMove.arg.name", - "editorCommand.activeEditorMove.arg.description", - "editorCommand.activeEditorCopy.description", - "editorCommand.activeEditorCopy.arg.name", - "editorCommand.activeEditorCopy.arg.description", - "toggleInlineView", - "compare", - "splitEditorInGroup", - "joinEditorInGroup", - "toggleJoinEditorInGroup", - "toggleSplitEditorInGroupLayout", - "focusLeftSideEditor", - "focusRightSideEditor", - "focusOtherSideEditor", - "toggleEditorGroupLock", - "lockEditorGroup", - "unlockEditorGroup" - ], - "vs/editor/browser/editorExtensions": [ - { - "key": "miUndo", - "comment": [ - "&& denotes a mnemonic" - ] - }, - "undo", - { - "key": "miRedo", - "comment": [ - "&& denotes a mnemonic" - ] - }, - "redo", - { - "key": "miSelectAll", - "comment": [ - "&& denotes a mnemonic" - ] - }, - "selectAll" - ], "vs/workbench/browser/parts/editor/editorStatus": [ "singleSelectionRange", "singleSelection", @@ -8023,12 +8183,48 @@ "toggleEditorType", "reopenTextEditor" ], - "vs/workbench/browser/parts/editor/editorQuickAccess": [ - "noViewResults", - "entryAriaLabelWithGroupDirty", - "entryAriaLabelWithGroup", - "entryAriaLabelDirty", - "closeEditor" + "vs/editor/browser/editorExtensions": [ + { + "key": "miUndo", + "comment": [ + "&& denotes a mnemonic" + ] + }, + "undo", + { + "key": "miRedo", + "comment": [ + "&& denotes a mnemonic" + ] + }, + "redo", + { + "key": "miSelectAll", + "comment": [ + "&& denotes a mnemonic" + ] + }, + "selectAll" + ], + "vs/workbench/browser/parts/editor/editorCommands": [ + "editorCommand.activeEditorMove.description", + "editorCommand.activeEditorMove.arg.name", + "editorCommand.activeEditorMove.arg.description", + "editorCommand.activeEditorCopy.description", + "editorCommand.activeEditorCopy.arg.name", + "editorCommand.activeEditorCopy.arg.description", + "toggleInlineView", + "compare", + "splitEditorInGroup", + "joinEditorInGroup", + "toggleJoinEditorInGroup", + "toggleSplitEditorInGroupLayout", + "focusLeftSideEditor", + "focusRightSideEditor", + "focusOtherSideEditor", + "toggleEditorGroupLock", + "lockEditorGroup", + "unlockEditorGroup" ], "vs/workbench/browser/parts/editor/editorConfiguration": [ "interactiveWindow", @@ -8038,6 +8234,13 @@ "editor.editorAssociations", "editorLargeFileSizeConfirmation" ], + "vs/workbench/browser/parts/editor/editorQuickAccess": [ + "noViewResults", + "entryAriaLabelWithGroupDirty", + "entryAriaLabelWithGroup", + "entryAriaLabelDirty", + "closeEditor" + ], "vs/workbench/browser/parts/editor/accessibilityStatus": [ "screenReaderDetectedExplanation.question", "screenReaderDetectedExplanation.answerYes", @@ -8045,6 +8248,24 @@ "screenReaderDetected", "status.editor.screenReaderMode" ], + "vs/editor/browser/widget/diffEditorWidget2/diffEditorWidget2.contribution": [ + "toggleCollapseUnchangedRegions", + "collapseUnchangedRegions", + "showUnchangedRegions", + "toggleShowMovedCodeBlocks", + "showMoves" + ], + "vs/workbench/browser/parts/editor/editorGroupView": [ + "ariaLabelGroupActions", + "emptyEditorGroup", + "groupLabel", + "groupAriaLabel" + ], + "vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart": [ + "move second side bar left", + "move second side bar right", + "hide second side bar" + ], "vs/workbench/browser/parts/activitybar/activitybarPart": [ "settingsViewBarIcon", "accountsViewBarIcon", @@ -8059,11 +8280,6 @@ "accounts", "accounts" ], - "vs/editor/browser/widget/diffEditorWidget2/diffEditorWidget2.contribution": [ - "toggleCollapseUnchangedRegions", - "collapseUnchangedRegions", - "showUnchangedRegions" - ], "vs/workbench/browser/parts/panel/panelPart": [ "resetLocation", "resetLocation", @@ -8073,21 +8289,19 @@ "align panel", "hidePanel" ], - "vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart": [ - "move second side bar left", - "move second side bar right", - "hide second side bar" + "vs/workbench/browser/parts/editor/editorDropTarget": [ + "dropIntoEditorPrompt" ], "vs/workbench/browser/parts/statusbar/statusbarActions": [ "hide", "focusStatusBar" ], - "vs/platform/actions/common/menuService": [ - "hide.label" - ], "vs/platform/actions/common/menuResetAction": [ "title" ], + "vs/platform/actions/common/menuService": [ + "hide.label" + ], "vs/base/browser/ui/dialog/dialog": [ "ok", "dialogInfoMessage", @@ -8323,6 +8537,21 @@ "reqid", "invalid.path.1" ], + "vs/workbench/services/themes/common/colorThemeSchema": [ + "schema.token.settings", + "schema.token.foreground", + "schema.token.background.warning", + "schema.token.fontStyle", + "schema.fontStyle.error", + "schema.token.fontStyle.none", + "schema.properties.name", + "schema.properties.scope", + "schema.workbenchColors", + "schema.tokenColors.path", + "schema.colors", + "schema.supportsSemanticHighlighting", + "schema.semanticTokenColors" + ], "vs/workbench/services/themes/common/themeConfiguration": [ "colorTheme", "colorThemeError", @@ -8396,21 +8625,6 @@ "editorColors.semanticHighlighting.rules", "semanticTokenColors" ], - "vs/workbench/services/themes/common/colorThemeSchema": [ - "schema.token.settings", - "schema.token.foreground", - "schema.token.background.warning", - "schema.token.fontStyle", - "schema.fontStyle.error", - "schema.token.fontStyle.none", - "schema.properties.name", - "schema.properties.scope", - "schema.workbenchColors", - "schema.tokenColors.path", - "schema.colors", - "schema.supportsSemanticHighlighting", - "schema.semanticTokenColors" - ], "vs/workbench/services/themes/browser/productIconThemeData": [ "error.parseicondefs", "defaultTheme", @@ -8425,7 +8639,19 @@ "error.icon.font", "error.icon.fontCharacter" ], + "vs/workbench/services/themes/common/productIconThemeSchema": [ + "schema.id", + "schema.id.formatError", + "schema.src", + "schema.font-path", + "schema.font-format", + "schema.font-weight", + "schema.font-style", + "schema.iconDefinitions" + ], "vs/workbench/services/extensionManagement/browser/extensionBisect": [ + "I cannot reproduce", + "This is Bad", "bisect.singular", "bisect.plural", "title.start", @@ -8478,16 +8704,6 @@ }, "title.stop" ], - "vs/workbench/services/themes/common/productIconThemeSchema": [ - "schema.id", - "schema.id.formatError", - "schema.src", - "schema.font-path", - "schema.font-format", - "schema.font-weight", - "schema.font-style", - "schema.iconDefinitions" - ], "vs/workbench/services/userDataProfile/browser/settingsResource": [ "settings" ], @@ -8500,20 +8716,23 @@ "vs/workbench/services/userDataProfile/browser/tasksResource": [ "tasks" ], - "vs/workbench/services/userDataProfile/browser/globalStateResource": [ - "globalState" - ], "vs/workbench/services/userDataProfile/browser/extensionsResource": [ "extensions", "disabled", "exclude" ], + "vs/workbench/services/userDataProfile/browser/globalStateResource": [ + "globalState" + ], "vs/workbench/services/workingCopy/common/storedFileWorkingCopySaveParticipant": [ "saveParticipants" ], "vs/workbench/services/views/common/viewContainerModel": [ "views log" ], + "vs/workbench/services/hover/browser/hoverWidget": [ + "hoverhint" + ], "vs/workbench/services/textMate/browser/textMateTokenizationFeatureImpl": [ "alreadyDebugging", "stop", @@ -8527,6 +8746,12 @@ "invalid.tokenTypes", "invalid.path.1" ], + "vs/workbench/contrib/preferences/browser/keybindingWidgets": [ + "defineKeybinding.initial", + "defineKeybinding.oneExists", + "defineKeybinding.existing", + "defineKeybinding.chordsTo" + ], "vs/editor/contrib/suggest/browser/suggest": [ "suggestWidgetHasSelection", "suggestWidgetDetailsVisible", @@ -8537,6 +8762,11 @@ "suggestionInsertMode", "suggestionCanResolve" ], + "vs/workbench/contrib/preferences/browser/preferencesActions": [ + "configureLanguageBasedSettings", + "languageDescriptionConfigured", + "pickLanguage" + ], "vs/workbench/contrib/preferences/browser/keybindingsEditor": [ "recordKeysLabel", "sortByPrecedeneLabel", @@ -8572,14 +8802,6 @@ "noWhen", "keyboard shortcuts aria label" ], - "vs/workbench/contrib/preferences/browser/preferencesActions": [ - "configureLanguageBasedSettings", - "languageDescriptionConfigured", - "pickLanguage" - ], - "vs/workbench/services/hover/browser/hoverWidget": [ - "hoverhint" - ], "vs/workbench/contrib/preferences/browser/preferencesIcons": [ "settingsScopeDropDownIcon", "settingsMoreActionIcon", @@ -8594,6 +8816,13 @@ "settingsFilter", "preferencesOpenSettings" ], + "vs/workbench/contrib/preferences/common/preferencesContribution": [ + "splitSettingsEditorLabel", + "enableNaturalLanguageSettingsSearch", + "settingsSearchTocBehavior.hide", + "settingsSearchTocBehavior.filter", + "settingsSearchTocBehavior" + ], "vs/workbench/contrib/preferences/browser/settingsEditor2": [ "SearchSettings.AriaLabel", "clearInput", @@ -8608,19 +8837,6 @@ "turnOnSyncButton", "lastSyncedLabel" ], - "vs/workbench/contrib/preferences/common/preferencesContribution": [ - "splitSettingsEditorLabel", - "enableNaturalLanguageSettingsSearch", - "settingsSearchTocBehavior.hide", - "settingsSearchTocBehavior.filter", - "settingsSearchTocBehavior" - ], - "vs/workbench/contrib/preferences/browser/keybindingWidgets": [ - "defineKeybinding.initial", - "defineKeybinding.oneExists", - "defineKeybinding.existing", - "defineKeybinding.chordsTo" - ], "vs/workbench/contrib/performance/browser/perfviewEditor": [ "name" ], @@ -8632,20 +8848,68 @@ "notebookOpenAsText", "notebookOpenInTextEditor" ], + "vs/workbench/contrib/notebook/common/notebookEditorInput": [ + "vetoExtHostRestart" + ], "vs/workbench/contrib/notebook/browser/services/notebookServiceImpl": [ "notebookOpenInstallMissingViewType" ], "vs/workbench/contrib/notebook/browser/diff/notebookDiffEditor": [ "notebookTreeAriaLabel" ], + "vs/workbench/contrib/notebook/browser/services/notebookExecutionServiceImpl": [ + "notebookRunTrust" + ], + "vs/workbench/contrib/notebook/browser/services/notebookKeymapServiceImpl": [ + "disableOtherKeymapsConfirmation", + "yes", + "no" + ], + "vs/editor/common/languages/modesRegistry": [ + "plainText.alias" + ], "vs/workbench/contrib/comments/browser/commentReply": [ "reply", "newComment", "reply", "reply" ], - "vs/editor/common/languages/modesRegistry": [ - "plainText.alias" + "vs/workbench/contrib/notebook/browser/services/notebookKernelHistoryServiceImpl": [ + "workbench.notebook.clearNotebookKernelsMRUCache" + ], + "vs/workbench/contrib/notebook/browser/services/notebookLoggingServiceImpl": [ + "renderChannelName" + ], + "vs/workbench/contrib/accessibility/browser/accessibilityContribution": [ + "accessibilityConfigurationTitle", + "verbosity.terminal.description", + "verbosity.diffEditor.description", + "verbosity.chat.description", + "verbosity.interactiveEditor.description", + "verbosity.keybindingsEditor.description", + "verbosity.notebook", + "editor.action.accessibilityHelp", + "editor.action.accessibleView" + ], + "vs/workbench/contrib/notebook/browser/controller/coreActions": [ + "notebookActions.category", + "notebookMenu.insertCell", + "notebookMenu.cellTitle", + "miShare" + ], + "vs/workbench/contrib/notebook/browser/notebookAccessibilityHelp": [ + "notebook.overview", + "notebook.cell.edit", + "notebook.cell.editNoKb", + "notebook.cell.quitEdit", + "notebook.cell.quitEditNoKb", + "notebook.cell.focusInOutput", + "notebook.cell.focusInOutputNoKb", + "notebook.cellNavigation", + "notebook.cell.executeAndFocusContainer", + "notebook.cell.executeAndFocusContainerNoKb", + "notebook.cell.insertCodeCellBelowAndFocusContainer", + "notebook.changeCellType" ], "vs/workbench/contrib/notebook/browser/controller/insertCellActions": [ "notebookActions.insertCodeCellAbove", @@ -8673,30 +8937,6 @@ "notebookActions.menu.insertMarkdown", "notebookActions.menu.insertMarkdown.tooltip" ], - "vs/workbench/contrib/notebook/browser/controller/coreActions": [ - "notebookActions.category", - "notebookMenu.insertCell", - "notebookMenu.cellTitle", - "miShare" - ], - "vs/workbench/contrib/notebook/browser/services/notebookExecutionServiceImpl": [ - "notebookRunTrust" - ], - "vs/workbench/contrib/notebook/browser/controller/layoutActions": [ - "workbench.notebook.layout.select.label", - "workbench.notebook.layout.configure.label", - "workbench.notebook.layout.configure.label", - "customizeNotebook", - "notebook.toggleLineNumbers", - "notebook.showLineNumbers", - "notebook.toggleCellToolbarPosition", - "notebook.toggleBreadcrumb", - "notebook.saveMimeTypeOrder", - "notebook.placeholder", - "saveTarget.machine", - "saveTarget.workspace", - "workbench.notebook.layout.webview.reset.label" - ], "vs/workbench/contrib/notebook/browser/controller/executeActions": [ "notebookActions.renderMarkdown", "notebookActions.executeNotebook", @@ -8739,24 +8979,25 @@ "detectLanguage", "noDetection" ], - "vs/workbench/contrib/notebook/browser/controller/foldingController": [ - "fold.cell", - "unfold.cell", - "fold.cell" - ], - "vs/workbench/contrib/notebook/browser/services/notebookKeymapServiceImpl": [ - "disableOtherKeymapsConfirmation", - "yes", - "no" - ], - "vs/workbench/contrib/notebook/browser/services/notebookLoggingServiceImpl": [ - "renderChannelName" + "vs/workbench/contrib/notebook/browser/controller/layoutActions": [ + "workbench.notebook.layout.select.label", + "workbench.notebook.layout.configure.label", + "workbench.notebook.layout.configure.label", + "customizeNotebook", + "notebook.toggleLineNumbers", + "notebook.showLineNumbers", + "notebook.toggleCellToolbarPosition", + "notebook.toggleBreadcrumb", + "notebook.saveMimeTypeOrder", + "notebook.placeholder", + "saveTarget.machine", + "saveTarget.workspace", + "workbench.notebook.layout.webview.reset.label" ], - "vs/workbench/contrib/notebook/browser/contrib/format/formatting": [ - "format.title", - "label", - "formatCell.label", - "formatCells.label" + "vs/workbench/contrib/notebook/browser/controller/foldingController": [ + "fold.cell", + "unfold.cell", + "fold.cell" ], "vs/workbench/contrib/notebook/browser/contrib/clipboard/notebookClipboard": [ "notebookActions.copy", @@ -8765,8 +9006,15 @@ "notebookActions.pasteAbove", "toggleNotebookClipboardLog" ], - "vs/workbench/contrib/notebook/browser/services/notebookKernelHistoryServiceImpl": [ - "workbench.notebook.clearNotebookKernelsMRUCache" + "vs/workbench/contrib/notebook/browser/contrib/find/notebookFind": [ + "notebookActions.hideFind", + "notebookActions.findInNotebook" + ], + "vs/workbench/contrib/notebook/browser/contrib/format/formatting": [ + "format.title", + "label", + "formatCell.label", + "formatCells.label" ], "vs/workbench/contrib/notebook/browser/contrib/saveParticipants/saveParticipants": [ "notebookFormatSave.formatting", @@ -8781,28 +9029,9 @@ }, "codeAction.apply" ], - "vs/workbench/contrib/notebook/browser/contrib/gettingStarted/notebookGettingStarted": [ - "workbench.notebook.layout.gettingStarted.label" - ], "vs/workbench/contrib/notebook/browser/contrib/layout/layoutActions": [ "notebook.toggleCellToolbarPosition" ], - "vs/workbench/contrib/notebook/browser/contrib/find/notebookFind": [ - "notebookActions.hideFind", - "notebookActions.findInNotebook" - ], - "vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/statusBarProviders": [ - "notebook.cell.status.language", - "notebook.cell.status.autoDetectLanguage" - ], - "vs/workbench/contrib/notebook/browser/contrib/profile/notebookProfile": [ - "setProfileTitle" - ], - "vs/workbench/contrib/notebook/browser/contrib/outline/notebookOutline": [ - "empty", - "outline.showCodeCells", - "breadcrumbs.showCodeCells" - ], "vs/workbench/contrib/notebook/browser/contrib/navigation/arrow": [ "cursorMoveDown", "cursorMoveUp", @@ -8817,6 +9046,29 @@ "cursorPageDownSelect", "notebook.navigation.allowNavigateToSurroundingCells" ], + "vs/workbench/contrib/notebook/browser/contrib/outline/notebookOutline": [ + "empty", + "outline.showCodeCells", + "breadcrumbs.showCodeCells" + ], + "vs/workbench/contrib/notebook/browser/contrib/gettingStarted/notebookGettingStarted": [ + "workbench.notebook.layout.gettingStarted.label" + ], + "vs/workbench/contrib/notebook/browser/contrib/profile/notebookProfile": [ + "setProfileTitle" + ], + "vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/statusBarProviders": [ + "notebook.cell.status.language", + "notebook.cell.status.autoDetectLanguage" + ], + "vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/executionStatusBarItemController": [ + "notebook.cell.status.success", + "notebook.cell.status.failed", + "notebook.cell.status.pending", + "notebook.cell.status.executing", + "notebook.cell.statusBar.timerTooltip.reportIssueFootnote", + "notebook.cell.statusBar.timerTooltip" + ], "vs/workbench/contrib/notebook/browser/contrib/editorStatusBar/editorStatusBar": [ "notebook.info", "tooltop", @@ -8827,19 +9079,47 @@ "notebook.multiActiveCellIndicator", "notebook.singleActiveCellIndicator" ], - "vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/executionStatusBarItemController": [ - "notebook.cell.status.success", - "notebook.cell.status.failed", - "notebook.cell.status.pending", - "notebook.cell.status.executing", - "notebook.cell.statusBar.timerTooltip.reportIssueFootnote", - "notebook.cell.statusBar.timerTooltip" + "vs/workbench/contrib/notebook/browser/contrib/cellCommands/cellCommands": [ + "notebookActions.moveCellUp", + "notebookActions.moveCellDown", + "notebookActions.copyCellUp", + "notebookActions.copyCellDown", + "notebookActions.splitCell", + "notebookActions.joinCellAbove", + "notebookActions.joinCellBelow", + "notebookActions.joinSelectedCells", + "notebookActions.changeCellToCode", + "notebookActions.changeCellToMarkdown", + "notebookActions.collapseCellInput", + "notebookActions.expandCellInput", + "notebookActions.collapseCellOutput", + "notebookActions.expandCellOutput", + "notebookActions.toggleOutputs", + "notebookActions.toggleOutputs", + "notebookActions.collapseAllCellInput", + "notebookActions.expandAllCellInput", + "notebookActions.collapseAllCellOutput", + "notebookActions.expandAllCellOutput", + "notebookActions.toggleScrolling" ], "vs/workbench/contrib/notebook/browser/contrib/troubleshoot/layout": [ "workbench.notebook.toggleLayoutTroubleshoot", "workbench.notebook.inspectLayout", "workbench.notebook.clearNotebookEdtitorTypeCache" ], + "vs/workbench/contrib/notebook/browser/diff/notebookDiffActions": [ + "notebook.diff.switchToText", + "notebook.diff.cell.revertMetadata", + "notebook.diff.cell.switchOutputRenderingStyleToText", + "notebook.diff.cell.revertOutputs", + "notebook.diff.cell.revertInput", + "notebook.diff.showOutputs", + "notebook.diff.showMetadata", + "notebook.diff.action.previous.title", + "notebook.diff.action.next.title", + "notebook.diff.ignoreMetadata", + "notebook.diff.ignoreOutputs" + ], "vs/workbench/contrib/chat/browser/actions/chatActions": [ "chat.category", { @@ -8850,7 +9130,6 @@ }, "interactiveSession.clearHistory.label", "actions.interactiveSession.focus", - "chat.action.accessibiltyHelp", "interactiveSession.focusInput.label", "interactiveSession.open", "interactiveSession.history.label", @@ -8869,29 +9148,6 @@ "interactive.copyAll.label", "interactive.copyItem.label" ], - "vs/workbench/contrib/notebook/browser/contrib/cellCommands/cellCommands": [ - "notebookActions.moveCellUp", - "notebookActions.moveCellDown", - "notebookActions.copyCellUp", - "notebookActions.copyCellDown", - "notebookActions.splitCell", - "notebookActions.joinCellAbove", - "notebookActions.joinCellBelow", - "notebookActions.joinSelectedCells", - "notebookActions.changeCellToCode", - "notebookActions.changeCellToMarkdown", - "notebookActions.collapseCellInput", - "notebookActions.expandCellInput", - "notebookActions.collapseCellOutput", - "notebookActions.expandCellOutput", - "notebookActions.toggleOutputs", - "notebookActions.toggleOutputs", - "notebookActions.collapseAllCellInput", - "notebookActions.expandAllCellInput", - "notebookActions.collapseAllCellOutput", - "notebookActions.expandAllCellOutput", - "notebookActions.toggleScrolling" - ], "vs/workbench/contrib/chat/browser/actions/chatExecuteActions": [ "interactive.submit.label", "interactive.cancel.label" @@ -8900,17 +9156,17 @@ "askQuickQuestion", "askabot" ], + "vs/workbench/contrib/chat/browser/actions/chatTitleActions": [ + "interactive.helpful.label", + "interactive.unhelpful.label", + "interactive.insertIntoNotebook.label", + "chat.remove.label" + ], "vs/workbench/contrib/chat/browser/actions/chatImportExport": [ "chat.file.label", "chat.export.label", "chat.import.label" ], - "vs/workbench/contrib/chat/browser/actions/chatTitleActions": [ - "interactive.voteUp.label", - "interactive.voteDown.label", - "interactive.insertIntoNotebook.label", - "chat.remove.label" - ], "vs/workbench/contrib/chat/browser/chatContributionServiceImpl": [ "vscode.extension.contributes.interactiveSession", "vscode.extension.contributes.interactiveSession.id", @@ -8922,42 +9178,126 @@ "vs/workbench/contrib/chat/browser/chatEditorInput": [ "chatEditorName" ], + "vs/workbench/contrib/chat/browser/chatWidget": [ + "clear" + ], "vs/workbench/contrib/chat/common/chatServiceImpl": [ "emptyResponse" ], + "vs/workbench/contrib/chat/browser/actions/chatMoveActions": [ + "chat.openInEditor.label", + "interactiveSession.openInEditor.label", + "interactiveSession.openInSidebar.label" + ], "vs/workbench/contrib/chat/browser/actions/chatClearActions": [ "interactiveSession.clear.label", "interactiveSession.clear.label", "interactiveSession.clear.label" ], - "vs/workbench/contrib/chat/browser/chatWidget": [ - "clear" + "vs/workbench/contrib/accessibility/browser/accessibleView": [ + "openDoc", + "disable-help-hint", + "exit-tip" ], - "vs/workbench/contrib/notebook/browser/diff/notebookDiffActions": [ - "notebook.diff.switchToText", - "notebook.diff.cell.revertMetadata", - "notebook.diff.cell.switchOutputRenderingStyleToText", - "notebook.diff.cell.revertOutputs", - "notebook.diff.cell.revertInput", - "notebook.diff.showOutputs", - "notebook.diff.showMetadata", - "notebook.diff.action.previous.title", - "notebook.diff.action.next.title", - "notebook.diff.ignoreMetadata", - "notebook.diff.ignoreOutputs" + "vs/workbench/contrib/chat/common/chatViewModel": [ + "thinking" ], - "vs/workbench/contrib/chat/browser/actions/chatMoveActions": [ - "chat.openInEditor.label", - "interactiveSession.openInEditor.label", - "interactiveSession.openInSidebar.label" + "vs/workbench/contrib/chat/common/chatContextKeys": [ + "interactiveSessionResponseHasProviderId", + "interactiveSessionResponseVote", + "interactiveSessionRequestInProgress", + "chatResponse", + "chatRequest", + "interactiveInputHasText", + "inInteractiveInput", + "inChat", + "hasChatProvider" + ], + "vs/workbench/contrib/chat/browser/contrib/chatInputEditorContrib": [ + "interactive.input.placeholderWithCommands", + "interactive.input.placeholderNoCommands" ], "vs/workbench/contrib/chat/common/chatColors": [ "chat.requestBackground", "chat.requestBorder" ], - "vs/workbench/contrib/chat/browser/contrib/chatInputEditorContrib": [ - "interactive.input.placeholderWithCommands", - "interactive.input.placeholderNoCommands" + "vs/workbench/contrib/inlineChat/browser/inlineChatController": [ + "welcome.1", + "welcome.2", + "create.fail", + "create.fail.detail", + "welcome.1", + "default.placeholder", + "default.placeholder.history", + "thinking", + "empty", + "markdownResponseMessage", + "editResponseMessage", + "err.apply", + "err.discard" + ], + "vs/workbench/contrib/inlineChat/browser/inlineChatActions": [ + "run", + "unstash", + "cat", + "accept", + "rerun", + "rerunShort", + "stop", + "arrowUp", + "arrowDown", + "focus", + "previousFromHistory", + "nextFromHistory", + "discardMenu", + "discard", + "undo.clipboard", + "undo.newfile", + "feedback.helpful", + "feedback.unhelpful", + "toggleDiff", + "toggleDiff2", + "apply1", + "apply2", + "cancel", + "copyRecordings", + "label", + "viewInChat", + "expandMessage", + "contractMessage" + ], + "vs/workbench/contrib/inlineChat/common/inlineChat": [ + "inlineChatHasProvider", + "inlineChatVisible", + "inlineChatFocused", + "inlineChatEmpty", + "inlineChatInnerCursorFirst", + "inlineChatInnerCursorLast", + "inlineChatMarkdownMessageCropState", + "inlineChatOuterCursorPosition", + "inlineChatHasActiveRequest", + "inlineChatHasStashedSession", + "inlineChatDiff", + "inlineChatResponseType", + "inlineChatResponseTypes", + "inlineChatDidEdit", + "inlineChatUserDidEdit", + "inlineChatLastFeedbackKind", + "inlineChatDocumentChanged", + "inlineChat.background", + "inlineChat.border", + "inlineChat.shadow", + "inlineChat.regionHighlight", + "inlineChatInput.border", + "inlineChatInput.focusBorder", + "inlineChatInput.placeholderForeground", + "inlineChatInput.background", + "inlineChatDiff.inserted", + "inlineChatDiff.removed", + "mode", + "mode.livePreview", + "mode.preview", + "mode.live" ], "vs/editor/contrib/peekView/browser/peekView": [ "inReferenceSearchEditor", @@ -8981,14 +9321,6 @@ "vs/workbench/contrib/interactive/browser/interactiveEditor": [ "interactiveInputPlaceHolder" ], - "vs/workbench/contrib/files/browser/fileConstants": [ - "saveAs", - "save", - "saveWithoutFormatting", - "saveAll", - "removeFolderFromWorkspace", - "newUntitledFile" - ], "vs/workbench/contrib/notebook/browser/notebookIcons": [ "selectKernelIcon", "executeIcon", @@ -9016,6 +9348,14 @@ "previousChangeIcon", "nextChangeIcon" ], + "vs/workbench/contrib/files/browser/fileConstants": [ + "saveAs", + "save", + "saveWithoutFormatting", + "saveAll", + "removeFolderFromWorkspace", + "newUntitledFile" + ], "vs/workbench/contrib/testing/browser/icons": [ "testViewIcon", "testingResultsIcon", @@ -9079,73 +9419,13 @@ }, "testExplorer" ], - "vs/workbench/contrib/testing/browser/testingOutputTerminalService": [ - "testOutputTerminalTitleWithDate", - "testOutputTerminalTitleWithDateAndTaskName", - "testOutputTerminalTitle", - "testNoRunYet", + "vs/workbench/contrib/testing/browser/testingOutputPeek": [ + "testing.markdownPeekError", + "testOutputTitle", + "testingOutputExpected", + "testingOutputActual", "runNoOutout", - "runFinished" - ], - "vs/workbench/contrib/testing/browser/testingViewPaneContainer": [ - "testing" - ], - "vs/workbench/contrib/testing/browser/testingProgressUiService": [ - "testProgress.runningInitial", - "testProgress.running", - "testProgressWithSkip.running", - "testProgress.completed", - "testProgressWithSkip.completed" - ], - "vs/workbench/contrib/testing/common/configuration": [ - "testConfigurationTitle", - "testing.autoRun.delay", - "testing.automaticallyOpenPeekView", - "testing.automaticallyOpenPeekView.failureAnywhere", - "testing.automaticallyOpenPeekView.failureInVisibleDocument", - "testing.automaticallyOpenPeekView.never", - "testing.automaticallyOpenPeekViewDuringContinuousRun", - "testing.countBadge", - "testing.countBadge.failed", - "testing.countBadge.off", - "testing.countBadge.passed", - "testing.countBadge.skipped", - "testing.followRunningTest", - "testing.defaultGutterClickAction", - "testing.defaultGutterClickAction.run", - "testing.defaultGutterClickAction.debug", - "testing.defaultGutterClickAction.contextMenu", - "testing.gutterEnabled", - "testing.saveBeforeTest", - "testing.openTesting.neverOpen", - "testing.openTesting.openOnTestStart", - "testing.openTesting.openOnTestFailure", - "testing.openTesting", - "testing.alwaysRevealTestOnStateChange" - ], - "vs/workbench/contrib/testing/common/testingContextKeys": [ - "testing.canRefresh", - "testing.isRefreshing", - "testing.isContinuousModeOn", - "testing.hasDebuggableTests", - "testing.hasRunnableTests", - "testing.hasCoverableTests", - "testing.hasNonDefaultConfig", - "testing.hasConfigurableConfig", - "testing.supportsContinuousRun", - "testing.isParentRunningContinuously", - "testing.activeEditorHasTests", - "testing.peekItemType", - "testing.controllerId", - "testing.testId", - "testing.testItemHasUri", - "testing.testItemIsHidden" - ], - "vs/workbench/contrib/testing/browser/testingOutputPeek": [ - "testing.markdownPeekError", - "testOutputTitle", - "testingOutputExpected", - "testingOutputActual", + "runNoOutputForPast", "close", "testUnnamedTask", "messageMoreLinesN", @@ -9160,14 +9440,20 @@ "run test", "debug test", "testing.goToError", - "testing.showMessageInTerminal", "testing.goToNextMessage", "testing.goToPreviousMessage", "testing.openMessageInEditor", "testing.toggleTestingPeekHistory" ], - "vs/workbench/contrib/testing/common/testingContentProvider": [ - "runNoOutout" + "vs/workbench/contrib/testing/browser/testingProgressUiService": [ + "testProgress.runningInitial", + "testProgress.running", + "testProgressWithSkip.running", + "testProgress.completed", + "testProgressWithSkip.completed" + ], + "vs/workbench/contrib/testing/browser/testingViewPaneContainer": [ + "testing" ], "vs/workbench/contrib/testing/common/testServiceImpl": [ "testTrust", @@ -9175,9 +9461,26 @@ "testTrust", "testError" ], - "vs/workbench/contrib/testing/browser/testingConfigurationUi": [ - "testConfigurationUi.pick", - "updateTestConfiguration" + "vs/workbench/contrib/testing/common/testingContentProvider": [ + "runNoOutout" + ], + "vs/workbench/contrib/testing/common/testingContextKeys": [ + "testing.canRefresh", + "testing.isRefreshing", + "testing.isContinuousModeOn", + "testing.hasDebuggableTests", + "testing.hasRunnableTests", + "testing.hasCoverableTests", + "testing.hasNonDefaultConfig", + "testing.hasConfigurableConfig", + "testing.supportsContinuousRun", + "testing.isParentRunningContinuously", + "testing.activeEditorHasTests", + "testing.peekItemType", + "testing.controllerId", + "testing.testId", + "testing.testItemHasUri", + "testing.testItemIsHidden" ], "vs/workbench/contrib/testing/browser/testExplorerActions": [ "hideTest", @@ -9212,8 +9515,6 @@ "testing.sortByLocation", "testing.sortByDuration", "testing.showMostRecentOutput", - "testing.pickTaskUnnamed", - "testing.pickTask", "testing.collapseAll", "testing.clearResults", "testing.editFocusedTest", @@ -9233,75 +9534,36 @@ "testing.refreshTests", "testing.cancelTestRefresh" ], - "vs/workbench/contrib/interactiveEditor/browser/interactiveEditorController": [ - "create.fail", - "create.fail.detail", - "welcome.1", - "default.placeholder", - "default.placeholder.history", - "thinking", - "empty", - "err.apply", - "err.discard" + "vs/workbench/contrib/testing/browser/testingConfigurationUi": [ + "testConfigurationUi.pick", + "updateTestConfiguration" ], - "vs/workbench/contrib/interactiveEditor/common/interactiveEditor": [ - "interactiveEditorHasProvider", - "interactiveEditorVisible", - "interactiveEditorFocused", - "interactiveEditorEmpty", - "interactiveEditorInnerCursorFirst", - "interactiveEditorInnerCursorLast", - "interactiveEditorMarkdownMessageCropState", - "interactiveEditorOuterCursorPosition", - "interactiveEditorHasActiveRequest", - "interactiveEditorHasStashedSession", - "interactiveEditorDiff", - "interactiveEditorResponseType", - "interactiveEditorDidEdit", - "interactiveEditorLastFeedbackKind", - "interactiveEditorDocumentChanged", - "interactiveEditor.border", - "interactiveEditor.shadow", - "interactiveEditor.regionHighlight", - "interactiveEditorInput.border", - "interactiveEditorInput.focusBorder", - "interactiveEditorInput.placeholderForeground", - "interactiveEditorInput.background", - "interactiveEditorDiff.inserted", - "interactiveEditorDiff.removed", - "editMode", - "editMode.livePreview", - "editMode.preview", - "editMode.live" - ], - "vs/workbench/contrib/interactiveEditor/browser/interactiveEditorActions": [ - "run", - "unstash", - "cat", - "accept", - "stop", - "arrowUp", - "arrowDown", - "focus", - "previousFromHistory", - "nextFromHistory", - "discardMenu", - "discard", - "undo.clipboard", - "undo.newfile", - "feedback.helpful", - "feedback.unhelpful", - "toggleDiff", - "toggleDiff2", - "apply1", - "apply2", - "cancel", - "copyRecordings", - "label", - "viewInChat", - "expandMessage", - "contractMessage", - "actions.interactiveSession.accessibiltyHelpEditor" + "vs/workbench/contrib/testing/common/configuration": [ + "testConfigurationTitle", + "testing.autoRun.delay", + "testing.automaticallyOpenPeekView", + "testing.automaticallyOpenPeekView.failureAnywhere", + "testing.automaticallyOpenPeekView.failureInVisibleDocument", + "testing.automaticallyOpenPeekView.never", + "testing.showAllMessages", + "testing.automaticallyOpenPeekViewDuringContinuousRun", + "testing.countBadge", + "testing.countBadge.failed", + "testing.countBadge.off", + "testing.countBadge.passed", + "testing.countBadge.skipped", + "testing.followRunningTest", + "testing.defaultGutterClickAction", + "testing.defaultGutterClickAction.run", + "testing.defaultGutterClickAction.debug", + "testing.defaultGutterClickAction.contextMenu", + "testing.gutterEnabled", + "testing.saveBeforeTest", + "testing.openTesting.neverOpen", + "testing.openTesting.openOnTestStart", + "testing.openTesting.openOnTestFailure", + "testing.openTesting", + "testing.alwaysRevealTestOnStateChange" ], "vs/workbench/contrib/logs/common/logsActions": [ "setLogLevel", @@ -9327,11 +9589,23 @@ "vs/platform/quickinput/browser/helpQuickAccess": [ "helpPickAriaLabel" ], + "vs/workbench/contrib/quickaccess/browser/viewQuickAccess": [ + "noViewResults", + "views", + "panels", + "secondary side bar", + "terminalTitle", + "terminals", + "debugConsoles", + "channels", + "openView", + "quickOpenView" + ], "vs/workbench/contrib/quickaccess/browser/commandsQuickAccess": [ - "askXInChat", "noCommandResults", "configure keybinding", "semanticSimilarity", + "askXInChat", "commandWithCategory", "showTriggerActions", "clearCommandHistory", @@ -9342,20 +9616,14 @@ "comment": [ "&& denotes a mnemonic" ] - }, - "askInChat" + } ], - "vs/workbench/contrib/quickaccess/browser/viewQuickAccess": [ - "noViewResults", - "views", - "panels", - "secondary side bar", - "terminalTitle", - "terminals", - "debugConsoles", - "channels", - "openView", - "quickOpenView" + "vs/workbench/contrib/files/browser/views/explorerView": [ + "explorerSection", + "createNewFile", + "createNewFolder", + "refreshExplorer", + "collapseExplorerFolders" ], "vs/workbench/contrib/files/browser/views/emptyView": [ "noWorkspace" @@ -9379,57 +9647,6 @@ }, "newUntitledFile" ], - "vs/workbench/contrib/files/browser/views/explorerView": [ - "explorerSection", - "createNewFile", - "createNewFolder", - "refreshExplorer", - "collapseExplorerFolders" - ], - "vs/workbench/contrib/files/browser/fileCommands": [ - "modifiedLabel", - { - "key": "genericSaveError", - "comment": [ - "{0} is the resource that failed to save and {1} the error message" - ] - }, - "retry", - "discard", - "genericRevertError", - "newFileCommand.saveLabel" - ], - "vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler": [ - "userGuide", - "staleSaveError", - "readonlySaveErrorAdmin", - "readonlySaveErrorSudo", - "readonlySaveError", - "permissionDeniedSaveError", - "permissionDeniedSaveErrorSudo", - { - "key": "genericSaveError", - "comment": [ - "{0} is the resource that failed to save and {1} the error message" - ] - }, - "learnMore", - "dontShowAgain", - "compareChanges", - "saveConflictDiffLabel", - "overwriteElevated", - "overwriteElevatedSudo", - "saveElevated", - "saveElevatedSudo", - "retry", - "discard", - "overwrite", - "overwrite", - "configure" - ], - "vs/workbench/contrib/files/browser/editors/binaryFileEditor": [ - "binaryFileEditor" - ], "vs/workbench/contrib/files/browser/fileActions": [ "newFile", "newFolder", @@ -9591,23 +9808,69 @@ "toggleActiveEditorReadonlyInSession", "resetActiveEditorReadonlyInSession" ], - "vs/workbench/contrib/files/common/dirtyFilesIndicator": [ - "dirtyFile", - "dirtyFiles" - ], - "vs/editor/common/config/editorConfigurationSchema": [ - "editorConfigurationTitle", - "tabSize", - "indentSize", - "insertSpaces", - "detectIndentation", - "trimAutoWhitespace", - "largeFileOptimizations", - "wordBasedSuggestions", - "wordBasedSuggestionsMode.currentDocument", - "wordBasedSuggestionsMode.matchingDocuments", - "wordBasedSuggestionsMode.allDocuments", - "wordBasedSuggestionsMode", + "vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler": [ + "userGuide", + "staleSaveError", + "readonlySaveErrorAdmin", + "readonlySaveErrorSudo", + "readonlySaveError", + "permissionDeniedSaveError", + "permissionDeniedSaveErrorSudo", + { + "key": "genericSaveError", + "comment": [ + "{0} is the resource that failed to save and {1} the error message" + ] + }, + "learnMore", + "dontShowAgain", + "compareChanges", + "saveConflictDiffLabel", + "overwriteElevated", + "overwriteElevatedSudo", + "saveElevated", + "saveElevatedSudo", + "retry", + "discard", + "overwrite", + "overwrite", + "configure" + ], + "vs/workbench/contrib/files/browser/fileCommands": [ + "modifiedLabel", + { + "key": "genericSaveError", + "comment": [ + "{0} is the resource that failed to save and {1} the error message" + ] + }, + "retry", + "discard", + "genericRevertError", + "newFileCommand.saveLabel" + ], + "vs/workbench/contrib/files/browser/editors/binaryFileEditor": [ + "binaryFileEditor" + ], + "vs/workbench/contrib/files/browser/workspaceWatcher": [ + "enospcError", + "learnMore", + "eshutdownError", + "reload" + ], + "vs/editor/common/config/editorConfigurationSchema": [ + "editorConfigurationTitle", + "tabSize", + "indentSize", + "insertSpaces", + "detectIndentation", + "trimAutoWhitespace", + "largeFileOptimizations", + "wordBasedSuggestions", + "wordBasedSuggestionsMode.currentDocument", + "wordBasedSuggestionsMode.matchingDocuments", + "wordBasedSuggestionsMode.allDocuments", + "wordBasedSuggestionsMode", "semanticHighlighting.true", "semanticHighlighting.false", "semanticHighlighting.configuredByTheme", @@ -9636,13 +9899,9 @@ "diffAlgorithm.legacy", "diffAlgorithm.advanced", "collapseUnchangedRegions", - "useVersion2" - ], - "vs/workbench/contrib/files/browser/workspaceWatcher": [ - "enospcError", - "learnMore", - "eshutdownError", - "reload" + "showMoves", + "useVersion2", + "showEmptyDecorations" ], "vs/workbench/contrib/files/browser/editors/textFileEditor": [ "textFileEditor", @@ -9654,6 +9913,20 @@ "unavailableResourceErrorEditorText", "createFile" ], + "vs/workbench/contrib/files/common/dirtyFilesIndicator": [ + "dirtyFile", + "dirtyFiles" + ], + "vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPreview": [ + "default" + ], + "vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess": [ + "cannotRunGotoLine", + "gotoLineColumnLabel", + "gotoLineLabel", + "gotoLineLabelEmptyWithLimit", + "gotoLineLabelEmpty" + ], "vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPane": [ "ok", "cancel", @@ -9666,16 +9939,6 @@ "edt.title.2", "edt.title.1" ], - "vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPreview": [ - "default" - ], - "vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess": [ - "cannotRunGotoLine", - "gotoLineColumnLabel", - "gotoLineLabel", - "gotoLineLabelEmptyWithLimit", - "gotoLineLabelEmpty" - ], "vs/workbench/contrib/codeEditor/browser/quickaccess/gotoSymbolQuickAccess": [ "empty", "gotoSymbol", @@ -9689,24 +9952,6 @@ "gotoSymbolQuickAccess", "gotoSymbolByCategoryQuickAccess" ], - "vs/workbench/contrib/search/browser/searchIcons": [ - "searchDetailsIcon", - "searchShowContextIcon", - "searchHideReplaceIcon", - "searchShowReplaceIcon", - "searchReplaceAllIcon", - "searchReplaceIcon", - "searchRemoveIcon", - "searchRefreshIcon", - "searchCollapseAllIcon", - "searchExpandAllIcon", - "searchShowAsTree", - "searchShowAsList", - "searchClearIcon", - "searchStopIcon", - "searchViewIcon", - "searchNewEditorIcon" - ], "vs/workbench/contrib/search/browser/anythingQuickAccess": [ "noAnythingResults", "recentlyOpenedSeparator", @@ -9728,10 +9973,23 @@ "closeEditor", "filePickAriaLabelDirty" ], - "vs/workbench/contrib/search/browser/symbolsQuickAccess": [ - "noSymbolResults", - "openToSide", - "openToBottom" + "vs/workbench/contrib/search/browser/searchIcons": [ + "searchDetailsIcon", + "searchShowContextIcon", + "searchHideReplaceIcon", + "searchShowReplaceIcon", + "searchReplaceAllIcon", + "searchReplaceIcon", + "searchRemoveIcon", + "searchRefreshIcon", + "searchCollapseAllIcon", + "searchExpandAllIcon", + "searchShowAsTree", + "searchShowAsList", + "searchClearIcon", + "searchStopIcon", + "searchViewIcon", + "searchNewEditorIcon" ], "vs/workbench/contrib/search/browser/searchWidget": [ "search.action.replaceAll.disabled.label", @@ -9743,6 +10001,11 @@ "label.Replace", "search.replace.placeHolder" ], + "vs/workbench/contrib/search/browser/symbolsQuickAccess": [ + "noSymbolResults", + "openToSide", + "openToBottom" + ], "vs/workbench/contrib/search/browser/searchActionsCopy": [ "copyMatchLabel", "copyPathLabel", @@ -9764,16 +10027,6 @@ "findInFolder", "findInWorkspace" ], - "vs/workbench/contrib/search/browser/searchActionsSymbol": [ - "showTriggerActions", - "showTriggerActions", - { - "key": "miGotoSymbolInWorkspace", - "comment": [ - "&& denotes a mnemonic" - ] - } - ], "vs/workbench/contrib/search/browser/searchActionsNav": [ "ToggleQueryDetailsAction.label", "CloseReplaceWidget.label", @@ -9799,8 +10052,15 @@ "file.replaceAll.label", "file.replaceAll.label" ], - "vs/workbench/contrib/search/browser/searchActionsBase": [ - "search" + "vs/workbench/contrib/search/browser/searchActionsSymbol": [ + "showTriggerActions", + "showTriggerActions", + { + "key": "miGotoSymbolInWorkspace", + "comment": [ + "&& denotes a mnemonic" + ] + } ], "vs/workbench/contrib/search/browser/searchActionsTopBar": [ "clearSearchHistoryLabel", @@ -9812,10 +10072,8 @@ "ViewAsTreeAction.label", "ViewAsListAction.label" ], - "vs/workbench/contrib/searchEditor/browser/searchEditorInput": [ - "searchTitle.withQuery", - "searchTitle.withQuery", - "searchTitle" + "vs/workbench/contrib/search/browser/searchActionsBase": [ + "search" ], "vs/workbench/contrib/searchEditor/browser/searchEditor": [ "moreSearch", @@ -9828,16 +10086,25 @@ "searchEditor", "textInputBoxBorder" ], - "vs/workbench/contrib/search/browser/patternInputWidget": [ - "defaultLabel", - "onlySearchInOpenEditors", - "useExcludesAndIgnoreFilesDescription" + "vs/workbench/contrib/searchEditor/browser/searchEditorInput": [ + "searchTitle.withQuery", + "searchTitle.withQuery", + "searchTitle" ], "vs/workbench/browser/parts/views/viewPane": [ "viewPaneContainerExpandedIcon", "viewPaneContainerCollapsedIcon", "viewToolbarAriaLabel" ], + "vs/workbench/contrib/search/browser/searchMessage": [ + "unable to open trust", + "unable to open" + ], + "vs/workbench/contrib/search/browser/patternInputWidget": [ + "defaultLabel", + "onlySearchInOpenEditors", + "useExcludesAndIgnoreFilesDescription" + ], "vs/workbench/contrib/search/browser/searchResultsView": [ "searchFolderMatch.other.label", "searchFolderMatch.other.label", @@ -9861,16 +10128,6 @@ "status.scm", "scmPendingChangesBadge" ], - "vs/workbench/contrib/scm/browser/scmViewPaneContainer": [ - "source control" - ], - "vs/workbench/contrib/scm/browser/scmRepositoriesViewPane": [ - "scm" - ], - "vs/workbench/contrib/search/browser/searchMessage": [ - "unable to open trust", - "unable to open" - ], "vs/workbench/contrib/scm/browser/dirtydiffDecorator": [ "changes", "change", @@ -9903,9 +10160,8 @@ "overviewRulerAddedForeground", "overviewRulerDeletedForeground" ], - "vs/workbench/contrib/workspace/common/workspace": [ - "workspaceTrustEnabledCtx", - "workspaceTrustedCtx" + "vs/workbench/contrib/scm/browser/scmViewPaneContainer": [ + "source control" ], "vs/workbench/contrib/scm/browser/scmViewPane": [ "scm", @@ -9925,23 +10181,104 @@ "label.close", "scm.providerBorder" ], - "vs/workbench/contrib/debug/browser/debugColors": [ - "debugToolBarBackground", - "debugToolBarBorder", - "debugIcon.startForeground", - "debugIcon.pauseForeground", - "debugIcon.stopForeground", - "debugIcon.disconnectForeground", - "debugIcon.restartForeground", - "debugIcon.stepOverForeground", - "debugIcon.stepIntoForeground", - "debugIcon.stepOutForeground", - "debugIcon.continueForeground", - "debugIcon.stepBackForeground" + "vs/workbench/contrib/scm/browser/scmRepositoriesViewPane": [ + "scm" ], - "vs/workbench/contrib/debug/browser/callStackView": [ + "vs/workbench/contrib/workspace/common/workspace": [ + "workspaceTrustEnabledCtx", + "workspaceTrustedCtx" + ], + "vs/workbench/contrib/debug/browser/breakpointsView": [ + "unverifiedExceptionBreakpoint", + "expressionCondition", + "expressionAndHitCount", + "functionBreakpointsNotSupported", + "dataBreakpointsNotSupported", + "read", + "write", + "access", + "functionBreakpointPlaceholder", + "functionBreakPointInputAriaLabel", + "functionBreakpointExpressionPlaceholder", + "functionBreakPointExpresionAriaLabel", + "functionBreakpointHitCountPlaceholder", + "functionBreakPointHitCountAriaLabel", + "exceptionBreakpointAriaLabel", + "exceptionBreakpointPlaceholder", + "breakpoints", + "disabledLogpoint", + "disabledBreakpoint", + "unverifiedLogpoint", + "unverifiedBreakpoint", + "dataBreakpointUnsupported", + "dataBreakpoint", + "functionBreakpointUnsupported", + "functionBreakpoint", + "expression", + "hitCount", + "instructionBreakpointUnsupported", + "instructionBreakpointAtAddress", + "instructionBreakpoint", + "hitCount", + "breakpointUnsupported", + "logMessage", + "expression", + "hitCount", + "breakpoint", + "addFunctionBreakpoint", { - "key": "running", + "key": "miFunctionBreakpoint", + "comment": [ + "&& denotes a mnemonic" + ] + }, + "activateBreakpoints", + "removeBreakpoint", + "removeAllBreakpoints", + { + "key": "miRemoveAllBreakpoints", + "comment": [ + "&& denotes a mnemonic" + ] + }, + "enableAllBreakpoints", + { + "key": "miEnableAllBreakpoints", + "comment": [ + "&& denotes a mnemonic" + ] + }, + "disableAllBreakpoints", + { + "key": "miDisableAllBreakpoints", + "comment": [ + "&& denotes a mnemonic" + ] + }, + "reapplyAllBreakpoints", + "editCondition", + "editCondition", + "editHitCount", + "editBreakpoint", + "editHitCount" + ], + "vs/workbench/contrib/debug/browser/debugColors": [ + "debugToolBarBackground", + "debugToolBarBorder", + "debugIcon.startForeground", + "debugIcon.pauseForeground", + "debugIcon.stopForeground", + "debugIcon.disconnectForeground", + "debugIcon.restartForeground", + "debugIcon.stepOverForeground", + "debugIcon.stepIntoForeground", + "debugIcon.stepOutForeground", + "debugIcon.continueForeground", + "debugIcon.stepBackForeground" + ], + "vs/workbench/contrib/debug/browser/callStackView": [ + { + "key": "running", "comment": [ "indicates state" ] @@ -9998,82 +10335,99 @@ "showMoreStackFrames", "collapse" ], - "vs/workbench/contrib/debug/browser/breakpointsView": [ - "unverifiedExceptionBreakpoint", - "expressionCondition", - "expressionAndHitCount", - "functionBreakpointsNotSupported", - "dataBreakpointsNotSupported", - "read", - "write", - "access", - "functionBreakpointPlaceholder", - "functionBreakPointInputAriaLabel", - "functionBreakpointExpressionPlaceholder", - "functionBreakPointExpresionAriaLabel", - "functionBreakpointHitCountPlaceholder", - "functionBreakPointHitCountAriaLabel", - "exceptionBreakpointAriaLabel", - "exceptionBreakpointPlaceholder", - "breakpoints", - "disabledLogpoint", - "disabledBreakpoint", - "unverifiedLogpoint", - "unverifiedBreakpoint", - "dataBreakpointUnsupported", - "dataBreakpoint", - "functionBreakpointUnsupported", - "functionBreakpoint", - "expression", - "hitCount", - "instructionBreakpointUnsupported", - "instructionBreakpointAtAddress", - "instructionBreakpoint", - "hitCount", - "breakpointUnsupported", - "logMessage", - "expression", - "hitCount", - "breakpoint", - "addFunctionBreakpoint", + "vs/workbench/contrib/debug/browser/debugCommands": [ + "debug", + "restartDebug", + "stepOverDebug", + "stepIntoDebug", + "stepIntoTargetDebug", + "stepOutDebug", + "pauseDebug", + "disconnect", + "disconnectSuspend", + "stop", + "continueDebug", + "focusSession", + "selectAndStartDebugging", + "openLaunchJson", + "startDebug", + "startWithoutDebugging", + "nextDebugConsole", + "prevDebugConsole", + "openLoadedScript", + "callStackTop", + "callStackBottom", + "callStackUp", + "callStackDown", + "selectDebugConsole", + "selectDebugSession", + "chooseLocation", + "noExecutableCode", + "jumpToCursor", + "editor.debug.action.stepIntoTargets.none", + "addConfiguration", + "addInlineBreakpoint" + ], + "vs/workbench/contrib/debug/browser/debugConsoleQuickAccess": [ + "workbench.action.debug.startDebug" + ], + "vs/workbench/contrib/debug/browser/debugEditorActions": [ + "toggleBreakpointAction", { - "key": "miFunctionBreakpoint", + "key": "miToggleBreakpoint", "comment": [ "&& denotes a mnemonic" ] }, - "activateBreakpoints", - "removeBreakpoint", - "removeAllBreakpoints", + "conditionalBreakpointEditorAction", { - "key": "miRemoveAllBreakpoints", + "key": "miConditionalBreakpoint", "comment": [ "&& denotes a mnemonic" ] }, - "enableAllBreakpoints", + "logPointEditorAction", { - "key": "miEnableAllBreakpoints", + "key": "miLogPoint", "comment": [ "&& denotes a mnemonic" ] }, - "disableAllBreakpoints", + "EditBreakpointEditorAction", { - "key": "miDisableAllBreakpoints", + "key": "miEditBreakpoint", "comment": [ "&& denotes a mnemonic" ] }, - "reapplyAllBreakpoints", - "editCondition", - "editCondition", - "editHitCount", - "editBreakpoint", - "editHitCount" - ], - "vs/workbench/contrib/debug/browser/debugConsoleQuickAccess": [ - "workbench.action.debug.startDebug" + "openDisassemblyView", + { + "key": "miDisassemblyView", + "comment": [ + "&& denotes a mnemonic" + ] + }, + "toggleDisassemblyViewSourceCode", + { + "key": "mitogglesource", + "comment": [ + "&& denotes a mnemonic" + ] + }, + "runToCursor", + "evaluateInDebugConsole", + "addToWatch", + "showDebugHover", + "editor.debug.action.stepIntoTargets.notAvailable", + { + "key": "stepIntoTargets", + "comment": [ + "Step Into Targets lets the user step into an exact function he or she is interested in." + ] + }, + "goToNextBreakpoint", + "goToPreviousBreakpoint", + "closeExceptionWidget" ], "vs/workbench/contrib/debug/browser/debugIcons": [ "debugConsoleViewIcon", @@ -10132,39 +10486,6 @@ "debugConsoleEvaluationPrompt", "debugInspectMemory" ], - "vs/workbench/contrib/debug/browser/debugCommands": [ - "debug", - "restartDebug", - "stepOverDebug", - "stepIntoDebug", - "stepIntoTargetDebug", - "stepOutDebug", - "pauseDebug", - "disconnect", - "disconnectSuspend", - "stop", - "continueDebug", - "focusSession", - "selectAndStartDebugging", - "openLaunchJson", - "startDebug", - "startWithoutDebugging", - "nextDebugConsole", - "prevDebugConsole", - "openLoadedScript", - "callStackTop", - "callStackBottom", - "callStackUp", - "callStackDown", - "selectDebugConsole", - "selectDebugSession", - "chooseLocation", - "noExecutableCode", - "jumpToCursor", - "editor.debug.action.stepIntoTargets.none", - "addConfiguration", - "addInlineBreakpoint" - ], "vs/workbench/contrib/debug/browser/debugQuickAccess": [ "noDebugResults", "customizeLaunchConfig", @@ -10185,112 +10506,63 @@ "addConfigTo", "addConfiguration" ], - "vs/workbench/contrib/debug/browser/debugEditorActions": [ - "toggleBreakpointAction", + "vs/workbench/contrib/debug/browser/debugStatus": [ + "status.debug", + "debugTarget", + "selectAndStartDebug" + ], + "vs/workbench/contrib/debug/browser/debugService": [ + "1activeSession", + "nActiveSessions", + "runTrust", + "debugTrust", { - "key": "miToggleBreakpoint", + "key": "compoundMustHaveConfigurations", "comment": [ - "&& denotes a mnemonic" + "compound indicates a \"compounds\" configuration item", + "\"configurations\" is an attribute and should not be localized" ] }, - "conditionalBreakpointEditorAction", + "noConfigurationNameInWorkspace", + "multipleConfigurationNamesInWorkspace", + "noFolderWithName", + "configMissing", + "launchJsonDoesNotExist", + "debugRequestNotSupported", + "debugRequesMissing", + "debugTypeNotSupported", + "debugTypeMissing", { - "key": "miConditionalBreakpoint", + "key": "installAdditionalDebuggers", "comment": [ - "&& denotes a mnemonic" + "Placeholder is the debug type, so for example \"node\", \"python\"" ] }, - "logPointEditorAction", + "noFolderWorkspaceDebugError", + "multipleSession", + "debugAdapterCrash", { - "key": "miLogPoint", + "key": "debuggingPaused", "comment": [ - "&& denotes a mnemonic" + "First placeholder is the file line content, second placeholder is the reason why debugging is stopped, for example \"breakpoint\", third is the stack frame name, and last is the line number." ] }, - "EditBreakpointEditorAction", - { - "key": "miEditBreakpoint", - "comment": [ - "&& denotes a mnemonic" - ] - }, - "openDisassemblyView", - { - "key": "miDisassemblyView", - "comment": [ - "&& denotes a mnemonic" - ] - }, - "toggleDisassemblyViewSourceCode", - { - "key": "mitogglesource", - "comment": [ - "&& denotes a mnemonic" - ] - }, - "runToCursor", - "evaluateInDebugConsole", - "addToWatch", - "showDebugHover", - "editor.debug.action.stepIntoTargets.notAvailable", - { - "key": "stepIntoTargets", - "comment": [ - "Step Into Targets lets the user step into an exact function he or she is interested in." - ] - }, - "goToNextBreakpoint", - "goToPreviousBreakpoint", - "closeExceptionWidget" - ], - "vs/workbench/contrib/debug/browser/debugStatus": [ - "status.debug", - "debugTarget", - "selectAndStartDebug" + "breakpointAdded", + "breakpointRemoved" ], "vs/workbench/contrib/debug/browser/debugToolBar": [ "notebook.moreRunActionsLabel", "stepBackDebug", "reverseContinue" ], - "vs/workbench/contrib/debug/browser/debugService": [ - "1activeSession", - "nActiveSessions", - "runTrust", - "debugTrust", - { - "key": "compoundMustHaveConfigurations", - "comment": [ - "compound indicates a \"compounds\" configuration item", - "\"configurations\" is an attribute and should not be localized" - ] - }, - "noConfigurationNameInWorkspace", - "multipleConfigurationNamesInWorkspace", - "noFolderWithName", - "configMissing", - "launchJsonDoesNotExist", - "debugRequestNotSupported", - "debugRequesMissing", - "debugTypeNotSupported", - "debugTypeMissing", - { - "key": "installAdditionalDebuggers", - "comment": [ - "Placeholder is the debug type, so for example \"node\", \"python\"" - ] - }, - "noFolderWorkspaceDebugError", - "multipleSession", - "debugAdapterCrash", - { - "key": "debuggingPaused", - "comment": [ - "First placeholder is the file line content, second placeholder is the reason why debugging is stopped, for example \"breakpoint\", third is the stack frame name, and last is the line number." - ] - }, - "breakpointAdded", - "breakpointRemoved" + "vs/workbench/contrib/debug/browser/disassemblyView": [ + "instructionNotAvailable", + "disassemblyTableColumnLabel", + "editorOpenedFromDisassemblyDescription", + "disassemblyView", + "instructionAddress", + "instructionBytes", + "instructionText" ], "vs/workbench/contrib/debug/browser/loadedScriptsView": [ "loadedScriptsSession", @@ -10310,14 +10582,37 @@ "statusBarDebuggingForeground", "statusBarDebuggingBorder" ], - "vs/workbench/contrib/debug/browser/disassemblyView": [ - "instructionNotAvailable", - "disassemblyTableColumnLabel", - "editorOpenedFromDisassemblyDescription", - "disassemblyView", - "instructionAddress", - "instructionBytes", - "instructionText" + "vs/workbench/contrib/debug/browser/variablesView": [ + "variableValueAriaLabel", + "variablesAriaTreeLabel", + "variableScopeAriaLabel", + { + "key": "variableAriaLabel", + "comment": [ + "Placeholders are variable name and variable value respectivly. They should not be translated." + ] + }, + "viewMemory.prompt", + "cancel", + "install", + "viewMemory.install.progress", + "collapse" + ], + "vs/workbench/contrib/debug/browser/watchExpressionsView": [ + "typeNewValue", + "watchExpressionInputAriaLabel", + "watchExpressionPlaceholder", + { + "comment": [ + "Debug is a noun in this context, not a verb." + ], + "key": "watchAriaTreeLabel" + }, + "watchExpressionAriaLabel", + "watchVariableAriaLabel", + "collapse", + "addWatchExpression", + "removeAllWatchExpressions" ], "vs/workbench/contrib/debug/browser/welcomeView": [ "run", @@ -10359,22 +10654,6 @@ }, "allDebuggersDisabled" ], - "vs/workbench/contrib/debug/browser/watchExpressionsView": [ - "typeNewValue", - "watchExpressionInputAriaLabel", - "watchExpressionPlaceholder", - { - "comment": [ - "Debug is a noun in this context, not a verb." - ], - "key": "watchAriaTreeLabel" - }, - "watchExpressionAriaLabel", - "watchVariableAriaLabel", - "collapse", - "addWatchExpression", - "removeAllWatchExpressions" - ], "vs/workbench/contrib/debug/common/debugContentProvider": [ "unable", "canNotResolveSourceWithError", @@ -10393,29 +10672,6 @@ "vs/workbench/contrib/debug/common/disassemblyViewInput": [ "disassemblyInputName" ], - "vs/workbench/contrib/debug/browser/variablesView": [ - "variableValueAriaLabel", - "variablesAriaTreeLabel", - "variableScopeAriaLabel", - { - "key": "variableAriaLabel", - "comment": [ - "Placeholders are variable name and variable value respectivly. They should not be translated." - ] - }, - "viewMemory.prompt", - "cancel", - "install", - "viewMemory.install.progress", - "collapse" - ], - "vs/workbench/contrib/debug/browser/exceptionWidget": [ - "debugExceptionWidgetBorder", - "debugExceptionWidgetBackground", - "exceptionThrownWithId", - "exceptionThrown", - "close" - ], "vs/workbench/contrib/debug/browser/debugHover": [ { "key": "quickTip", @@ -10431,14 +10687,12 @@ ] } ], - "vs/workbench/contrib/debug/browser/breakpointWidget": [ - "breakpointWidgetLogMessagePlaceholder", - "breakpointWidgetHitCountPlaceholder", - "breakpointWidgetExpressionPlaceholder", - "expression", - "hitCount", - "logMessage", - "breakpointType" + "vs/workbench/contrib/debug/browser/exceptionWidget": [ + "debugExceptionWidgetBorder", + "debugExceptionWidgetBackground", + "exceptionThrownWithId", + "exceptionThrown", + "close" ], "vs/workbench/contrib/debug/common/debugModel": [ "invalidVariableAttributes", @@ -10459,10 +10713,14 @@ }, "breakpointDirtydHover" ], - "vs/platform/actions/browser/menuEntryActionViewItem": [ - "titleAndKb", - "titleAndKb", - "titleAndKbAndAlt" + "vs/workbench/contrib/debug/browser/breakpointWidget": [ + "breakpointWidgetLogMessagePlaceholder", + "breakpointWidgetHitCountPlaceholder", + "breakpointWidgetExpressionPlaceholder", + "expression", + "hitCount", + "logMessage", + "breakpointType" ], "vs/platform/history/browser/contextScopedHistoryWidget": [ "suggestWidgetVisible" @@ -10497,6 +10755,12 @@ "vs/workbench/contrib/debug/common/replModel": [ "consoleCleared" ], + "vs/workbench/contrib/markers/browser/markersView": [ + "showing filtered problems", + "No problems filtered", + "problems filtered", + "clearFilter" + ], "vs/workbench/contrib/markers/browser/messages": [ "problems.view.toggle.label", "problems.view.focus.label", @@ -10546,40 +10810,15 @@ "problems.tree.aria.label.relatedinfo.message", "errors.warnings.show.label" ], + "vs/workbench/browser/parts/views/viewFilter": [ + "more filters" + ], "vs/workbench/contrib/markers/browser/markersFileDecorations": [ "label", "tooltip.1", "tooltip.N", "markers.showOnFile" ], - "vs/workbench/browser/parts/views/viewFilter": [ - "more filters" - ], - "vs/workbench/contrib/markers/browser/markersView": [ - "showing filtered problems", - "No problems filtered", - "problems filtered", - "clearFilter" - ], - "vs/workbench/contrib/mergeEditor/browser/mergeEditorInput": [ - "name" - ], - "vs/workbench/contrib/mergeEditor/browser/commands/devCommands": [ - "mergeEditor", - "merge.dev.copyState", - "mergeEditor.name", - "mergeEditor.noActiveMergeEditor", - "mergeEditor.name", - "mergeEditor.successfullyCopiedMergeEditorContents", - "merge.dev.saveContentsToFolder", - "mergeEditor.name", - "mergeEditor.noActiveMergeEditor", - "mergeEditor.selectFolderToSaveTo", - "mergeEditor.name", - "mergeEditor.successfullySavedMergeEditorContentsToFolder", - "merge.dev.loadContentsFromFolder", - "mergeEditor.selectFolderToSaveTo" - ], "vs/workbench/contrib/mergeEditor/browser/commands/commands": [ "title", "layout.mixed", @@ -10614,12 +10853,28 @@ ] } ], + "vs/workbench/contrib/mergeEditor/browser/commands/devCommands": [ + "mergeEditor", + "merge.dev.copyState", + "mergeEditor.name", + "mergeEditor.noActiveMergeEditor", + "mergeEditor.name", + "mergeEditor.successfullyCopiedMergeEditorContents", + "merge.dev.saveContentsToFolder", + "mergeEditor.name", + "mergeEditor.noActiveMergeEditor", + "mergeEditor.selectFolderToSaveTo", + "mergeEditor.name", + "mergeEditor.successfullySavedMergeEditorContentsToFolder", + "merge.dev.loadContentsFromFolder", + "mergeEditor.selectFolderToSaveTo" + ], + "vs/workbench/contrib/mergeEditor/browser/mergeEditorInput": [ + "name" + ], "vs/workbench/contrib/mergeEditor/browser/view/mergeEditor": [ "mergeEditor" ], - "vs/workbench/contrib/comments/browser/commentService": [ - "hasCommentingProvider" - ], "vs/workbench/contrib/comments/browser/commentsEditorContribution": [ "nextCommentThreadAction", "previousCommentThreadAction", @@ -10629,15 +10884,26 @@ "comments.expandAll", "comments.expandUnresolved" ], - "vs/workbench/contrib/url/browser/trustedDomainsValidator": [ - "openExternalLinkAt", - { - "key": "open", - "comment": [ - "&& denotes a mnemonic" - ] - }, - { + "vs/workbench/contrib/comments/browser/commentService": [ + "hasCommentingProvider" + ], + "vs/workbench/contrib/url/browser/trustedDomains": [ + "trustedDomain.manageTrustedDomain", + "trustedDomain.trustDomain", + "trustedDomain.trustAllPorts", + "trustedDomain.trustSubDomain", + "trustedDomain.trustAllDomains", + "trustedDomain.manageTrustedDomains" + ], + "vs/workbench/contrib/url/browser/trustedDomainsValidator": [ + "openExternalLinkAt", + { + "key": "open", + "comment": [ + "&& denotes a mnemonic" + ] + }, + { "key": "copy", "comment": [ "&& denotes a mnemonic" @@ -10650,6 +10916,9 @@ ] } ], + "vs/workbench/contrib/webviewPanel/browser/webviewEditor": [ + "context.activeWebviewId" + ], "vs/workbench/contrib/webviewPanel/browser/webviewCommands": [ "editor.action.webvieweditor.showFind", "editor.action.webvieweditor.hideFind", @@ -10657,8 +10926,8 @@ "editor.action.webvieweditor.findPrevious", "refreshWebviewLabel" ], - "vs/workbench/contrib/webviewPanel/browser/webviewEditor": [ - "context.activeWebviewId" + "vs/workbench/contrib/customEditor/common/customEditor": [ + "context.customEditor" ], "vs/workbench/contrib/externalUriOpener/common/configuration": [ "externalUriOpeners", @@ -10666,169 +10935,9 @@ "externalUriOpeners.uri", "externalUriOpeners.defaultId" ], - "vs/workbench/contrib/externalUriOpener/common/externalUriOpenerService": [ - "selectOpenerDefaultLabel.web", - "selectOpenerDefaultLabel", - "selectOpenerConfigureTitle", - "selectOpenerPlaceHolder" - ], - "vs/workbench/contrib/customEditor/common/customEditor": [ - "context.customEditor" - ], - "vs/workbench/contrib/url/browser/trustedDomains": [ - "trustedDomain.manageTrustedDomain", - "trustedDomain.trustDomain", - "trustedDomain.trustAllPorts", - "trustedDomain.trustSubDomain", - "trustedDomain.trustAllDomains", - "trustedDomain.manageTrustedDomains" - ], "vs/workbench/contrib/extensions/common/extensionsInput": [ "extensionsInputName" ], - "vs/workbench/contrib/extensions/common/extensionsFileTemplate": [ - "app.extensions.json.title", - "app.extensions.json.recommendations", - "app.extension.identifier.errorMessage", - "app.extensions.json.unwantedRecommendations", - "app.extension.identifier.errorMessage" - ], - "vs/workbench/contrib/extensions/browser/extensionEditor": [ - "extension version", - "preRelease", - "name", - "preview", - "preview", - "builtin", - "publisher", - "install count", - "rating", - "details", - "detailstooltip", - "contributions", - "contributionstooltip", - "changelog", - "changelogtooltip", - "dependencies", - "dependenciestooltip", - "extensionpack", - "extensionpacktooltip", - "runtimeStatus", - "runtimeStatus description", - "noReadme", - "Readme title", - "extension pack", - "noReadme", - "Readme title", - "categories", - "Marketplace", - "repository", - "license", - "resources", - "Marketplace Info", - "published", - "last released", - "last updated", - "id", - "noChangelog", - "Changelog title", - "noContributions", - "noContributions", - "noDependencies", - "activation reason", - "startup", - "activation time", - "activatedBy", - "not yet activated", - "uncaught errors", - "messages", - "noStatus", - "settings", - "setting name", - "description", - "default", - "debuggers", - "debugger name", - "debugger type", - "viewContainers", - "view container id", - "view container title", - "view container location", - "views", - "view id", - "view name", - "view location", - "localizations", - "localizations language id", - "localizations language name", - "localizations localized language name", - "customEditors", - "customEditors view type", - "customEditors priority", - "customEditors filenamePattern", - "codeActions", - "codeActions.title", - "codeActions.kind", - "codeActions.description", - "codeActions.languages", - "authentication", - "authentication.label", - "authentication.id", - "colorThemes", - "iconThemes", - "productThemes", - "colors", - "colorId", - "description", - "defaultDark", - "defaultLight", - "defaultHC", - "JSON Validation", - "fileMatch", - "schema", - "commands", - "command name", - "command title", - "keyboard shortcuts", - "menuContexts", - "languages", - "language id", - "language name", - "file extensions", - "grammar", - "snippets", - "activation events", - "Notebooks", - "Notebook id", - "Notebook name", - "NotebookRenderers", - "Notebook renderer name", - "Notebook mimetypes", - "find", - "find next", - "find previous" - ], - "vs/workbench/contrib/extensions/common/extensionsUtils": [ - "disableOtherKeymapsConfirmation", - "yes", - "no" - ], - "vs/workbench/contrib/extensions/browser/extensionsDependencyChecker": [ - "extensions", - "auto install missing deps", - "finished installing missing deps", - "reload", - "no missing deps" - ], - "vs/workbench/contrib/extensions/browser/extensionsActivationProgress": [ - "activation" - ], - "vs/workbench/contrib/extensions/browser/extensionsQuickAccess": [ - "type", - "searchFor", - "install", - "manage" - ], "vs/workbench/contrib/extensions/browser/extensionsActions": [ "VS Code for Web", "cannot be installed", @@ -10875,30 +10984,6 @@ "install", "install release version", "install", - "do no sync", - { - "key": "install extension in remote and do not sync", - "comment": [ - "First placeholder is install action label.", - "Second placeholder is the name of the action to install an extension in remote server and do not sync it. Placeholder is for the name of remote server.", - "Third placeholder is do not sync label." - ] - }, - { - "key": "install extension in remote", - "comment": [ - "First placeholder is install action label.", - "Second placeholder is the name of the action to install an extension in remote server and do not sync it. Placeholder is for the name of remote server." - ] - }, - "install extension locally and do not sync", - "install extension locally", - { - "key": "install everywhere tooltip", - "comment": [ - "Placeholder is the name of the product. Eg: Visual Studio Code or Visual Studio Code - Insiders" - ] - }, "installing", "install", "installing", @@ -11036,82 +11121,24 @@ "extensionButtonProminentForeground", "extensionButtonProminentHoverBackground" ], - "vs/workbench/contrib/extensions/browser/extensionRecommendationNotificationService": [ - "neverShowAgain", - "ignoreExtensionRecommendations", - "ignoreAll", - "no", - { - "key": "this repository", - "comment": [ - "this repository means the current repository that is opened" - ] - }, - "extensionFromPublisher", - "extensionsFromMultiplePublishers", - "extensionsFromPublishers", - "extensionsFromPublisher", - "recommended", - { - "key": "exeRecommended", - "comment": [ - "Placeholder string is the name of the software that is installed." - ] - }, - "install", - "install and do no sync", - "show recommendations" + "vs/workbench/contrib/extensions/browser/extensionsViews": [ + "extensions", + "offline error", + "error", + "no extensions found", + "suggestProxyError", + "open user settings", + "no local extensions", + "extension.arialabel.verifiedPublihser", + "extension.arialabel.publihser", + "extension.arialabel.deprecated", + "extension.arialabel.rating" ], - "vs/workbench/contrib/extensions/browser/abstractRuntimeExtensionsEditor": [ - { - "key": "starActivation", - "comment": [ - "{0} will be an extension identifier" - ] - }, - { - "key": "workspaceContainsGlobActivation", - "comment": [ - "{0} will be a glob pattern", - "{1} will be an extension identifier" - ] - }, - { - "key": "workspaceContainsFileActivation", - "comment": [ - "{0} will be a file name", - "{1} will be an extension identifier" - ] - }, - { - "key": "workspaceContainsTimeout", - "comment": [ - "{0} will be a glob pattern", - "{1} will be an extension identifier" - ] - }, - { - "key": "startupFinishedActivation", - "comment": [ - "This refers to an extension. {0} will be an activation event." - ] - }, - "languageActivation", - { - "key": "workspaceGenericActivation", - "comment": [ - "{0} will be an activation event, like e.g. 'language:typescript', 'debug', etc.", - "{1} will be an extension identifier" - ] - }, - "extensionActivating", - "unresponsive.title", - "errors", - "runtimeExtensions", - "copy id", - "disable workspace", - "disable", - "showRuntimeExtensions" + "vs/workbench/contrib/externalUriOpener/common/externalUriOpenerService": [ + "selectOpenerDefaultLabel.web", + "selectOpenerDefaultLabel", + "selectOpenerConfigureTitle", + "selectOpenerPlaceHolder" ], "vs/workbench/contrib/extensions/browser/extensionsIcons": [ "extensionsViewIcon", @@ -11139,11 +11166,151 @@ "trustIcon", "activationtimeIcon" ], - "vs/workbench/contrib/extensions/browser/extensionEnablementWorkspaceTrustTransitionParticipant": [ - "restartExtensionHost.reason" + "vs/platform/dnd/browser/dnd": [ + "fileTooLarge" ], - "vs/workbench/contrib/extensions/browser/extensionsCompletionItemsProvider": [ - "exampleExtension" + "vs/workbench/contrib/extensions/common/extensionsFileTemplate": [ + "app.extensions.json.title", + "app.extensions.json.recommendations", + "app.extension.identifier.errorMessage", + "app.extensions.json.unwantedRecommendations", + "app.extension.identifier.errorMessage" + ], + "vs/workbench/contrib/extensions/common/extensionsUtils": [ + "disableOtherKeymapsConfirmation", + "yes", + "no" + ], + "vs/workbench/contrib/extensions/browser/extensionEditor": [ + "extension version", + "preRelease", + "name", + "preview", + "preview", + "builtin", + "publisher", + "install count", + "rating", + "details", + "detailstooltip", + "contributions", + "contributionstooltip", + "changelog", + "changelogtooltip", + "dependencies", + "dependenciestooltip", + "extensionpack", + "extensionpacktooltip", + "runtimeStatus", + "runtimeStatus description", + "noReadme", + "Readme title", + "extension pack", + "noReadme", + "Readme title", + "categories", + "Marketplace", + "repository", + "license", + "resources", + "Marketplace Info", + "published", + "last released", + "last updated", + "id", + "noChangelog", + "Changelog title", + "noContributions", + "noContributions", + "noDependencies", + "activation reason", + "startup", + "activation time", + "activatedBy", + "not yet activated", + "uncaught errors", + "messages", + "noStatus", + "settings", + "setting name", + "description", + "default", + "debuggers", + "debugger name", + "debugger type", + "viewContainers", + "view container id", + "view container title", + "view container location", + "views", + "view id", + "view name", + "view location", + "localizations", + "localizations language id", + "localizations language name", + "localizations localized language name", + "customEditors", + "customEditors view type", + "customEditors priority", + "customEditors filenamePattern", + "codeActions", + "codeActions.title", + "codeActions.kind", + "codeActions.description", + "codeActions.languages", + "authentication", + "authentication.label", + "authentication.id", + "colorThemes", + "iconThemes", + "productThemes", + "colors", + "colorId", + "description", + "defaultDark", + "defaultLight", + "defaultHC", + "JSON Validation", + "fileMatch", + "schema", + "commands", + "command name", + "command title", + "keyboard shortcuts", + "menuContexts", + "languages", + "language id", + "language name", + "file extensions", + "grammar", + "snippets", + "activation events", + "Notebooks", + "Notebook id", + "Notebook name", + "NotebookRenderers", + "Notebook renderer name", + "Notebook mimetypes", + "find", + "find next", + "find previous" + ], + "vs/workbench/contrib/extensions/browser/extensionsActivationProgress": [ + "activation" + ], + "vs/workbench/contrib/extensions/browser/extensionsDependencyChecker": [ + "extensions", + "auto install missing deps", + "finished installing missing deps", + "reload", + "no missing deps" + ], + "vs/workbench/contrib/extensions/browser/extensionsQuickAccess": [ + "type", + "searchFor", + "install", + "manage" ], "vs/workbench/contrib/extensions/browser/extensionsWorkbenchService": [ "Manifest is not found", @@ -11167,79 +11334,96 @@ "twoDependentsError", "multipleDependentsError" ], - "vs/workbench/contrib/extensions/browser/deprecatedExtensionsChecker": [ - "deprecated extensions", - "showDeprecated", - "neverShowAgain" - ], - "vs/workbench/contrib/extensions/browser/extensionsViews": [ - "extensions", - "offline error", - "error", - "no extensions found", - "suggestProxyError", - "open user settings", - "no local extensions", - "extension.arialabel.verifiedPublihser", - "extension.arialabel.publihser", - "extension.arialabel.deprecated", - "extension.arialabel.rating" - ], - "vs/workbench/contrib/terminal/browser/terminal.contribution": [ - "tasksQuickAccessPlaceholder", - "tasksQuickAccessHelp", - "terminal", - "terminal", + "vs/workbench/contrib/extensions/browser/extensionRecommendationNotificationService": [ + "neverShowAgain", + "ignoreExtensionRecommendations", + "ignoreAll", + "no", { - "key": "miToggleIntegratedTerminal", + "key": "this repository", "comment": [ - "&& denotes a mnemonic" + "this repository means the current repository that is opened" ] - } - ], - "vs/platform/dnd/browser/dnd": [ - "fileTooLarge" - ], - "vs/workbench/contrib/output/browser/logViewer": [ - "logViewerAriaLabel" - ], - "vs/workbench/contrib/terminal/browser/terminalView": [ - "terminal.useMonospace", - "terminal.monospaceOnly", - "terminals", - "terminalConnectingLabel" - ], - "vs/workbench/contrib/terminalContrib/environmentChanges/browser/terminal.environmentChanges.contribution": [ - "workbench.action.terminal.showEnvironmentContributions", - "envChanges", - "extension" - ], - "vs/workbench/contrib/terminalContrib/developer/browser/terminal.developer.contribution": [ - "workbench.action.terminal.showTextureAtlas", - "workbench.action.terminal.writeDataToTerminal", - "workbench.action.terminal.writeDataToTerminal.prompt" + }, + "extensionFromPublisher", + "extensionsFromMultiplePublishers", + "extensionsFromPublishers", + "extensionsFromPublisher", + "recommended", + { + "key": "exeRecommended", + "comment": [ + "Placeholder string is the name of the software that is installed." + ] + }, + "install", + "install and do no sync", + "show recommendations" ], - "vs/workbench/contrib/terminalContrib/accessibility/browser/terminal.accessibility.contribution": [ - "workbench.action.terminal.showAccessibilityHelp", - "workbench.action.terminal.focusAccessibleBuffer", - "workbench.action.terminal.navigateAccessibleBuffer", - "workbench.action.terminal.accessibleBufferGoToNextCommand", - "workbench.action.terminal.accessibleBufferGoToPreviousCommand" + "vs/workbench/contrib/extensions/browser/abstractRuntimeExtensionsEditor": [ + { + "key": "starActivation", + "comment": [ + "{0} will be an extension identifier" + ] + }, + { + "key": "workspaceContainsGlobActivation", + "comment": [ + "{0} will be a glob pattern", + "{1} will be an extension identifier" + ] + }, + { + "key": "workspaceContainsFileActivation", + "comment": [ + "{0} will be a file name", + "{1} will be an extension identifier" + ] + }, + { + "key": "workspaceContainsTimeout", + "comment": [ + "{0} will be a glob pattern", + "{1} will be an extension identifier" + ] + }, + { + "key": "startupFinishedActivation", + "comment": [ + "This refers to an extension. {0} will be an activation event." + ] + }, + "languageActivation", + { + "key": "workspaceGenericActivation", + "comment": [ + "{0} will be an activation event, like e.g. 'language:typescript', 'debug', etc.", + "{1} will be an extension identifier" + ] + }, + "extensionActivating", + "unresponsive.title", + "errors", + "runtimeExtensions", + "copy id", + "disable workspace", + "disable", + "showRuntimeExtensions" ], - "vs/workbench/contrib/terminalContrib/find/browser/terminal.find.contribution": [ - "workbench.action.terminal.focusFind", - "workbench.action.terminal.hideFind", - "workbench.action.terminal.toggleFindRegex", - "workbench.action.terminal.toggleFindWholeWord", - "workbench.action.terminal.toggleFindCaseSensitive", - "workbench.action.terminal.findNext", - "workbench.action.terminal.findPrevious", - "workbench.action.terminal.searchWorkspace" + "vs/workbench/contrib/extensions/browser/extensionEnablementWorkspaceTrustTransitionParticipant": [ + "restartExtensionHost.reason" ], - "vs/workbench/contrib/terminalContrib/links/browser/terminal.links.contribution": [ - "workbench.action.terminal.openDetectedLink", - "workbench.action.terminal.openLastUrlLink", - "workbench.action.terminal.openLastLocalFileLink" + "vs/workbench/contrib/extensions/browser/extensionsCompletionItemsProvider": [ + "exampleExtension" + ], + "vs/workbench/contrib/extensions/browser/deprecatedExtensionsChecker": [ + "deprecated extensions", + "showDeprecated", + "neverShowAgain" + ], + "vs/workbench/contrib/output/browser/logViewer": [ + "logViewerAriaLabel" ], "vs/workbench/contrib/tasks/common/problemMatcher": [ "ProblemPatternParser.problemPattern.missingRegExp", @@ -11311,9 +11495,6 @@ "eslint-stylish", "go" ], - "vs/workbench/contrib/terminalContrib/quickFix/browser/terminal.quickFix.contribution": [ - "workbench.action.terminal.showQuickFixes" - ], "vs/workbench/contrib/tasks/browser/runAutomaticTasks": [ "workbench.action.tasks.manageAutomaticRunning", "workbench.action.tasks.allowAutomaticTasks", @@ -11329,10 +11510,6 @@ "JsonSchema.linux", "JsonSchema.shell" ], - "vs/workbench/contrib/tasks/browser/tasksQuickAccess": [ - "noTaskResults", - "TaskService.pickRunTask" - ], "vs/workbench/contrib/tasks/common/jsonSchema_v2": [ "JsonSchema.shell", "JsonSchema.tasks.isShellCommand.deprecated", @@ -11417,26 +11594,53 @@ "JsonSchema.mac", "JsonSchema.linux" ], + "vs/workbench/contrib/tasks/browser/tasksQuickAccess": [ + "noTaskResults", + "TaskService.pickRunTask" + ], + "vs/workbench/contrib/tasks/common/taskDefinitionRegistry": [ + "TaskDefinition.description", + "TaskDefinition.properties", + "TaskDefinition.when", + "TaskTypeConfiguration.noType", + "TaskDefinitionExtPoint" + ], "vs/workbench/contrib/remote/browser/tunnelFactory": [ "tunnelPrivacy.private", "tunnelPrivacy.public" ], - "vs/workbench/contrib/emmet/browser/actions/expandAbbreviation": [ - "expandAbbreviationAction", + "vs/workbench/contrib/remote/browser/remote": [ + "getStartedWalkthrough.id", + "RemoteHelpInformationExtPoint", + "RemoteHelpInformationExtPoint.getStarted", + "RemoteHelpInformationExtPoint.documentation", + "RemoteHelpInformationExtPoint.feedback", + "RemoteHelpInformationExtPoint.feedback.deprecated", + "RemoteHelpInformationExtPoint.reportIssue", + "RemoteHelpInformationExtPoint.issues", + "remote.help.getStarted", + "remote.help.documentation", + "remote.help.issues", + "remote.help.report", + "pickRemoteExtension", + "remote.help", + "remotehelp", + "remote.explorer", + "remote.explorer", + "reconnectionWaitOne", + "reconnectionWaitMany", + "reconnectNow", + "reloadWindow", + "connectionLost", + "reconnectionRunning", + "reconnectionPermanentFailure", { - "key": "miEmmetExpandAbbreviation", + "key": "reloadWindow.dialog", "comment": [ "&& denotes a mnemonic" ] } ], - "vs/workbench/contrib/tasks/common/taskDefinitionRegistry": [ - "TaskDefinition.description", - "TaskDefinition.properties", - "TaskDefinition.when", - "TaskTypeConfiguration.noType", - "TaskDefinitionExtPoint" - ], "vs/workbench/contrib/remote/browser/remoteIndicator": [ "statusBarOfflineBackground", "statusBarOfflineForeground", @@ -11479,8 +11683,57 @@ "closeRemoteConnection.title", "reloadWindow", "closeVirtualWorkspace.title", - "installRemotes", - "remoteActions" + "remote.startActions.help", + "remote.startActions.install", + "remoteActions", + "remote.startActions.installingExtension" + ], + "vs/workbench/contrib/terminal/browser/terminal.contribution": [ + "tasksQuickAccessPlaceholder", + "tasksQuickAccessHelp", + "terminal", + "terminal", + { + "key": "miToggleIntegratedTerminal", + "comment": [ + "&& denotes a mnemonic" + ] + } + ], + "vs/workbench/contrib/terminalContrib/accessibility/browser/terminal.accessibility.contribution": [ + "workbench.action.terminal.focusAccessibleBuffer", + "workbench.action.terminal.navigateAccessibleBuffer", + "workbench.action.terminal.accessibleBufferGoToNextCommand", + "workbench.action.terminal.accessibleBufferGoToPreviousCommand" + ], + "vs/workbench/contrib/terminal/browser/terminalView": [ + "terminal.useMonospace", + "terminal.monospaceOnly", + "terminals", + "terminalConnectingLabel" + ], + "vs/workbench/contrib/terminalContrib/developer/browser/terminal.developer.contribution": [ + "workbench.action.terminal.showTextureAtlas", + "workbench.action.terminal.writeDataToTerminal", + "workbench.action.terminal.writeDataToTerminal.prompt", + "workbench.action.terminal.restartPtyHost" + ], + "vs/workbench/contrib/terminalContrib/environmentChanges/browser/terminal.environmentChanges.contribution": [ + "workbench.action.terminal.showEnvironmentContributions", + "envChanges", + "extension" + ], + "vs/workbench/contrib/terminalContrib/quickFix/browser/terminal.quickFix.contribution": [ + "workbench.action.terminal.showQuickFixes" + ], + "vs/workbench/contrib/emmet/browser/actions/expandAbbreviation": [ + "expandAbbreviationAction", + { + "key": "miEmmetExpandAbbreviation", + "comment": [ + "&& denotes a mnemonic" + ] + } ], "vs/workbench/contrib/codeEditor/browser/accessibility/accessibility": [ "accessibilityHelpTitle", @@ -11502,46 +11755,28 @@ "openDocMac", "openDocWinLinux", "outroMsg", - "ShowAccessibilityHelpAction", "toggleScreenReaderMode" ], - "vs/workbench/contrib/remote/browser/remote": [ - "getStartedWalkthrough.id", - "RemoteHelpInformationExtPoint", - "RemoteHelpInformationExtPoint.getStarted", - "RemoteHelpInformationExtPoint.documentation", - "RemoteHelpInformationExtPoint.feedback", - "RemoteHelpInformationExtPoint.feedback.deprecated", - "RemoteHelpInformationExtPoint.reportIssue", - "RemoteHelpInformationExtPoint.issues", - "remote.help.getStarted", - "remote.help.documentation", - "remote.help.issues", - "remote.help.report", - "pickRemoteExtension", - "remote.help", - "remotehelp", - "remote.explorer", - "remote.explorer", - "reconnectionWaitOne", - "reconnectionWaitMany", - "reconnectNow", - "reloadWindow", - "connectionLost", - "reconnectionRunning", - "reconnectionPermanentFailure", - { - "key": "reloadWindow.dialog", - "comment": [ - "&& denotes a mnemonic" - ] - } + "vs/workbench/contrib/terminalContrib/links/browser/terminal.links.contribution": [ + "workbench.action.terminal.openDetectedLink", + "workbench.action.terminal.openLastUrlLink", + "workbench.action.terminal.openLastLocalFileLink" ], "vs/workbench/contrib/codeEditor/browser/diffEditorHelper": [ "hintTimeout", "removeTimeout", "hintWhitespace" ], + "vs/workbench/contrib/terminalContrib/find/browser/terminal.find.contribution": [ + "workbench.action.terminal.focusFind", + "workbench.action.terminal.hideFind", + "workbench.action.terminal.toggleFindRegex", + "workbench.action.terminal.toggleFindWholeWord", + "workbench.action.terminal.toggleFindCaseSensitive", + "workbench.action.terminal.findNext", + "workbench.action.terminal.findPrevious", + "workbench.action.terminal.searchWorkspace" + ], "vs/workbench/contrib/codeEditor/browser/inspectKeybindings": [ "workbench.action.inspectKeyMap", "workbench.action.inspectKeyMapJSON" @@ -11556,29 +11791,15 @@ "removeOptimizations", "reopenFilePrompt" ], + "vs/workbench/contrib/codeEditor/browser/inspectEditorTokens/inspectEditorTokens": [ + "inspectEditorTokens", + "inspectTMScopesWidget.loading" + ], "vs/workbench/contrib/codeEditor/browser/quickaccess/gotoLineQuickAccess": [ "gotoLine", "gotoLineQuickAccessPlaceholder", "gotoLineQuickAccess" ], - "vs/workbench/contrib/codeEditor/browser/toggleMinimap": [ - "toggleMinimap", - { - "key": "miMinimap", - "comment": [ - "&& denotes a mnemonic" - ] - } - ], - "vs/workbench/contrib/codeEditor/browser/toggleColumnSelection": [ - "toggleColumnSelection", - { - "key": "miColumnSelection", - "comment": [ - "&& denotes a mnemonic" - ] - } - ], "vs/workbench/contrib/codeEditor/browser/saveParticipants": [ { "key": "formatting2", @@ -11595,29 +11816,43 @@ }, "codeAction.apply" ], - "vs/workbench/contrib/codeEditor/browser/inspectEditorTokens/inspectEditorTokens": [ - "inspectEditorTokens", - "inspectTMScopesWidget.loading" + "vs/workbench/contrib/codeEditor/browser/toggleColumnSelection": [ + "toggleColumnSelection", + { + "key": "miColumnSelection", + "comment": [ + "&& denotes a mnemonic" + ] + } ], - "vs/workbench/contrib/codeEditor/browser/toggleMultiCursorModifier": [ + "vs/workbench/contrib/codeEditor/browser/toggleMinimap": [ + "toggleMinimap", + { + "key": "miMinimap", + "comment": [ + "&& denotes a mnemonic" + ] + } + ], + "vs/workbench/contrib/codeEditor/browser/toggleMultiCursorModifier": [ "toggleLocation", "miMultiCursorAlt", "miMultiCursorCmd", "miMultiCursorCtrl" ], - "vs/workbench/contrib/codeEditor/browser/toggleRenderWhitespace": [ - "toggleRenderWhitespace", + "vs/workbench/contrib/codeEditor/browser/toggleRenderControlCharacter": [ + "toggleRenderControlCharacters", { - "key": "miToggleRenderWhitespace", + "key": "miToggleRenderControlCharacters", "comment": [ "&& denotes a mnemonic" ] } ], - "vs/workbench/contrib/codeEditor/browser/toggleRenderControlCharacter": [ - "toggleRenderControlCharacters", + "vs/workbench/contrib/codeEditor/browser/toggleRenderWhitespace": [ + "toggleRenderWhitespace", { - "key": "miToggleRenderControlCharacters", + "key": "miToggleRenderWhitespace", "comment": [ "&& denotes a mnemonic" ] @@ -11644,16 +11879,56 @@ ] } ], - "vs/workbench/contrib/format/browser/formatActionsNone": [ - "formatDocument.label.multiple", - "too.large", - "no.provider", + "vs/workbench/contrib/snippets/browser/commands/configureSnippets": [ + "global.scope", + "global.1", + "detail.label", + "name", + "bad_name1", + "bad_name2", + "bad_name3", + "openSnippet.label", + "userSnippets", { - "key": "install.formatter", + "key": "miOpenSnippets", "comment": [ "&& denotes a mnemonic" ] - } + }, + "new.global_scope", + "new.global", + "new.workspace_scope", + "new.folder", + "group.global", + "new.global.sep", + "new.global.sep", + "openSnippet.pickLanguage" + ], + "vs/workbench/contrib/snippets/browser/commands/fileTemplateSnippets": [ + "label", + "placeholder" + ], + "vs/workbench/contrib/snippets/browser/commands/insertSnippet": [ + "snippet.suggestions.label" + ], + "vs/workbench/contrib/snippets/browser/commands/surroundWithSnippet": [ + "label" + ], + "vs/workbench/contrib/snippets/browser/snippetCodeActionProvider": [ + "codeAction", + "overflow.start.title", + "title" + ], + "vs/workbench/contrib/snippets/browser/snippetsService": [ + "invalid.path.0", + "invalid.language.0", + "invalid.language", + "invalid.path.1", + "vscode.extension.contributes.snippets", + "vscode.extension.contributes.snippets-language", + "vscode.extension.contributes.snippets-path", + "badVariableUse", + "badFile" ], "vs/workbench/contrib/format/browser/formatActionsMultiple": [ "null", @@ -11681,35 +11956,20 @@ "formatDocument.label.multiple", "formatSelection.label.multiple" ], + "vs/workbench/contrib/format/browser/formatActionsNone": [ + "formatDocument.label.multiple", + "too.large", + "no.provider", + { + "key": "install.formatter", + "comment": [ + "&& denotes a mnemonic" + ] + } + ], "vs/workbench/contrib/format/browser/formatModified": [ "formatChanges" ], - "vs/workbench/contrib/snippets/browser/snippetCodeActionProvider": [ - "codeAction", - "overflow.start.title", - "title" - ], - "vs/workbench/contrib/snippets/browser/snippetsService": [ - "invalid.path.0", - "invalid.language.0", - "invalid.language", - "invalid.path.1", - "vscode.extension.contributes.snippets", - "vscode.extension.contributes.snippets-language", - "vscode.extension.contributes.snippets-path", - "badVariableUse", - "badFile" - ], - "vs/workbench/contrib/snippets/browser/commands/insertSnippet": [ - "snippet.suggestions.label" - ], - "vs/workbench/contrib/snippets/browser/commands/surroundWithSnippet": [ - "label" - ], - "vs/workbench/contrib/snippets/browser/commands/fileTemplateSnippets": [ - "label", - "placeholder" - ], "vs/workbench/contrib/update/browser/update": [ "update.noReleaseNotesOnline", "read the release notes", @@ -11768,53 +12028,11 @@ "vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedInput": [ "getStarted" ], - "vs/workbench/contrib/welcomeGettingStarted/browser/startupPage": [ - "startupPage.markdownPreviewError" - ], - "vs/workbench/contrib/snippets/browser/commands/configureSnippets": [ - "global.scope", - "global.1", - "detail.label", - "name", - "bad_name1", - "bad_name2", - "bad_name3", - "openSnippet.label", - "userSnippets", - { - "key": "miOpenSnippets", - "comment": [ - "&& denotes a mnemonic" - ] - }, - "new.global_scope", - "new.global", - "new.workspace_scope", - "new.folder", - "group.global", - "new.global.sep", - "new.global.sep", - "openSnippet.pickLanguage" - ], "vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedService": [ "builtin", "developer", "resetWelcomePageWalkthroughProgress" ], - "vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedIcons": [ - "gettingStartedUnchecked", - "gettingStartedChecked" - ], - "vs/workbench/contrib/remote/browser/remoteStartEntry": [ - "remote.category", - "remote.showStartEntryActions", - "remote.showTunnelStartEntryActions", - "remote.startActions.help", - "remote.startActions.install", - "remote.startActions.quickPickPlaceholder", - "remote.startActions.installingExtension", - "workbench.remote.showStartListEntry" - ], "vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted": [ "welcomeAriaLabel", "pickWalkthroughs", @@ -11863,10 +12081,25 @@ ] } ], + "vs/workbench/contrib/welcomeGettingStarted/browser/startupPage": [ + "welcome.displayName", + "startupPage.markdownPreviewError" + ], + "vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedIcons": [ + "gettingStartedUnchecked", + "gettingStartedChecked" + ], "vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughPart": [ "walkThrough.unboundCommand", "walkThrough.gitNotFound" ], + "vs/workbench/contrib/welcomeWalkthrough/browser/editor/editorWalkThrough": [ + "editorWalkThrough.title", + "editorWalkThrough" + ], + "vs/workbench/contrib/welcomeViews/common/viewsWelcomeContribution": [ + "ViewsWelcomeExtensionPoint.proposedAPI" + ], "vs/workbench/contrib/welcomeViews/common/viewsWelcomeExtensionPoint": [ "contributes.viewsWelcome", "contributes.viewsWelcome.view", @@ -11877,9 +12110,6 @@ "contributes.viewsWelcome.view.group", "contributes.viewsWelcome.view.enablement" ], - "vs/workbench/contrib/welcomeViews/common/viewsWelcomeContribution": [ - "ViewsWelcomeExtensionPoint.proposedAPI" - ], "vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek": [ "callFrom", "callsTo", @@ -11946,15 +12176,6 @@ "status.feedback", "status.feedback" ], - "vs/workbench/contrib/editSessions/common/editSessions": [ - "cloud changes", - "cloud changes", - "editSessionViewIcon" - ], - "vs/workbench/contrib/welcomeWalkthrough/browser/editor/editorWalkThrough": [ - "editorWalkThrough.title", - "editorWalkThrough" - ], "vs/workbench/contrib/userDataSync/browser/userDataSync": [ "stop sync", "configure sync", @@ -12044,12 +12265,65 @@ "complete merges title", "workbench.actions.syncData.reset" ], + "vs/workbench/contrib/userDataProfile/browser/userDataProfile": [ + "create empty profile", + "save profile as", + "profiles", + "switchProfile", + "selectProfile", + "rename profile", + "show profile contents", + "export profile", + "export profile in share", + "import profile", + "import from file", + "import from url", + "import profile quick pick title", + "import profile placeholder", + "profile import error", + "import profile dialog", + "import profile share", + "name", + "create from current profle", + "create empty profile", + "profileExists", + "create profile", + "empty", + "using current", + "templates", + "create profile title", + "delete profile", + "current", + "delete specific profile", + "pick profile to delete", + "create profile from templates", + "create profile from template title", + "no templates" + ], + "vs/workbench/contrib/userDataProfile/browser/userDataProfileActions": [ + "create temporary profile", + "rename profile", + "select profile to rename", + "profileExists", + "current", + "rename specific profile", + "pick profile to rename", + "mange", + "cleanup profile", + "reset workspaces" + ], + "vs/workbench/contrib/editSessions/common/editSessions": [ + "cloud changes", + "cloud changes", + "editSessionViewIcon" + ], "vs/workbench/contrib/editSessions/browser/editSessionsStorageService": [ "choose account placeholder", "signed in", "others", "sign in using account", "sign in", + "sign in badge", "reset auth.v3", "sign out of cloud changes clear data prompt", "delete all cloud changes" @@ -12093,6 +12367,26 @@ "codeActionsOnSave", "codeActionsOnSave.generic" ], + "vs/workbench/contrib/timeline/browser/timelinePane": [ + "timeline.loadingMore", + "timeline.loadMore", + "timeline", + "timeline.editorCannotProvideTimeline", + "timeline.noTimelineInfo", + "timeline.editorCannotProvideTimeline", + "timeline.aria.item", + "timeline", + "timeline.loading", + "timelineRefresh", + "timelinePin", + "timelineUnpin", + "refresh", + "timeline", + "timeline.toggleFollowActiveEditorCommand.follow", + "timeline", + "timeline.toggleFollowActiveEditorCommand.unfollow", + "timeline" + ], "vs/workbench/contrib/localHistory/browser/localHistoryTimeline": [ "localHistory" ], @@ -12117,6 +12411,7 @@ "localHistory.restoreViaPicker", "restoreViaPicker.filePlaceholder", "restoreViaPicker.entryPlaceholder", + "localHistory.restoreViaPickerMenu", "localHistory.rename", "renameLocalHistoryEntryTitle", "renameLocalHistoryPlaceholder", @@ -12145,76 +12440,6 @@ "localHistoryCompareToFileEditorLabel", "localHistoryCompareToPreviousEditorLabel" ], - "vs/workbench/contrib/userDataProfile/browser/userDataProfile": [ - "create empty profile", - "save profile as", - "profiles", - "switchProfile", - "selectProfile", - "rename profile", - "show profile contents", - "export profile", - "export profile in share", - "import profile", - "import from file", - "import from url", - "import profile quick pick title", - "import profile placeholder", - "profile import error", - "import profile dialog", - "import profile share", - "name", - "create from current profle", - "create empty profile", - "profileExists", - "create profile", - "empty", - "using current", - "templates", - "create profile title", - "delete profile", - "current", - "delete specific profile", - "pick profile to delete", - "create profile from templates", - "create profile from template title", - "no templates" - ], - "vs/workbench/contrib/userDataProfile/browser/userDataProfileActions": [ - "create temporary profile", - "rename profile", - "select profile to rename", - "profileExists", - "current", - "rename specific profile", - "pick profile to rename", - "mange", - "cleanup profile", - "reset workspaces" - ], - "vs/workbench/contrib/timeline/browser/timelinePane": [ - "timeline.loadingMore", - "timeline.loadMore", - "timeline", - "timeline.editorCannotProvideTimeline", - "timeline.noTimelineInfo", - "timeline.editorCannotProvideTimeline", - "timeline.aria.item", - "timeline", - "timeline.loading", - "timelineRefresh", - "timelinePin", - "timelineUnpin", - "refresh", - "timeline", - "timeline.toggleFollowActiveEditorCommand.follow", - "timeline", - "timeline.toggleFollowActiveEditorCommand.unfollow", - "timeline" - ], - "vs/workbench/services/workspaces/browser/workspaceTrustEditorInput": [ - "workspaceTrustEditorInputName" - ], "vs/workbench/contrib/workspace/browser/workspaceTrustEditor": [ "shieldIcon", "checkListIcon", @@ -12319,6 +12544,9 @@ "untrustedFolderReason", "trustedForcedReason" ], + "vs/workbench/services/workspaces/browser/workspaceTrustEditorInput": [ + "workspaceTrustEditorInputName" + ], "vs/workbench/contrib/audioCues/browser/commands": [ "audioCues.help", "disabled", @@ -12329,112 +12557,6 @@ "shareProviderCount", "type to filter" ], - "vs/workbench/contrib/accessibility/browser/accessibilityContribution": [ - "accessibilityConfigurationTitle", - "verbosity.terminal.description", - "verbosity.diffEditor.description", - "verbosity.chat.description", - "verbosity.interactiveEditor.description", - "verbosity.keybindingsEditor.description", - "verbosity.notebook" - ], - "vs/workbench/browser/parts/notifications/notificationsCenter": [ - "notificationsEmpty", - "notifications", - "notificationsToolbar", - "notificationsCenterWidgetAriaLabel" - ], - "vs/workbench/browser/parts/notifications/notificationsStatus": [ - "status.notifications", - "status.notifications", - "status.doNotDisturb", - "status.doNotDisturbTooltip", - "hideNotifications", - "zeroNotifications", - "noNotifications", - "oneNotification", - { - "key": "notifications", - "comment": [ - "{0} will be replaced by a number" - ] - }, - { - "key": "noNotificationsWithProgress", - "comment": [ - "{0} will be replaced by a number" - ] - }, - { - "key": "oneNotificationWithProgress", - "comment": [ - "{0} will be replaced by a number" - ] - }, - { - "key": "notificationsWithProgress", - "comment": [ - "{0} and {1} will be replaced by a number" - ] - }, - "status.message" - ], - "vs/workbench/browser/parts/notifications/notificationsCommands": [ - "notifications", - "showNotifications", - "hideNotifications", - "clearAllNotifications", - "acceptNotificationPrimaryAction", - "toggleDoNotDisturbMode", - "focusNotificationToasts" - ], - "vs/workbench/browser/parts/notifications/notificationsToasts": [ - "notificationAriaLabel", - "notificationWithSourceAriaLabel" - ], - "vs/workbench/services/configuration/common/configurationEditing": [ - "openTasksConfiguration", - "openLaunchConfiguration", - "open", - "openTasksConfiguration", - "openLaunchConfiguration", - "saveAndRetry", - "saveAndRetry", - "open", - "errorPolicyConfiguration", - "errorUnknownKey", - "errorInvalidWorkspaceConfigurationApplication", - "errorInvalidWorkspaceConfigurationMachine", - "errorInvalidFolderConfiguration", - "errorInvalidUserTarget", - "errorInvalidWorkspaceTarget", - "errorInvalidFolderTarget", - "errorInvalidResourceLanguageConfiguration", - "errorNoWorkspaceOpened", - "errorInvalidTaskConfiguration", - "errorInvalidLaunchConfiguration", - "errorInvalidConfiguration", - "errorInvalidRemoteConfiguration", - "errorInvalidConfigurationWorkspace", - "errorInvalidConfigurationFolder", - "errorTasksConfigurationFileDirty", - "errorLaunchConfigurationFileDirty", - "errorConfigurationFileDirty", - "errorRemoteConfigurationFileDirty", - "errorConfigurationFileDirtyWorkspace", - "errorConfigurationFileDirtyFolder", - "errorTasksConfigurationFileModifiedSince", - "errorLaunchConfigurationFileModifiedSince", - "errorConfigurationFileModifiedSince", - "errorRemoteConfigurationFileModifiedSince", - "errorConfigurationFileModifiedSinceWorkspace", - "errorConfigurationFileModifiedSinceFolder", - "errorUnknown", - "userTarget", - "remoteUserTarget", - "workspaceTarget", - "folderTarget" - ], "vs/workbench/services/textfile/common/textFileEditorModelManager": [ { "key": "genericSaveError", @@ -12451,11 +12573,6 @@ "toggle.commandCenter", "toggle.layout" ], - "vs/workbench/browser/parts/notifications/notificationsAlerts": [ - "alertErrorMessage", - "alertWarningMessage", - "alertInfoMessage" - ], "vs/workbench/services/configurationResolver/common/variableResolver": [ "canNotResolveFile", "canNotResolveFolderForFile", @@ -12504,23 +12621,34 @@ "vs/workbench/contrib/extensions/common/reportExtensionIssueAction": [ "reportExtensionIssue" ], - "vs/workbench/contrib/terminal/browser/terminalProfileResolverService": [ - "terminalProfileMigration", - "migrateToProfile" - ], "vs/workbench/contrib/terminal/electron-sandbox/terminalRemote": [ "workbench.action.terminal.newLocal" ], - "vs/workbench/contrib/terminal/browser/baseTerminalBackend": [ - "restartPtyHost", - "nonResponsivePtyHost" - ], "vs/workbench/contrib/tasks/common/taskTemplates": [ "dotnetCore", "msbuild", "externalCommand", "Maven" ], + "vs/workbench/contrib/tasks/browser/taskQuickPick": [ + "taskQuickPick.showAll", + "configureTaskIcon", + "removeTaskIcon", + "configureTask", + "contributedTasks", + "taskType", + "removeRecent", + "recentlyUsed", + "configured", + "configured", + "TaskQuickPick.changeSettingDetails", + "TaskQuickPick.changeSettingNo", + "TaskService.pickRunTask", + "TaskQuickPick.changeSettingsOptions", + "TaskQuickPick.goBack", + "TaskQuickPick.noTasksForType", + "noProviderForTask" + ], "vs/workbench/contrib/tasks/common/taskConfiguration": [ "ConfigurationParser.invalidCWD", "ConfigurationParser.inValidArg", @@ -12544,24 +12672,11 @@ ] } ], - "vs/workbench/contrib/tasks/browser/taskQuickPick": [ - "taskQuickPick.showAll", - "configureTaskIcon", - "removeTaskIcon", - "configureTask", - "contributedTasks", - "taskType", - "removeRecent", - "recentlyUsed", - "configured", - "configured", - "TaskQuickPick.changeSettingDetails", - "TaskQuickPick.changeSettingNo", - "TaskService.pickRunTask", - "TaskQuickPick.changeSettingsOptions", - "TaskQuickPick.goBack", - "TaskQuickPick.noTasksForType", - "noProviderForTask" + "vs/workbench/contrib/terminal/browser/baseTerminalBackend": [ + "ptyHostStatus", + "ptyHostStatus.short", + "nonResponsivePtyHost", + "ptyHostStatus.ariaLabel" ], "vs/workbench/contrib/tasks/browser/taskTerminalStatus": [ "taskTerminalStatus.active", @@ -12752,42 +12867,10 @@ "{0} is the platform, {1} is a code block, {2} and {3} are a link start and end" ] }, - "terminal.integrated.shell.linux.deprecation", - "terminal.integrated.shell.osx.deprecation", - "terminal.integrated.shell.windows.deprecation", - "terminal.integrated.automationShell.linux.deprecation", - "terminal.integrated.automationShell.osx.deprecation", - "terminal.integrated.automationShell.windows.deprecation", "terminalIntegratedConfigurationTitle", - { - "key": "terminal.integrated.automationShell.linux", - "comment": [ - "{0} and {1} are the `shell` and `shellArgs` settings keys" - ] - }, - { - "key": "terminal.integrated.automationShell.osx", - "comment": [ - "{0} and {1} are the `shell` and `shellArgs` settings keys" - ] - }, - { - "key": "terminal.integrated.automationShell.windows", - "comment": [ - "{0} and {1} are the `shell` and `shellArgs` settings keys" - ] - }, "terminal.integrated.automationProfile.linux", "terminal.integrated.automationProfile.osx", "terminal.integrated.automationProfile.windows", - "terminal.integrated.shell.linux", - "terminal.integrated.shell.osx", - "terminal.integrated.shell.windows", - "terminal.integrated.shellArgs.linux", - "terminal.integrated.shellArgs.osx", - "terminal.integrated.shellArgs.windows", - "terminal.integrated.shellArgs.windows", - "terminal.integrated.shellArgs.windows.string", "terminalProfile.windowsSource", "terminalProfile.windowsExtensionIdentifier", "terminalProfile.windowsExtensionId", @@ -12823,38 +12906,70 @@ }, "clearedInput" ], - "vs/editor/browser/widget/diffReview": [ - "diffReviewInsertIcon", - "diffReviewRemoveIcon", - "diffReviewCloseIcon", - "label.close", - "no_lines_changed", - "one_line_changed", - "more_lines_changed", - { - "key": "header", - "comment": [ - "This is the ARIA label for a git diff header.", - "A git diff header looks like this: @@ -154,12 +159,39 @@.", - "That encodes that at original line 154 (which is now line 159), 12 lines were removed/changed with 39 lines.", - "Variables 0 and 1 refer to the diff index out of total number of diffs.", - "Variables 2 and 4 will be numbers (a line number).", - "Variables 3 and 5 will be \"no lines changed\", \"1 line changed\" or \"X lines changed\", localized separately." - ] - }, - "blankLine", - { - "key": "unchangedLine", - "comment": [ - "The placeholders are contents of the line and should not be translated." - ] - }, - "equalLine", - "insertLine", - "deleteLine", - "editor.action.diffReview.next", - "editor.action.diffReview.prev" - ], + "vs/workbench/browser/parts/notifications/notificationsList": [ + "notificationAriaLabel", + "notificationWithSourceAriaLabel", + "notificationsList" + ], + "vs/workbench/browser/parts/notifications/notificationsActions": [ + "clearIcon", + "clearAllIcon", + "hideIcon", + "expandIcon", + "collapseIcon", + "configureIcon", + "doNotDisturbIcon", + "clearNotification", + "clearNotifications", + "toggleDoNotDisturbMode", + "hideNotificationsCenter", + "expandNotification", + "collapseNotification", + "configureNotification", + "copyNotification" + ], + "vs/base/browser/ui/dropdown/dropdownActionViewItem": [ + "moreActions" + ], + "vs/base/browser/ui/actionbar/actionViewItems": [ + { + "key": "titleLabel", + "comment": [ + "action title", + "action keybinding" + ] + } + ], + "vs/editor/browser/widget/diffReview": [ + "diffReviewInsertIcon", + "diffReviewRemoveIcon", + "diffReviewCloseIcon", + "label.close", + "no_lines_changed", + "one_line_changed", + "more_lines_changed", + { + "key": "header", + "comment": [ + "This is the ARIA label for a git diff header.", + "A git diff header looks like this: @@ -154,12 +159,39 @@.", + "That encodes that at original line 154 (which is now line 159), 12 lines were removed/changed with 39 lines.", + "Variables 0 and 1 refer to the diff index out of total number of diffs.", + "Variables 2 and 4 will be numbers (a line number).", + "Variables 3 and 5 will be \"no lines changed\", \"1 line changed\" or \"X lines changed\", localized separately." + ] + }, + "blankLine", + { + "key": "unchangedLine", + "comment": [ + "The placeholders are contents of the line and should not be translated." + ] + }, + "equalLine", + "insertLine", + "deleteLine" + ], "vs/editor/browser/widget/inlineDiffMargin": [ "diff.clipboard.copyDeletedLinesContent.label", "diff.clipboard.copyDeletedLinesContent.single.label", @@ -12900,20 +13015,15 @@ "autoFix.label", "editor.action.autoFix.noneMessage" ], + "vs/editor/contrib/codeAction/browser/codeActionController": [ + "hideMoreActions", + "showMoreActions" + ], "vs/editor/contrib/codeAction/browser/lightBulbWidget": [ "preferredcodeActionWithKb", "codeActionWithKb", "codeAction" ], - "vs/base/browser/ui/actionbar/actionViewItems": [ - { - "key": "titleLabel", - "comment": [ - "action title", - "action keybinding" - ] - } - ], "vs/editor/contrib/dropOrPasteInto/browser/copyPasteController": [ "pasteWidgetVisible", "postPasteWidgetTitle", @@ -12944,6 +13054,7 @@ "findReplaceAllIcon", "findPreviousMatchIcon", "findNextMatchIcon", + "label.findDialog", "label.find", "placeholder.find", "label.previousMatchButton", @@ -12978,9 +13089,6 @@ "hint1n", "hintnn" ], - "vs/editor/contrib/inlineCompletions/browser/hoverParticipant": [ - "inlineSuggestionFollows" - ], "vs/editor/contrib/inlineCompletions/browser/commands": [ "action.inlineSuggest.showNext", "action.inlineSuggest.showPrevious", @@ -12994,16 +13102,14 @@ "action.inlineSuggest.hide", "action.inlineSuggest.alwaysShowToolbar" ], + "vs/editor/contrib/inlineCompletions/browser/hoverParticipant": [ + "inlineSuggestionFollows" + ], "vs/editor/contrib/gotoSymbol/browser/peek/referencesController": [ "referenceSearchVisible", "labelLoading", "metaTitle.N" ], - "vs/editor/contrib/gotoSymbol/browser/symbolNavigation": [ - "hasSymbols", - "location.kb", - "location" - ], "vs/editor/contrib/gotoSymbol/browser/referencesModel": [ "aria.oneReference", { @@ -13019,6 +13125,11 @@ "aria.result.n1", "aria.result.nm" ], + "vs/editor/contrib/gotoSymbol/browser/symbolNavigation": [ + "hasSymbols", + "location.kb", + "location" + ], "vs/editor/contrib/message/browser/messageController": [ "messageVisible" ], @@ -13038,10 +13149,6 @@ "editorMarkerNavigationInfoHeaderBackground", "editorMarkerNavigationBackground" ], - "vs/editor/contrib/codeAction/browser/codeActionController": [ - "hideMoreActions", - "showMoreActions" - ], "vs/editor/contrib/hover/browser/markdownHoverParticipant": [ "modesContentHover.loading", "stopped rendering", @@ -13149,12 +13256,6 @@ "label.desc", "ariaCurrenttSuggestionReadDetails" ], - "vs/workbench/api/browser/mainThreadWebviews": [ - "errorMessage" - ], - "vs/workbench/browser/parts/editor/textEditor": [ - "editor" - ], "vs/platform/theme/common/tokenClassificationRegistry": [ "schema.token.settings", "schema.token.foreground", @@ -13199,6 +13300,12 @@ "async", "readonly" ], + "vs/workbench/api/browser/mainThreadWebviews": [ + "errorMessage" + ], + "vs/workbench/browser/parts/editor/textEditor": [ + "editor" + ], "vs/workbench/contrib/terminal/browser/terminalEditorInput": [ "confirmDirtyTerminal.message", { @@ -13236,9 +13343,6 @@ "commentRange", "lastReplyFrom" ], - "vs/workbench/contrib/notebook/common/notebookEditorModel": [ - "vetoExtHostRestart" - ], "vs/workbench/contrib/testing/common/testResult": [ "runFinished" ], @@ -13262,25 +13366,6 @@ "checked", "unchecked" ], - "vs/workbench/contrib/remote/browser/remoteIcons": [ - "getStartedIcon", - "documentationIcon", - "feedbackIcon", - "reviewIssuesIcon", - "reportIssuesIcon", - "remoteExplorerViewIcon", - "portsViewIcon", - "portIcon", - "privatePortIcon", - "forwardPortIcon", - "stopForwardIcon", - "openBrowserIcon", - "openPreviewIcon", - "copyAddressIcon", - "labelPortIcon", - "forwardedPortWithoutProcessIcon", - "forwardedPortWithProcessIcon" - ], "vs/base/browser/ui/splitview/paneview": [ "viewSection" ], @@ -13345,6 +13430,36 @@ "tunnelContext.protocolMenu", "portWithRunningProcess.foreground" ], + "vs/workbench/contrib/remote/browser/remoteIcons": [ + "getStartedIcon", + "documentationIcon", + "feedbackIcon", + "reviewIssuesIcon", + "reportIssuesIcon", + "remoteExplorerViewIcon", + "portsViewIcon", + "portIcon", + "privatePortIcon", + "forwardPortIcon", + "stopForwardIcon", + "openBrowserIcon", + "openPreviewIcon", + "copyAddressIcon", + "labelPortIcon", + "forwardedPortWithoutProcessIcon", + "forwardedPortWithProcessIcon" + ], + "vs/workbench/browser/parts/editor/textCodeEditor": [ + "textEditor" + ], + "vs/workbench/browser/parts/editor/binaryEditor": [ + "binaryEditor", + "binaryError", + "openAnyway" + ], + "vs/editor/browser/widget/diffEditorWidget2/colors": [ + "diffEditor.move.border" + ], "vs/workbench/browser/parts/editor/editorPanes": [ "editorOpenErrorDialog", { @@ -13381,17 +13496,6 @@ }, "watermark.showSettings" ], - "vs/workbench/browser/parts/editor/textCodeEditor": [ - "textEditor" - ], - "vs/editor/browser/widget/diffEditorWidget2/diffEditorWidget2": [ - "diff-aria-navigation-tip" - ], - "vs/workbench/browser/parts/editor/binaryEditor": [ - "binaryEditor", - "binaryError", - "openAnyway" - ], "vs/workbench/browser/parts/activitybar/activitybarActions": [ "loading", "authProviderUnavailable", @@ -13487,14 +13591,14 @@ ] } ], - "vs/base/browser/ui/toolbar/toolbar": [ - "moreActions" - ], "vs/workbench/browser/parts/compositePart": [ "ariaCompositeToolbarLabel", "viewsAndMoreActions", "titleTooltip" ], + "vs/base/browser/ui/toolbar/toolbar": [ + "moreActions" + ], "vs/workbench/browser/parts/sidebar/sidebarActions": [ "focusSideBar" ], @@ -13540,6 +13644,9 @@ "validations.objectIncorrectType", "validations.objectPattern" ], + "vs/editor/common/model/editStack": [ + "edit" + ], "vs/platform/quickinput/browser/quickInput": [ "quickInput.back", "inputModeEntry", @@ -13575,8 +13682,17 @@ "vscode.extension.contributes.grammars.balancedBracketScopes", "vscode.extension.contributes.grammars.unbalancedBracketScopes" ], - "vs/editor/common/model/editStack": [ - "edit" + "vs/workbench/contrib/preferences/browser/preferencesWidgets": [ + "userSettings", + "userSettingsRemote", + "workspaceSettings", + "folderSettings", + "settingsSwitcherBarAriaLabel", + "userSettings", + "userSettingsRemote", + "workspaceSettings", + "userSettings", + "workspaceSettings" ], "vs/base/browser/ui/keybindingLabel/keybindingLabel": [ "unbound" @@ -13621,15 +13737,6 @@ "manage workspace trust", "unsupportedProperty" ], - "vs/workbench/contrib/preferences/browser/preferencesWidgets": [ - "userSettings", - "userSettingsRemote", - "workspaceSettings", - "folderSettings", - "settingsSwitcherBarAriaLabel", - "workspaceSettings", - "userSettings" - ], "vs/workbench/contrib/preferences/browser/settingsLayout": [ "commonlyUsed", "textEditor", @@ -13668,7 +13775,7 @@ "notebook", "audioCues", "mergeEditor", - "interactiveSession", + "chat", "application", "proxy", "keyboard", @@ -13689,22 +13796,6 @@ }, "groupRowAriaLabel" ], - "vs/workbench/contrib/preferences/browser/settingsSearchMenu": [ - "modifiedSettingsSearch", - "modifiedSettingsSearchTooltip", - "extSettingsSearch", - "extSettingsSearchTooltip", - "featureSettingsSearch", - "featureSettingsSearchTooltip", - "tagSettingsSearch", - "tagSettingsSearchTooltip", - "langSettingsSearch", - "langSettingsSearchTooltip", - "onlineSettingsSearch", - "onlineSettingsSearchTooltip", - "policySettingsSearch", - "policySettingsSearchTooltip" - ], "vs/workbench/contrib/preferences/browser/settingsTree": [ "extensions", "modified", @@ -13724,6 +13815,26 @@ "copySettingAsJSONLabel", "stopSyncingSetting" ], + "vs/workbench/contrib/preferences/browser/settingsSearchMenu": [ + "modifiedSettingsSearch", + "modifiedSettingsSearchTooltip", + "extSettingsSearch", + "extSettingsSearchTooltip", + "featureSettingsSearch", + "featureSettingsSearchTooltip", + "tagSettingsSearch", + "tagSettingsSearchTooltip", + "langSettingsSearch", + "langSettingsSearchTooltip", + "onlineSettingsSearch", + "onlineSettingsSearchTooltip", + "policySettingsSearch", + "policySettingsSearchTooltip" + ], + "vs/workbench/contrib/notebook/browser/viewParts/notebookKernelView": [ + "notebookActions.selectKernel", + "notebookActions.selectKernel.args" + ], "vs/workbench/contrib/notebook/browser/notebookExtensionPoint": [ "contributes.notebook.provider", "contributes.notebook.provider.viewType", @@ -13780,9 +13891,21 @@ "notebook.cellEditorBackground", "notebook.editorBackground" ], - "vs/workbench/contrib/notebook/browser/viewParts/notebookKernelView": [ - "notebookActions.selectKernel", - "notebookActions.selectKernel.args" + "vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView": [ + "notebook.emptyMarkdownPlaceholder", + { + "key": "notebook.error.rendererNotFound", + "comment": [ + "$0 is a placeholder for the mime type" + ] + }, + { + "key": "notebook.error.rendererFallbacksExhausted", + "comment": [ + "$0 is a placeholder for the mime type" + ] + }, + "webview title" ], "vs/workbench/services/workingCopy/common/fileWorkingCopyManager": [ "fileWorkingCopyCreate.source", @@ -13800,33 +13923,6 @@ ] } ], - "vs/workbench/contrib/comments/common/commentContextKeys": [ - "commentThreadIsEmpty", - "commentIsEmpty", - "comment", - "commentThread", - "commentController" - ], - "vs/workbench/contrib/notebook/browser/controller/cellOperations": [ - "notebookActions.joinSelectedCells", - "notebookActions.joinSelectedCells.label" - ], - "vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView": [ - "notebook.emptyMarkdownPlaceholder", - { - "key": "notebook.error.rendererNotFound", - "comment": [ - "$0 is a placeholder for the mime type" - ] - }, - { - "key": "notebook.error.rendererFallbacksExhausted", - "comment": [ - "$0 is a placeholder for the mime type" - ] - }, - "webview title" - ], "vs/workbench/contrib/notebook/browser/viewParts/notebookKernelQuickPickStrategy": [ "current1", "current2", @@ -13845,24 +13941,29 @@ "kernels.detecting", "select" ], + "vs/workbench/contrib/comments/common/commentContextKeys": [ + "commentThreadIsEmpty", + "commentIsEmpty", + "comment", + "commentThread", + "commentController" + ], + "vs/workbench/contrib/notebook/browser/controller/cellOperations": [ + "notebookActions.joinSelectedCells", + "notebookActions.joinSelectedCells.label" + ], + "vs/workbench/contrib/notebook/browser/contrib/find/notebookFindWidget": [ + "ariaSearchNoResultEmpty", + "ariaSearchNoResult", + "ariaSearchNoResultWithLineNumNoCurrentMatch" + ], "vs/editor/contrib/codeAction/browser/codeAction": [ "applyCodeActionFailed" ], - "vs/workbench/contrib/chat/common/chatContextKeys": [ - "interactiveSessionResponseHasProviderId", - "interactiveSessionResponseVote", - "interactiveSessionRequestInProgress", - "chatResponse", - "chatRequest", - "interactiveInputHasText", - "inInteractiveInput", - "inChat", - "hasChatProvider" - ], "vs/workbench/contrib/chat/browser/actions/chatAccessibilityHelp": [ - "interactiveSession.helpMenuExit", "chat.overview", "chat.requestHistory", + "chat.announcement", "workbench.action.chat.focus", "workbench.action.chat.focusNoKb", "workbench.action.chat.focusInput", @@ -13871,21 +13972,18 @@ "workbench.action.chat.nextCodeBlockNoKb", "workbench.action.chat.clear", "workbench.action.chat.clearNoKb", - "interactiveSession.makeRequest", - "interactiveSession.diff", - "interactiveSession.diffNoKb", - "interactiveSession.acceptReject", - "interactiveSession.explain", - "interactiveSession.chatViewFocus", - "interactiveSession.toolbar" - ], - "vs/workbench/contrib/notebook/browser/contrib/find/notebookFindWidget": [ - "ariaSearchNoResultEmpty", - "ariaSearchNoResult", - "ariaSearchNoResultWithLineNumNoCurrentMatch" - ], - "vs/workbench/contrib/chat/common/chatViewModel": [ - "thinking" + "inlineChat.overview", + "inlineChat.access", + "inlineChat.requestHistory", + "inlineChat.contextActions", + "inlineChat.fix", + "inlineChat.diff", + "inlineChat.diffNoKb", + "inlineChat.explain", + "inlineChat.toolbar", + "chat.audioCues", + "chat-help-label", + "inline-chat-label" ], "vs/workbench/contrib/chat/browser/chatListRenderer": [ "chat", @@ -13901,6 +13999,19 @@ "chatInput.accessibilityHelpNoKb", "chatInput" ], + "vs/workbench/contrib/inlineChat/browser/inlineChatStrategies": [ + "lines.0", + "lines.1", + "lines.N" + ], + "vs/workbench/contrib/inlineChat/browser/inlineChatWidget": [ + "aria-label", + "original", + "modified", + "inlineChat.accessibilityHelp", + "inlineChat.accessibilityHelpNoKb", + "inlineChatClosed" + ], "vs/workbench/contrib/testing/browser/theme": [ "testing.iconFailed", "testing.iconErrored", @@ -13946,17 +14057,35 @@ "testing.filters.showExcludedTests", "testing.filters.removeTestExclusions" ], - "vs/workbench/contrib/interactiveEditor/browser/interactiveEditorStrategies": [ - "lines.0", - "lines.1", - "lines.N" + "vs/workbench/contrib/terminal/browser/xterm/xtermTerminal": [ + "terminal.integrated.copySelection.noSelection", + "yes", + "no", + "dontShowAgain", + "terminal.slowRendering" ], - "vs/workbench/contrib/interactiveEditor/browser/interactiveEditorWidget": [ - "aria-label", - "original", - "modified", - "interactiveEditor.accessibilityHelp", - "interactiveSessionInput.accessibilityHelpNoKb" + "vs/workbench/contrib/terminal/common/terminalColorRegistry": [ + "terminal.background", + "terminal.foreground", + "terminalCursor.foreground", + "terminalCursor.background", + "terminal.selectionBackground", + "terminal.inactiveSelectionBackground", + "terminal.selectionForeground", + "terminalCommandDecoration.defaultBackground", + "terminalCommandDecoration.successBackground", + "terminalCommandDecoration.errorBackground", + "terminalOverviewRuler.cursorForeground", + "terminal.border", + "terminal.findMatchBackground", + "terminal.findMatchHighlightBorder", + "terminal.findMatchBorder", + "terminal.findMatchHighlightBackground", + "terminal.findMatchHighlightBorder", + "terminalOverviewRuler.findMatchHighlightForeground", + "terminal.dragAndDropBackground", + "terminal.tab.activeBorder", + "terminal.ansiColor" ], "vs/platform/quickinput/browser/commandsQuickAccess": [ "recentlyUsed", @@ -14075,10 +14204,6 @@ "detail.del", "title" ], - "vs/workbench/contrib/search/browser/replaceService": [ - "searchReplace.source", - "fileReplaceChanges" - ], "vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess": [ "cannotRunGotoSymbolWithoutEditor", "cannotRunGotoSymbolWithoutSymbolProvider", @@ -14114,6 +14239,10 @@ "field", "constant" ], + "vs/workbench/contrib/search/browser/replaceService": [ + "searchReplace.source", + "fileReplaceChanges" + ], "vs/workbench/contrib/search/browser/searchFindInput": [ "searchFindInputNotebookFilter.label" ], @@ -14167,6 +14296,13 @@ "installExt", "selectDebug" ], + "vs/workbench/contrib/debug/browser/debugConfigurationManager": [ + "editLaunchConfig", + "selectConfiguration", + "DebugConfig.failed", + "workspace", + "user settings" + ], "vs/workbench/contrib/debug/browser/debugTaskRunner": [ "preLaunchTaskErrors", "preLaunchTaskError", @@ -14243,9 +14379,6 @@ "vs/workbench/contrib/debug/common/debugSource": [ "unknownSource" ], - "vs/base/browser/ui/dropdown/dropdownActionViewItem": [ - "moreActions" - ], "vs/base/browser/ui/findinput/replaceInput": [ "defaultLabel", "label.preserveCaseToggle" @@ -14263,6 +14396,16 @@ "fileColumnLabel", "sourceColumnLabel" ], + "vs/workbench/contrib/mergeEditor/common/mergeEditor": [ + "is", + "isr", + "editorLayout", + "showBase", + "showBaseAtTop", + "showNonConflictingChanges", + "baseUri", + "resultUri" + ], "vs/workbench/contrib/mergeEditor/browser/mergeEditorInputModel": [ "messageN", "message1", @@ -14339,19 +14482,34 @@ }, "noMoreWarn" ], - "vs/workbench/contrib/mergeEditor/common/mergeEditor": [ - "is", - "isr", - "editorLayout", - "showBase", - "showBaseAtTop", - "showNonConflictingChanges", - "baseUri", - "resultUri" + "vs/workbench/contrib/mergeEditor/browser/view/editors/baseCodeEditorView": [ + "base", + "compareWith", + "compareWithTooltip" ], "vs/workbench/contrib/mergeEditor/browser/view/viewModel": [ "noConflictMessage" ], + "vs/workbench/contrib/mergeEditor/browser/view/editors/resultCodeEditorView": [ + "result", + "mergeEditor.remainingConflicts", + "mergeEditor.remainingConflict", + "goToNextConflict", + "allConflictHandled" + ], + "vs/workbench/contrib/mergeEditor/browser/view/editors/inputCodeEditorView": [ + "input1", + "input2", + "mergeEditor.accept", + "mergeEditor.accept", + "mergeEditor.acceptBoth", + "mergeEditor.swap", + "mergeEditor.markAsHandled", + "accept.excluded", + "accept.conflicting", + "accept.first", + "accept.second" + ], "vs/workbench/contrib/mergeEditor/browser/view/colors": [ "mergeEditor.change.background", "mergeEditor.change.word.background", @@ -14367,49 +14525,16 @@ "mergeEditor.conflict.input1.background", "mergeEditor.conflict.input2.background" ], - "vs/workbench/contrib/debug/browser/debugConfigurationManager": [ - "editLaunchConfig", - "selectConfiguration", - "DebugConfig.failed", - "workspace", - "user settings" - ], - "vs/workbench/contrib/mergeEditor/browser/view/editors/inputCodeEditorView": [ - "input1", - "input2", - "mergeEditor.accept", - "mergeEditor.accept", - "mergeEditor.acceptBoth", - "mergeEditor.swap", - "mergeEditor.markAsHandled", - "accept.excluded", - "accept.conflicting", - "accept.first", - "accept.second" - ], "vs/workbench/contrib/comments/browser/commentsController": [ "hasCommentingRange", "pickCommentService" ], - "vs/workbench/contrib/mergeEditor/browser/view/editors/resultCodeEditorView": [ - "result", - "mergeEditor.remainingConflicts", - "mergeEditor.remainingConflict", - "goToNextConflict", - "allConflictHandled" - ], - "vs/workbench/contrib/mergeEditor/browser/view/editors/baseCodeEditorView": [ - "base", - "compareWith", - "compareWithTooltip" - ], "vs/workbench/contrib/customEditor/common/contributedCustomEditors": [ "builtinProviderDisplayName" ], - "vs/workbench/contrib/extensions/browser/extensionsViewer": [ - "error", - "Unknown Extension", - "extensions" + "vs/platform/files/browser/htmlFileSystemProvider": [ + "fileSystemRenameError", + "fileSystemNotAllowedError" ], "vs/workbench/contrib/extensions/browser/extensionsWidgets": [ "ratedLabel", @@ -14437,6 +14562,11 @@ "extensionPreReleaseForeground", "extensionIcon.sponsorForeground" ], + "vs/workbench/contrib/extensions/browser/extensionsViewer": [ + "error", + "Unknown Extension", + "extensions" + ], "vs/workbench/contrib/extensions/browser/exeBasedRecommendations": [ "exeBasedRecommendation" ], @@ -14456,32 +14586,73 @@ "vs/workbench/contrib/extensions/browser/webRecommendations": [ "reason" ], - "vs/platform/files/browser/htmlFileSystemProvider": [ - "fileSystemRenameError", - "fileSystemNotAllowedError" + "vs/workbench/contrib/tasks/common/jsonSchemaCommon": [ + "JsonSchema.options", + "JsonSchema.options.cwd", + "JsonSchema.options.env", + "JsonSchema.tasks.matcherError", + "JsonSchema.tasks.matcherError", + "JsonSchema.shellConfiguration", + "JsonSchema.shell.executable", + "JsonSchema.shell.args", + "JsonSchema.command", + "JsonSchema.tasks.args", + "JsonSchema.tasks.taskName", + "JsonSchema.command", + "JsonSchema.tasks.args", + "JsonSchema.tasks.windows", + "JsonSchema.tasks.matchers", + "JsonSchema.tasks.mac", + "JsonSchema.tasks.matchers", + "JsonSchema.tasks.linux", + "JsonSchema.tasks.matchers", + "JsonSchema.tasks.suppressTaskName", + "JsonSchema.tasks.showOutput", + "JsonSchema.echoCommand", + "JsonSchema.tasks.watching.deprecation", + "JsonSchema.tasks.watching", + "JsonSchema.tasks.background", + "JsonSchema.tasks.promptOnClose", + "JsonSchema.tasks.build", + "JsonSchema.tasks.test", + "JsonSchema.tasks.matchers", + "JsonSchema.command", + "JsonSchema.args", + "JsonSchema.showOutput", + "JsonSchema.watching.deprecation", + "JsonSchema.watching", + "JsonSchema.background", + "JsonSchema.promptOnClose", + "JsonSchema.echoCommand", + "JsonSchema.suppressTaskName", + "JsonSchema.taskSelector", + "JsonSchema.matchers", + "JsonSchema.tasks" ], - "vs/workbench/contrib/terminal/common/terminalColorRegistry": [ - "terminal.background", - "terminal.foreground", - "terminalCursor.foreground", - "terminalCursor.background", - "terminal.selectionBackground", - "terminal.inactiveSelectionBackground", - "terminal.selectionForeground", - "terminalCommandDecoration.defaultBackground", - "terminalCommandDecoration.successBackground", - "terminalCommandDecoration.errorBackground", - "terminalOverviewRuler.cursorForeground", - "terminal.border", - "terminal.findMatchBackground", - "terminal.findMatchHighlightBorder", - "terminal.findMatchBorder", - "terminal.findMatchHighlightBackground", - "terminal.findMatchHighlightBorder", - "terminalOverviewRuler.findMatchHighlightForeground", - "terminal.dragAndDropBackground", - "terminal.tab.activeBorder", - "terminal.ansiColor" + "vs/workbench/services/configurationResolver/common/configurationResolverUtils": [ + "deprecatedVariables" + ], + "vs/workbench/services/configurationResolver/common/configurationResolverSchema": [ + "JsonSchema.input.id", + "JsonSchema.input.type", + "JsonSchema.input.description", + "JsonSchema.input.default", + "JsonSchema.inputs", + "JsonSchema.input.type.promptString", + "JsonSchema.input.password", + "JsonSchema.input.type.pickString", + "JsonSchema.input.options", + "JsonSchema.input.pickString.optionLabel", + "JsonSchema.input.pickString.optionValue", + "JsonSchema.input.type.command", + "JsonSchema.input.command.command", + "JsonSchema.input.command.args", + "JsonSchema.input.command.args", + "JsonSchema.input.command.args" + ], + "vs/workbench/contrib/remote/browser/explorerViewItems": [ + "remotes", + "remote.explorer.switch" ], "vs/workbench/contrib/terminal/browser/terminalActions": [ "showTerminalTabs", @@ -14489,6 +14660,7 @@ "terminalLaunchHelp", "workbench.action.terminal.newInActiveWorkspace", "workbench.action.terminal.createTerminalEditor", + "workbench.action.terminal.createTerminalEditor", "workbench.action.terminal.createTerminalEditorSide", "workbench.action.terminal.showTabs", "workbench.action.terminal.focusPreviousPane", @@ -14523,7 +14695,6 @@ "workbench.action.terminal.selectToNextCommand", "workbench.action.terminal.selectToPreviousLine", "workbench.action.terminal.selectToNextLine", - "workbench.action.terminal.toggleEscapeSequenceLogging", "sendSequence", "workbench.action.terminal.newWithCwd.cwd", "workbench.action.terminal.renameWithArg.name", @@ -14582,44 +14753,6 @@ "workbench.action.terminal.newWithProfilePlus", "renameTerminal" ], - "vs/workbench/contrib/terminal/browser/terminalIcons": [ - "terminalViewIcon", - "renameTerminalIcon", - "killTerminalIcon", - "newTerminalIcon", - "configureTerminalProfileIcon", - "terminalDecorationMark", - "terminalDecorationIncomplete", - "terminalDecorationError", - "terminalDecorationSuccess", - "terminalCommandHistoryRemove", - "terminalCommandHistoryOutput", - "terminalCommandHistoryFuzzySearch" - ], - "vs/workbench/contrib/terminal/common/terminalStrings": [ - "terminal", - "terminal.new", - "doNotShowAgain", - "currentSessionCategory", - "previousSessionCategory", - "terminalCategory", - "workbench.action.terminal.focus", - "killTerminal", - "killTerminal.short", - "moveToEditor", - "workbench.action.terminal.moveToTerminalPanel", - "workbench.action.terminal.changeIcon", - "workbench.action.terminal.changeColor", - "splitTerminal", - "splitTerminal.short", - "unsplitTerminal", - "workbench.action.terminal.rename", - "workbench.action.terminal.sizeToContentWidthInstance", - "workbench.action.terminal.focusHover", - "workbench.action.terminal.sendSequence", - "workbench.action.terminal.newWithCwd", - "workbench.action.terminal.renameWithArg" - ], "vs/workbench/contrib/terminal/common/terminalConfiguration": [ "cwd", "cwdFolder", @@ -14762,7 +14895,21 @@ "terminal.integrated.shellIntegration.history", "terminal.integrated.shellIntegration.suggestEnabled", "terminal.integrated.smoothScrolling", - "terminal.integrated.experimentalImageSupport" + "terminal.integrated.enableImages" + ], + "vs/workbench/contrib/terminal/browser/terminalIcons": [ + "terminalViewIcon", + "renameTerminalIcon", + "killTerminalIcon", + "newTerminalIcon", + "configureTerminalProfileIcon", + "terminalDecorationMark", + "terminalDecorationIncomplete", + "terminalDecorationError", + "terminalDecorationSuccess", + "terminalCommandHistoryRemove", + "terminalCommandHistoryOutput", + "terminalCommandHistoryFuzzySearch" ], "vs/workbench/contrib/terminal/browser/terminalMenus": [ { @@ -14820,10 +14967,32 @@ "defaultTerminalProfile", "splitTerminal" ], - "vs/workbench/contrib/terminal/browser/terminalTabbedView": [ - "moveTabsRight", - "moveTabsLeft", - "hideTabs" + "vs/workbench/contrib/terminal/common/terminalStrings": [ + "terminal", + "terminal.new", + "doNotShowAgain", + "currentSessionCategory", + "previousSessionCategory", + "terminalCategory", + "workbench.action.terminal.focus", + "killTerminal", + "killTerminal.short", + "moveToEditor", + "workbench.action.terminal.moveToTerminalPanel", + "workbench.action.terminal.changeIcon", + "workbench.action.terminal.changeColor", + "splitTerminal", + "splitTerminal.short", + "unsplitTerminal", + "workbench.action.terminal.rename", + "workbench.action.terminal.sizeToContentWidthInstance", + "workbench.action.terminal.focusHover", + "workbench.action.terminal.sendSequence", + "workbench.action.terminal.newWithCwd", + "workbench.action.terminal.renameWithArg" + ], + "vs/platform/terminal/common/terminalLogService": [ + "terminalLoggerName" ], "vs/workbench/contrib/terminal/browser/terminalTooltip": [ "shellIntegration.enabled", @@ -14837,12 +15006,13 @@ }, "shellProcessTooltip.commandLine" ], - "vs/workbench/contrib/terminalContrib/accessibility/browser/terminalAccessibleBuffer": [ - "terminal.integrated.accessibleBuffer", - "terminal.integrated.symbolQuickPick.labelNoExitCode" + "vs/workbench/contrib/terminal/browser/terminalTabbedView": [ + "moveTabsRight", + "moveTabsLeft", + "hideTabs" ], "vs/workbench/contrib/terminalContrib/accessibility/browser/terminalAccessibilityHelp": [ - "terminal.integrated.accessiblityHelp", + "terminal-help-label", "focusAccessibleBuffer", "focusAccessibleBufferNoKb", "commandPromptMigration", @@ -14863,26 +15033,20 @@ "openDetectedLinkNoKb", "newWithProfile", "newWithProfileNoKb", - "accessibilitySettings", - "readMore", - "dismiss", - "introMsg" + "accessibilitySettings" ], - "vs/workbench/contrib/terminalContrib/links/browser/terminalLinkQuickpick": [ - "terminal.integrated.openDetectedLink", - "terminal.integrated.urlLinks", - "terminal.integrated.localFileLinks", - "terminal.integrated.searchLinks", - "terminal.integrated.showMoreLinks" + "vs/workbench/contrib/terminalContrib/accessibility/browser/terminalAccessibleBuffer": [ + "terminal.integrated.accessibleBuffer", + "terminal.integrated.symbolQuickPick.labelNoExitCode" ], - "vs/workbench/contrib/terminalContrib/links/browser/terminalLinkManager": [ - "terminalLinkHandler.followLinkAlt.mac", - "terminalLinkHandler.followLinkAlt", - "terminalLinkHandler.followLinkCmd", - "terminalLinkHandler.followLinkCtrl", - "followLink", - "followForwardedLink", - "followLinkUrl" + "vs/workbench/contrib/terminalContrib/quickFix/browser/terminalQuickFixBuiltinActions": [ + "terminal.freePort", + "terminal.createPR" + ], + "vs/workbench/contrib/terminalContrib/quickFix/browser/quickFixAddon": [ + "quickFix.command", + "quickFix.opener", + "codeAction.widget.id.quickfix" ], "vs/workbench/contrib/terminalContrib/quickFix/browser/terminalQuickFixService": [ "vscode.extension.contributes.terminalQuickFixes", @@ -14891,82 +15055,33 @@ "vscode.extension.contributes.terminalQuickFixes.outputMatcher", "vscode.extension.contributes.terminalQuickFixes.commandExitResult" ], - "vs/workbench/contrib/tasks/common/jsonSchemaCommon": [ - "JsonSchema.options", - "JsonSchema.options.cwd", - "JsonSchema.options.env", - "JsonSchema.tasks.matcherError", - "JsonSchema.tasks.matcherError", - "JsonSchema.shellConfiguration", - "JsonSchema.shell.executable", - "JsonSchema.shell.args", - "JsonSchema.command", - "JsonSchema.tasks.args", - "JsonSchema.tasks.taskName", - "JsonSchema.command", - "JsonSchema.tasks.args", - "JsonSchema.tasks.windows", - "JsonSchema.tasks.matchers", - "JsonSchema.tasks.mac", - "JsonSchema.tasks.matchers", - "JsonSchema.tasks.linux", - "JsonSchema.tasks.matchers", - "JsonSchema.tasks.suppressTaskName", - "JsonSchema.tasks.showOutput", - "JsonSchema.echoCommand", - "JsonSchema.tasks.watching.deprecation", - "JsonSchema.tasks.watching", - "JsonSchema.tasks.background", - "JsonSchema.tasks.promptOnClose", - "JsonSchema.tasks.build", - "JsonSchema.tasks.test", - "JsonSchema.tasks.matchers", - "JsonSchema.command", - "JsonSchema.args", - "JsonSchema.showOutput", - "JsonSchema.watching.deprecation", - "JsonSchema.watching", - "JsonSchema.background", - "JsonSchema.promptOnClose", - "JsonSchema.echoCommand", - "JsonSchema.suppressTaskName", - "JsonSchema.taskSelector", - "JsonSchema.matchers", - "JsonSchema.tasks" - ], - "vs/workbench/services/configurationResolver/common/configurationResolverUtils": [ - "deprecatedVariables" - ], - "vs/workbench/services/configurationResolver/common/configurationResolverSchema": [ - "JsonSchema.input.id", - "JsonSchema.input.type", - "JsonSchema.input.description", - "JsonSchema.input.default", - "JsonSchema.inputs", - "JsonSchema.input.type.promptString", - "JsonSchema.input.password", - "JsonSchema.input.type.pickString", - "JsonSchema.input.options", - "JsonSchema.input.pickString.optionLabel", - "JsonSchema.input.pickString.optionValue", - "JsonSchema.input.type.command", - "JsonSchema.input.command.command", - "JsonSchema.input.command.args", - "JsonSchema.input.command.args", - "JsonSchema.input.command.args" + "vs/workbench/contrib/terminalContrib/links/browser/terminalLinkManager": [ + "terminalLinkHandler.followLinkAlt.mac", + "terminalLinkHandler.followLinkAlt", + "terminalLinkHandler.followLinkCmd", + "terminalLinkHandler.followLinkCtrl", + "followLink", + "followForwardedLink", + "followLinkUrl" ], - "vs/workbench/contrib/terminalContrib/quickFix/browser/quickFixAddon": [ - "quickFix.command", - "quickFix.opener", - "codeAction.widget.id.quickfix" + "vs/workbench/contrib/terminalContrib/links/browser/terminalLinkQuickpick": [ + "terminal.integrated.openDetectedLink", + "terminal.integrated.urlLinks", + "terminal.integrated.localFileLinks", + "terminal.integrated.searchLinks", + "terminal.integrated.showMoreLinks" ], - "vs/workbench/contrib/remote/browser/explorerViewItems": [ - "remotes", - "remote.explorer.switch" + "vs/workbench/contrib/snippets/browser/commands/abstractSnippetsActions": [ + "snippets" ], - "vs/workbench/contrib/terminalContrib/quickFix/browser/terminalQuickFixBuiltinActions": [ - "terminal.freePort", - "terminal.createPR" + "vs/workbench/contrib/snippets/browser/snippetPicker": [ + "sep.userSnippet", + "sep.workspaceSnippet", + "disableSnippet", + "isDisabled", + "enable.snippet", + "pick.placeholder", + "pick.noSnippetAvailable" ], "vs/workbench/contrib/snippets/browser/snippetsFile": [ "source.workspaceSnippetGlobal", @@ -14978,23 +15093,11 @@ "snippetSuggest.longLabel", "snippetSuggest.longLabel" ], - "vs/workbench/contrib/snippets/browser/snippetPicker": [ - "sep.userSnippet", - "sep.workspaceSnippet", - "disableSnippet", - "isDisabled", - "enable.snippet", - "pick.placeholder", - "pick.noSnippetAvailable" - ], "vs/workbench/contrib/update/browser/releaseNotesEditor": [ "releaseNotesInputName", "unassigned", "showOnUpdate" ], - "vs/workbench/contrib/snippets/browser/commands/abstractSnippetsActions": [ - "snippets" - ], "vs/workbench/contrib/welcomeGettingStarted/common/gettingStartedContent": [ "getting-started-setup-icon", "getting-started-beginner-icon", @@ -15086,6 +15189,9 @@ "gettingStarted.settings.title", "gettingStarted.settings.description.interpolated", "tweakSettings", + "gettingStarted.profiles.title", + "gettingStarted.profiles.description.interpolated", + "tryProfiles", "gettingStarted.workspaceTrust.title", "gettingStarted.workspaceTrust.description.interpolated", "workspaceTrust", @@ -15168,7 +15274,6 @@ "walkthroughs.steps.when" ], "vs/workbench/contrib/welcomeGettingStarted/browser/featuredExtensionService": [ - "gettingStarted.featuredTitle", "gettingStarted.featuredTitle" ], "vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedColors": [ @@ -15180,6 +15285,9 @@ "welcomePage.progress.foreground", "walkthrough.stepTitle.foreground" ], + "vs/workbench/contrib/welcomeWalkthrough/common/walkThroughUtils": [ + "walkThrough.embeddedEditorBackground" + ], "vs/workbench/contrib/callHierarchy/browser/callHierarchyTree": [ "tree.aria", "from", @@ -15312,33 +15420,13 @@ ] } ], - "vs/workbench/contrib/welcomeWalkthrough/common/walkThroughUtils": [ - "walkThrough.embeddedEditorBackground" - ], - "vs/workbench/browser/parts/notifications/notificationsActions": [ - "clearIcon", - "clearAllIcon", - "hideIcon", - "expandIcon", - "collapseIcon", - "configureIcon", - "doNotDisturbIcon", - "clearNotification", - "clearNotifications", - "toggleDoNotDisturbMode", - "hideNotificationsCenter", - "expandNotification", - "collapseNotification", - "configureNotification", - "copyNotification" - ], "vs/workbench/services/textfile/common/textFileSaveParticipant": [ "saveParticipants" ], - "vs/workbench/browser/parts/notifications/notificationsList": [ - "notificationAriaLabel", - "notificationWithSourceAriaLabel", - "notificationsList" + "vs/workbench/browser/parts/titlebar/windowTitle": [ + "userIsAdmin", + "userIsSudo", + "devExtensionWindowTitlePrefix" ], "vs/workbench/browser/parts/titlebar/commandCenterControl": [ "label.dfl", @@ -15355,11 +15443,6 @@ "commandCenter-activeBorder", "commandCenter-inactiveBorder" ], - "vs/workbench/browser/parts/titlebar/windowTitle": [ - "userIsAdmin", - "userIsSudo", - "devExtensionWindowTitlePrefix" - ], "vs/workbench/services/workingCopy/common/storedFileWorkingCopy": [ "staleSaveError", "overwrite", @@ -15426,10 +15509,24 @@ "wordsDescription", "regexDescription" ], + "vs/workbench/browser/parts/notifications/notificationsViewer": [ + "executeCommand", + "notificationActions", + "notificationSource" + ], + "vs/platform/languagePacks/common/localizedStrings": [ + "open", + "close", + "find" + ], "vs/editor/browser/controller/textAreaHandler": [ "editor", "accessibilityOffAriaLabel" ], + "vs/editor/browser/widget/diffEditor.contribution": [ + "editor.action.diffReview.next", + "editor.action.diffReview.prev" + ], "vs/editor/contrib/codeAction/browser/codeActionMenu": [ "codeAction.widget.id.more", "codeAction.widget.id.quickfix", @@ -15440,10 +15537,6 @@ "codeAction.widget.id.surround", "codeAction.widget.id.source" ], - "vs/editor/contrib/colorPicker/browser/colorPickerWidget": [ - "clickToToggleColorOptions", - "closeIcon" - ], "vs/platform/actionWidget/browser/actionWidget": [ "codeActionMenuVisible", "hideCodeActionWidget.title", @@ -15452,6 +15545,10 @@ "acceptSelected.title", "previewSelected.title" ], + "vs/editor/contrib/colorPicker/browser/colorPickerWidget": [ + "clickToToggleColorOptions", + "closeIcon" + ], "vs/editor/contrib/inlineCompletions/browser/inlineCompletionContextKeys": [ "inlineSuggestionVisible", "inlineSuggestionHasIndentation", @@ -15547,6 +15644,42 @@ "commentThreadActiveRangeBackground", "commentThreadActiveRangeBorder" ], + "vs/editor/browser/widget/diffEditorWidget2/diffReview": [ + "diffReviewInsertIcon", + "diffReviewRemoveIcon", + "diffReviewCloseIcon", + "label.close", + "no_lines_changed", + "one_line_changed", + "more_lines_changed", + { + "key": "header", + "comment": [ + "This is the ARIA label for a git diff header.", + "A git diff header looks like this: @@ -154,12 +159,39 @@.", + "That encodes that at original line 154 (which is now line 159), 12 lines were removed/changed with 39 lines.", + "Variables 0 and 1 refer to the diff index out of total number of diffs.", + "Variables 2 and 4 will be numbers (a line number).", + "Variables 3 and 5 will be \"no lines changed\", \"1 line changed\" or \"X lines changed\", localized separately." + ] + }, + "blankLine", + { + "key": "unchangedLine", + "comment": [ + "The placeholders are contents of the line and should not be translated." + ] + }, + "equalLine", + "insertLine", + "deleteLine" + ], + "vs/editor/browser/widget/diffEditorWidget2/unchangedRanges": [ + "foldUnchanged" + ], + "vs/editor/browser/widget/diffEditorWidget2/diffEditorEditors": [ + "diff-aria-navigation-tip" + ], "vs/workbench/browser/parts/editor/editorPlaceholder": [ "trustRequiredEditor", "requiresFolderTrustText", @@ -15589,11 +15722,51 @@ "mAppMenu", "mMore" ], + "vs/platform/quickinput/browser/quickInputUtils": [ + "executeCommand" + ], "vs/platform/quickinput/browser/quickInputList": [ "quickInput" ], - "vs/platform/quickinput/browser/quickInputUtils": [ - "executeCommand" + "vs/workbench/contrib/preferences/browser/settingsEditorSettingIndicators": [ + "workspaceUntrustedLabel", + "trustLabel", + "manageWorkspaceTrust", + "extensionSyncIgnoredLabel", + "syncIgnoredTitle", + "defaultOverriddenLabel", + "user", + "workspace", + "remote", + "policyLabelText", + "policyDescription", + "policyFilterLink", + "applicationSetting", + "applicationSettingDescription", + "alsoConfiguredIn", + "configuredIn", + "alsoConfiguredElsewhere", + "configuredElsewhere", + "alsoModifiedInScopes", + "modifiedInScopes", + "hasDefaultOverridesForLanguages", + "defaultOverriddenDetails", + "user", + "workspace", + "remote", + "modifiedInScopeForLanguage", + "user", + "workspace", + "remote", + "modifiedInScopeForLanguageMidSentence", + "workspaceUntrustedAriaLabel", + "policyDescriptionAccessible", + "applicationSettingDescriptionAccessible", + "alsoConfiguredIn", + "configuredIn", + "syncIgnoredAriaLabel", + "defaultOverriddenDetailsAriaLabel", + "defaultOverriddenLanguagesList" ], "vs/workbench/contrib/preferences/browser/settingsWidgets": [ "okButton", @@ -15638,46 +15811,6 @@ "objectKeyHeader", "objectValueHeader" ], - "vs/workbench/contrib/preferences/browser/settingsEditorSettingIndicators": [ - "workspaceUntrustedLabel", - "trustLabel", - "manageWorkspaceTrust", - "extensionSyncIgnoredLabel", - "syncIgnoredTitle", - "defaultOverriddenLabel", - "user", - "workspace", - "remote", - "policyLabelText", - "policyDescription", - "policyFilterLink", - "applicationSetting", - "applicationSettingDescription", - "alsoConfiguredIn", - "configuredIn", - "alsoConfiguredElsewhere", - "configuredElsewhere", - "alsoModifiedInScopes", - "modifiedInScopes", - "hasDefaultOverridesForLanguages", - "defaultOverriddenDetails", - "user", - "workspace", - "remote", - "modifiedInScopeForLanguage", - "user", - "workspace", - "remote", - "modifiedInScopeForLanguageMidSentence", - "workspaceUntrustedAriaLabel", - "policyDescriptionAccessible", - "applicationSettingDescriptionAccessible", - "alsoConfiguredIn", - "configuredIn", - "syncIgnoredAriaLabel", - "defaultOverriddenDetailsAriaLabel", - "defaultOverriddenLanguagesList" - ], "vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer": [ "cellExecutionOrderCountLabel" ], @@ -15702,6 +15835,26 @@ "notebook.find.filter.findInCodeInput", "notebook.find.filter.findInCodeOutput" ], + "vs/platform/actions/browser/buttonbar": [ + "labelWithKeybinding" + ], + "vs/workbench/contrib/terminal/browser/xterm/decorationAddon": [ + "terminal.rerunCommand", + "rerun", + "yes", + "no", + "terminal.copyCommand", + "terminal.copyOutput", + "terminal.copyOutputAsHtml", + "workbench.action.terminal.runRecentCommand", + "workbench.action.terminal.goToRecentDirectory", + "terminal.configureCommandDecorations", + "terminal.learnShellIntegration", + "toggleVisibility", + "toggleVisibility", + "gutter", + "overviewRuler" + ], "vs/workbench/contrib/debug/common/debugger": [ "cannot.find.da", "launch.config.comment1", @@ -15757,18 +15910,6 @@ "app.launch.json.compound.stopAll", "compoundPrelaunchTask" ], - "vs/base/browser/ui/selectBox/selectBoxCustom": [ - { - "key": "selectBox", - "comment": [ - "Behave like native select dropdown element." - ] - } - ], - "vs/workbench/contrib/mergeEditor/browser/mergeMarkers/mergeMarkersController": [ - "conflictingLine", - "conflictingLines" - ], "vs/workbench/contrib/debug/browser/rawDebugSession": [ "noDebugAdapterStart", "canNotStart", @@ -15781,10 +15922,56 @@ "noDebugAdapter", "moreInfo" ], + "vs/base/browser/ui/selectBox/selectBoxCustom": [ + { + "key": "selectBox", + "comment": [ + "Behave like native select dropdown element." + ] + } + ], + "vs/workbench/contrib/mergeEditor/browser/mergeMarkers/mergeMarkersController": [ + "conflictingLine", + "conflictingLines" + ], "vs/workbench/contrib/mergeEditor/browser/model/mergeEditorModel": [ "setInputHandled", "undoMarkAsHandled" ], + "vs/workbench/contrib/comments/browser/commentGlyphWidget": [ + "editorGutterCommentRangeForeground", + "editorOverviewRuler.commentForeground", + "editorOverviewRuler.commentUnresolvedForeground", + "editorGutterCommentGlyphForeground", + "editorGutterCommentUnresolvedGlyphForeground" + ], + "vs/workbench/contrib/customEditor/common/extensionPoint": [ + "contributes.customEditors", + "contributes.viewType", + "contributes.displayName", + "contributes.selector", + "contributes.selector.filenamePattern", + "contributes.priority", + "contributes.priority.default", + "contributes.priority.option" + ], + "vs/workbench/contrib/terminal/browser/terminalConfigHelper": [ + "useWslExtension.title", + "install" + ], + "vs/workbench/contrib/terminal/browser/terminalProfileQuickpick": [ + "terminal.integrated.selectProfileToCreate", + "terminal.integrated.chooseDefaultProfile", + "enterTerminalProfileName", + "terminalProfileAlreadyExists", + "terminalProfiles", + "ICreateContributedTerminalProfileOptions", + "terminalProfiles.detected", + "unsafePathWarning", + "yes", + "cancel", + "createQuickLaunchProfile" + ], "vs/workbench/contrib/mergeEditor/browser/view/conflictActions": [ "accept", "acceptTooltip", @@ -15808,37 +15995,15 @@ "resetToBase", "resetToBaseTooltip" ], - "vs/workbench/contrib/comments/browser/commentGlyphWidget": [ - "editorGutterCommentRangeForeground", - "editorOverviewRuler.commentForeground", - "editorOverviewRuler.commentUnresolvedForeground", - "editorGutterCommentGlyphForeground", - "editorGutterCommentUnresolvedGlyphForeground" - ], - "vs/workbench/contrib/customEditor/common/extensionPoint": [ - "contributes.customEditors", - "contributes.viewType", - "contributes.displayName", - "contributes.selector", - "contributes.selector.filenamePattern", - "contributes.priority", - "contributes.priority.default", - "contributes.priority.option" - ], - "vs/workbench/contrib/terminal/browser/terminalConfigHelper": [ - "useWslExtension.title", - "install" - ], "vs/workbench/contrib/terminal/browser/terminalInstance": [ + "terminalTypeTask", + "terminalTypeLocal", "terminal.integrated.a11yPromptLabel", "terminal.integrated.useAccessibleBuffer", "terminal.integrated.useAccessibleBufferNoKb", - "terminalTypeTask", - "terminalTypeLocal", "bellStatus", "keybindingHandling", "configureTerminalSettings", - "terminal.integrated.copySelection.noSelection", "preview", "confirmMoveTrashMessageFilesAndDirectories", { @@ -15868,19 +16033,6 @@ "terminated.exitCodeOnly", "launchFailed.errorMessage" ], - "vs/workbench/contrib/terminal/browser/terminalProfileQuickpick": [ - "terminal.integrated.selectProfileToCreate", - "terminal.integrated.chooseDefaultProfile", - "enterTerminalProfileName", - "terminalProfileAlreadyExists", - "terminalProfiles", - "ICreateContributedTerminalProfileOptions", - "terminalProfiles.detected", - "unsafePathWarning", - "yes", - "cancel", - "createQuickLaunchProfile" - ], "vs/workbench/contrib/terminal/browser/terminalTabsList": [ "terminalInputAriaLabel", "terminal.tabs", @@ -15902,6 +16054,19 @@ }, "label" ], + "vs/workbench/contrib/terminal/browser/xterm/decorationStyles": [ + "terminalPromptContextMenu", + "terminalPromptCommandFailed", + "terminalPromptCommandFailedWithExitCode", + "terminalPromptCommandSuccess" + ], + "vs/workbench/contrib/terminalContrib/links/browser/terminalLinkDetectorAdapter": [ + "searchWorkspace", + "openFile", + "focusFolder", + "openFolder", + "followLink" + ], "vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget": [ "label.find", "placeholder.find", @@ -15913,19 +16078,6 @@ "ariaSearchNoResult", "ariaSearchNoResultWithLineNumNoCurrentMatch" ], - "vs/workbench/contrib/terminalContrib/links/browser/terminalLinkDetectorAdapter": [ - "searchWorkspace", - "openFile", - "focusFolder", - "openFolder", - "followLink" - ], - "vs/workbench/contrib/terminal/browser/xterm/decorationStyles": [ - "terminalPromptContextMenu", - "terminalPromptCommandFailed", - "terminalPromptCommandFailedWithExitCode", - "terminalPromptCommandSuccess" - ], "vs/workbench/contrib/welcomeGettingStarted/common/media/theme_picker": [ "dark", "light", @@ -15953,21 +16105,11 @@ "Theirs", "Yours" ], - "vs/platform/languagePacks/common/localizedStrings": [ - "open", - "close", - "find" - ], "vs/workbench/contrib/welcomeGettingStarted/common/media/notebookProfile": [ "default", "jupyter", "colab" ], - "vs/workbench/browser/parts/notifications/notificationsViewer": [ - "executeCommand", - "notificationActions", - "notificationSource" - ], "vs/platform/actionWidget/browser/actionList": [ { "key": "label-preview", @@ -15999,6 +16141,20 @@ "referenceCount", "treeAriaLabel" ], + "vs/editor/browser/widget/diffEditorWidget2/decorations": [ + "diffInsertIcon", + "diffRemoveIcon", + "revertChangeHoverMessage" + ], + "vs/editor/browser/widget/diffEditorWidget2/inlineDiffDeletedCodeMargin": [ + "diff.clipboard.copyDeletedLinesContent.label", + "diff.clipboard.copyDeletedLinesContent.single.label", + "diff.clipboard.copyChangedLinesContent.label", + "diff.clipboard.copyChangedLinesContent.single.label", + "diff.clipboard.copyDeletedLineContent.label", + "diff.clipboard.copyChangedLineContent.label", + "diff.inline.revertChange.label" + ], "vs/workbench/browser/parts/editor/breadcrumbs": [ "title", "enabled", @@ -16045,12 +16201,25 @@ "vs/workbench/browser/parts/editor/breadcrumbsPicker": [ "breadcrumbs" ], + "vs/workbench/contrib/notebook/browser/diff/diffElementOutputs": [ + "mimeTypePicker", + "empty", + "noRenderer.2", + "curruentActiveMimeType", + "promptChooseMimeTypeInSecure.placeHolder", + "promptChooseMimeType.placeHolder", + "builtinRenderInfo" + ], "vs/workbench/contrib/notebook/browser/view/cellParts/cellEditorOptions": [ "notebook.lineNumbers", "notebook.toggleLineNumbers", "notebook.showLineNumbers", "notebook.cell.toggleLineNumbers.title" ], + "vs/workbench/contrib/notebook/browser/view/cellParts/codeCell": [ + "cellExpandInputButtonLabelWithDoubleClick", + "cellExpandInputButtonLabel" + ], "vs/workbench/contrib/notebook/browser/view/cellParts/codeCellRunToolbar": [ "notebook.moreRunActionsLabel" ], @@ -16063,22 +16232,20 @@ "hiddenCellsLabel", "hiddenCellsLabelPlural" ], - "vs/workbench/contrib/notebook/browser/view/cellParts/codeCell": [ - "cellExpandInputButtonLabelWithDoubleClick", - "cellExpandInputButtonLabel" - ], "vs/workbench/contrib/notebook/browser/view/cellParts/markupCell": [ "cellExpandInputButtonLabelWithDoubleClick", "cellExpandInputButtonLabel" ], - "vs/workbench/contrib/notebook/browser/diff/diffElementOutputs": [ - "mimeTypePicker", - "empty", - "noRenderer.2", - "curruentActiveMimeType", - "promptChooseMimeTypeInSecure.placeHolder", - "promptChooseMimeType.placeHolder", - "builtinRenderInfo" + "vs/workbench/services/suggest/browser/simpleSuggestWidget": [ + "suggest", + "label.full", + "label.detail", + "label.desc", + "ariaCurrenttSuggestionReadDetails" + ], + "vs/workbench/contrib/terminal/browser/terminalProcessManager": [ + "killportfailure", + "ptyHostRelaunch" ], "vs/workbench/contrib/terminal/browser/terminalRunRecentQuickPick": [ "removeCommand", @@ -16089,20 +16256,15 @@ "selectRecentDirectoryMac", "selectRecentDirectory" ], - "vs/workbench/contrib/terminal/browser/terminalProcessManager": [ - "killportfailure", - "ptyHostRelaunch" - ], - "vs/workbench/contrib/terminal/browser/xterm/xtermTerminal": [ - "yes", - "no", - "dontShowAgain", - "terminal.slowRendering" - ], - "vs/workbench/contrib/comments/browser/commentThreadBody": [ - "commentThreadAria.withRange", - "commentThreadAria.document", - "commentThreadAria" + "vs/workbench/contrib/notebook/browser/view/cellParts/cellOutput": [ + "empty", + "noRenderer.2", + "pickMimeType", + "curruentActiveMimeType", + "installJupyterPrompt", + "promptChooseMimeTypeInSecure.placeHolder", + "promptChooseMimeType.placeHolder", + "unavailableRenderInfo" ], "vs/workbench/contrib/notebook/browser/view/cellParts/codeCellExecutionIcon": [ "notebook.cell.status.success", @@ -16110,6 +16272,11 @@ "notebook.cell.status.pending", "notebook.cell.status.executing" ], + "vs/workbench/contrib/comments/browser/commentThreadBody": [ + "commentThreadAria.withRange", + "commentThreadAria.document", + "commentThreadAria" + ], "vs/workbench/contrib/comments/browser/commentThreadHeader": [ "collapseIcon", "label.collapse", @@ -16122,33 +16289,6 @@ "showEnvironmentContributions", "ScopedEnvironmentContributionInfo" ], - "vs/workbench/contrib/terminal/browser/xterm/decorationAddon": [ - "terminal.rerunCommand", - "rerun", - "yes", - "no", - "terminal.copyCommand", - "terminal.copyOutput", - "terminal.copyOutputAsHtml", - "workbench.action.terminal.runRecentCommand", - "workbench.action.terminal.goToRecentDirectory", - "terminal.configureCommandDecorations", - "terminal.learnShellIntegration", - "toggleVisibility", - "toggleVisibility", - "gutter", - "overviewRuler" - ], - "vs/workbench/contrib/notebook/browser/view/cellParts/cellOutput": [ - "empty", - "noRenderer.2", - "pickMimeType", - "curruentActiveMimeType", - "installJupyterPrompt", - "promptChooseMimeTypeInSecure.placeHolder", - "promptChooseMimeType.placeHolder", - "unavailableRenderInfo" - ], "vs/workbench/contrib/comments/browser/commentNode": [ "commentToggleReaction", "commentToggleReactionError", @@ -16158,13 +16298,6 @@ "commentAddReactionError", "commentAddReactionDefaultError" ], - "vs/workbench/services/suggest/browser/simpleSuggestWidget": [ - "suggest", - "label.full", - "label.detail", - "label.desc", - "ariaCurrenttSuggestionReadDetails" - ], "vs/workbench/contrib/comments/browser/reactionsAction": [ "pickReactions", "comment.toggleableReaction", @@ -16194,6 +16327,9 @@ ] }, "messages": { + "vs/platform/terminal/node/ptyHostMain": [ + "Pty Host" + ], "vs/code/electron-main/main": [ "Main", "Another instance of {0} is already running as administrator.", @@ -16211,9 +16347,6 @@ "vs/code/node/sharedProcess/sharedProcessMain": [ "Shared" ], - "vs/platform/terminal/node/ptyHostMain": [ - "Pty Host" - ], "vs/code/electron-sandbox/processExplorer/processExplorerMain": [ "Process Name", "CPU (%)", @@ -16276,6 +16409,7 @@ "Unique id used for correlating crash reports sent from this app instance.", "Enable proposed APIs for a list of extension ids (such as `vscode.git`). Proposed APIs are unstable and subject to breaking without warning at any time. This should only be set for extension development and testing purposes.", "Log level to use. Default is 'info'. Allowed values are 'error', 'warn', 'info', 'debug', 'trace', 'off'.", + "Disables the Chromium sandbox. This is useful when running VS Code as elevated on Linux and running under Applocker on Windows.", "Forces the renderer to be accessible. ONLY change this if you are using a screen reader on Linux. On other platforms the renderer will automatically be accessible. This flag is automatically set if you have editor.accessibilitySupport: on." ], "vs/workbench/services/textfile/electron-sandbox/nativeTextFileService": [ @@ -16290,6 +16424,14 @@ "The workspace is already opened in another window. Please close that window first and then try again.", "Opening a multi-root workspace." ], + "vs/workbench/services/secrets/electron-sandbox/secretStorageService": [ + "Open troubleshooting guide", + "An OS keyring couldn't be identified for storing the encryption related data in your current desktop environment.", + "Open the troubleshooting guide to address this or you can use weaker encryption that doesn't use the OS keyring.", + "Use weaker encryption", + "You're running in a GNOME environment but the OS keyring is not available for encryption. Ensure you have gnome-keyring or another libsecret compatible implementation installed and running.", + "You're running in a KDE environment but the OS keyring is not available for encryption. Ensure you have kwallet running." + ], "vs/workbench/services/localization/electron-sandbox/localeService": [ "Unable to write display language. Please open the runtime settings, correct errors/warnings in it and try again.", "Open Runtime Settings", @@ -16302,14 +16444,14 @@ "Local", "Remote" ], - "vs/workbench/services/workingCopy/electron-sandbox/workingCopyBackupService": [ - "Backup working copies" - ], "vs/workbench/services/integrity/electron-sandbox/integrityService": [ "Your {0} installation appears to be corrupt. Please reinstall.", "More Information", "Don't Show Again" ], + "vs/workbench/services/workingCopy/electron-sandbox/workingCopyBackupService": [ + "Backup working copies" + ], "vs/workbench/services/extensions/electron-sandbox/nativeExtensionService": [ "Extension host cannot start: version mismatch.", "Relaunch VS Code", @@ -16422,6 +16564,56 @@ "vs/base/common/platform": [ "_" ], + "vs/platform/environment/node/argv": [ + "Options", + "Extensions Management", + "Troubleshooting", + "Directory where CLI metadata should be stored.", + "Compare two files with each other.", + "Perform a three-way merge by providing paths for two modified versions of a file, the common origin of both modified versions and the output file to save merge results.", + "Add folder(s) to the last active window.", + "Open a file at the path on the specified line and character position.", + "Force to open a new window.", + "Force to open a file or folder in an already opened window.", + "Wait for the files to be closed before returning.", + "The locale to use (e.g. en-US or zh-TW).", + "Specifies the directory that user data is kept in. Can be used to open multiple distinct instances of Code.", + "Opens the provided folder or workspace with the given profile and associates the profile with the workspace. If the profile does not exist, a new empty one is created. A folder or workspace must be provided for the profile to take effect.", + "Print usage.", + "Set the root path for extensions.", + "List the installed extensions.", + "Show versions of installed extensions, when using --list-extensions.", + "Filters installed extensions by provided category, when using --list-extensions.", + "Installs or updates an extension. The argument is either an extension id or a path to a VSIX. The identifier of an extension is '${publisher}.${name}'. Use '--force' argument to update to latest version. To install a specific version provide '@${version}'. For example: 'vscode.csharp@1.2.3'.", + "Installs the pre-release version of the extension, when using --install-extension", + "Uninstalls an extension.", + "Enables proposed API features for extensions. Can receive one or more extension IDs to enable individually.", + "Print version.", + "Print verbose output (implies --wait).", + "Log level to use. Default is 'info'. Allowed values are 'critical', 'error', 'warn', 'info', 'debug', 'trace', 'off'. You can also configure the log level of an extension by passing extension id and log level in the following format: '${publisher}.${name}:${logLevel}'. For example: 'vscode.csharp:trace'. Can receive one or more such entries.", + "Print process usage and diagnostics information.", + "Run CPU profiler during startup.", + "Disable all installed extensions. This option is not persisted and is effective only when the command opens a new window.", + "Disable the provided extension. This option is not persisted and is effective only when the command opens a new window.", + "Turn sync on or off.", + "Allow debugging and profiling of extensions. Check the developer tools for the connection URI.", + "Allow debugging and profiling of extensions with the extension host being paused after start. Check the developer tools for the connection URI.", + "Disable GPU hardware acceleration.", + "Use this option only when there is requirement to launch the application as sudo user on Linux or when running as an elevated user in an applocker environment on Windows.", + "Shows all telemetry events which VS code collects.", + "Use {0} instead.", + "paths", + "Usage", + "options", + "To read output from another program, append '-' (e.g. 'echo Hello World | {0} -')", + "To read from stdin, append '-' (e.g. 'ps aux | grep code | {0} -')", + "Subcommands", + "Unknown version", + "Unknown commit" + ], + "vs/platform/terminal/node/ptyService": [ + "History restored" + ], "vs/editor/common/config/editorOptions": [ "Use platform APIs to detect when a Screen Reader is attached", "Optimize for usage with a Screen Reader", @@ -16603,6 +16795,7 @@ "When enabled IntelliSense shows `user`-suggestions.", "When enabled IntelliSense shows `issues`-suggestions.", "Whether leading and trailing whitespace should always be selected.", + "Whether subwords (like 'foo' in 'fooBar' or 'foo_bar') should be selected.", "No indentation. Wrapped lines begin at column 1.", "Wrapped lines get the same indentation as the parent.", "Wrapped lines get +1 indentation toward the parent.", @@ -16647,6 +16840,10 @@ "Controls the font family for CodeLens.", "Controls the font size in pixels for CodeLens. When set to 0, 90% of `#editor.fontSize#` is used.", "Controls whether the editor should render the inline color decorators and color picker.", + "Make the color picker appear both on click and hover of the color decorator", + "Make the color picker appear on hover of the color decorator", + "Make the color picker appear on click of the color decorator", + "Controls the condition to make a color picker appear from a color decorator", "Controls the max number of color decorators that can be rendered in an editor at once.", "Enable that the selection with the mouse and keys is doing column selection.", "Controls whether syntax highlighting should be copied into the clipboard.", @@ -16814,8 +17011,8 @@ "Unable to atomically delete file '{0}' because using trash is enabled.", "Unable to delete nonexistent file '{0}'", "Unable to delete non-empty folder '{0}'.", - "Unable to modify readonly file '{0}'", - "Unable to modify readonly file '{0}'" + "Unable to modify read-only file '{0}'", + "Unable to modify read-only file '{0}'" ], "vs/platform/files/node/diskFileSystemProvider": [ "File already exists", @@ -16896,6 +17093,15 @@ "Extension '{0}' is not installed on {1}.", "Extension '{0}' is not installed." ], + "vs/platform/extensionManagement/common/extensionsScannerService": [ + "Cannot read file {0}: {1}.", + "Failed to parse {0}: [{1}, {2}] {3}.", + "Invalid manifest file {0}: Not an JSON object.", + "Failed to parse {0}: {1}.", + "Invalid format {0}: JSON object expected.", + "Failed to parse {0}: {1}.", + "Invalid format {0}: JSON object expected." + ], "vs/platform/extensionManagement/node/extensionManagementService": [ "Unable to install extension '{0}' as it is not compatible with VS Code '{1}'.", "Marketplace is not enabled", @@ -16907,61 +17113,6 @@ "Please restart VS Code before reinstalling {0}.", "Please restart VS Code before reinstalling {0}." ], - "vs/platform/environment/node/argv": [ - "Options", - "Extensions Management", - "Troubleshooting", - "Directory where CLI metadata should be stored.", - "Compare two files with each other.", - "Perform a three-way merge by providing paths for two modified versions of a file, the common origin of both modified versions and the output file to save merge results.", - "Add folder(s) to the last active window.", - "Open a file at the path on the specified line and character position.", - "Force to open a new window.", - "Force to open a file or folder in an already opened window.", - "Wait for the files to be closed before returning.", - "The locale to use (e.g. en-US or zh-TW).", - "Specifies the directory that user data is kept in. Can be used to open multiple distinct instances of Code.", - "Opens the provided folder or workspace with the given profile and associates the profile with the workspace. If the profile does not exist, a new empty one is created. A folder or workspace must be provided for the profile to take effect.", - "Print usage.", - "Set the root path for extensions.", - "List the installed extensions.", - "Show versions of installed extensions, when using --list-extensions.", - "Filters installed extensions by provided category, when using --list-extensions.", - "Installs or updates an extension. The argument is either an extension id or a path to a VSIX. The identifier of an extension is '${publisher}.${name}'. Use '--force' argument to update to latest version. To install a specific version provide '@${version}'. For example: 'vscode.csharp@1.2.3'.", - "Installs the pre-release version of the extension, when using --install-extension", - "Uninstalls an extension.", - "Enables proposed API features for extensions. Can receive one or more extension IDs to enable individually.", - "Print version.", - "Print verbose output (implies --wait).", - "Log level to use. Default is 'info'. Allowed values are 'critical', 'error', 'warn', 'info', 'debug', 'trace', 'off'. You can also configure the log level of an extension by passing extension id and log level in the following format: '${publisher}.${name}:${logLevel}'. For example: 'vscode.csharp:trace'. Can receive one or more such entries.", - "Print process usage and diagnostics information.", - "Run CPU profiler during startup.", - "Disable all installed extensions. This option is not persisted and is effective only when the command opens a new window.", - "Disable the provided extension. This option is not persisted and is effective only when the command opens a new window.", - "Turn sync on or off.", - "Allow debugging and profiling of extensions. Check the developer tools for the connection URI.", - "Allow debugging and profiling of extensions with the extension host being paused after start. Check the developer tools for the connection URI.", - "Disable GPU hardware acceleration.", - "Shows all telemetry events which VS code collects.", - "Use {0} instead.", - "paths", - "Usage", - "options", - "To read output from another program, append '-' (e.g. 'echo Hello World | {0} -')", - "To read from stdin, append '-' (e.g. 'ps aux | grep code | {0} -')", - "Subcommands", - "Unknown version", - "Unknown commit" - ], - "vs/platform/extensionManagement/common/extensionsScannerService": [ - "Cannot read file {0}: {1}.", - "Failed to parse {0}: [{1}, {2}] {3}.", - "Invalid manifest file {0}: Not an JSON object.", - "Failed to parse {0}: {1}.", - "Invalid format {0}: JSON object expected.", - "Failed to parse {0}: {1}.", - "Invalid format {0}: JSON object expected." - ], "vs/platform/languagePacks/common/languagePacks": [ " (Current)" ], @@ -17078,8 +17229,81 @@ "Opening tunnel {0}", "Opening tunnel" ], - "vs/platform/terminal/node/ptyService": [ - "History restored" + "vs/workbench/browser/workbench": [ + "Failed to load a required file. Please restart the application to try again. Details: {0}" + ], + "vs/workbench/electron-sandbox/window": [ + "Restart", + "Configure", + "Learn More", + "Writing login information to the keychain failed with error '{0}'.", + "Troubleshooting Guide", + "You are running an emulated version of {0}. For better performance download the native arm64 version of {0} build for your machine.", + "Download", + "Proxy Authentication Required", + "&&Log In", + "Username", + "Password", + "The proxy {0} requires a username and password.", + "Remember my credentials", + "Are you sure you want to quit?", + "Are you sure you want to exit?", + "Are you sure you want to close the window?", + "&&Quit", + "&&Exit", + "&&Close Window", + "Do not ask me again", + "Error: {0}", + "The following operations are still running: \n{0}", + "An unexpected error prevented the window to close", + "An unexpected error prevented the application to quit", + "An unexpected error prevented the window to reload", + "An unexpected error prevented to change the workspace", + "Closing the window is taking a bit longer...", + "Quitting the application is taking a bit longer...", + "Reloading the window is taking a bit longer...", + "Changing the workspace is taking a bit longer...", + "Close Anyway", + "Quit Anyway", + "Reload Anyway", + "Change Anyway", + "There is a dependency cycle in the AMD modules that needs to be resolved!", + "It is not recommended to run {0} as root user.", + "Files you store within the installation folder ('{0}') may be OVERWRITTEN or DELETED IRREVERSIBLY without warning at update time.", + "{0} on {1} will soon stop receiving updates. Consider upgrading your windows version.", + "Learn More", + "{0}. Use navigation keys to access banner actions.", + "Learn More", + "{0} on {1} will soon stop receiving updates. Consider upgrading your macOS version.", + "Learn More", + "{0}. Use navigation keys to access banner actions.", + "Learn More", + "Resolving shell environment...", + "Learn More" + ], + "vs/workbench/services/configuration/browser/configurationService": [ + "Contribute defaults for configurations", + "Experiments" + ], + "vs/platform/workspace/common/workspace": [ + "Code Workspace" + ], + "vs/workbench/services/remote/electron-sandbox/remoteAgentService": [ + "Open Developer Tools", + "Open in browser", + "Failed to connect to the remote extension host server (Error: {0})" + ], + "vs/workbench/services/log/electron-sandbox/logService": [ + "Window" + ], + "vs/platform/workspace/common/workspaceTrust": [ + "Trusted", + "Restricted Mode" + ], + "vs/workbench/services/userDataProfile/common/userDataProfile": [ + "Icon for Default Profile.", + "Profiles", + "Profile" ], "vs/platform/list/browser/listService": [ "Workbench", @@ -17113,6 +17337,9 @@ "Warning", "Info" ], + "vs/platform/contextkey/browser/contextKeyService": [ + "A command that returns information about context keys" + ], "vs/platform/contextkey/common/contextkey": [ "Empty context key expression", "Did you forget to write an expression? You can also put 'false' or 'true' to always evaluate to false or true, respectively.", @@ -17126,8 +17353,13 @@ "Unexpected token. Hint: {0}", "Unexpected token." ], - "vs/platform/contextkey/browser/contextKeyService": [ - "A command that returns information about context keys" + "vs/workbench/browser/actions/textInputActions": [ + "Undo", + "Redo", + "Cut", + "Copy", + "Paste", + "Select All" ], "vs/workbench/browser/workbench.contribution": [ "The default size.", @@ -17159,11 +17391,13 @@ "Allow tabs to get smaller when the available space is not enough to show all tabs at once.", "Make all tabs the same size, while allowing them to get smaller when the available space is not enough to show all tabs at once.", "Controls the size of editor tabs. This value is ignored when `#workbench.editor.showTabs#` is disabled.", - "Controls the maximum width of tabs when {0} is set to {1}.", + "Controls the minimum width of tabs when `#workbench.editor.tabSizing#` size is set to `fixed`.", + "Controls the maximum width of tabs when `#workbench.editor.tabSizing#` size is set to `fixed`.", "A pinned tab inherits the look of non pinned tabs.", "A pinned tab will show in a compact form with only icon or first letter of the editor name.", "A pinned tab shrinks to a compact fixed size showing parts of the editor name.", "Controls the size of pinned editor tabs. Pinned tabs are sorted to the beginning of all opened tabs and typically do not close until unpinned. This value is ignored when `#workbench.editor.showTabs#` is disabled.", + "Splits all the editor groups to equal parts unless a part has been changed in size.", "Splits all the editor groups to equal parts.", "Splits the active editor group to equal parts.", "Controls the size of editor groups when splitting them.", @@ -17190,6 +17424,7 @@ "Editors are positioned from left to right.", "Controls if the centered layout should automatically resize to maximum width when more than one group is open. Once only one group is open it will resize back to the original centered width.", "Controls whether the centered layout tries to maintain constant width when the window is resized.", + "Controls whether to maximize/restore the editor group when double clicking on a tab. This value is ignored when `#workbench.editor.showTabs#` is disabled.", "Controls if the number of opened editors should be limited or not. When enabled, less recently used editors will close to make space for newly opening editors.", "Controls the maximum number of opened editors. Use the {0} setting to control this limit per editor group or across all groups.", "Controls if the maximum number of opened editors should exclude dirty editors for counting towards the configured limit.", @@ -17197,7 +17432,7 @@ "Controls whether local file history is enabled. When enabled, the file contents of an editor that is saved will be stored to a backup location to be able to restore or review the contents later. Changing this setting has no effect on existing local file history entries.", "Controls the maximum size of a file (in KB) to be considered for local file history. Files that are larger will not be added to the local file history. Changing this setting has no effect on existing local file history entries.", "Controls the maximum number of local file history entries per file. When the number of local file history entries exceeds this number for a file, the oldest entries will be discarded.", - "Configure paths or [glob patterns](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options) for excluding files from the local file history. Glob patterns are always evaluated relative to the path of the workspace folder unless they are absolute paths. Changing this setting has no effect on existing local file history entries.", + "Configure paths or [glob patterns](https://aka.ms/vscode-glob-patterns) for excluding files from the local file history. Glob patterns are always evaluated relative to the path of the workspace folder unless they are absolute paths. Changing this setting has no effect on existing local file history entries.", "Configure an interval in seconds during which the last entry in local file history is replaced with the entry that is being added. This helps reduce the overall number of entries that are added, for example when auto save is enabled. This setting is only applied to entries that have the same source of origin. Changing this setting has no effect on existing local file history entries.", "Controls the number of recently used commands to keep in history for the command palette. Set to 0 to disable command history.", "Controls whether the last typed input to the command palette should be restored when opening it the next time.", @@ -17344,14 +17579,6 @@ "Privacy Statement", "Privac&&y Statement" ], - "vs/workbench/browser/actions/textInputActions": [ - "Undo", - "Redo", - "Cut", - "Copy", - "Paste", - "Select All" - ], "vs/workbench/browser/actions/layoutActions": [ "Represents the menu bar", "Represents the activity bar in the left position", @@ -17528,6 +17755,14 @@ "Add Folder to Workspace", "Select workspace folder" ], + "vs/workbench/browser/actions/quickAccessActions": [ + "Go to File...", + "Quick Open", + "Navigate Next in Quick Open", + "Navigate Previous in Quick Open", + "Select Next in Quick Open", + "Select Previous in Quick Open" + ], "vs/workbench/services/actions/common/menusExtensionPoint": [ "The Command Palette", "The touch bar (macOS only)", @@ -17638,14 +17873,6 @@ "Menu item references a submenu `{0}` which is not defined in the 'submenus' section.", "The `{0}` submenu was already contributed to the `{1}` menu." ], - "vs/workbench/browser/actions/quickAccessActions": [ - "Go to File...", - "Quick Open", - "Navigate Next in Quick Open", - "Navigate Previous in Quick Open", - "Select Next in Quick Open", - "Select Previous in Quick Open" - ], "vs/workbench/api/common/configurationExtensionPoint": [ "A title for the current category of settings. This label will be rendered in the Settings editor as a subheading. If the title is the same as the extension display name, then the category will be grouped under the main extension heading.", "When specified, gives the order of this category of settings relative to other categories.", @@ -17946,9 +18173,6 @@ "Cancel", "Dismiss" ], - "vs/workbench/services/configuration/common/jsonEditingService": [ - "Unable to write into the file. Please open the file to correct errors/warnings in the file and try again." - ], "vs/workbench/services/preferences/browser/preferencesService": [ "Open a folder or workspace first to create workspace or folder settings.", "Place your key bindings in this file to override the defaults", @@ -17956,6 +18180,9 @@ "Default Keybindings", "Unable to create '{0}' ({1})." ], + "vs/workbench/services/configuration/common/jsonEditingService": [ + "Unable to write into the file. Please open the file to correct errors/warnings in the file and try again." + ], "vs/workbench/services/editor/browser/editorResolverService": [ "There are multiple default editors available for the resource.", "Configure Default", @@ -18071,15 +18298,6 @@ "Don't Show Again", "Don't Show Again" ], - "vs/workbench/services/userDataProfile/browser/userDataProfileManagement": [ - "The current profile has been removed. Please reload to switch back to default profile", - "The current profile has been removed. Please reload to switch back to default profile", - "Cannot rename the default profile", - "Cannot delete the default profile", - "Switching to a profile.", - "Switching a profile requires reloading VS Code.", - "&&Reload" - ], "vs/workbench/services/userDataProfile/browser/userDataProfileImportExportService": [ "Error while importing profile: {0}", "{0}: Resolving profile content...", @@ -18087,6 +18305,8 @@ "Create Profile", "Export", "Close", + "Troubleshoot Issue", + "Setting up Troubleshoot Profile: {0}", "{0}: Exporting...", "Profile '{0}' was exported successfully.", "&&Copy Link", @@ -18102,15 +18322,14 @@ "Cancel", "Create Profile", "{0} ({1})...", - "{0} ({1}): Applying Settings...", - "{0} ({1}): Applying Keyboard Shortcuts...", - "{0} ({1}): Applying Tasks...", - "{0} ({1}): Applying Snippets...", - "{0} ({1}): Applying State...", - "{0} ({1}): Applying Extensions...", - "{0} ({1}): Applying...", + "Applying Settings...", + "{0}ying Keyboard Shortcuts...", + "Applying Tasks...", + "Applying Snippets...", + "Applying State...", + "Applying Extensions...", + " Applying...", "Export '{0}' profile as...", - "Preview", "Profile with name '{0}' already exists. Do you want to overwrite it?", "&&Overwrite", "&&Create New Profile", @@ -18128,16 +18347,51 @@ "Export Profile", "Profile name must be provided." ], + "vs/workbench/services/userDataProfile/browser/userDataProfileManagement": [ + "The current profile has been removed. Please reload to switch back to default profile", + "The current profile has been removed. Please reload to switch back to default profile", + "Cannot rename the default profile", + "Cannot delete the default profile", + "Switching to a profile.", + "Switching a profile requires reloading VS Code.", + "&&Reload" + ], "vs/workbench/services/remote/common/remoteExplorerService": [ "User Forwarded", "Auto Forwarded", "Local port {0} could not be used for forwarding to remote port {1}.\n\nThis usually happens when there is already another process using local port {0}.\n\nPort number {2} has been used instead.", "Statically Forwarded" ], + "vs/workbench/services/filesConfiguration/common/filesConfigurationService": [ + "Editor is read-only because the file system of the file is read-only.", + "Editor is read-only because the file was set read-only in this session. [Click here](command:{0}) to set writeable.", + "Editor is read-only because the file was set read-only via settings. [Click here](command:{0}) to configure.", + "Editor is read-only because of file permissions. [Click here](command:{0}) to set writeable anyway.", + "Editor is read-only because the file is read-only." + ], "vs/workbench/services/views/browser/viewDescriptorService": [ "Hide '{0}'", "Reset Location" ], + "vs/workbench/services/authentication/browser/authenticationService": [ + "The id of the authentication provider.", + "The human readable name of the authentication provider.", + "Contributes authentication", + "No accounts requested yet...", + "An authentication contribution must specify an id.", + "An authentication contribution must specify a label.", + "This authentication id '{0}' has already been registered", + "Loading...", + "Sign in requested", + "The extension '{0}' wants to access the {1} account '{2}'.", + "&&Allow", + "&&Deny", + "Sign in to another account", + "The extension '{0}' wants to access a {1} account", + "Select an account for '{0}' to use or Esc to cancel", + "Grant access to {0} for {1}... (1)", + "Sign in with {0} to use {1} (1)" + ], "vs/workbench/services/userDataSync/browser/userDataSyncWorkbenchService": [ "Settings sync cannot be turned on because there are no authentication providers available.", "No account available", @@ -18163,24 +18417,38 @@ "Others", "Sign in with {0}" ], - "vs/workbench/services/authentication/browser/authenticationService": [ - "The id of the authentication provider.", - "The human readable name of the authentication provider.", - "Contributes authentication", - "No accounts requested yet...", - "An authentication contribution must specify an id.", - "An authentication contribution must specify a label.", - "This authentication id '{0}' has already been registered", - "Loading...", - "Sign in requested", - "The extension '{0}' wants to access the {1} account '{2}'.", - "&&Allow", - "&&Deny", - "Sign in to another account", - "The extension '{0}' wants to access a {1} account", - "Select an account for '{0}' to use or Esc to cancel", - "Grant access to {0} for {1}... (1)", - "Sign in with {0} to use {1} (1)" + "vs/workbench/services/assignment/common/assignmentService": [ + "Fetches experiments to run from a Microsoft online service." + ], + "vs/workbench/services/issue/browser/issueTroubleshoot": [ + "Troubleshoot Issue", + "Issue troubleshooting is a process to help you identify the cause for an issue. The cause for an issue can be a misconfiguration, due to an extension, or be {0} itself.\n\nDuring the process the window reloads repeatedly. Each time you must confirm if you are still seeing the issue.", + "&&Troubleshoot Issue", + "Issue troubleshooting is active and has temporarily disabled all installed extensions. Check if you can still reproduce the problem and proceed by selecting from these options.", + "Issue troubleshooting is active and has temporarily reset your configurations to defaults. Check if you can still reproduce the problem and proceed by selecting from these options.", + "Issue troubleshooting has identified that the issue is caused by your configurations. Please report the issue by exporting your configurations using \"Export Profile\" command and share the file in the issue report.", + "Issue troubleshooting has identified that the issue is with {0}.", + "I can't reproduce", + "I can reproduce", + "Stop", + "Troubleshoot Issue", + "This likely means that the issue has been addressed already and will be available in an upcoming release. You can safely use {0} insiders until the new stable version is available.", + "Troubleshoot Issue", + "Download {0} Insiders", + "Report Issue Anyway", + "Please try to download and reproduce the issue in {0} insiders.", + "Troubleshoot Issue", + "I can't reproduce", + "I can reproduce", + "Stop", + "Please try to reproduce the issue in {0} insiders and confirm if the issue exists there.", + "Troubleshoot Issue...", + "Stop Troubleshoot Issue" + ], + "vs/workbench/contrib/preferences/browser/keybindingsEditorContribution": [ + "You won't be able to produce this key combination under your current keyboard layout.", + "**{0}** for your current keyboard layout (**{1}** for US standard).", + "**{0}** for your current keyboard layout." ], "vs/workbench/contrib/preferences/browser/preferences.contribution": [ "Settings Editor 2", @@ -18230,10 +18498,11 @@ "Define Keybinding", "&&Preferences" ], - "vs/workbench/contrib/preferences/browser/keybindingsEditorContribution": [ - "You won't be able to produce this key combination under your current keyboard layout.", - "**{0}** for your current keyboard layout (**{1}** for US standard).", - "**{0}** for your current keyboard layout." + "vs/workbench/contrib/performance/browser/performance.contribution": [ + "Startup Performance", + "Print Service Cycles", + "Print Service Traces", + "Print Emitter Profiles" ], "vs/workbench/contrib/notebook/browser/notebook.contribution": [ "Settings for code editors used in notebooks. This can be used to customize most editor.* settings.", @@ -18279,12 +18548,6 @@ "Control whether a confirmation prompt is required to delete a running cell.", "Customize the Find Widget behavior for searching within notebook cells. When both markup source and markup preview are enabled, the Find Widget will search either the source code or preview based on the current state of the cell." ], - "vs/workbench/contrib/performance/browser/performance.contribution": [ - "Startup Performance", - "Print Service Cycles", - "Print Service Traces", - "Print Emitter Profiles" - ], "vs/workbench/contrib/chat/browser/chat.contribution": [ "Chat", "Controls the font size in pixels in chat codeblocks.", @@ -18292,9 +18555,9 @@ "Controls the font weight in chat codeblocks.", "Controls whether lines should wrap in chat codeblocks.", "Controls the line height in pixels in chat codeblocks. Use 0 to compute the line height from the font size.", - "Controls whether the quick question feature is enabled.", "Chat", - "Chat" + "Chat", + "Chat Accessible View" ], "vs/workbench/contrib/interactive/browser/interactive.contribution": [ "Interactive Window", @@ -18310,8 +18573,7 @@ "Focus History", "The border color for the current interactive code cell when the editor has focus.", "The border color for the current interactive code cell when the editor does not have focus.", - "Automatically scroll the interactive window to show the output of the last statement executed. If this value is false, the window will only scroll if the last cell was already the one scrolled to.", - "Controls whether the Interactive Window sessions/history should be restored across window reloads. Whether the state of controllers used in Interactive Windows is persisted across window reloads are controlled by extensions contributing controllers." + "Automatically scroll the interactive window to show the output of the last statement executed. If this value is false, the window will only scroll if the last cell was already the one scrolled to." ], "vs/workbench/contrib/testing/browser/testing.contribution": [ "Testing", @@ -18358,26 +18620,6 @@ "You have not yet opened a folder.\n{0}\nOpening a folder will close all currently open editors. To keep them open, {1} instead.", "You have not yet opened a folder.\n{0}" ], - "vs/workbench/contrib/bulkEdit/browser/bulkEditService": [ - "Made no edits", - "Made {0} text edits in {1} files", - "Made {0} text edits in one file", - "Made {0} text edits in {1} files, also created or deleted {2} files", - "Workspace Edit", - "Workspace Edit", - "Made no edits", - "Are you sure you want to close the window?", - "&&Close Window", - "Are you sure you want to change the workspace?", - "Change &&Workspace", - "Are you sure you want to reload the window?", - "&&Reload Window", - "Are you sure you want to quit?", - "&&Quit", - "'{0}' is in progress.", - "File operation", - "Controls if files that were part of a refactoring are saved automatically" - ], "vs/workbench/contrib/files/browser/fileActions.contribution": [ "Copy Path", "Copy Relative Path", @@ -18428,7 +18670,7 @@ "Hot exit will be triggered when the browser quits or the window or tab is closed.", "Controls whether unsaved files are remembered between sessions, allowing the save prompt when exiting the editor to be skipped.", "Files", - "Configure [glob patterns](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options) for excluding files and folders. For example, the File Explorer decides which files and folders to show or hide based on this setting. Refer to the `#search.exclude#` setting to define search-specific excludes. Refer to the `#explorer.excludeGitIgnore#` setting for ignoring files based on your `.gitignore`.", + "Configure [glob patterns](https://aka.ms/vscode-glob-patterns) for excluding files and folders. For example, the File Explorer decides which files and folders to show or hide based on this setting. Refer to the `#search.exclude#` setting to define search-specific excludes. Refer to the `#explorer.excludeGitIgnore#` setting for ignoring files based on your `.gitignore`.", "Enable the pattern.", "Disable the pattern.", "The glob pattern to match file paths against. Set to true or false to enable or disable the pattern.", @@ -18450,16 +18692,18 @@ "An editor with changes is automatically saved when the window loses focus.", "Controls [auto save](https://code.visualstudio.com/docs/editor/codebasics#_save-auto-save) of editors that have unsaved changes.", "Controls the delay in milliseconds after which an editor with unsaved changes is saved automatically. Only applies when `#files.autoSave#` is set to `{0}`.", - "Configure paths or glob patterns to exclude from file watching. Paths can either be relative to the watched folder or absolute. Glob patterns are matched relative from the watched folder. When you experience the file watcher process consuming a lot of CPU, make sure to exclude large folders that are of less interest (such as build output folders).", + "Configure paths or [glob patterns](https://aka.ms/vscode-glob-patterns) to exclude from file watching. Paths can either be relative to the watched folder or absolute. Glob patterns are matched relative from the watched folder. When you experience the file watcher process consuming a lot of CPU, make sure to exclude large folders that are of less interest (such as build output folders).", "Configure extra paths to watch for changes inside the workspace. By default, all workspace folders will be watched recursively, except for folders that are symbolic links. You can explicitly add absolute or relative paths to support watching folders that are symbolic links. Relative paths will be resolved to an absolute path using the currently opened workspace.", "The default language identifier that is assigned to new files. If configured to `${activeEditorLanguage}`, will use the language identifier of the currently active text editor if any.", - "Configure paths or [glob patterns](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options) to mark as read-only. Glob patterns are always evaluated relative to the path of the workspace folder unless they are absolute paths. You can exclude matching paths via the `#files.readonlyExclude#` setting. Files from readonly file system providers will always be read-only independent of this setting.", - "Configure paths or [glob patterns](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options) to exclude from being marked as read-only if they match as a result of the `#files.readonlyInclude#` setting. Glob patterns are always evaluated relative to the path of the workspace folder unless they are absolute paths. Files from readonly file system providers will always be read-only independent of this setting.", - "Marks files as readonly when their file permissions indicate as such. This can be overridden via `#files.readonlyInclude#` and `#files.readonlyExclude#` settings.", + "Configure paths or [glob patterns](https://aka.ms/vscode-glob-patterns) to mark as read-only. Glob patterns are always evaluated relative to the path of the workspace folder unless they are absolute paths. You can exclude matching paths via the `#files.readonlyExclude#` setting. Files from readonly file system providers will always be read-only independent of this setting.", + "Configure paths or [glob patterns](https://aka.ms/vscode-glob-patterns) to exclude from being marked as read-only if they match as a result of the `#files.readonlyInclude#` setting. Glob patterns are always evaluated relative to the path of the workspace folder unless they are absolute paths. Files from readonly file system providers will always be read-only independent of this setting.", + "Marks files as read-only when their file permissions indicate as such. This can be overridden via `#files.readonlyInclude#` and `#files.readonlyExclude#` settings.", "Restore the undo stack when a file is reopened.", "Will refuse to save and ask for resolving the save conflict manually.", "Will resolve the save conflict by overwriting the file on disk with the changes in the editor.", "A save conflict can occur when a file is saved to disk that was changed by another program in the meantime. To prevent data loss, the user is asked to compare the changes in the editor with the version on disk. This setting should only be changed if you frequently encounter save conflict errors and may result in data loss if used without caution.", + "Default path for file dialogs must be an absolute path (e.g. C:\\\\myFolder or /myFolder).", + "Default path for file dialogs, overriding user's home path. Only used in the absence of a context-specific path, such as most recently opened file or folder.", "Enables the simple file dialog for opening and saving files and folders. The simple file dialog replaces the system file dialog when enabled.", "Timeout in milliseconds after which file participants for create, rename, and delete are cancelled. Use `0` to disable participants.", "Format a file on save. A formatter must be available, the file must not be saved after delay, and the editor must not be shutting down.", @@ -18478,7 +18722,7 @@ "Files will not be revealed and selected.", "Files will not be scrolled into view, but will still be focused.", "Controls whether the Explorer should automatically reveal and select files when opening them.", - "Configure paths or [glob patterns](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options) for excluding files and folders from being revealed and selected in the Explorer when they are opened. Glob patterns are always evaluated relative to the path of the workspace folder unless they are absolute paths.", + "Configure paths or [glob patterns](https://aka.ms/vscode-glob-patterns) for excluding files and folders from being revealed and selected in the Explorer when they are opened. Glob patterns are always evaluated relative to the path of the workspace folder unless they are absolute paths.", "The glob pattern to match file paths against. Set to true or false to enable or disable the pattern.", "Additional check on the siblings of a matching file. Use $(basename) as variable for the matching file name.", "Controls whether the Explorer should allow to move files and folders via drag and drop. This setting only effects drag and drop from inside the Explorer.", @@ -18519,6 +18763,26 @@ "Controls nesting of files in the Explorer. {0} must be set for this to take effect. Each __Item__ represents a parent pattern and may contain a single `*` character that matches any string. Each __Value__ represents a comma separated list of the child patterns that should be shown nested under a given parent. Child patterns may contain several special tokens:\n- `${capture}`: Matches the resolved value of the `*` from the parent pattern\n- `${basename}`: Matches the parent file's basename, the `file` in `file.ts`\n- `${extname}`: Matches the parent file's extension, the `ts` in `file.ts`\n- `${dirname}`: Matches the parent file's directory name, the `src` in `src/file.ts`\n- `*`: Matches any string, may only be used once per child pattern", "Each key pattern may contain a single `*` character which will match any string." ], + "vs/workbench/contrib/bulkEdit/browser/bulkEditService": [ + "Made no edits", + "Made {0} text edits in {1} files", + "Made {0} text edits in one file", + "Made {0} text edits in {1} files, also created or deleted {2} files", + "Workspace Edit", + "Workspace Edit", + "Made no edits", + "Are you sure you want to close the window?", + "&&Close Window", + "Are you sure you want to change the workspace?", + "Change &&Workspace", + "Are you sure you want to reload the window?", + "&&Reload Window", + "Are you sure you want to quit?", + "&&Quit", + "'{0}' is in progress.", + "File operation", + "Controls if files that were part of a refactoring are saved automatically" + ], "vs/workbench/contrib/bulkEdit/browser/preview/bulkEdit.contribution": [ "Another refactoring is being previewed.", "Press 'Continue' to discard the previous refactoring and continue with the current refactoring.", @@ -18539,10 +18803,6 @@ "Refactor Preview", "Refactor Preview" ], - "vs/workbench/contrib/sash/browser/sash.contribution": [ - "Controls the feedback area size in pixels of the dragging area in between views/editors. Set it to a larger value if you feel it's hard to resize views using the mouse.", - "Controls the hover feedback delay in milliseconds of the dragging area in between views/editors." - ], "vs/workbench/contrib/search/browser/search.contribution": [ "Search", "Search", @@ -18631,6 +18891,10 @@ "Select All Matches", "Open New Search Editor" ], + "vs/workbench/contrib/sash/browser/sash.contribution": [ + "Controls the feedback area size in pixels of the dragging area in between views/editors. Set it to a larger value if you feel it's hard to resize views using the mouse.", + "Controls the hover feedback delay in milliseconds of the dragging area in between views/editors." + ], "vs/workbench/contrib/search/browser/searchView": [ "Search was canceled before any results could be found - ", "Toggle Search Details", @@ -18977,7 +19241,13 @@ "If the comments view has not been opened yet during this session it will open the first time during a session that a file with comments is active.", "Controls when the comments view should open.", "Determines if relative time will be used in comment timestamps (ex. '1 day ago').", - "Controls the visibility of the comments bar and comment threads in editors that have commenting ranges and comments. Comments are still accessible via the Comments view and will cause commenting to be toggled on in the same way running the command \"Comments: Toggle Editor Commenting\" toggles comments." + "Controls the visibility of the comments bar and comment threads in editors that have commenting ranges and comments. Comments are still accessible via the Comments view and will cause commenting to be toggled on in the same way running the command \"Comments: Toggle Editor Commenting\" toggles comments.", + "Controls whether the comments widget scrolls or expands." + ], + "vs/workbench/contrib/url/browser/url.contribution": [ + "Open URL", + "URL to open", + "When enabled, trusted domain prompts will appear when opening links in trusted workspaces." ], "vs/workbench/contrib/webview/browser/webview.contribution": [ "Cut", @@ -18987,10 +19257,46 @@ "vs/workbench/contrib/webviewPanel/browser/webviewPanel.contribution": [ "webview editor" ], - "vs/workbench/contrib/url/browser/url.contribution": [ - "Open URL", - "URL to open", - "When enabled, trusted domain prompts will appear when opening links in trusted workspaces." + "vs/workbench/contrib/extensions/browser/extensionsViewlet": [ + "Remote", + "Installed", + "Install Local Extensions in '{0}'...", + "Install Remote Extensions Locally...", + "Popular", + "Recommended", + "Enabled", + "Disabled", + "Marketplace", + "Installed", + "Recently Updated", + "Enabled", + "Disabled", + "Available Updates", + "Builtin", + "Workspace Unsupported", + "Workspace Recommendations", + "Other Recommendations", + "Features", + "Themes", + "Programming Languages", + "Disabled in Restricted Mode", + "Limited in Restricted Mode", + "Disabled in Virtual Workspaces", + "Limited in Virtual Workspaces", + "Deprecated", + "Search Extensions in Marketplace", + "1 extension found in the {0} section.", + "1 extension found.", + "{0} extensions found in the {1} section.", + "{0} extensions found.", + "Marketplace returned 'ECONNREFUSED'. Please check the 'http.proxy' setting.", + "Open User Settings", + "{0} requires update", + "{0} require update", + "{0} requires reload", + "{0} require reload", + "We have uninstalled '{0}' which was reported to be problematic.", + "Reload Now" ], "vs/workbench/contrib/extensions/browser/extensions.contribution": [ "Press Enter to manage extensions.", @@ -19128,53 +19434,6 @@ "Extensions", "Extensions" ], - "vs/workbench/contrib/extensions/browser/extensionsViewlet": [ - "Remote", - "Installed", - "Install Local Extensions in '{0}'...", - "Install Remote Extensions Locally...", - "Popular", - "Recommended", - "Enabled", - "Disabled", - "Marketplace", - "Installed", - "Recently Updated", - "Enabled", - "Disabled", - "Available Updates", - "Builtin", - "Workspace Unsupported", - "Workspace Recommendations", - "Other Recommendations", - "Features", - "Themes", - "Programming Languages", - "Disabled in Restricted Mode", - "Limited in Restricted Mode", - "Disabled in Virtual Workspaces", - "Limited in Virtual Workspaces", - "Deprecated", - "Search Extensions in Marketplace", - "1 extension found in the {0} section.", - "1 extension found.", - "{0} extensions found in the {1} section.", - "{0} extensions found.", - "Marketplace returned 'ECONNREFUSED'. Please check the 'http.proxy' setting.", - "Open User Settings", - "{0} requires update", - "{0} require update", - "{0} requires reload", - "{0} require reload", - "We have uninstalled '{0}' which was reported to be problematic.", - "Reload Now" - ], - "vs/workbench/contrib/output/browser/outputView": [ - "{0} - Output", - "Output channel for '{0}'", - "Output", - "Output panel" - ], "vs/workbench/contrib/output/browser/output.contribution": [ "View icon of the output view.", "Output", @@ -19196,7 +19455,8 @@ "Extension Logs", "Select Log", "Open Log File...", - "Select Log file", + "The id of the log file to open, for example `\"window\"`. Currently the best way to get this is to get the ID by checking the `workbench.action.output.show.` commands", + "Select Log File", "Output", "Enable/disable the ability of smart scrolling in the output view. Smart scrolling allows you to lock scrolling automatically when you click in the output view and unlocks when you click in the last line." ], @@ -19311,11 +19571,6 @@ "vs/workbench/contrib/keybindings/browser/keybindings.contribution": [ "Toggle Keyboard Shortcuts Troubleshooting" ], - "vs/workbench/contrib/folding/browser/folding.contribution": [ - "All", - "All active folding range providers", - "Defines a default folding range provider that takes precedence over all other folding range providers. Must be the identifier of an extension contributing a folding range provider." - ], "vs/workbench/contrib/snippets/browser/snippets.contribution": [ "Controls if surround-with-snippets or file template snippets show as Code Actions.", "The prefix to use when selecting the snippet in intellisense", @@ -19328,6 +19583,17 @@ "User snippet configuration", "A list of language names to which this snippet applies, e.g. 'typescript,javascript'." ], + "vs/workbench/contrib/output/browser/outputView": [ + "{0} - Output", + "Output channel for '{0}'", + "Output", + "Output panel" + ], + "vs/workbench/contrib/folding/browser/folding.contribution": [ + "All", + "All active folding range providers", + "Defines a default folding range provider that takes precedence over all other folding range providers. Must be the identifier of an extension contributing a folding range provider." + ], "vs/workbench/contrib/limitIndicator/browser/limitIndicator.contribution": [ "Configure", "Color Decorator Status", @@ -19536,9 +19802,6 @@ "{0} (Language Status)", "Reset Language Status Interaction Counter" ], - "vs/workbench/contrib/experiments/browser/experiments.contribution": [ - "Fetches experiments to run from a Microsoft online service." - ], "vs/workbench/contrib/userDataSync/browser/userDataSync.contribution": [ "Settings sync is suspended temporarily because the current device is making too many requests. Please reload {0} to resume.", "Settings sync is suspended temporarily because the current device is making too many requests. Please restart {0} to resume.", @@ -19714,7 +19977,10 @@ "Plays a sound when the focus moves to a deleted line in diff review mode or to the next/previous change", "Plays a sound when the focus moves to a modified line in diff review mode or to the next/previous change", "Plays a sound when a notebook cell execution is successfully completed.", - "Plays a sound when a notebook cell execution fails." + "Plays a sound when a notebook cell execution fails.", + "Plays a sound when a chat request is made.", + "Plays a sound on loop while the response is pending.", + "Plays a sound on loop while the response has been received." ], "vs/workbench/contrib/deprecatedExtensionMigrator/browser/deprecatedExtensionMigrator.contribution": [ "The extension 'Bracket pair Colorizer' got disabled because it was deprecated.", @@ -19722,86 +19988,18 @@ "Enable Native Bracket Pair Colorization", "More Info" ], + "vs/workbench/contrib/accessibility/browser/accessibility.contribution": [ + "editor accessibility help", + "Hover Accessible View" + ], "vs/workbench/contrib/share/browser/share.contribution": [ "Share...", "Generating link...", + "Copied text to clipboard!", "Copied link to clipboard!", "Close", - "Open Link" - ], - "vs/workbench/browser/workbench": [ - "Failed to load a required file. Please restart the application to try again. Details: {0}" - ], - "vs/workbench/electron-sandbox/window": [ - "Restart", - "Configure", - "Learn More", - "Writing login information to the keychain failed with error '{0}'.", - "Troubleshooting Guide", - "Proxy Authentication Required", - "&&Log In", - "Username", - "Password", - "The proxy {0} requires a username and password.", - "Remember my credentials", - "Are you sure you want to quit?", - "Are you sure you want to exit?", - "Are you sure you want to close the window?", - "&&Quit", - "&&Exit", - "&&Close Window", - "Do not ask me again", - "Error: {0}", - "The following operations are still running: \n{0}", - "An unexpected error prevented the window to close", - "An unexpected error prevented the application to quit", - "An unexpected error prevented the window to reload", - "An unexpected error prevented to change the workspace", - "Closing the window is taking a bit longer...", - "Quitting the application is taking a bit longer...", - "Reloading the window is taking a bit longer...", - "Changing the workspace is taking a bit longer...", - "Close Anyway", - "Quit Anyway", - "Reload Anyway", - "Change Anyway", - "There is a dependency cycle in the AMD modules that needs to be resolved!", - "It is not recommended to run {0} as root user.", - "Files you store within the installation folder ('{0}') may be OVERWRITTEN or DELETED IRREVERSIBLY without warning at update time.", - "{0} on {1} will soon stop receiving updates. Consider upgrading your windows version.", - "Learn More", - "{0}. Use navigation keys to access banner actions.", - "Learn More", - "{0} on {1} will soon stop receiving updates. Consider upgrading your macOS version.", - "Learn More", - "{0}. Use navigation keys to access banner actions.", - "Learn More", - "Resolving shell environment...", - "Learn More" - ], - "vs/workbench/services/configuration/browser/configurationService": [ - "Contribute defaults for configurations", - "Experiments" - ], - "vs/platform/workspace/common/workspace": [ - "Code Workspace" - ], - "vs/workbench/services/remote/electron-sandbox/remoteAgentService": [ - "Open Developer Tools", - "Open in browser", - "Failed to connect to the remote extension host server (Error: {0})" - ], - "vs/workbench/services/log/electron-sandbox/logService": [ - "Window" - ], - "vs/platform/workspace/common/workspaceTrust": [ - "Trusted", - "Restricted Mode" - ], - "vs/workbench/services/userDataProfile/common/userDataProfile": [ - "Icon for Default Profile.", - "Profiles", - "Profile" + "Open Link", + "Controls whether to render the Share action next to the command center when {0} is {1}." ], "vs/platform/configuration/common/configurationRegistry": [ "Default Language Configuration Overrides", @@ -19849,6 +20047,13 @@ "Quality type of VS Code", "Whether keyboard focus is inside an input box" ], + "vs/workbench/electron-sandbox/actions/installActions": [ + "Shell Command", + "Install '{0}' command in PATH", + "Shell command '{0}' successfully installed in PATH.", + "Uninstall '{0}' command from PATH", + "Shell command '{0}' successfully uninstalled from PATH." + ], "vs/workbench/common/contextkeys": [ "The kind of workspace opened in the window, either 'empty' (no workspace), 'folder' (single folder) or 'workspace' (multi-root workspace)", "The number of root folders in the workspace", @@ -19863,8 +20068,8 @@ "Whether the active editor is the first one in its group", "Whether the active editor is the last one in its group", "Whether the active editor is pinned", - "Whether the active editor is readonly", - "Whether the active editor can toggle between being readonly or writeable", + "Whether the active editor is read-only", + "Whether the active editor can toggle between being read-only or writeable", "Whether the active editor can revert", "The identifier of the active editor", "The available editor identifiers that are usable for the active editor", @@ -19911,13 +20116,6 @@ "Whether a resource is present or not", "Whether the resource is backed by a file system provider" ], - "vs/workbench/electron-sandbox/actions/installActions": [ - "Shell Command", - "Install '{0}' command in PATH", - "Shell command '{0}' successfully installed in PATH.", - "Uninstall '{0}' command from PATH", - "Shell command '{0}' successfully uninstalled from PATH." - ], "vs/workbench/common/configuration": [ "Application", "Workbench", @@ -19929,7 +20127,7 @@ "OK" ], "vs/workbench/electron-sandbox/parts/dialogs/dialogHandler": [ - "Version: {0}\nCommit: {1}\nDate: {2}\nElectron: {3}\nChromium: {4}\nNode.js: {5}\nV8: {6}\nOS: {7}", + "Version: {0}\nCommit: {1}\nDate: {2}\nElectron: {3}\nElectronBuildId: {4}\nChromium: {5}\nNode.js: {6}\nV8: {7}\nOS: {8}", "&&Copy", "OK" ], @@ -19937,8 +20135,8 @@ "File Created", "File Replaced", "Text File Model Decorations", - "Deleted, Read Only", - "Read Only", + "Deleted, Read-only", + "Read-only", "Deleted", "File seems to be binary and cannot be opened as text", "'{0}' already exists. Do you want to replace it?", @@ -20086,7 +20284,9 @@ "Outline color for text that got removed.", "Border color between the two text editors.", "Color of the diff editor's diagonal fill. The diagonal fill is used in side-by-side diff views.", - "The color of unchanged blocks in diff editor.", + "The background color of unchanged blocks in the diff editor.", + "The foreground color of unchanged blocks in the diff editor.", + "The background color of unchanged code in the diff editor.", "List/Tree background color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.", "List/Tree foreground color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.", "List/Tree outline color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.", @@ -20301,6 +20501,12 @@ "vs/base/common/actions": [ "(empty)" ], + "vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService": [ + "Save", + "Save Workspace", + "Unable to write into workspace configuration file. Please open the file to correct errors/warnings in it and try again.", + "Open Workspace Configuration" + ], "vs/workbench/services/configurationResolver/browser/baseConfigurationResolverService": [ "Cannot substitute command variable '{0}' because command did not return a result of type string.", "Variable '{0}' must be defined in an '{1}' section of the debug or task configuration.", @@ -20353,20 +20559,20 @@ "Reverting editors with unsaved changes is taking a bit longer...", "Discarding backups is taking a bit longer..." ], - "vs/platform/action/common/actionCommonCategories": [ - "View", - "Help", - "Test", - "File", - "Preferences", - "Developer" - ], "vs/workbench/services/workingCopy/common/workingCopyHistoryService": [ "File Saved", "File Moved", "File Renamed", "Saving local history" ], + "vs/platform/action/common/actionCommonCategories": [ + "View", + "Help", + "Test", + "File", + "Preferences", + "Developer" + ], "vs/workbench/services/extensions/common/abstractExtensionService": [ "The following extensions contain dependency loops and have been disabled: {0}", "The following extensions contain dependency loops and have been disabled: {0}", @@ -20379,12 +20585,6 @@ "Remote Extension host terminated unexpectedly 3 times within the last 5 minutes.", "Restart Remote Extension Host" ], - "vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService": [ - "Save", - "Save Workspace", - "Unable to write into workspace configuration file. Please open the file to correct errors/warnings in it and try again.", - "Open Workspace Configuration" - ], "vs/workbench/services/extensions/electron-sandbox/cachedExtensionScanner": [ "Extensions have been modified on disk. Please reload the window.", "Reload Window" @@ -20419,7 +20619,7 @@ "Whether the editor text has focus (cursor is blinking)", "Whether the editor or an editor widget has focus (e.g. focus is in the find widget)", "Whether an editor or a rich text input has focus (cursor is blinking)", - "Whether the editor is read only", + "Whether the editor is read-only", "Whether the context is a diff editor", "Whether the context is an embedded diff editor", "Whether `editor.columnSelection` is enabled", @@ -20549,11 +20749,6 @@ "Settings Sync", "View icon of the Settings Sync view." ], - "vs/workbench/contrib/tasks/common/tasks": [ - "Whether a task is currently running.", - "Tasks", - "Error: the task identifier '{0}' is missing the required property '{1}'. The task identifier will be ignored." - ], "vs/workbench/contrib/performance/electron-sandbox/startupProfiler": [ "Successfully created profiles.", "Please create an issue and manually attach the following files:\n{0}", @@ -20563,6 +20758,11 @@ "A final restart is required to continue to use '{0}'. Again, thank you for your contribution.", "&&Restart" ], + "vs/workbench/contrib/tasks/common/tasks": [ + "Whether a task is currently running.", + "Tasks", + "Error: the task identifier '{0}' is missing the required property '{1}'. The task identifier will be ignored." + ], "vs/workbench/contrib/tasks/common/taskService": [ "Whether CustomExecution tasks are supported. Consider using in the when clause of a 'taskDefinition' contribution.", "Whether ShellExecution tasks are supported. Consider using in the when clause of a 'taskDefinition' contribution.", @@ -20570,6 +20770,11 @@ "Whether ProcessExecution tasks are supported. Consider using in the when clause of a 'taskDefinition' contribution.", "True when in the web with no remote authority." ], + "vs/workbench/common/views": [ + "Default view icon.", + "A view with id '{0}' is already registered", + "No tree view with id '{0}' registered." + ], "vs/workbench/contrib/tasks/browser/abstractTaskService": [ "Configure Task", "Tasks", @@ -20693,15 +20898,14 @@ "Notebook Cell Failed", "Diff Line Inserted", "Diff Line Deleted", - "Diff Line Modified" - ], - "vs/workbench/common/views": [ - "Default view icon.", - "A view with id '{0}' is already registered", - "No tree view with id '{0}' registered." + "Diff Line Modified", + "Chat Request Sent", + "Chat Response Received", + "Chat Response Pending" ], "vs/workbench/contrib/terminal/common/terminalContextKey": [ "Whether the terminal is focused.", + "Whether any terminal is focused, including detached terminals used in other UI.", "Whether the terminal accessible buffer is focused.", "Whether a terminal in the editor area is focused.", "The current number of terminals.", @@ -20711,6 +20915,7 @@ "Whether the terminal's suggest widget is visible.", "Whether the terminal view is showing", "Whether text is selected in the active terminal.", + "Whether text is selected in a focused terminal.", "Whether terminal processes can be launched in the current workspace.", "Whether one terminal is selected in the terminal tabs list.", "Whether the focused tab's terminal is a split terminal.", @@ -20721,17 +20926,17 @@ "Open Webview Developer Tools", "Using standard dev tools to debug iframe based webview" ], + "vs/workbench/contrib/localHistory/electron-sandbox/localHistoryCommands": [ + "Reveal in File Explorer", + "Reveal in Finder", + "Open Containing Folder" + ], "vs/workbench/contrib/mergeEditor/electron-sandbox/devCommands": [ "Merge Editor (Dev)", "Open Merge Editor State from JSON", "Enter JSON", "Open Selection In Temporary Merge Editor" ], - "vs/workbench/contrib/localHistory/electron-sandbox/localHistoryCommands": [ - "Reveal in File Explorer", - "Reveal in Finder", - "Open Containing Folder" - ], "vs/workbench/api/common/extHostExtensionService": [ "Cannot load test runner.", "Path {0} does not point to a valid extension test runner." @@ -20750,13 +20955,19 @@ "Extension Host (Worker)", "Extension Host" ], - "vs/workbench/api/node/extHostTunnelService": [ - "Private", - "Public" + "vs/platform/terminal/node/terminalProcess": [ + "Starting directory (cwd) \"{0}\" is not a directory", + "Starting directory (cwd) \"{0}\" does not exist", + "Path to shell executable \"{0}\" does not exist", + "Path to shell executable \"{0}\" is not a file or a symlink" ], "vs/workbench/api/node/extHostDebugService": [ "Debug Process" ], + "vs/workbench/api/node/extHostTunnelService": [ + "Private", + "Public" + ], "vs/platform/dialogs/electron-main/dialogMainService": [ "Open", "Open Folder", @@ -20806,6 +21017,14 @@ "Unable to uninstall the shell command '{0}'.", "Unable to find shell script in '{0}'" ], + "vs/platform/workspaces/electron-main/workspacesHistoryMainService": [ + "New Window", + "Opens a new window", + "Recent Folders & Workspaces", + "Recent Folders", + "Untitled (Workspace)", + "{0} (Workspace)" + ], "vs/platform/windows/electron-main/windowsMainService": [ "&&OK", "Path does not exist", @@ -20819,14 +21038,6 @@ "The path '{0}' uses a host that is not allowed. Unless you trust the host, you should press 'Cancel'", "Permanently allow host '{0}'" ], - "vs/platform/workspaces/electron-main/workspacesHistoryMainService": [ - "New Window", - "Opens a new window", - "Recent Folders & Workspaces", - "Recent Folders", - "Untitled (Workspace)", - "{0} (Workspace)" - ], "vs/platform/workspaces/electron-main/workspacesManagementMainService": [ "&&OK", "Unable to save workspace '{0}'", @@ -20855,6 +21066,20 @@ "Version specified in `engines.vscode` ({0}) is not specific enough. For vscode versions after 1.0.0, please define at a minimum the major desired version. E.g. ^1.10.0, 1.10.x, 1.x.x, 2.x.x, etc.", "Extension is not compatible with Code {0}. Extension requires: {1}." ], + "vs/base/common/jsonErrorMessages": [ + "Invalid symbol", + "Invalid number format", + "Property name expected", + "Value expected", + "Colon expected", + "Comma expected", + "Closing brace expected", + "Closing bracket expected", + "End of file expected" + ], + "vs/platform/extensionManagement/common/extensionNls": [ + "Couldn't find message for key {0}." + ], "vs/base/node/zip": [ "Error extracting {0}. Invalid file.", "Incomplete. Found {0} of {1} entries", @@ -20877,20 +21102,6 @@ "vs/platform/extensionManagement/node/extensionManagementUtil": [ "VSIX invalid: package.json is not a JSON file." ], - "vs/base/common/jsonErrorMessages": [ - "Invalid symbol", - "Invalid number format", - "Property name expected", - "Value expected", - "Colon expected", - "Comma expected", - "Closing brace expected", - "Closing bracket expected", - "End of file expected" - ], - "vs/platform/extensionManagement/common/extensionNls": [ - "Couldn't find message for key {0}." - ], "vs/base/browser/ui/button/button": [ "More Actions..." ], @@ -20970,12 +21181,6 @@ "Cannot sync because current session is expired", "Cannot sync because syncing is turned off on this machine from another machine." ], - "vs/platform/terminal/node/terminalProcess": [ - "Starting directory (cwd) \"{0}\" is not a directory", - "Starting directory (cwd) \"{0}\" does not exist", - "Path to shell executable \"{0}\" does not exist", - "Path to shell executable \"{0}\" is not a file or a symlink" - ], "vs/base/browser/ui/tree/abstractTree": [ "Filter", "Fuzzy Match", @@ -20992,6 +21197,93 @@ "Icon for goto previous editor location.", "Icon for goto next editor location." ], + "vs/workbench/browser/parts/notifications/notificationsAlerts": [ + "Error: {0}", + "Warning: {0}", + "Info: {0}" + ], + "vs/workbench/browser/parts/notifications/notificationsCenter": [ + "No new notifications", + "Notifications", + "Notification Center Actions", + "Notifications Center" + ], + "vs/workbench/browser/parts/notifications/notificationsStatus": [ + "Notifications", + "Notifications", + "Do Not Disturb", + "Do Not Disturb Mode is Enabled", + "Hide Notifications", + "No Notifications", + "No New Notifications", + "1 New Notification", + "{0} New Notifications", + "No New Notifications ({0} in progress)", + "1 New Notification ({0} in progress)", + "{0} New Notifications ({1} in progress)", + "Status Message" + ], + "vs/workbench/browser/parts/notifications/notificationsCommands": [ + "Notifications", + "Show Notifications", + "Hide Notifications", + "Clear All Notifications", + "Accept Notification Primary Action", + "Toggle Do Not Disturb Mode", + "Focus Notification Toast" + ], + "vs/workbench/browser/parts/notifications/notificationsToasts": [ + "{0}, notification", + "{0}, source: {1}, notification" + ], + "vs/platform/actions/browser/menuEntryActionViewItem": [ + "{0} ({1})", + "{0} ({1})", + "{0}\n[{1}] {2}" + ], + "vs/workbench/services/configuration/common/configurationEditing": [ + "Open Tasks Configuration", + "Open Launch Configuration", + "Open Settings", + "Open Tasks Configuration", + "Open Launch Configuration", + "Save and Retry", + "Save and Retry", + "Open Settings", + "Unable to write {0} because it is configured in system policy.", + "Unable to write to {0} because {1} is not a registered configuration.", + "Unable to write {0} to Workspace Settings. This setting can be written only into User settings.", + "Unable to write {0} to Workspace Settings. This setting can be written only into User settings.", + "Unable to write to Folder Settings because {0} does not support the folder resource scope.", + "Unable to write to User Settings because {0} does not support for global scope.", + "Unable to write to Workspace Settings because {0} does not support for workspace scope in a multi folder workspace.", + "Unable to write to Folder Settings because no resource is provided.", + "Unable to write to Language Settings because {0} is not a resource language setting.", + "Unable to write to {0} because no workspace is opened. Please open a workspace first and try again.", + "Unable to write into the tasks configuration file. Please open it to correct errors/warnings in it and try again.", + "Unable to write into the launch configuration file. Please open it to correct errors/warnings in it and try again.", + "Unable to write into user settings. Please open the user settings to correct errors/warnings in it and try again.", + "Unable to write into remote user settings. Please open the remote user settings to correct errors/warnings in it and try again.", + "Unable to write into workspace settings. Please open the workspace settings to correct errors/warnings in the file and try again.", + "Unable to write into folder settings. Please open the '{0}' folder settings to correct errors/warnings in it and try again.", + "Unable to write into tasks configuration file because the file has unsaved changes. Please save it first and then try again.", + "Unable to write into launch configuration file because the file has unsaved changes. Please save it first and then try again.", + "Unable to write into user settings because the file has unsaved changes. Please save the user settings file first and then try again.", + "Unable to write into remote user settings because the file has unsaved changes. Please save the remote user settings file first and then try again.", + "Unable to write into workspace settings because the file has unsaved changes. Please save the workspace settings file first and then try again.", + "Unable to write into folder settings because the file has unsaved changes. Please save the '{0}' folder settings file first and then try again.", + "Unable to write into tasks configuration file because the content of the file is newer.", + "Unable to write into launch configuration file because the content of the file is newer.", + "Unable to write into user settings because the content of the file is newer.", + "Unable to write into remote user settings because the content of the file is newer.", + "Unable to write into workspace settings because the content of the file is newer.", + "Unable to write into folder settings because the content of the file is newer.", + "Unable to write to {0} because of an internal error.", + "User Settings", + "Remote User Settings", + "Workspace Settings", + "Folder Settings" + ], "vs/editor/common/core/editorColorRegistry": [ "Background color for the highlight of line at the cursor position.", "Background color for the border around the line at the cursor position.", @@ -21059,6 +21351,10 @@ "Stick to the end even when going to longer lines", "Removed secondary cursors" ], + "vs/editor/browser/widget/codeEditorWidget": [ + "The number of cursors has been limited to {0}. Consider using [find and replace](https://code.visualstudio.com/docs/editor/codebasics#_find-and-replace) for larger changes or increase the editor multi cursor limit setting.", + "Increase Multi Cursor Limit" + ], "vs/editor/contrib/anchorSelect/browser/anchorSelect": [ "Selection Anchor", "Anchor set at {0}:{1}", @@ -21067,10 +21363,6 @@ "Select from Anchor to Cursor", "Cancel Selection Anchor" ], - "vs/editor/contrib/caretOperations/browser/caretOperations": [ - "Move Selected Text Left", - "Move Selected Text Right" - ], "vs/editor/contrib/bracketMatching/browser/bracketMatching": [ "Overview ruler marker color for matching brackets.", "Go to Bracket", @@ -21078,6 +21370,20 @@ "Remove Brackets", "Go to &&Bracket" ], + "vs/editor/browser/widget/diffEditorWidget": [ + "Line decoration for inserts in the diff editor.", + "Line decoration for removals in the diff editor.", + " use Shift + F7 to navigate changes", + "Cannot compare files because one file is too large.", + "Click to revert change" + ], + "vs/editor/contrib/caretOperations/browser/caretOperations": [ + "Move Selected Text Left", + "Move Selected Text Right" + ], + "vs/editor/contrib/caretOperations/browser/transpose": [ + "Transpose Letters" + ], "vs/editor/contrib/clipboard/browser/clipboard": [ "Cu&&t", "Cut", @@ -21098,26 +21404,18 @@ "Paste", "Copy With Syntax Highlighting" ], - "vs/editor/browser/widget/codeEditorWidget": [ - "The number of cursors has been limited to {0}. Consider using [find and replace](https://code.visualstudio.com/docs/editor/codebasics#_find-and-replace) for larger changes or increase the editor multi cursor limit setting.", - "Increase Multi Cursor Limit" - ], - "vs/editor/browser/widget/diffEditorWidget": [ - "Line decoration for inserts in the diff editor.", - "Line decoration for removals in the diff editor.", - " use Shift + F7 to navigate changes", - "Cannot compare files because one file is too large.", - "Click to revert change" - ], - "vs/editor/contrib/caretOperations/browser/transpose": [ - "Transpose Letters" - ], "vs/editor/contrib/codeAction/browser/codeActionContributions": [ "Enable/disable showing group headers in the Code Action menu." ], "vs/editor/contrib/codelens/browser/codelensController": [ "Show CodeLens Commands For Current Line" ], + "vs/editor/contrib/colorPicker/browser/standaloneColorPickerActions": [ + "Show or Focus Standalone Color Picker", + "&&Show or Focus Standalone Color Picker", + "Hide the Color Picker", + "Insert Color with Standalone Color Picker" + ], "vs/editor/contrib/comment/browser/comment": [ "Toggle Line Comment", "&&Toggle Line Comment", @@ -21138,12 +21436,6 @@ "Always", "Show Editor Context Menu" ], - "vs/editor/contrib/colorPicker/browser/standaloneColorPickerActions": [ - "Show or Focus Standalone Color Picker", - "&&Show or Focus Standalone Color Picker", - "Hide the Color Picker", - "Insert Color with Standalone Color Picker" - ], "vs/editor/contrib/cursorUndo/browser/cursorUndo": [ "Cursor Undo", "Cursor Redo" @@ -21173,11 +21465,6 @@ "Replace", "&&Replace" ], - "vs/editor/contrib/fontZoom/browser/fontZoom": [ - "Editor Font Zoom In", - "Editor Font Zoom Out", - "Editor Font Zoom Reset" - ], "vs/editor/contrib/folding/browser/folding": [ "Unfold", "Unfold Recursively", @@ -21202,6 +21489,11 @@ "Format Document", "Format Selection" ], + "vs/editor/contrib/fontZoom/browser/fontZoom": [ + "Editor Font Zoom In", + "Editor Font Zoom Out", + "Editor Font Zoom Reset" + ], "vs/editor/contrib/gotoSymbol/browser/goToCommands": [ "Peek", "Definitions", @@ -21243,9 +21535,6 @@ "No results for '{0}'", "References" ], - "vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition": [ - "Click to show {0} definitions." - ], "vs/editor/contrib/gotoError/browser/gotoError": [ "Go to Next Problem (Error, Warning, Info)", "Icon for goto next marker.", @@ -21256,6 +21545,9 @@ "Go to Previous Problem in Files (Error, Warning, Info)", "Previous &&Problem" ], + "vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition": [ + "Click to show {0} definitions." + ], "vs/editor/contrib/hover/browser/hover": [ "Show or Focus Hover", "Show Definition Preview Hover", @@ -21403,6 +21695,11 @@ "vs/editor/contrib/tokenization/browser/tokenization": [ "Developer: Force Retokenize" ], + "vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode": [ + "Toggle Tab Key Moves Focus", + "Pressing Tab will now move focus to the next focusable element", + "Pressing Tab will now insert the tab character" + ], "vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter": [ "Icon shown with a warning message in the extensions editor.", "This document contains many non-basic ASCII unicode characters", @@ -21448,36 +21745,22 @@ "Cannot edit in read-only input", "Cannot edit in read-only editor" ], - "vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode": [ - "Toggle Tab Key Moves Focus", - "Pressing Tab will now move focus to the next focusable element", - "Pressing Tab will now insert the tab character" - ], "vs/editor/common/standaloneStrings": [ - "No selection", - "Line {0}, Column {1} ({2} selected)", - "Line {0}, Column {1}", - "{0} selections ({1} characters selected)", - "{0} selections", - "Now changing the setting `accessibilitySupport` to 'on'.", - "Now opening the Editor Accessibility documentation page.", - " in a read-only pane of a diff editor.", - " in a pane of a diff editor.", - " in a read-only code editor", - " in a code editor", + "Accessibility Help", + "Now opening the Accessibility documentation page.", + "You are in a read-only pane of a diff editor.", + "You are in a pane of a diff editor.", + "You are in a read-only code editor", + "You are in a code editor", "To configure the editor to be optimized for usage with a Screen Reader press Command+E now.", "To configure the editor to be optimized for usage with a Screen Reader press Control+E now.", "The editor is configured to be optimized for usage with a Screen Reader.", - "The editor is configured to never be optimized for usage with a Screen Reader, which is not the case at this time.", + "The editor is configured to never be optimized for usage with a Screen Reader", "Pressing Tab in the current editor will move focus to the next focusable element. Toggle this behavior by pressing {0}.", "Pressing Tab in the current editor will move focus to the next focusable element. The command {0} is currently not triggerable by a keybinding.", "Pressing Tab in the current editor will insert the tab character. Toggle this behavior by pressing {0}.", "Pressing Tab in the current editor will insert the tab character. The command {0} is currently not triggerable by a keybinding.", - "Press Command+H now to open a browser window with more information related to editor accessibility.", - "Press Control+H now to open a browser window with more information related to editor accessibility.", - "You can dismiss this tooltip and return to the editor by pressing Escape or Shift+Escape.", "Show Accessibility Help", - "Accessibility Help", "Developer: Inspect Tokens", "Go to Line/Column...", "Show all Quick Access Providers", @@ -21490,6 +21773,35 @@ "Toggle High Contrast Theme", "Made {0} edits in {1} files" ], + "vs/workbench/api/common/jsonValidationExtensionPoint": [ + "Contributes json schema configuration.", + "The file pattern (or an array of patterns) to match, for example \"package.json\" or \"*.launch\". Exclusion patterns start with '!'", + "A schema URL ('http:', 'https:') or relative path to the extension folder ('./').", + "'configuration.jsonValidation' must be a array", + "'configuration.jsonValidation.fileMatch' must be defined as a string or an array of strings.", + "'configuration.jsonValidation.url' must be a URL or relative path", + "Expected `contributes.{0}.url` ({1}) to be included inside extension's folder ({2}). This might make the extension non-portable.", + "'configuration.jsonValidation.url' is an invalid relative URL: {0}", + "'configuration.jsonValidation.url' must be an absolute URL or start with './' to reference schemas located in the extension." + ], + "vs/workbench/services/themes/common/colorExtensionPoint": [ + "Contributes extension defined themable colors", + "The identifier of the themable color", + "Identifiers must only contain letters, digits and dots and can not start with a dot", + "The description of the themable color", + "The default color for light themes. Either a color value in hex (#RRGGBB[AA]) or the identifier of a themable color which provides the default.", + "The default color for dark themes. Either a color value in hex (#RRGGBB[AA]) or the identifier of a themable color which provides the default.", + "The default color for high contrast dark themes. Either a color value in hex (#RRGGBB[AA]) or the identifier of a themable color which provides the default. If not provided, the `dark` color is used as default for high contrast dark themes.", + "The default color for high contrast light themes. Either a color value in hex (#RRGGBB[AA]) or the identifier of a themable color which provides the default. If not provided, the `light` color is used as default for high contrast light themes.", + "'configuration.colors' must be a array", + "{0} must be either a color value in hex (#RRGGBB[AA] or #RGB[A]) or the identifier of a themable color which provides the default.", + "'configuration.colors.id' must be defined and can not be empty", + "'configuration.colors.id' must only contain letters, digits and dots and can not start with a dot", + "'configuration.colors.description' must be defined and can not be empty", + "'configuration.colors.defaults' must be defined and must contain 'light' and 'dark'", + "If defined, 'configuration.colors.defaults.highContrast' must be a string.", + "If defined, 'configuration.colors.defaults.highContrastLight' must be a string." + ], "vs/workbench/services/themes/common/iconExtensionPoint": [ "Contributes extension defined themable icons", "The identifier of the themable icon", @@ -21505,6 +21817,46 @@ "Expected `contributes.icons.default.fontPath` ({0}) to be included inside extension's folder ({0}).", "'configuration.icons.default' must be either a reference to the id of an other theme icon (string) or a icon definition (object) with properties `fontPath` and `fontCharacter`." ], + "vs/workbench/services/themes/common/tokenClassificationExtensionPoint": [ + "Contributes semantic token types.", + "The identifier of the semantic token type", + "Identifiers should be in the form letterOrDigit[_-letterOrDigit]*", + "The super type of the semantic token type", + "Super types should be in the form letterOrDigit[_-letterOrDigit]*", + "The description of the semantic token type", + "Contributes semantic token modifiers.", + "The identifier of the semantic token modifier", + "Identifiers should be in the form letterOrDigit[_-letterOrDigit]*", + "The description of the semantic token modifier", + "Contributes semantic token scope maps.", + "Lists the languge for which the defaults are.", + "Maps a semantic token (described by semantic token selector) to one or more textMate scopes used to represent that token.", + "'configuration.{0}.id' must be defined and can not be empty", + "'configuration.{0}.id' must follow the pattern letterOrDigit[-_letterOrDigit]*", + "'configuration.{0}.superType' must follow the pattern letterOrDigit[-_letterOrDigit]*", + "'configuration.{0}.description' must be defined and can not be empty", + "'configuration.semanticTokenType' must be an array", + "'configuration.semanticTokenModifier' must be an array", + "'configuration.semanticTokenScopes' must be an array", + "'configuration.semanticTokenScopes.language' must be a string", + "'configuration.semanticTokenScopes.scopes' must be defined as an object", + "'configuration.semanticTokenScopes.scopes' values must be an array of strings", + "configuration.semanticTokenScopes.scopes': Problems parsing selector {0}." + ], + "vs/workbench/api/browser/statusBarExtensionPoint": [ + "The identifier of the status bar entry. Must be unique within the extension. The same value must be used when calling the `vscode.window.createStatusBarItem(id, ...)`-API", + "The name of the entry, like 'Python Language Indicator', 'Git Status' etc. Try to keep the length of the name short, yet descriptive enough that users can understand what the status bar item is about.", + "The text to show for the entry. You can embed icons in the text by leveraging the `$()`-syntax, like 'Hello $(globe)!'", + "The tooltip text for the entry.", + "The command to execute when the status bar entry is clicked.", + "The alignment of the status bar entry.", + "The priority of the status bar entry. Higher value means the item should be shown more to the left.", + "Defines the role and aria label to be used when the status bar entry is focused.", + "The role of the status bar entry which defines how a screen reader interacts with it. More about aria roles can be found here https://w3c.github.io/aria/#widget_roles", + "The aria label of the status bar entry. Defaults to the entry's text.", + "Contributes items to the status bar.", + "Invalid status bar item contribution." + ], "vs/workbench/contrib/codeEditor/browser/languageConfigurationExtensionPoint": [ "Errors parsing {0}: {1}", "{0}: Invalid format, JSON object expected.", @@ -21570,41 +21922,8 @@ "Describes text to be appended after the new line and after the indentation.", "Describes the number of characters to remove from the new line's indentation." ], - "vs/workbench/api/browser/statusBarExtensionPoint": [ - "The identifier of the status bar entry. Must be unique within the extension. The same value must be used when calling the `vscode.window.createStatusBarItem(id, ...)`-API", - "The name of the entry, like 'Python Language Indicator', 'Git Status' etc. Try to keep the length of the name short, yet descriptive enough that users can understand what the status bar item is about.", - "The text to show for the entry. You can embed icons in the text by leveraging the `$()`-syntax, like 'Hello $(globe)!'", - "The command to execute when the status bar entry is clicked.", - "The alignment of the status bar entry.", - "The priority of the status bar entry. Higher value means the item should be shown more to the left.", - "Contributes items to the status bar.", - "Invalid status bar item contribution." - ], - "vs/workbench/services/themes/common/tokenClassificationExtensionPoint": [ - "Contributes semantic token types.", - "The identifier of the semantic token type", - "Identifiers should be in the form letterOrDigit[_-letterOrDigit]*", - "The super type of the semantic token type", - "Super types should be in the form letterOrDigit[_-letterOrDigit]*", - "The description of the semantic token type", - "Contributes semantic token modifiers.", - "The identifier of the semantic token modifier", - "Identifiers should be in the form letterOrDigit[_-letterOrDigit]*", - "The description of the semantic token modifier", - "Contributes semantic token scope maps.", - "Lists the languge for which the defaults are.", - "Maps a semantic token (described by semantic token selector) to one or more textMate scopes used to represent that token.", - "'configuration.{0}.id' must be defined and can not be empty", - "'configuration.{0}.id' must follow the pattern letterOrDigit[-_letterOrDigit]*", - "'configuration.{0}.superType' must follow the pattern letterOrDigit[-_letterOrDigit]*", - "'configuration.{0}.description' must be defined and can not be empty", - "'configuration.semanticTokenType' must be an array", - "'configuration.semanticTokenModifier' must be an array", - "'configuration.semanticTokenScopes' must be an array", - "'configuration.semanticTokenScopes.language' must be a string", - "'configuration.semanticTokenScopes.scopes' must be defined as an object", - "'configuration.semanticTokenScopes.scopes' values must be an array of strings", - "configuration.semanticTokenScopes.scopes': Problems parsing selector {0}." + "vs/workbench/api/browser/mainThreadCLICommands": [ + "Cannot install the '{0}' extension because it is declared to not run in this setup." ], "vs/workbench/api/browser/mainThreadExtensionService": [ "Cannot activate the '{0}' extension because it depends on the '{1}' extension, which is not loaded. Would you like to reload the window to load the extension?", @@ -21619,16 +21938,6 @@ "Install and Reload", "Cannot activate the '{0}' extension because it depends on an unknown '{1}' extension." ], - "vs/workbench/api/browser/mainThreadCLICommands": [ - "Cannot install the '{0}' extension because it is declared to not run in this setup." - ], - "vs/workbench/api/browser/mainThreadMessageService": [ - "{0} (Extension)", - "Extension", - "Manage Extension", - "Cancel", - "&&OK" - ], "vs/workbench/api/browser/mainThreadFileSystemEventService": [ "Extension '{0}' wants to make refactoring changes with this file creation", "Extension '{0}' wants to make refactoring changes with this file copy", @@ -21654,38 +21963,16 @@ "vs/workbench/api/browser/mainThreadProgress": [ "Manage Extension" ], - "vs/workbench/services/themes/common/colorExtensionPoint": [ - "Contributes extension defined themable colors", - "The identifier of the themable color", - "Identifiers must only contain letters, digits and dots and can not start with a dot", - "The description of the themable color", - "The default color for light themes. Either a color value in hex (#RRGGBB[AA]) or the identifier of a themable color which provides the default.", - "The default color for dark themes. Either a color value in hex (#RRGGBB[AA]) or the identifier of a themable color which provides the default.", - "The default color for high contrast dark themes. Either a color value in hex (#RRGGBB[AA]) or the identifier of a themable color which provides the default. If not provided, the `dark` color is used as default for high contrast dark themes.", - "The default color for high contrast light themes. Either a color value in hex (#RRGGBB[AA]) or the identifier of a themable color which provides the default. If not provided, the `light` color is used as default for high contrast light themes.", - "'configuration.colors' must be a array", - "{0} must be either a color value in hex (#RRGGBB[AA] or #RGB[A]) or the identifier of a themable color which provides the default.", - "'configuration.colors.id' must be defined and can not be empty", - "'configuration.colors.id' must only contain letters, digits and dots and can not start with a dot", - "'configuration.colors.description' must be defined and can not be empty", - "'configuration.colors.defaults' must be defined and must contain 'light' and 'dark'", - "If defined, 'configuration.colors.defaults.highContrast' must be a string.", - "If defined, 'configuration.colors.defaults.highContrastLight' must be a string." + "vs/workbench/api/browser/mainThreadMessageService": [ + "{0} (Extension)", + "Extension", + "Manage Extension", + "Cancel", + "&&OK" ], "vs/workbench/api/browser/mainThreadSaveParticipant": [ "Aborted onWillSaveTextDocument-event after 1750ms" ], - "vs/workbench/api/common/jsonValidationExtensionPoint": [ - "Contributes json schema configuration.", - "The file pattern (or an array of patterns) to match, for example \"package.json\" or \"*.launch\". Exclusion patterns start with '!'", - "A schema URL ('http:', 'https:') or relative path to the extension folder ('./').", - "'configuration.jsonValidation' must be a array", - "'configuration.jsonValidation.fileMatch' must be defined as a string or an array of strings.", - "'configuration.jsonValidation.url' must be a URL or relative path", - "Expected `contributes.{0}.url` ({1}) to be included inside extension's folder ({2}). This might make the extension non-portable.", - "'configuration.jsonValidation.url' is an invalid relative URL: {0}", - "'configuration.jsonValidation.url' must be an absolute URL or start with './' to reference schemas located in the extension." - ], "vs/workbench/api/browser/mainThreadEditSessionIdentityParticipant": [ "Aborted onWillCreateEditSessionIdentity-event after 10000ms" ], @@ -21875,6 +22162,14 @@ "Whether collapse all is toggled for the tree view with id {0}.", "Error running command {1}: {0}. This is likely caused by the extension that contributes {1}." ], + "vs/workbench/browser/parts/views/viewPaneContainer": [ + "Views", + "Move View Up", + "Move View Left", + "Move View Down", + "Move View Right", + "Move Views" + ], "vs/workbench/contrib/debug/common/debug": [ "Debug type of the active debug session. For example 'python'.", "Debug type of the selected launch configuration. For example 'python'.", @@ -21919,7 +22214,7 @@ "True when the focused session supports the terminate debuggee capability.", "True when the focused session supports the suspend debuggee capability.", "True when the focused variable has an 'evalauteName' field set.", - "True when the focused variable is readonly.", + "True when the focused variable is read-only.", "True when the exception widget is visible.", "True when there is more than 1 debug console.", "True when there is more than 1 active debug session.", @@ -21930,19 +22225,11 @@ "Configured debug type '{0}' is installed but not supported in this environment.", "Controls when the internal Debug Console should open." ], - "vs/workbench/browser/parts/views/viewPaneContainer": [ - "Views", - "Move View Up", - "Move View Left", - "Move View Down", - "Move View Right", - "Move Views" - ], "vs/workbench/contrib/files/common/files": [ "True when the EXPLORER viewlet is visible.", "True when the FOLDERS view (the file tree within the explorer view container) is visible.", "True when the focused item in the EXPLORER is a folder.", - "True when the focused item in the EXPLORER is readonly.", + "True when the focused item in the EXPLORER is read-only.", "True when the focused item in the EXPLORER is a root folder.", "True when an item in the EXPLORER has been cut for cut and paste.", "True when the focused item in the EXPLORER can be moved to trash.", @@ -21967,21 +22254,12 @@ "Make Public", "Use Port {0} as Sudo..." ], - "vs/workbench/browser/parts/editor/editorGroupView": [ - "Empty editor group actions", - "{0} (empty)", - "Group {0}", - "Editor Group {0}" - ], - "vs/workbench/browser/parts/editor/editorDropTarget": [ - "Hold __{0}__ to drop into editor" + "vs/workbench/common/editor/sideBySideEditorInput": [ + "{0} - {1}" ], "vs/workbench/browser/parts/editor/sideBySideEditor": [ "Side by Side Editor" ], - "vs/workbench/common/editor/sideBySideEditorInput": [ - "{0} - {1}" - ], "vs/workbench/common/editor/diffEditorInput": [ "{0} ↔ {1}" ], @@ -21993,34 +22271,6 @@ "vs/workbench/browser/parts/editor/binaryDiffEditor": [ "{0} ↔ {1}" ], - "vs/workbench/browser/parts/editor/editorCommands": [ - "Move the active editor by tabs or groups", - "Active editor move argument", - "Argument Properties:\n\t* 'to': String value providing where to move.\n\t* 'by': String value providing the unit for move (by tab or by group).\n\t* 'value': Number value providing how many positions or an absolute position to move.", - "Copy the active editor by groups", - "Active editor copy argument", - "Argument Properties:\n\t* 'to': String value providing where to copy.\n\t* 'value': Number value providing how many positions or an absolute position to copy.", - "Toggle Inline View", - "Compare", - "Split Editor in Group", - "Join Editor in Group", - "Toggle Split Editor in Group", - "Toggle Layout of Split Editor in Group", - "Focus First Side in Active Editor", - "Focus Second Side in Active Editor", - "Focus Other Side in Active Editor", - "Toggle Editor Group Lock", - "Lock Editor Group", - "Unlock Editor Group" - ], - "vs/editor/browser/editorExtensions": [ - "&&Undo", - "Undo", - "&&Redo", - "Redo", - "&&Select All", - "Select All" - ], "vs/workbench/browser/parts/editor/editorStatus": [ "Ln {0}, Col {1} ({2} selected)", "Ln {0}, Col {1}", @@ -22201,33 +22451,79 @@ "Toggle Editor Type", "Reopen Editor With Text Editor" ], - "vs/workbench/browser/parts/editor/editorQuickAccess": [ - "No matching editors", - "{0}, unsaved changes, {1}", - "{0}, {1}", - "{0}, unsaved changes", - "Close Editor" - ], - "vs/workbench/browser/parts/editor/editorConfiguration": [ - "Interactive Window", - "Markdown Preview", - "If an editor matching one of the listed types is opened as the first in an editor group and more than one group is open, the group is automatically locked. Locked groups will only be used for opening editors when explicitly chosen by a user gesture (for example drag and drop), but not by default. Consequently, the active editor in a locked group is less likely to be replaced accidentally with a different editor.", - "The default editor for files detected as binary. If undefined, the user will be presented with a picker.", - "Configure glob patterns to editors (for example `\"*.hex\": \"hexEditor.hexedit\"`). These have precedence over the default behavior.", - "Controls the minimum size of a file in MB before asking for confirmation when opening in the editor. Note that this setting may not apply to all editor types and environments." - ], - "vs/workbench/browser/parts/editor/accessibilityStatus": [ - "Are you using a screen reader to operate VS Code?", - "Yes", - "No", - "Screen Reader Optimized", - "Screen Reader Mode" + "vs/editor/browser/editorExtensions": [ + "&&Undo", + "Undo", + "&&Redo", + "Redo", + "&&Select All", + "Select All" ], - "vs/workbench/browser/parts/activitybar/activitybarPart": [ - "Settings icon in the view bar.", - "Accounts icon in the view bar.", - "Menu", - "Hide Menu", + "vs/workbench/browser/parts/editor/editorCommands": [ + "Move the active editor by tabs or groups", + "Active editor move argument", + "Argument Properties:\n\t* 'to': String value providing where to move.\n\t* 'by': String value providing the unit for move (by tab or by group).\n\t* 'value': Number value providing how many positions or an absolute position to move.", + "Copy the active editor by groups", + "Active editor copy argument", + "Argument Properties:\n\t* 'to': String value providing where to copy.\n\t* 'value': Number value providing how many positions or an absolute position to copy.", + "Toggle Inline View", + "Compare", + "Split Editor in Group", + "Join Editor in Group", + "Toggle Split Editor in Group", + "Toggle Layout of Split Editor in Group", + "Focus First Side in Active Editor", + "Focus Second Side in Active Editor", + "Focus Other Side in Active Editor", + "Toggle Editor Group Lock", + "Lock Editor Group", + "Unlock Editor Group" + ], + "vs/workbench/browser/parts/editor/editorConfiguration": [ + "Interactive Window", + "Markdown Preview", + "If an editor matching one of the listed types is opened as the first in an editor group and more than one group is open, the group is automatically locked. Locked groups will only be used for opening editors when explicitly chosen by a user gesture (for example drag and drop), but not by default. Consequently, the active editor in a locked group is less likely to be replaced accidentally with a different editor.", + "The default editor for files detected as binary. If undefined, the user will be presented with a picker.", + "Configure [glob patterns](https://aka.ms/vscode-glob-patterns) to editors (for example `\"*.hex\": \"hexEditor.hexedit\"`). These have precedence over the default behavior.", + "Controls the minimum size of a file in MB before asking for confirmation when opening in the editor. Note that this setting may not apply to all editor types and environments." + ], + "vs/workbench/browser/parts/editor/editorQuickAccess": [ + "No matching editors", + "{0}, unsaved changes, {1}", + "{0}, {1}", + "{0}, unsaved changes", + "Close Editor" + ], + "vs/workbench/browser/parts/editor/accessibilityStatus": [ + "Are you using a screen reader to operate VS Code?", + "Yes", + "No", + "Screen Reader Optimized", + "Screen Reader Mode" + ], + "vs/editor/browser/widget/diffEditorWidget2/diffEditorWidget2.contribution": [ + "Toggle Collapse Unchanged Regions", + "Show Unchanged Regions", + "Collapse Unchanged Regions", + "Toggle Show Moved Code Blocks", + "Show Moves" + ], + "vs/workbench/browser/parts/editor/editorGroupView": [ + "Empty editor group actions", + "{0} (empty)", + "Group {0}", + "Editor Group {0}" + ], + "vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart": [ + "Move Secondary Side Bar Left", + "Move Secondary Side Bar Right", + "Hide Secondary Side Bar" + ], + "vs/workbench/browser/parts/activitybar/activitybarPart": [ + "Settings icon in the view bar.", + "Accounts icon in the view bar.", + "Menu", + "Hide Menu", "Accounts", "Hide Activity Bar", "Reset Location", @@ -22237,11 +22533,6 @@ "Accounts", "Accounts" ], - "vs/editor/browser/widget/diffEditorWidget2/diffEditorWidget2.contribution": [ - "Toggle Collapse Unchanged Regions", - "Collapse Unchanged Regions", - "Show Unchanged Regions" - ], "vs/workbench/browser/parts/panel/panelPart": [ "Reset Location", "Reset Location", @@ -22251,21 +22542,19 @@ "Align Panel", "Hide Panel" ], - "vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart": [ - "Move Secondary Side Bar Left", - "Move Secondary Side Bar Right", - "Hide Secondary Side Bar" + "vs/workbench/browser/parts/editor/editorDropTarget": [ + "Hold __{0}__ to drop into editor" ], "vs/workbench/browser/parts/statusbar/statusbarActions": [ "Hide '{0}'", "Focus Status Bar" ], - "vs/platform/actions/common/menuService": [ - "Hide '{0}'" - ], "vs/platform/actions/common/menuResetAction": [ "Reset All Menus" ], + "vs/platform/actions/common/menuService": [ + "Hide '{0}'" + ], "vs/base/browser/ui/dialog/dialog": [ "OK", "Info", @@ -22288,7 +22577,7 @@ "File Encoding Changed" ], "vs/workbench/services/editor/common/editorResolverService": [ - "Configure glob patterns to editors (for example `\"*.hex\": \"hexEditor.hexedit\"`). These have precedence over the default behavior." + "Configure [glob patterns](https://aka.ms/vscode-glob-patterns) to editors (for example `\"*.hex\": \"hexEditor.hexedit\"`). These have precedence over the default behavior." ], "vs/base/common/keybindingLabels": [ "Ctrl", @@ -22386,6 +22675,21 @@ "Expected string in `contributes.{0}.id`. Provided value: {1}", "Expected `contributes.{0}.path` ({1}) to be included inside extension's folder ({2}). This might make the extension non-portable." ], + "vs/workbench/services/themes/common/colorThemeSchema": [ + "Colors and styles for the token.", + "Foreground color for the token.", + "Token background colors are currently not supported.", + "Font style of the rule: 'italic', 'bold', 'underline', 'strikethrough' or a combination. The empty string unsets inherited settings.", + "Font style must be 'italic', 'bold', 'underline', 'strikethrough' or a combination or the empty string.", + "None (clear inherited style)", + "Description of the rule.", + "Scope selector against which this rule matches.", + "Colors in the workbench", + "Path to a tmTheme file (relative to the current file).", + "Colors for syntax highlighting", + "Whether semantic highlighting should be enabled for this theme.", + "Colors for semantic tokens" + ], "vs/workbench/services/themes/common/themeConfiguration": [ "Specifies the color theme used in the workbench.", "Theme is unknown or not installed.", @@ -22424,21 +22728,6 @@ "Semantic token styling rules for this theme.", "Overrides editor semantic token color and styles from the currently selected color theme." ], - "vs/workbench/services/themes/common/colorThemeSchema": [ - "Colors and styles for the token.", - "Foreground color for the token.", - "Token background colors are currently not supported.", - "Font style of the rule: 'italic', 'bold', 'underline', 'strikethrough' or a combination. The empty string unsets inherited settings.", - "Font style must be 'italic', 'bold', 'underline', 'strikethrough' or a combination or the empty string.", - "None (clear inherited style)", - "Description of the rule.", - "Scope selector against which this rule matches.", - "Colors in the workbench", - "Path to a tmTheme file (relative to the current file).", - "Colors for syntax highlighting", - "Whether semantic highlighting should be enabled for this theme.", - "Colors for semantic tokens" - ], "vs/workbench/services/themes/browser/productIconThemeData": [ "Problems processing product icons definitions in {0}:\n{1}", "Default", @@ -22453,7 +22742,19 @@ "Skipping icon definition '{0}'. Unknown font.", "Skipping icon definition '{0}'. Unknown fontCharacter." ], + "vs/workbench/services/themes/common/productIconThemeSchema": [ + "The ID of the font.", + "The ID must only contain letters, numbers, underscore and minus.", + "The location of the font.", + "The font path, relative to the current product icon theme file.", + "The format of the font.", + "The weight of the font. See https://developer.mozilla.org/en-US/docs/Web/CSS/font-weight for valid values.", + "The style of the font. See https://developer.mozilla.org/en-US/docs/Web/CSS/font-style for valid values.", + "Association of icon name to a font character." + ], "vs/workbench/services/extensionManagement/browser/extensionBisect": [ + "I can't reproduce", + "I can reproduce", "Extension Bisect is active and has disabled 1 extension. Check if you can still reproduce the problem and proceed by selecting from these options.", "Extension Bisect is active and has disabled {0} extensions. Check if you can still reproduce the problem and proceed by selecting from these options.", "Start Extension Bisect", @@ -22470,22 +22771,12 @@ "Keep this extension disabled", "Extension Bisect", "Extension Bisect is active and has disabled {0} extensions. Check if you can still reproduce the problem and proceed by selecting from these options.", - "&&Good now", - "This is &&bad", + "I ca&&n't reproduce", + "I can &&reproduce", "&&Stop Bisect", "&&Cancel Bisect", "Stop Extension Bisect" ], - "vs/workbench/services/themes/common/productIconThemeSchema": [ - "The ID of the font.", - "The ID must only contain letters, numbers, underscore and minus.", - "The location of the font.", - "The font path, relative to the current product icon theme file.", - "The format of the font.", - "The weight of the font. See https://developer.mozilla.org/en-US/docs/Web/CSS/font-weight for valid values.", - "The style of the font. See https://developer.mozilla.org/en-US/docs/Web/CSS/font-style for valid values.", - "Association of icon name to a font character." - ], "vs/workbench/services/userDataProfile/browser/settingsResource": [ "Settings" ], @@ -22498,20 +22789,23 @@ "vs/workbench/services/userDataProfile/browser/tasksResource": [ "User Tasks" ], - "vs/workbench/services/userDataProfile/browser/globalStateResource": [ - "UI State" - ], "vs/workbench/services/userDataProfile/browser/extensionsResource": [ "Extensions", "Disabled", "Select {0} Extension" ], + "vs/workbench/services/userDataProfile/browser/globalStateResource": [ + "UI State" + ], "vs/workbench/services/workingCopy/common/storedFileWorkingCopySaveParticipant": [ "Saving '{0}'" ], "vs/workbench/services/views/common/viewContainerModel": [ "Views" ], + "vs/workbench/services/hover/browser/hoverWidget": [ + "Hold {0} key to mouse over" + ], "vs/workbench/services/textMate/browser/textMateTokenizationFeatureImpl": [ "Already Logging.", "Stop", @@ -22525,6 +22819,12 @@ "Invalid value in `contributes.{0}.tokenTypes`. Must be an object map from scope name to token type. Provided value: {1}", "Expected `contributes.{0}.path` ({1}) to be included inside extension's folder ({2}). This might make the extension non-portable." ], + "vs/workbench/contrib/preferences/browser/keybindingWidgets": [ + "Press desired key combination and then press ENTER.", + "1 existing command has this keybinding", + "{0} existing commands have this keybinding", + "chord to" + ], "vs/editor/contrib/suggest/browser/suggest": [ "Whether any suggestion is focused", "Whether suggestion details are visible", @@ -22535,6 +22835,11 @@ "Whether the default behaviour is to insert or replace", "Whether the current suggestion supports to resolve further details" ], + "vs/workbench/contrib/preferences/browser/preferencesActions": [ + "Configure Language Specific Settings...", + "({0})", + "Select Language" + ], "vs/workbench/contrib/preferences/browser/keybindingsEditor": [ "Record Keys", "Sort by Precedence (Highest first)", @@ -22570,14 +22875,6 @@ "No when context", "use space or enter to change the keybinding." ], - "vs/workbench/contrib/preferences/browser/preferencesActions": [ - "Configure Language Specific Settings...", - "({0})", - "Select Language" - ], - "vs/workbench/services/hover/browser/hoverWidget": [ - "Hold {0} key to mouse over" - ], "vs/workbench/contrib/preferences/browser/preferencesIcons": [ "Icon for the folder dropdown button in the split JSON Settings editor.", "Icon for the 'more actions' action in the Settings UI.", @@ -22592,6 +22889,13 @@ "Icon for the button that suggests filters for the Settings UI.", "Icon for open settings commands." ], + "vs/workbench/contrib/preferences/common/preferencesContribution": [ + "Split Settings Editor", + "Controls whether to enable the natural language search mode for settings. The natural language search is provided by a Microsoft online service.", + "Hide the Table of Contents while searching.", + "Filter the Table of Contents to just categories that have matching settings. Clicking a category will filter the results to that category.", + "Controls the behavior of the settings editor Table of Contents while searching." + ], "vs/workbench/contrib/preferences/browser/settingsEditor2": [ "Search settings", "Clear Settings Search Input", @@ -22606,19 +22910,6 @@ "Turn on Settings Sync", "Last synced: {0}" ], - "vs/workbench/contrib/preferences/common/preferencesContribution": [ - "Split Settings Editor", - "Controls whether to enable the natural language search mode for settings. The natural language search is provided by a Microsoft online service.", - "Hide the Table of Contents while searching.", - "Filter the Table of Contents to just categories that have matching settings. Clicking a category will filter the results to that category.", - "Controls the behavior of the settings editor Table of Contents while searching." - ], - "vs/workbench/contrib/preferences/browser/keybindingWidgets": [ - "Press desired key combination and then press ENTER.", - "1 existing command has this keybinding", - "{0} existing commands have this keybinding", - "chord to" - ], "vs/workbench/contrib/performance/browser/perfviewEditor": [ "Startup Performance" ], @@ -22630,20 +22921,68 @@ "Open As Text", "Open in Text Editor" ], + "vs/workbench/contrib/notebook/common/notebookEditorInput": [ + "Notebook '{0}' could not be saved." + ], "vs/workbench/contrib/notebook/browser/services/notebookServiceImpl": [ "Install extension for '{0}'" ], "vs/workbench/contrib/notebook/browser/diff/notebookDiffEditor": [ "Notebook Text Diff" ], + "vs/workbench/contrib/notebook/browser/services/notebookExecutionServiceImpl": [ + "Executing a notebook cell will run code from this workspace." + ], + "vs/workbench/contrib/notebook/browser/services/notebookKeymapServiceImpl": [ + "Disable other keymaps ({0}) to avoid conflicts between keybindings?", + "Yes", + "No" + ], + "vs/editor/common/languages/modesRegistry": [ + "Plain Text" + ], "vs/workbench/contrib/comments/browser/commentReply": [ "Reply...", "Type a new comment", "Reply...", "Reply..." ], - "vs/editor/common/languages/modesRegistry": [ - "Plain Text" + "vs/workbench/contrib/notebook/browser/services/notebookKernelHistoryServiceImpl": [ + "Clear Notebook Kernels MRU Cache" + ], + "vs/workbench/contrib/notebook/browser/services/notebookLoggingServiceImpl": [ + "Notebook rendering" + ], + "vs/workbench/contrib/accessibility/browser/accessibilityContribution": [ + "Accessibility", + "Provide information about how to access the terminal accessibility help menu when the terminal is focused", + "Provide information about how to navigate changes in the diff editor when it is focused", + "Provide information about how to access the chat help menu when the chat input is focused", + "Provide information about how to access the inline editor chat accessibility help menu when the input is focused", + "Provide information about how to change a keybinding in the keybindings editor when a row is focused", + "Provide information about how to focus the cell container or inner editor when a notebook cell is focused.", + "Open Accessibility Help", + "Open Accessible View" + ], + "vs/workbench/contrib/notebook/browser/controller/coreActions": [ + "Notebook", + "Insert Cell", + "Notebook Cell", + "Share" + ], + "vs/workbench/contrib/notebook/browser/notebookAccessibilityHelp": [ + "The notebook view is a collection of code and markdown cells. Code cells can be executed and will produce output directly below the cell.", + "The Edit Cell command ({0}) will focus on the cell input.", + "The Edit Cell command will focus on the cell input and is currently not triggerable by a keybinding.", + "The Quit Edit command ({0}) will set focus on the cell container. The default (Escape) key may need to be pressed twice first exit the virtual cursor if active.", + "The Quit Edit command will set focus on the cell container and is currently not triggerable by a keybinding.", + "The Focus Output command ({0}) will set focus in the cell's output.", + "The Quit Edit command will set focus in the cell's output and is currently not triggerable by a keybinding.", + "The up and down arrows will move focus between cells while focused on the outer cell container", + "The Execute Cell command ({0}) executes the cell that currently has focus.", + "The Execute Cell command executes the cell that currently has focus and is currently not triggerable by a keybinding.", + "The Insert Cell Above/Below commands will create new empty code cells", + "The Change Cell to Code/Markdown commands are used to switch between cell types." ], "vs/workbench/contrib/notebook/browser/controller/insertCellActions": [ "Insert Code Cell Above", @@ -22671,30 +23010,6 @@ "Markdown", "Add Markdown Cell" ], - "vs/workbench/contrib/notebook/browser/controller/coreActions": [ - "Notebook", - "Insert Cell", - "Notebook Cell", - "Share" - ], - "vs/workbench/contrib/notebook/browser/services/notebookExecutionServiceImpl": [ - "Executing a notebook cell will run code from this workspace." - ], - "vs/workbench/contrib/notebook/browser/controller/layoutActions": [ - "Select between Notebook Layouts", - "Customize Notebook Layout", - "Customize Notebook Layout", - "Customize Notebook...", - "Toggle Notebook Line Numbers", - "Notebook Line Numbers", - "Toggle Cell Toolbar Position", - "Toggle Breadcrumbs", - "Save Mimetype Display Order", - "Settings file to save in", - "User Settings", - "Workspace Settings", - "Reset Notebook Webview" - ], "vs/workbench/contrib/notebook/browser/controller/executeActions": [ "Render All Markdown Cells", "Run All", @@ -22737,25 +23052,26 @@ "Accept Detected Language for Cell", "Unable to detect cell language" ], + "vs/workbench/contrib/notebook/browser/controller/layoutActions": [ + "Select between Notebook Layouts", + "Customize Notebook Layout", + "Customize Notebook Layout", + "Customize Notebook...", + "Toggle Notebook Line Numbers", + "Notebook Line Numbers", + "Toggle Cell Toolbar Position", + "Toggle Breadcrumbs", + "Save Mimetype Display Order", + "Settings file to save in", + "User Settings", + "Workspace Settings", + "Reset Notebook Webview" + ], "vs/workbench/contrib/notebook/browser/controller/foldingController": [ "Fold Cell", "Unfold Cell", "Fold Cell" ], - "vs/workbench/contrib/notebook/browser/services/notebookKeymapServiceImpl": [ - "Disable other keymaps ({0}) to avoid conflicts between keybindings?", - "Yes", - "No" - ], - "vs/workbench/contrib/notebook/browser/services/notebookLoggingServiceImpl": [ - "Notebook rendering" - ], - "vs/workbench/contrib/notebook/browser/contrib/format/formatting": [ - "Format Notebook", - "Format Notebook", - "Format Cell", - "Format Cells" - ], "vs/workbench/contrib/notebook/browser/contrib/clipboard/notebookClipboard": [ "Copy Cell", "Cut Cell", @@ -22763,8 +23079,15 @@ "Paste Cell Above", "Toggle Notebook Clipboard Troubleshooting" ], - "vs/workbench/contrib/notebook/browser/services/notebookKernelHistoryServiceImpl": [ - "Clear Notebook Kernels MRU Cache" + "vs/workbench/contrib/notebook/browser/contrib/find/notebookFind": [ + "Hide Find in Notebook", + "Find in Notebook" + ], + "vs/workbench/contrib/notebook/browser/contrib/format/formatting": [ + "Format Notebook", + "Format Notebook", + "Format Cell", + "Format Cells" ], "vs/workbench/contrib/notebook/browser/contrib/saveParticipants/saveParticipants": [ "Formatting", @@ -22774,28 +23097,9 @@ "Getting code actions from '{0}' ([configure]({1})).", "Applying code action '{0}'." ], - "vs/workbench/contrib/notebook/browser/contrib/gettingStarted/notebookGettingStarted": [ - "Reset notebook getting started" - ], "vs/workbench/contrib/notebook/browser/contrib/layout/layoutActions": [ "Toggle Cell Toolbar Position" ], - "vs/workbench/contrib/notebook/browser/contrib/find/notebookFind": [ - "Hide Find in Notebook", - "Find in Notebook" - ], - "vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/statusBarProviders": [ - "Select Cell Language Mode", - "Accept Detected Language: {0}" - ], - "vs/workbench/contrib/notebook/browser/contrib/profile/notebookProfile": [ - "Set Profile" - ], - "vs/workbench/contrib/notebook/browser/contrib/outline/notebookOutline": [ - "empty cell", - "When enabled notebook outline shows code cells.", - "When enabled notebook breadcrumbs contain code cells." - ], "vs/workbench/contrib/notebook/browser/contrib/navigation/arrow": [ "Focus Next Cell Editor", "Focus Previous Cell Editor", @@ -22810,6 +23114,29 @@ "Cell Cursor Page Down Select", "When enabled cursor can navigate to the next/previous cell when the current cursor in the cell editor is at the first/last line." ], + "vs/workbench/contrib/notebook/browser/contrib/outline/notebookOutline": [ + "empty cell", + "When enabled notebook outline shows code cells.", + "When enabled notebook breadcrumbs contain code cells." + ], + "vs/workbench/contrib/notebook/browser/contrib/gettingStarted/notebookGettingStarted": [ + "Reset notebook getting started" + ], + "vs/workbench/contrib/notebook/browser/contrib/profile/notebookProfile": [ + "Set Profile" + ], + "vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/statusBarProviders": [ + "Select Cell Language Mode", + "Accept Detected Language: {0}" + ], + "vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/executionStatusBarItemController": [ + "Success", + "Failed", + "Pending", + "Executing", + "Use the links above to file an issue using the issue reporter.", + "**Last Execution** {0}\n\n**Execution Time** {1}\n\n**Overhead Time** {2}\n\n**Render Times**\n\n{3}" + ], "vs/workbench/contrib/notebook/browser/contrib/editorStatusBar/editorStatusBar": [ "Notebook Kernel Info", "{0} (suggestion)", @@ -22820,25 +23147,52 @@ "Cell {0} ({1} selected)", "Cell {0} of {1}" ], - "vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/executionStatusBarItemController": [ - "Success", - "Failed", - "Pending", - "Executing", - "Use the links above to file an issue using the issue reporter.", - "**Last Execution** {0}\n\n**Execution Time** {1}\n\n**Overhead Time** {2}\n\n**Render Times**\n\n{3}" + "vs/workbench/contrib/notebook/browser/contrib/cellCommands/cellCommands": [ + "Move Cell Up", + "Move Cell Down", + "Copy Cell Up", + "Copy Cell Down", + "Split Cell", + "Join With Previous Cell", + "Join With Next Cell", + "Join Selected Cells", + "Change Cell to Code", + "Change Cell to Markdown", + "Collapse Cell Input", + "Expand Cell Input", + "Collapse Cell Output", + "Expand Cell Output", + "Toggle Outputs", + "Toggle Outputs", + "Collapse All Cell Inputs", + "Expand All Cell Inputs", + "Collapse All Cell Outputs", + "Expand All Cell Outputs", + "Toggle Scroll Cell Output" ], "vs/workbench/contrib/notebook/browser/contrib/troubleshoot/layout": [ "Toggle Layout Troubleshoot", "Inspect Notebook Layout", "Clear Notebook Editor Type Cache" ], + "vs/workbench/contrib/notebook/browser/diff/notebookDiffActions": [ + "Open Text Diff Editor", + "Revert Metadata", + "Switch Output Rendering", + "Revert Outputs", + "Revert Input", + "Show Outputs Differences", + "Show Metadata Differences", + "Show Previous Change", + "Show Next Change", + "Hide Metadata Differences", + "Hide Outputs Differences" + ], "vs/workbench/contrib/chat/browser/actions/chatActions": [ "Chat", "Accept Chat Input", "Clear Input History", "Focus Chat List", - "Chat View Accessibility Help", "Focus Chat Input", "Open Editor ({0})", "Show History", @@ -22857,29 +23211,6 @@ "Copy All", "Copy" ], - "vs/workbench/contrib/notebook/browser/contrib/cellCommands/cellCommands": [ - "Move Cell Up", - "Move Cell Down", - "Copy Cell Up", - "Copy Cell Down", - "Split Cell", - "Join With Previous Cell", - "Join With Next Cell", - "Join Selected Cells", - "Change Cell to Code", - "Change Cell to Markdown", - "Collapse Cell Input", - "Expand Cell Input", - "Collapse Cell Output", - "Expand Cell Output", - "Toggle Outputs", - "Toggle Outputs", - "Collapse All Cell Inputs", - "Expand All Cell Inputs", - "Collapse All Cell Outputs", - "Expand All Cell Outputs", - "Toggle Scroll Cell Output" - ], "vs/workbench/contrib/chat/browser/actions/chatExecuteActions": [ "Submit", "Cancel" @@ -22888,17 +23219,17 @@ "Ask Quick Question", "Ask {0} a question..." ], + "vs/workbench/contrib/chat/browser/actions/chatTitleActions": [ + "Helpful", + "Unhelpful", + "Insert into Notebook", + "Remove Request and Response" + ], "vs/workbench/contrib/chat/browser/actions/chatImportExport": [ "Chat Session", "Export Session", "Import Session" ], - "vs/workbench/contrib/chat/browser/actions/chatTitleActions": [ - "Vote Up", - "Vote Down", - "Insert into Notebook", - "Remove Request and Response" - ], "vs/workbench/contrib/chat/browser/chatContributionServiceImpl": [ "Contributes an Interactive Session provider", "Unique identifier for this Interactive Session provider.", @@ -22910,42 +23241,126 @@ "vs/workbench/contrib/chat/browser/chatEditorInput": [ "Chat" ], + "vs/workbench/contrib/chat/browser/chatWidget": [ + "Clear the session" + ], "vs/workbench/contrib/chat/common/chatServiceImpl": [ "Provider returned null response" ], + "vs/workbench/contrib/chat/browser/actions/chatMoveActions": [ + "Open Session In Editor", + "Open Session In Editor", + "Open Session In Sidebar" + ], "vs/workbench/contrib/chat/browser/actions/chatClearActions": [ "Clear", "Clear", "Clear" ], - "vs/workbench/contrib/chat/browser/chatWidget": [ - "Clear the session" + "vs/workbench/contrib/accessibility/browser/accessibleView": [ + "\nPress H now to open a browser window with more information related to accessibility.\n", + "\nTo disable the `accessibility.verbosity` hint for this feature, press D now.\n", + "Exit this menu via the Escape key." ], - "vs/workbench/contrib/notebook/browser/diff/notebookDiffActions": [ - "Open Text Diff Editor", - "Revert Metadata", - "Switch Output Rendering", - "Revert Outputs", - "Revert Input", - "Show Outputs Differences", - "Show Metadata Differences", - "Show Previous Change", - "Show Next Change", - "Hide Metadata Differences", - "Hide Outputs Differences" + "vs/workbench/contrib/chat/common/chatViewModel": [ + "Thinking" ], - "vs/workbench/contrib/chat/browser/actions/chatMoveActions": [ - "Open Session In Editor", - "Open Session In Editor", - "Open Session In Sidebar" + "vs/workbench/contrib/chat/common/chatContextKeys": [ + "True when the provider has assigned an id to this response.", + "When the response has been voted up, is set to 'up'. When voted down, is set to 'down'. Otherwise an empty string.", + "True when the current request is still in progress.", + "The chat item is a response.", + "The chat item is a request", + "True when the chat input has text.", + "True when focus is in the chat input, false otherwise.", + "True when focus is in the chat widget, false otherwise.", + "True when some chat provider has been registered." + ], + "vs/workbench/contrib/chat/browser/contrib/chatInputEditorContrib": [ + "Ask a question or type '/' for topics", + "Ask a question" ], "vs/workbench/contrib/chat/common/chatColors": [ "The background color of a chat request.", "The border color of a chat request." ], - "vs/workbench/contrib/chat/browser/contrib/chatInputEditorContrib": [ - "Ask a question or type '/' for topics", - "Ask a question" + "vs/workbench/contrib/inlineChat/browser/inlineChatController": [ + "AI-generated code may be incorrect", + "Getting ready...", + "Failed to start editor chat", + "Please consult the error log and try again later.", + "AI-generated code may be incorrect", + "Ask a question", + "{0} ({1}, {2} for history)", + "Thinking…", + "No results, please refine your input and try again", + "{0}", + "Use tab to navigate to the diff editor and review proposed changes.", + "Failed to apply changes.", + "Failed to discard changes." + ], + "vs/workbench/contrib/inlineChat/browser/inlineChatActions": [ + "Start Code Chat", + "Resume Last Dismissed Code Chat", + "Inline Chat", + "Make Request", + "Regenerate Response", + "Regenerate", + "Stop Request", + "Cursor Up", + "Cursor Down", + "Focus Input", + "Previous From History", + "Next From History", + "Discard...", + "Discard", + "Discard to Clipboard", + "Discard to New File", + "Helpful", + "Unhelpful", + "Toggle Diff", + "Show Inline Diff", + "Accept Changes", + "Accept", + "Cancel", + "(Developer) Write Exchange to Clipboard", + "'{0}' and {1} follow ups ({2})", + "View in Chat", + "Show More", + "Show Less" + ], + "vs/workbench/contrib/inlineChat/common/inlineChat": [ + "Whether a provider for interactive editors exists", + "Whether the interactive editor input is visible", + "Whether the interactive editor input is focused", + "Whether the interactive editor input is empty", + "Whether the cursor of the iteractive editor input is on the first line", + "Whether the cursor of the iteractive editor input is on the last line", + "Whether the interactive editor message is cropped, not cropped or expanded", + "Whether the cursor of the outer editor is above or below the interactive editor input", + "Whether interactive editor has an active request", + "Whether interactive editor has kept a session for quick restore", + "Whether interactive editor show diffs for changes", + "What type was the last response of the current interactive editor session", + "What type was the responses have been receieved", + "Whether interactive editor did change any code", + "Whether the user did changes ontop of the inline chat", + "The last kind of feedback that was provided", + "Whether the document has changed concurrently", + "Background color of the interactive editor widget", + "Border color of the interactive editor widget", + "Shadow color of the interactive editor widget", + "Background highlighting of the current interactive region. Must be transparent.", + "Border color of the interactive editor input", + "Border color of the interactive editor input when focused", + "Foreground color of the interactive editor input placeholder", + "Background color of the interactive editor input", + "Background color of inserted text in the interactive editor input", + "Background color of removed text in the interactive editor input", + "Configure if changes crafted in the interactive editor are applied directly to the document or are previewed first.", + "Changes are applied directly to the document and are highlighted visually via inline or side-by-side diffs. Ending a session will keep the changes.", + "Changes are previewed only and need to be accepted via the apply button. Ending a session will discard the changes.", + "Changes are applied directly to the document but can be highlighted via inline diffs. Ending a session will keep the changes." ], "vs/editor/contrib/peekView/browser/peekView": [ "Whether the current code editor is embedded inside peek", @@ -22969,14 +23384,6 @@ "vs/workbench/contrib/interactive/browser/interactiveEditor": [ "Type '{0}' code here and press {1} to run" ], - "vs/workbench/contrib/files/browser/fileConstants": [ - "Save As...", - "Save", - "Save without Formatting", - "Save All", - "Remove Folder from Workspace", - "New Untitled Text File" - ], "vs/workbench/contrib/notebook/browser/notebookIcons": [ "Configure icon to select a kernel in notebook editors.", "Icon to execute in notebook editors.", @@ -23004,11 +23411,19 @@ "Icon for the previous change action in the diff editor.", "Icon for the next change action in the diff editor." ], - "vs/workbench/contrib/testing/browser/icons": [ - "View icon of the test view.", - "Icons for test results.", - "Icon of the \"run test\" action.", - "Icon of the \"run all tests\" action.", + "vs/workbench/contrib/files/browser/fileConstants": [ + "Save As...", + "Save", + "Save without Formatting", + "Save All", + "Remove Folder from Workspace", + "New Untitled Text File" + ], + "vs/workbench/contrib/testing/browser/icons": [ + "View icon of the test view.", + "Icons for test results.", + "Icon of the \"run test\" action.", + "Icon of the \"run all tests\" action.", "Icon of the \"debug all tests\" action.", "Icon of the \"debug test\" action.", "Icon to cancel ongoing test runs.", @@ -23057,73 +23472,13 @@ "{0}, outdated result", "Test Explorer" ], - "vs/workbench/contrib/testing/browser/testingOutputTerminalService": [ - "Test Output at {0}", - "{0} at {1}", - "Test Output", - "\r\nNo tests have been run, yet.\r\n", - "The test run did not record any output.", - "Test run finished at {0}" - ], - "vs/workbench/contrib/testing/browser/testingViewPaneContainer": [ - "Testing" - ], - "vs/workbench/contrib/testing/browser/testingProgressUiService": [ - "Running tests...", - "Running tests, {0}/{1} passed ({2}%)", - "Running tests, {0}/{1} tests passed ({2}%, {3} skipped)", - "{0}/{1} tests passed ({2}%)", - "{0}/{1} tests passed ({2}%, {3} skipped)" - ], - "vs/workbench/contrib/testing/common/configuration": [ - "Testing", - "How long to wait, in milliseconds, after a test is marked as outdated and starting a new run.", - "Configures when the error Peek view is automatically opened.", - "Open automatically no matter where the failure is.", - "Open automatically when a test fails in a visible document.", - "Never automatically open.", - "Controls whether to automatically open the Peek view during continuous run mode.", - "Controls the count badge on the Testing icon on the Activity Bar.", - "Show the number of failed tests", - "Disable the testing count badge", - "Show the number of passed tests", - "Show the number of skipped tests", - "Controls whether the running test should be followed in the Test Explorer view.", - "Controls the action to take when left-clicking on a test decoration in the gutter.", - "Run the test.", - "Debug the test.", - "Open the context menu for more options.", - "Controls whether test decorations are shown in the editor gutter.", - "Control whether save all dirty editors before running a test.", - "Never automatically open the testing view", - "Open the testing view when tests start", - "Open the testing view on any test failure", - "Controls when the testing view should open.", - "Always reveal the executed test when `#testing.followRunningTest#` is on. If this setting is turned off, only failed tests will be revealed." - ], - "vs/workbench/contrib/testing/common/testingContextKeys": [ - "Indicates whether any test controller has an attached refresh handler.", - "Indicates whether any test controller is currently refreshing tests.", - "Indicates whether continuous test mode is on.", - "Indicates whether any test controller has registered a debug configuration", - "Indicates whether any test controller has registered a run configuration", - "Indicates whether any test controller has registered a coverage configuration", - "Indicates whether any test controller has registered a non-default configuration", - "Indicates whether any test configuration can be configured", - "Indicates whether continous test running is supported", - "Indicates whether the parent of a test is continuously running, set in the menu context of test items", - "Indicates whether any tests are present in the current editor", - "Type of the item in the output peek view. Either a \"test\", \"message\", \"task\", or \"result\".", - "Controller ID of the current test item", - "ID of the current test item, set when creating or opening menus on test items", - "Boolean indicating whether the test item has a URI defined", - "Boolean indicating whether the test item is hidden" - ], "vs/workbench/contrib/testing/browser/testingOutputPeek": [ "Could not open markdown preview: {0}.\n\nPlease make sure the markdown extension is enabled.", "Test Output", "Expected result", "Actual result", + "The test run did not record any output.", + "Test output is only available for new test runs.", "Close", "Unnamed Task", "+ {0} more lines", @@ -23138,14 +23493,20 @@ "Run Test", "Debug Test", "Go to Source", - "Show Output in Terminal", "Go to Next Test Failure", "Go to Previous Test Failure", "Open in Editor", "Toggle Test History in Peek" ], - "vs/workbench/contrib/testing/common/testingContentProvider": [ - "The test run did not record any output." + "vs/workbench/contrib/testing/browser/testingProgressUiService": [ + "Running tests...", + "Running tests, {0}/{1} passed ({2}%)", + "Running tests, {0}/{1} tests passed ({2}%, {3} skipped)", + "{0}/{1} tests passed ({2}%)", + "{0}/{1} tests passed ({2}%, {3} skipped)" + ], + "vs/workbench/contrib/testing/browser/testingViewPaneContainer": [ + "Testing" ], "vs/workbench/contrib/testing/common/testServiceImpl": [ "Running tests may execute code in your workspace.", @@ -23153,9 +23514,26 @@ "Running tests may execute code in your workspace.", "An error occurred attempting to run tests: {0}" ], - "vs/workbench/contrib/testing/browser/testingConfigurationUi": [ - "Pick a test profile to use", - "Update Test Configuration" + "vs/workbench/contrib/testing/common/testingContentProvider": [ + "The test run did not record any output." + ], + "vs/workbench/contrib/testing/common/testingContextKeys": [ + "Indicates whether any test controller has an attached refresh handler.", + "Indicates whether any test controller is currently refreshing tests.", + "Indicates whether continuous test mode is on.", + "Indicates whether any test controller has registered a debug configuration", + "Indicates whether any test controller has registered a run configuration", + "Indicates whether any test controller has registered a coverage configuration", + "Indicates whether any test controller has registered a non-default configuration", + "Indicates whether any test configuration can be configured", + "Indicates whether continous test running is supported", + "Indicates whether the parent of a test is continuously running, set in the menu context of test items", + "Indicates whether any tests are present in the current editor", + "Type of the item in the output peek view. Either a \"test\", \"message\", \"task\", or \"result\".", + "Controller ID of the current test item", + "ID of the current test item, set when creating or opening menus on test items", + "Boolean indicating whether the test item has a URI defined", + "Boolean indicating whether the test item is hidden" ], "vs/workbench/contrib/testing/browser/testExplorerActions": [ "Hide Test", @@ -23190,8 +23568,6 @@ "Sort by Location", "Sort by Duration", "Show Output", - "Run #{0}", - "Pick a run to show output for", "Collapse All Tests", "Clear All Results", "Go to Test", @@ -23211,75 +23587,36 @@ "Refresh Tests", "Cancel Test Refresh" ], - "vs/workbench/contrib/interactiveEditor/browser/interactiveEditorController": [ - "Failed to start editor chat", - "Please consult the error log and try again later.", - "AI-generated code may be incorrect", - "Ask a question", - "{0} ({1}, {2} for history)", - "Thinking…", - "No results, please refine your input and try again", - "Failed to apply changes.", - "Failed to discard changes." - ], - "vs/workbench/contrib/interactiveEditor/common/interactiveEditor": [ - "Whether a provider for interactive editors exists", - "Whether the interactive editor input is visible", - "Whether the interactive editor input is focused", - "Whether the interactive editor input is empty", - "Whether the cursor of the iteractive editor input is on the first line", - "Whether the cursor of the iteractive editor input is on the last line", - "Whether the interactive editor message is cropped, not cropped or expanded", - "Whether the cursor of the outer editor is above or below the interactive editor input", - "Whether interactive editor has an active request", - "Whether interactive editor has kept a session for quick restore", - "Whether interactive editor show diffs for changes", - "What type was the last response of the current interactive editor session", - "Whether interactive editor did change any code", - "The last kind of feedback that was provided", - "Whether the document has changed concurrently", - "Border color of the interactive editor widget", - "Shadow color of the interactive editor widget", - "Background highlighting of the current interactive region. Must be transparent.", - "Border color of the interactive editor input", - "Border color of the interactive editor input when focused", - "Foreground color of the interactive editor input placeholder", - "Background color of the interactive editor input", - "Background color of inserted text in the interactive editor input", - "Background color of removed text in the interactive editor input", - "Configure if changes crafted in the interactive editor are applied directly to the document or are previewed first.", - "Changes are applied directly to the document and are highlighted visually via inline or side-by-side diffs. Ending a session will keep the changes.", - "Changes are previewed only and need to be accepted via the apply button. Ending a session will discard the changes.", - "Changes are applied directly to the document but can be highlighted via inline diffs. Ending a session will keep the changes." + "vs/workbench/contrib/testing/browser/testingConfigurationUi": [ + "Pick a test profile to use", + "Update Test Configuration" ], - "vs/workbench/contrib/interactiveEditor/browser/interactiveEditorActions": [ - "Start Code Chat", - "Resume Last Dismissed Code Chat", - "Interactive Editor", - "Make Request", - "Stop Request", - "Cursor Up", - "Cursor Down", - "Focus Input", - "Previous From History", - "Next From History", - "Discard...", - "Discard", - "Discard to Clipboard", - "Discard to New File", - "Helpful", - "Unhelpful", - "Toggle Diff", - "Show Inline Diff", - "Accept Changes", - "Accept", - "Cancel", - "(Developer) Write Exchange to Clipboard", - "'{0}' and {1} follow ups ({2})", - "View in Chat", - "Expand Message", - "Contract Message", - "Interactive Session Editor Accessibility Help" + "vs/workbench/contrib/testing/common/configuration": [ + "Testing", + "How long to wait, in milliseconds, after a test is marked as outdated and starting a new run.", + "Configures when the error Peek view is automatically opened.", + "Open automatically no matter where the failure is.", + "Open automatically when a test fails in a visible document.", + "Never automatically open.", + "Controls whether to show messages from all test runs.", + "Controls whether to automatically open the Peek view during continuous run mode.", + "Controls the count badge on the Testing icon on the Activity Bar.", + "Show the number of failed tests", + "Disable the testing count badge", + "Show the number of passed tests", + "Show the number of skipped tests", + "Controls whether the running test should be followed in the Test Explorer view.", + "Controls the action to take when left-clicking on a test decoration in the gutter.", + "Run the test.", + "Debug the test.", + "Open the context menu for more options.", + "Controls whether test decorations are shown in the editor gutter.", + "Control whether save all dirty editors before running a test.", + "Never automatically open the testing view", + "Open the testing view when tests start", + "Open the testing view on any test failure", + "Controls when the testing view should open.", + "Always reveal the executed test when `#testing.followRunningTest#` is on. If this setting is turned off, only failed tests will be revealed." ], "vs/workbench/contrib/logs/common/logsActions": [ "Set Log Level...", @@ -23305,19 +23642,6 @@ "vs/platform/quickinput/browser/helpQuickAccess": [ "{0}, {1}" ], - "vs/workbench/contrib/quickaccess/browser/commandsQuickAccess": [ - "Ask {0}: {1}", - "No matching commands", - "Configure Keybinding", - "similar commands", - "{0}: {1}", - "Show All Commands", - "Clear Command History", - "Do you want to clear the history of recently used commands?", - "This action is irreversible!", - "&&Clear", - "Ask In Chat" - ], "vs/workbench/contrib/quickaccess/browser/viewQuickAccess": [ "No matching views", "Side Bar", @@ -23330,6 +23654,25 @@ "Open View", "Quick Open View" ], + "vs/workbench/contrib/quickaccess/browser/commandsQuickAccess": [ + "No matching commands", + "Configure Keybinding", + "similar commands", + "Ask {0}: {1}", + "{0}: {1}", + "Show All Commands", + "Clear Command History", + "Do you want to clear the history of recently used commands?", + "This action is irreversible!", + "&&Clear" + ], + "vs/workbench/contrib/files/browser/views/explorerView": [ + "Explorer Section: {0}", + "New File...", + "New Folder...", + "Refresh Explorer", + "Collapse Folders in Explorer" + ], "vs/workbench/contrib/files/browser/views/emptyView": [ "No Folder Opened" ], @@ -23342,48 +23685,7 @@ "Flip &&Layout", "New Untitled Text File" ], - "vs/workbench/contrib/files/browser/views/explorerView": [ - "Explorer Section: {0}", - "New File...", - "New Folder...", - "Refresh Explorer", - "Collapse Folders in Explorer" - ], - "vs/workbench/contrib/files/browser/fileCommands": [ - "{0} (in file) ↔ {1}", - "Failed to save '{0}': {1}", - "Retry", - "Discard", - "Failed to revert '{0}': {1}", - "Create File" - ], - "vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler": [ - "Use the actions in the editor tool bar to either undo your changes or overwrite the content of the file with your changes.", - "Failed to save '{0}': The content of the file is newer. Please compare your version with the file contents or overwrite the content of the file with your changes.", - "Failed to save '{0}': File is read-only. Select 'Overwrite as Admin' to retry as administrator.", - "Failed to save '{0}': File is read-only. Select 'Overwrite as Sudo' to retry as superuser.", - "Failed to save '{0}': File is read-only. Select 'Overwrite' to attempt to make it writeable.", - "Failed to save '{0}': Insufficient permissions. Select 'Retry as Admin' to retry as administrator.", - "Failed to save '{0}': Insufficient permissions. Select 'Retry as Sudo' to retry as superuser.", - "Failed to save '{0}': {1}", - "Learn More", - "Don't Show Again", - "Compare", - "{0} (in file) ↔ {1} (in {2}) - Resolve save conflict", - "Overwrite as Admin...", - "Overwrite as Sudo...", - "Retry as Admin...", - "Retry as Sudo...", - "Retry", - "Discard", - "Overwrite", - "Overwrite", - "Configure" - ], - "vs/workbench/contrib/files/browser/editors/binaryFileEditor": [ - "Binary File Viewer" - ], - "vs/workbench/contrib/files/browser/fileActions": [ + "vs/workbench/contrib/files/browser/fileActions": [ "New File...", "New Folder...", "Rename...", @@ -23459,14 +23761,50 @@ "Paste {0} files", "Paste {0}", "The file(s) to paste have been deleted or moved since you copied them. {0}", - "Set Active Editor Readonly in Session", + "Set Active Editor Read-only in Session", "Set Active Editor Writeable in Session", - "Toggle Active Editor Readonly in Session", - "Reset Active Editor Readonly in Session" + "Toggle Active Editor Read-only in Session", + "Reset Active Editor Read-only in Session" ], - "vs/workbench/contrib/files/common/dirtyFilesIndicator": [ - "1 unsaved file", - "{0} unsaved files" + "vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler": [ + "Use the actions in the editor tool bar to either undo your changes or overwrite the content of the file with your changes.", + "Failed to save '{0}': The content of the file is newer. Please compare your version with the file contents or overwrite the content of the file with your changes.", + "Failed to save '{0}': File is read-only. Select 'Overwrite as Admin' to retry as administrator.", + "Failed to save '{0}': File is read-only. Select 'Overwrite as Sudo' to retry as superuser.", + "Failed to save '{0}': File is read-only. Select 'Overwrite' to attempt to make it writeable.", + "Failed to save '{0}': Insufficient permissions. Select 'Retry as Admin' to retry as administrator.", + "Failed to save '{0}': Insufficient permissions. Select 'Retry as Sudo' to retry as superuser.", + "Failed to save '{0}': {1}", + "Learn More", + "Don't Show Again", + "Compare", + "{0} (in file) ↔ {1} (in {2}) - Resolve save conflict", + "Overwrite as Admin...", + "Overwrite as Sudo...", + "Retry as Admin...", + "Retry as Sudo...", + "Retry", + "Discard", + "Overwrite", + "Overwrite", + "Configure" + ], + "vs/workbench/contrib/files/browser/fileCommands": [ + "{0} (in file) ↔ {1}", + "Failed to save '{0}': {1}", + "Retry", + "Discard", + "Failed to revert '{0}': {1}", + "Create File" + ], + "vs/workbench/contrib/files/browser/editors/binaryFileEditor": [ + "Binary File Viewer" + ], + "vs/workbench/contrib/files/browser/workspaceWatcher": [ + "Unable to watch for file changes in this large workspace folder. Please follow the instructions link to resolve this issue.", + "Instructions", + "File changes watcher stopped unexpectedly. A reload of the window may enable the watcher again unless the workspace cannot be watched for file changes.", + "Reload" ], "vs/editor/common/config/editorConfigurationSchema": [ "Editor", @@ -23508,14 +23846,10 @@ "Lines will wrap according to the {0} setting.", "Uses the legacy diffing algorithm.", "Uses the advanced diffing algorithm.", - "Controls whether the diff editor shows unchanged regions. Only works when 'diffEditor.experimental.useVersion2' is set.", - "Controls whether the diff editor uses the new or the old implementation." - ], - "vs/workbench/contrib/files/browser/workspaceWatcher": [ - "Unable to watch for file changes in this large workspace folder. Please follow the instructions link to resolve this issue.", - "Instructions", - "File changes watcher stopped unexpectedly. A reload of the window may enable the watcher again unless the workspace cannot be watched for file changes.", - "Reload" + "Controls whether the diff editor shows unchanged regions. Only works when {0} is set.", + "Controls whether the diff editor should show detected code moves. Only works when {0} is set.", + "Controls whether the diff editor uses the new or the old implementation.", + "Controls whether the diff editor shows empty decorations to see where characters got inserted or deleted." ], "vs/workbench/contrib/files/browser/editors/textFileEditor": [ "Text File Editor", @@ -23527,6 +23861,20 @@ "The editor could not be opened because the file was not found.", "Create File" ], + "vs/workbench/contrib/files/common/dirtyFilesIndicator": [ + "1 unsaved file", + "{0} unsaved files" + ], + "vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPreview": [ + "Other" + ], + "vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess": [ + "Open a text editor first to go to a line.", + "Go to line {0} and character {1}.", + "Go to line {0}.", + "Current Line: {0}, Character: {1}. Type a line number between 1 and {2} to navigate to.", + "Current Line: {0}, Character: {1}. Type a line number to navigate to." + ], "vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPane": [ "Apply", "Discard", @@ -23539,16 +23887,6 @@ "{0} ({1}, refactor preview)", "{0} (refactor preview)" ], - "vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPreview": [ - "Other" - ], - "vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess": [ - "Open a text editor first to go to a line.", - "Go to line {0} and character {1}.", - "Go to line {0}.", - "Current Line: {0}, Character: {1}. Type a line number between 1 and {2} to navigate to.", - "Current Line: {0}, Character: {1}. Type a line number to navigate to." - ], "vs/workbench/contrib/codeEditor/browser/quickaccess/gotoSymbolQuickAccess": [ "No matching entries", "Go to Symbol in Editor...", @@ -23557,6 +23895,17 @@ "Go to Symbol in Editor", "Go to Symbol in Editor by Category" ], + "vs/workbench/contrib/search/browser/anythingQuickAccess": [ + "No matching results", + "recently opened", + "file and symbol results", + "file results", + "More", + "Open to the Side", + "Open to the Bottom", + "Remove from Recently Opened", + "{0} unsaved changes" + ], "vs/workbench/contrib/search/browser/searchIcons": [ "Icon to make search details visible.", "Icon for toggle the context in the search editor.", @@ -23575,22 +23924,6 @@ "View icon of the search view.", "Icon for the action to open a new search editor." ], - "vs/workbench/contrib/search/browser/anythingQuickAccess": [ - "No matching results", - "recently opened", - "file and symbol results", - "file results", - "More", - "Open to the Side", - "Open to the Bottom", - "Remove from Recently Opened", - "{0} unsaved changes" - ], - "vs/workbench/contrib/search/browser/symbolsQuickAccess": [ - "No matching workspace symbols", - "Open to the Side", - "Open to the Bottom" - ], "vs/workbench/contrib/search/browser/searchWidget": [ "Replace All (Submit Search to Enable)", "Replace All", @@ -23601,6 +23934,11 @@ "Replace: Type replace term and press Enter to preview", "Replace" ], + "vs/workbench/contrib/search/browser/symbolsQuickAccess": [ + "No matching workspace symbols", + "Open to the Side", + "Open to the Bottom" + ], "vs/workbench/contrib/search/browser/searchActionsCopy": [ "Copy", "Copy Path", @@ -23617,11 +23955,6 @@ "Find in Folder...", "Find in Workspace..." ], - "vs/workbench/contrib/search/browser/searchActionsSymbol": [ - "Go to Symbol in Workspace...", - "Go to Symbol in Workspace...", - "Go to Symbol in &&Workspace..." - ], "vs/workbench/contrib/search/browser/searchActionsNav": [ "Toggle Query Details", "Close Replace Widget", @@ -23647,8 +23980,10 @@ "Replace All", "Replace All" ], - "vs/workbench/contrib/search/browser/searchActionsBase": [ - "Search" + "vs/workbench/contrib/search/browser/searchActionsSymbol": [ + "Go to Symbol in Workspace...", + "Go to Symbol in Workspace...", + "Go to Symbol in &&Workspace..." ], "vs/workbench/contrib/search/browser/searchActionsTopBar": [ "Clear Search History", @@ -23660,9 +23995,7 @@ "View as Tree", "View as List" ], - "vs/workbench/contrib/searchEditor/browser/searchEditorInput": [ - "Search: {0}", - "Search: {0}", + "vs/workbench/contrib/search/browser/searchActionsBase": [ "Search" ], "vs/workbench/contrib/searchEditor/browser/searchEditor": [ @@ -23676,16 +24009,25 @@ "Search", "Search editor text input box border." ], - "vs/workbench/contrib/search/browser/patternInputWidget": [ - "input", - "Search only in Open Editors", - "Use Exclude Settings and Ignore Files" + "vs/workbench/contrib/searchEditor/browser/searchEditorInput": [ + "Search: {0}", + "Search: {0}", + "Search" ], "vs/workbench/browser/parts/views/viewPane": [ "Icon for an expanded view pane container.", "Icon for a collapsed view pane container.", "{0} actions" ], + "vs/workbench/contrib/search/browser/searchMessage": [ + "Unable to open command link from untrusted source: {0}", + "Unable to open unknown link: {0}" + ], + "vs/workbench/contrib/search/browser/patternInputWidget": [ + "input", + "Search only in Open Editors", + "Use Exclude Settings and Ignore Files" + ], "vs/workbench/contrib/search/browser/searchResultsView": [ "Other files", "Other files", @@ -23709,16 +24051,6 @@ "Source Control", "{0} pending changes" ], - "vs/workbench/contrib/scm/browser/scmViewPaneContainer": [ - "Source Control" - ], - "vs/workbench/contrib/scm/browser/scmRepositoriesViewPane": [ - "Source Control Repositories" - ], - "vs/workbench/contrib/search/browser/searchMessage": [ - "Unable to open command link from untrusted source: {0}", - "Unable to open unknown link: {0}" - ], "vs/workbench/contrib/scm/browser/dirtydiffDecorator": [ "{0} - {1} of {2} changes", "{0} - {1} of {2} change", @@ -23741,9 +24073,8 @@ "Overview ruler marker color for added content.", "Overview ruler marker color for deleted content." ], - "vs/workbench/contrib/workspace/common/workspace": [ - "Whether the workspace trust feature is enabled.", - "Whether the current workspace has been trusted by the user." + "vs/workbench/contrib/scm/browser/scmViewPaneContainer": [ + "Source Control" ], "vs/workbench/contrib/scm/browser/scmViewPane": [ "Source Control Management", @@ -23763,38 +24094,12 @@ "Close", "SCM Provider separator border." ], - "vs/workbench/contrib/debug/browser/debugColors": [ - "Debug toolbar background color.", - "Debug toolbar border color.", - "Debug toolbar icon for start debugging.", - "Debug toolbar icon for pause.", - "Debug toolbar icon for stop.", - "Debug toolbar icon for disconnect.", - "Debug toolbar icon for restart.", - "Debug toolbar icon for step over.", - "Debug toolbar icon for step into.", - "Debug toolbar icon for step over.", - "Debug toolbar icon for continue.", - "Debug toolbar icon for step back." + "vs/workbench/contrib/scm/browser/scmRepositoriesViewPane": [ + "Source Control Repositories" ], - "vs/workbench/contrib/debug/browser/callStackView": [ - "Running", - "Show More Stack Frames", - "Session", - "Running", - "Restart Frame", - "Load More Stack Frames", - "Show {0} More: {1}", - "Show {0} More Stack Frames", - "Paused on {0}", - "Paused", - "Debug Call Stack", - "Thread {0} {1}", - "Stack Frame {0}, line {1}, {2}", - "Running", - "Session {0} {1}", - "Show {0} More Stack Frames", - "Collapse All" + "vs/workbench/contrib/workspace/common/workspace": [ + "Whether the workspace trust feature is enabled.", + "Whether the current workspace has been trusted by the user." ], "vs/workbench/contrib/debug/browser/breakpointsView": [ "Unverified Exception Breakpoint", @@ -23850,65 +24155,38 @@ "Edit Function Breakpoint...", "Edit Hit Count..." ], - "vs/workbench/contrib/debug/browser/debugConsoleQuickAccess": [ - "Start a New Debug Session" + "vs/workbench/contrib/debug/browser/debugColors": [ + "Debug toolbar background color.", + "Debug toolbar border color.", + "Debug toolbar icon for start debugging.", + "Debug toolbar icon for pause.", + "Debug toolbar icon for stop.", + "Debug toolbar icon for disconnect.", + "Debug toolbar icon for restart.", + "Debug toolbar icon for step over.", + "Debug toolbar icon for step into.", + "Debug toolbar icon for step over.", + "Debug toolbar icon for continue.", + "Debug toolbar icon for step back." ], - "vs/workbench/contrib/debug/browser/debugIcons": [ - "View icon of the debug console view.", - "View icon of the run view.", - "View icon of the variables view.", - "View icon of the watch view.", - "View icon of the call stack view.", - "View icon of the breakpoints view.", - "View icon of the loaded scripts view.", - "Icon for breakpoints.", - "Icon for disabled breakpoints.", - "Icon for unverified breakpoints.", - "Icon for function breakpoints.", - "Icon for disabled function breakpoints.", - "Icon for unverified function breakpoints.", - "Icon for conditional breakpoints.", - "Icon for disabled conditional breakpoints.", - "Icon for unverified conditional breakpoints.", - "Icon for data breakpoints.", - "Icon for disabled data breakpoints.", - "Icon for unverified data breakpoints.", - "Icon for log breakpoints.", - "Icon for disabled log breakpoint.", - "Icon for unverified log breakpoints.", - "Icon for breakpoint hints shown on hover in editor glyph margin.", - "Icon for unsupported breakpoints.", - "Icon for a stackframe shown in the editor glyph margin.", - "Icon for a focused stackframe shown in the editor glyph margin.", - "Icon for the debug bar gripper.", - "Icon for the debug restart frame action.", - "Icon for the debug stop action.", - "Icon for the debug disconnect action.", - "Icon for the debug restart action.", - "Icon for the debug step over action.", - "Icon for the debug step into action.", - "Icon for the debug step out action.", - "Icon for the debug step back action.", - "Icon for the debug pause action.", - "Icon for the debug continue action.", - "Icon for the debug reverse continue action.", - "Icon for the run or debug action.", - "Icon for the debug start action.", - "Icon for the debug configure action.", - "Icon for the debug console open action.", - "Icon for removing debug configurations.", - "Icon for the collapse all action in the debug views.", - "Icon for the session icon in the call stack view.", - "Icon for the clear all action in the debug console.", - "Icon for the Remove All action in the watch view.", - "Icon for the Remove action in the watch view.", - "Icon for the add action in the watch view.", - "Icon for the add function breakpoint action in the watch view.", - "Icon for the Remove All action in the breakpoints view.", - "Icon for the activate action in the breakpoints view.", - "Icon for the debug evaluation input marker.", - "Icon for the debug evaluation prompt.", - "Icon for the inspect memory action." + "vs/workbench/contrib/debug/browser/callStackView": [ + "Running", + "Show More Stack Frames", + "Session", + "Running", + "Restart Frame", + "Load More Stack Frames", + "Show {0} More: {1}", + "Show {0} More Stack Frames", + "Paused on {0}", + "Paused", + "Debug Call Stack", + "Thread {0} {1}", + "Stack Frame {0}, line {1}, {2}", + "Running", + "Session {0} {1}", + "Show {0} More Stack Frames", + "Collapse All" ], "vs/workbench/contrib/debug/browser/debugCommands": [ "Debug", @@ -23943,15 +24221,8 @@ "Add Configuration...", "Add Inline Breakpoint" ], - "vs/workbench/contrib/debug/browser/debugQuickAccess": [ - "No matching launch configurations", - "Configure Launch Configuration", - "contributed", - "Remove Launch Configuration", - "{0} contributed configurations", - "configure", - "Add Config ({0})...", - "Add Configuration..." + "vs/workbench/contrib/debug/browser/debugConsoleQuickAccess": [ + "Start a New Debug Session" ], "vs/workbench/contrib/debug/browser/debugEditorActions": [ "Debug: Toggle Breakpoint", @@ -23976,16 +24247,78 @@ "Debug: Go to Previous Breakpoint", "Close Exception Widget" ], + "vs/workbench/contrib/debug/browser/debugIcons": [ + "View icon of the debug console view.", + "View icon of the run view.", + "View icon of the variables view.", + "View icon of the watch view.", + "View icon of the call stack view.", + "View icon of the breakpoints view.", + "View icon of the loaded scripts view.", + "Icon for breakpoints.", + "Icon for disabled breakpoints.", + "Icon for unverified breakpoints.", + "Icon for function breakpoints.", + "Icon for disabled function breakpoints.", + "Icon for unverified function breakpoints.", + "Icon for conditional breakpoints.", + "Icon for disabled conditional breakpoints.", + "Icon for unverified conditional breakpoints.", + "Icon for data breakpoints.", + "Icon for disabled data breakpoints.", + "Icon for unverified data breakpoints.", + "Icon for log breakpoints.", + "Icon for disabled log breakpoint.", + "Icon for unverified log breakpoints.", + "Icon for breakpoint hints shown on hover in editor glyph margin.", + "Icon for unsupported breakpoints.", + "Icon for a stackframe shown in the editor glyph margin.", + "Icon for a focused stackframe shown in the editor glyph margin.", + "Icon for the debug bar gripper.", + "Icon for the debug restart frame action.", + "Icon for the debug stop action.", + "Icon for the debug disconnect action.", + "Icon for the debug restart action.", + "Icon for the debug step over action.", + "Icon for the debug step into action.", + "Icon for the debug step out action.", + "Icon for the debug step back action.", + "Icon for the debug pause action.", + "Icon for the debug continue action.", + "Icon for the debug reverse continue action.", + "Icon for the run or debug action.", + "Icon for the debug start action.", + "Icon for the debug configure action.", + "Icon for the debug console open action.", + "Icon for removing debug configurations.", + "Icon for the collapse all action in the debug views.", + "Icon for the session icon in the call stack view.", + "Icon for the clear all action in the debug console.", + "Icon for the Remove All action in the watch view.", + "Icon for the Remove action in the watch view.", + "Icon for the add action in the watch view.", + "Icon for the add function breakpoint action in the watch view.", + "Icon for the Remove All action in the breakpoints view.", + "Icon for the activate action in the breakpoints view.", + "Icon for the debug evaluation input marker.", + "Icon for the debug evaluation prompt.", + "Icon for the inspect memory action." + ], + "vs/workbench/contrib/debug/browser/debugQuickAccess": [ + "No matching launch configurations", + "Configure Launch Configuration", + "contributed", + "Remove Launch Configuration", + "{0} contributed configurations", + "configure", + "Add Config ({0})...", + "Add Configuration..." + ], "vs/workbench/contrib/debug/browser/debugStatus": [ "Debug", "Debug: {0}", "Select and start debug configuration" ], - "vs/workbench/contrib/debug/browser/debugToolBar": [ - "More...", - "Step Back", - "Reverse" - ], "vs/workbench/contrib/debug/browser/debugService": [ "1 active session", "{0} active sessions", @@ -24009,6 +24342,20 @@ "Added breakpoint, line {0}, file {1}", "Removed breakpoint, line {0}, file {1}" ], + "vs/workbench/contrib/debug/browser/debugToolBar": [ + "More...", + "Step Back", + "Reverse" + ], + "vs/workbench/contrib/debug/browser/disassemblyView": [ + "Disassembly not available.", + "instructions", + "from disassembly", + "Disassembly View", + "Address", + "Bytes", + "Instruction" + ], "vs/workbench/contrib/debug/browser/loadedScriptsView": [ "Debug Session", "Debug Loaded Scripts", @@ -24022,23 +24369,16 @@ "Status bar foreground color when a program is being debugged. The status bar is shown in the bottom of the window", "Status bar border color separating to the sidebar and editor when a program is being debugged. The status bar is shown in the bottom of the window" ], - "vs/workbench/contrib/debug/browser/disassemblyView": [ - "Disassembly not available.", - "instructions", - "from disassembly", - "Disassembly View", - "Address", - "Bytes", - "Instruction" - ], - "vs/workbench/contrib/debug/browser/welcomeView": [ - "Run", - "[Open a file](command:{0}) which can be debugged or run.", - "[Run and Debug{0}](command:{1})", - "[Show all automatic debug configurations](command:{0}).", - "To customize Run and Debug [create a launch.json file](command:{0}).", - "To customize Run and Debug, [open a folder](command:{0}) and create a launch.json file.", - "All debug extensions are disabled. Enable a debug extension or install a new one from the Marketplace." + "vs/workbench/contrib/debug/browser/variablesView": [ + "Type new variable value", + "Debug Variables", + "Scope {0}", + "{0}, value {1}", + "Inspecting binary data requires the Hex Editor extension. Would you like to install it now?", + "Cancel", + "Install", + "Installing the Hex Editor...", + "Collapse All" ], "vs/workbench/contrib/debug/browser/watchExpressionsView": [ "Type new value", @@ -24051,6 +24391,15 @@ "Add Expression", "Remove All Expressions" ], + "vs/workbench/contrib/debug/browser/welcomeView": [ + "Run", + "[Open a file](command:{0}) which can be debugged or run.", + "[Run and Debug{0}](command:{1})", + "[Show all automatic debug configurations](command:{0}).", + "To customize Run and Debug [create a launch.json file](command:{0}).", + "To customize Run and Debug, [open a folder](command:{0}) and create a launch.json file.", + "All debug extensions are disabled. Enable a debug extension or install a new one from the Marketplace." + ], "vs/workbench/contrib/debug/common/debugContentProvider": [ "Unable to resolve the resource without a debug session", "Could not load source '{0}': {1}.", @@ -24064,16 +24413,10 @@ "vs/workbench/contrib/debug/common/disassemblyViewInput": [ "Disassembly" ], - "vs/workbench/contrib/debug/browser/variablesView": [ - "Type new variable value", - "Debug Variables", - "Scope {0}", - "{0}, value {1}", - "Inspecting binary data requires the Hex Editor extension. Would you like to install it now?", - "Cancel", - "Install", - "Installing the Hex Editor...", - "Collapse All" + "vs/workbench/contrib/debug/browser/debugHover": [ + "Hold {0} key to switch to editor language hover", + "Debug Hover", + "{0}, value {1}, variables, debug" ], "vs/workbench/contrib/debug/browser/exceptionWidget": [ "Exception widget border color.", @@ -24082,20 +24425,6 @@ "Exception has occurred.", "Close" ], - "vs/workbench/contrib/debug/browser/debugHover": [ - "Hold {0} key to switch to editor language hover", - "Debug Hover", - "{0}, value {1}, variables, debug" - ], - "vs/workbench/contrib/debug/browser/breakpointWidget": [ - "Message to log when breakpoint is hit. Expressions within {} are interpolated. 'Enter' to accept, 'esc' to cancel.", - "Break when hit count condition is met. 'Enter' to accept, 'esc' to cancel.", - "Break when expression evaluates to true. 'Enter' to accept, 'esc' to cancel.", - "Expression", - "Hit Count", - "Log Message", - "Breakpoint Type" - ], "vs/workbench/contrib/debug/common/debugModel": [ "Invalid variable attributes", "Please start a debug session to evaluate expressions", @@ -24105,10 +24434,14 @@ "Running", "Unverified breakpoint. File is modified, please restart debug session." ], - "vs/platform/actions/browser/menuEntryActionViewItem": [ - "{0} ({1})", - "{0} ({1})", - "{0}\n[{1}] {2}" + "vs/workbench/contrib/debug/browser/breakpointWidget": [ + "Message to log when breakpoint is hit. Expressions within {} are interpolated. 'Enter' to accept, 'esc' to cancel.", + "Break when hit count condition is met. 'Enter' to accept, 'esc' to cancel.", + "Break when expression evaluates to true. 'Enter' to accept, 'esc' to cancel.", + "Expression", + "Hit Count", + "Log Message", + "Breakpoint Type" ], "vs/platform/history/browser/contextScopedHistoryWidget": [ "Whether suggestion are visible" @@ -24138,6 +24471,12 @@ "vs/workbench/contrib/debug/common/replModel": [ "Console was cleared" ], + "vs/workbench/contrib/markers/browser/markersView": [ + "Showing {0} of {1}", + "Showing {0} problems", + "Showing {0} of {1} problems", + "Clear Filters" + ], "vs/workbench/contrib/markers/browser/messages": [ "Toggle Problems (Errors, Warnings, Infos)", "Focus Problems (Errors, Warnings, Infos)", @@ -24187,40 +24526,15 @@ "{0} at line {1} and character {2} in {3}", "Show Errors and Warnings" ], + "vs/workbench/browser/parts/views/viewFilter": [ + "More Filters..." + ], "vs/workbench/contrib/markers/browser/markersFileDecorations": [ "Problems", "1 problem in this file", "{0} problems in this file", "Show Errors & Warnings on files and folder." ], - "vs/workbench/browser/parts/views/viewFilter": [ - "More Filters..." - ], - "vs/workbench/contrib/markers/browser/markersView": [ - "Showing {0} of {1}", - "Showing {0} problems", - "Showing {0} of {1} problems", - "Clear Filters" - ], - "vs/workbench/contrib/mergeEditor/browser/mergeEditorInput": [ - "Merging: {0}" - ], - "vs/workbench/contrib/mergeEditor/browser/commands/devCommands": [ - "Merge Editor (Dev)", - "Copy Merge Editor State as JSON", - "Merge Editor", - "No active merge editor", - "Merge Editor", - "Successfully copied merge editor state", - "Save Merge Editor State to Folder", - "Merge Editor", - "No active merge editor", - "Select folder to save to", - "Merge Editor", - "Successfully saved merge editor state to folder", - "Load Merge Editor State from Folder", - "Select folder to save to" - ], "vs/workbench/contrib/mergeEditor/browser/commands/commands": [ "Open Merge Editor", "Mixed Layout", @@ -24250,27 +24564,57 @@ "The file contains unhandled conflicts.", "&&Complete with Conflicts" ], - "vs/workbench/contrib/mergeEditor/browser/view/mergeEditor": [ - "Text Merge Editor" - ], - "vs/workbench/contrib/comments/browser/commentService": [ - "Whether the open workspace has either comments or commenting ranges." - ], - "vs/workbench/contrib/comments/browser/commentsEditorContribution": [ - "Go to Next Comment Thread", - "Go to Previous Comment Thread", - "Toggle Editor Commenting", - "Add Comment on Current Selection", - "Collapse All Comments", - "Expand All Comments", - "Expand Unresolved Comments" - ], + "vs/workbench/contrib/mergeEditor/browser/commands/devCommands": [ + "Merge Editor (Dev)", + "Copy Merge Editor State as JSON", + "Merge Editor", + "No active merge editor", + "Merge Editor", + "Successfully copied merge editor state", + "Save Merge Editor State to Folder", + "Merge Editor", + "No active merge editor", + "Select folder to save to", + "Merge Editor", + "Successfully saved merge editor state to folder", + "Load Merge Editor State from Folder", + "Select folder to save to" + ], + "vs/workbench/contrib/mergeEditor/browser/mergeEditorInput": [ + "Merging: {0}" + ], + "vs/workbench/contrib/mergeEditor/browser/view/mergeEditor": [ + "Text Merge Editor" + ], + "vs/workbench/contrib/comments/browser/commentsEditorContribution": [ + "Go to Next Comment Thread", + "Go to Previous Comment Thread", + "Toggle Editor Commenting", + "Add Comment on Current Selection", + "Collapse All Comments", + "Expand All Comments", + "Expand Unresolved Comments" + ], + "vs/workbench/contrib/comments/browser/commentService": [ + "Whether the open workspace has either comments or commenting ranges." + ], + "vs/workbench/contrib/url/browser/trustedDomains": [ + "Manage Trusted Domains", + "Trust {0}", + "Trust {0} on all ports", + "Trust {0} and all its subdomains", + "Trust all domains (disables link protection)", + "Manage Trusted Domains" + ], "vs/workbench/contrib/url/browser/trustedDomainsValidator": [ "Do you want {0} to open the external website?", "&&Open", "&&Copy", "Configure &&Trusted Domains" ], + "vs/workbench/contrib/webviewPanel/browser/webviewEditor": [ + "The viewType of the currently active webview panel." + ], "vs/workbench/contrib/webviewPanel/browser/webviewCommands": [ "Show find", "Stop find", @@ -24278,8 +24622,8 @@ "Find previous", "Reload Webviews" ], - "vs/workbench/contrib/webviewPanel/browser/webviewEditor": [ - "The viewType of the currently active webview panel." + "vs/workbench/contrib/customEditor/common/customEditor": [ + "The viewType of the currently active custom editor." ], "vs/workbench/contrib/externalUriOpener/common/configuration": [ "Configure the opener to use for external URIs (http, https).", @@ -24287,169 +24631,9 @@ "Map URI pattern to an opener id.\nExample patterns: \n{0}", "Open using VS Code's standard opener." ], - "vs/workbench/contrib/externalUriOpener/common/externalUriOpenerService": [ - "Open in new browser window", - "Open in default browser", - "Configure default opener...", - "How would you like to open: {0}" - ], - "vs/workbench/contrib/customEditor/common/customEditor": [ - "The viewType of the currently active custom editor." - ], - "vs/workbench/contrib/url/browser/trustedDomains": [ - "Manage Trusted Domains", - "Trust {0}", - "Trust {0} on all ports", - "Trust {0} and all its subdomains", - "Trust all domains (disables link protection)", - "Manage Trusted Domains" - ], "vs/workbench/contrib/extensions/common/extensionsInput": [ "Extension: {0}" ], - "vs/workbench/contrib/extensions/common/extensionsFileTemplate": [ - "Extensions", - "List of extensions which should be recommended for users of this workspace. The identifier of an extension is always '${publisher}.${name}'. For example: 'vscode.csharp'.", - "Expected format '${publisher}.${name}'. Example: 'vscode.csharp'.", - "List of extensions recommended by VS Code that should not be recommended for users of this workspace. The identifier of an extension is always '${publisher}.${name}'. For example: 'vscode.csharp'.", - "Expected format '${publisher}.${name}'. Example: 'vscode.csharp'." - ], - "vs/workbench/contrib/extensions/browser/extensionEditor": [ - "Extension Version", - "Pre-Release", - "Extension name", - "Preview", - "Preview", - "Built-in", - "Publisher", - "Install count", - "Rating", - "Details", - "Extension details, rendered from the extension's 'README.md' file", - "Feature Contributions", - "Lists contributions to VS Code by this extension", - "Changelog", - "Extension update history, rendered from the extension's 'CHANGELOG.md' file", - "Dependencies", - "Lists extensions this extension depends on", - "Extension Pack", - "Lists extensions those will be installed together with this extension", - "Runtime Status", - "Extension runtime status", - "No README available.", - "Readme", - "Extension Pack ({0})", - "No README available.", - "Readme", - "Categories", - "Marketplace", - "Repository", - "License", - "Extension Resources", - "More Info", - "Published", - "Last released", - "Last updated", - "Identifier", - "No Changelog available.", - "Changelog", - "No Contributions", - "No Contributions", - "No Dependencies", - "Activation Event:", - "Startup", - "Activation Time:", - "Activated By:", - "Not yet activated.", - "Uncaught Errors ({0})", - "Messages ({0})", - "No status available.", - "Settings ({0})", - "ID", - "Description", - "Default", - "Debuggers ({0})", - "Name", - "Type", - "View Containers ({0})", - "ID", - "Title", - "Where", - "Views ({0})", - "ID", - "Name", - "Where", - "Localizations ({0})", - "Language ID", - "Language Name", - "Language Name (Localized)", - "Custom Editors ({0})", - "View Type", - "Priority", - "Filename Pattern", - "Code Actions ({0})", - "Title", - "Kind", - "Description", - "Languages", - "Authentication ({0})", - "Label", - "ID", - "Color Themes ({0})", - "File Icon Themes ({0})", - "Product Icon Themes ({0})", - "Colors ({0})", - "ID", - "Description", - "Dark Default", - "Light Default", - "High Contrast Default", - "JSON Validation ({0})", - "File Match", - "Schema", - "Commands ({0})", - "ID", - "Title", - "Keyboard Shortcuts", - "Menu Contexts", - "Languages ({0})", - "ID", - "Name", - "File Extensions", - "Grammar", - "Snippets", - "Activation Events ({0})", - "Notebooks ({0})", - "ID", - "Name", - "Notebook Renderers ({0})", - "Name", - "Mimetypes", - "Find", - "Find Next", - "Find Previous" - ], - "vs/workbench/contrib/extensions/common/extensionsUtils": [ - "Disable other keymaps ({0}) to avoid conflicts between keybindings?", - "Yes", - "No" - ], - "vs/workbench/contrib/extensions/browser/extensionsDependencyChecker": [ - "Extensions", - "Install Missing Dependencies", - "Finished installing missing dependencies. Please reload the window now.", - "Reload Window", - "There are no missing dependencies to install." - ], - "vs/workbench/contrib/extensions/browser/extensionsActivationProgress": [ - "Activating Extensions..." - ], - "vs/workbench/contrib/extensions/browser/extensionsQuickAccess": [ - "Type an extension name to install or search.", - "Press Enter to search for extension '{0}'.", - "Press Enter to install extension '{0}'.", - "Press Enter to manage your extensions." - ], "vs/workbench/contrib/extensions/browser/extensionsActions": [ "{0} for the Web", "The '{0}' extension is not available in {1}. Click 'More Information' to learn more.", @@ -24481,12 +24665,6 @@ "Install", "Install Release Version", "Install", - "Do not sync", - "{0} in {1} ({2})", - "{0} in {1}", - "{0} Locally ({1})", - "{0} Locally", - "Install this extension in all your synced {0} instances", "Installing", "Install", "Installing", @@ -24619,38 +24797,24 @@ "Button foreground color for extension actions that stand out (e.g. install button).", "Button background hover color for extension actions that stand out (e.g. install button)." ], - "vs/workbench/contrib/extensions/browser/extensionRecommendationNotificationService": [ - "Don't Show Again", - "Do you want to ignore all extension recommendations?", - "Yes, Ignore All", - "No", - "this repository", - "'{0}' extension from {1}", - "extensions from {0}, {1} and others", - "extensions from {0} and {1}", - "extensions from {0}", - "Do you want to install the recommended {0} for {1}?", - "You have {0} installed on your system. Do you want to install the recommended {1} for it?", - "Install", - "Install (Do not sync)", - "Show Recommendations" + "vs/workbench/contrib/extensions/browser/extensionsViews": [ + "Extensions", + "Unable to search the Marketplace when offline, please check your network connection.", + "Error while fetching extensions. {0}", + "No extensions found.", + "Marketplace returned 'ECONNREFUSED'. Please check the 'http.proxy' setting.", + "Open User Settings", + "There are no extensions to install.", + "Verified Publisher {0}", + "Publisher {0}", + "Deprecated", + "Rated {0} out of 5 stars by {1} users" ], - "vs/workbench/contrib/extensions/browser/abstractRuntimeExtensionsEditor": [ - "Activated by {0} on start-up", - "Activated by {1} because a file matching {0} exists in your workspace", - "Activated by {1} because file {0} exists in your workspace", - "Activated by {1} because searching for {0} took too long", - "Activated by {0} after start-up finished", - "Activated by {1} because you opened a {0} file", - "Activated by {1} on {0}", - "Extension is activating...", - "Extension has caused the extension host to freeze.", - "{0} uncaught errors", - "Runtime Extensions", - "Copy id ({0})", - "Disable (Workspace)", - "Disable", - "Show Running Extensions" + "vs/workbench/contrib/externalUriOpener/common/externalUriOpenerService": [ + "Open in new browser window", + "Open in default browser", + "Configure default opener...", + "How would you like to open: {0}" ], "vs/workbench/contrib/extensions/browser/extensionsIcons": [ "View icon of the extensions view.", @@ -24678,11 +24842,151 @@ "Icon shown with a workspace trust message in the extension editor.", "Icon shown with a activation time message in the extension editor." ], - "vs/workbench/contrib/extensions/browser/extensionEnablementWorkspaceTrustTransitionParticipant": [ - "Restarting extension host due to workspace trust change." + "vs/platform/dnd/browser/dnd": [ + "File is too large to open as untitled editor. Please upload it first into the file explorer and then try again." ], - "vs/workbench/contrib/extensions/browser/extensionsCompletionItemsProvider": [ - "Example" + "vs/workbench/contrib/extensions/common/extensionsFileTemplate": [ + "Extensions", + "List of extensions which should be recommended for users of this workspace. The identifier of an extension is always '${publisher}.${name}'. For example: 'vscode.csharp'.", + "Expected format '${publisher}.${name}'. Example: 'vscode.csharp'.", + "List of extensions recommended by VS Code that should not be recommended for users of this workspace. The identifier of an extension is always '${publisher}.${name}'. For example: 'vscode.csharp'.", + "Expected format '${publisher}.${name}'. Example: 'vscode.csharp'." + ], + "vs/workbench/contrib/extensions/common/extensionsUtils": [ + "Disable other keymaps ({0}) to avoid conflicts between keybindings?", + "Yes", + "No" + ], + "vs/workbench/contrib/extensions/browser/extensionEditor": [ + "Extension Version", + "Pre-Release", + "Extension name", + "Preview", + "Preview", + "Built-in", + "Publisher", + "Install count", + "Rating", + "Details", + "Extension details, rendered from the extension's 'README.md' file", + "Feature Contributions", + "Lists contributions to VS Code by this extension", + "Changelog", + "Extension update history, rendered from the extension's 'CHANGELOG.md' file", + "Dependencies", + "Lists extensions this extension depends on", + "Extension Pack", + "Lists extensions those will be installed together with this extension", + "Runtime Status", + "Extension runtime status", + "No README available.", + "Readme", + "Extension Pack ({0})", + "No README available.", + "Readme", + "Categories", + "Marketplace", + "Repository", + "License", + "Extension Resources", + "More Info", + "Published", + "Last released", + "Last updated", + "Identifier", + "No Changelog available.", + "Changelog", + "No Contributions", + "No Contributions", + "No Dependencies", + "Activation Event:", + "Startup", + "Activation Time:", + "Activated By:", + "Not yet activated.", + "Uncaught Errors ({0})", + "Messages ({0})", + "No status available.", + "Settings ({0})", + "ID", + "Description", + "Default", + "Debuggers ({0})", + "Name", + "Type", + "View Containers ({0})", + "ID", + "Title", + "Where", + "Views ({0})", + "ID", + "Name", + "Where", + "Localizations ({0})", + "Language ID", + "Language Name", + "Language Name (Localized)", + "Custom Editors ({0})", + "View Type", + "Priority", + "Filename Pattern", + "Code Actions ({0})", + "Title", + "Kind", + "Description", + "Languages", + "Authentication ({0})", + "Label", + "ID", + "Color Themes ({0})", + "File Icon Themes ({0})", + "Product Icon Themes ({0})", + "Colors ({0})", + "ID", + "Description", + "Dark Default", + "Light Default", + "High Contrast Default", + "JSON Validation ({0})", + "File Match", + "Schema", + "Commands ({0})", + "ID", + "Title", + "Keyboard Shortcuts", + "Menu Contexts", + "Languages ({0})", + "ID", + "Name", + "File Extensions", + "Grammar", + "Snippets", + "Activation Events ({0})", + "Notebooks ({0})", + "ID", + "Name", + "Notebook Renderers ({0})", + "Name", + "Mimetypes", + "Find", + "Find Next", + "Find Previous" + ], + "vs/workbench/contrib/extensions/browser/extensionsActivationProgress": [ + "Activating Extensions..." + ], + "vs/workbench/contrib/extensions/browser/extensionsDependencyChecker": [ + "Extensions", + "Install Missing Dependencies", + "Finished installing missing dependencies. Please reload the window now.", + "Reload Window", + "There are no missing dependencies to install." + ], + "vs/workbench/contrib/extensions/browser/extensionsQuickAccess": [ + "Type an extension name to install or search.", + "Press Enter to search for extension '{0}'.", + "Press Enter to install extension '{0}'.", + "Press Enter to manage your extensions." ], "vs/workbench/contrib/extensions/browser/extensionsWorkbenchService": [ "Manifest is not found", @@ -24706,74 +25010,52 @@ "Cannot disable '{0}' extension alone. '{1}' and '{2}' extensions depend on this. Do you want to disable all these extensions?", "Cannot disable '{0}' extension alone. '{1}', '{2}' and other extensions depend on this. Do you want to disable all these extensions?" ], - "vs/workbench/contrib/extensions/browser/deprecatedExtensionsChecker": [ - "You have deprecated extensions installed. We recommend to review them and migrate to alternatives.", - "Show Deprecated Extensions", - "Don't Show Again" - ], - "vs/workbench/contrib/extensions/browser/extensionsViews": [ - "Extensions", - "Unable to search the Marketplace when offline, please check your network connection.", - "Error while fetching extensions. {0}", - "No extensions found.", - "Marketplace returned 'ECONNREFUSED'. Please check the 'http.proxy' setting.", - "Open User Settings", - "There are no extensions to install.", - "Verified Publisher {0}", - "Publisher {0}", - "Deprecated", - "Rated {0} out of 5 stars by {1} users" - ], - "vs/workbench/contrib/terminal/browser/terminal.contribution": [ - "Type the name of a terminal to open.", - "Show All Opened Terminals", - "Terminal", - "Terminal", - "&&Terminal" - ], - "vs/platform/dnd/browser/dnd": [ - "File is too large to open as untitled editor. Please upload it first into the file explorer and then try again." - ], - "vs/workbench/contrib/output/browser/logViewer": [ - "Log viewer" - ], - "vs/workbench/contrib/terminal/browser/terminalView": [ - "Use 'monospace'", - "The terminal only supports monospace fonts. Be sure to restart VS Code if this is a newly installed font.", - "Open Terminals.", - "Starting..." - ], - "vs/workbench/contrib/terminalContrib/environmentChanges/browser/terminal.environmentChanges.contribution": [ - "Show Environment Contributions", - "Terminal Environment Changes", - "Extension: {0}" + "vs/workbench/contrib/extensions/browser/extensionRecommendationNotificationService": [ + "Don't Show Again", + "Do you want to ignore all extension recommendations?", + "Yes, Ignore All", + "No", + "this repository", + "'{0}' extension from {1}", + "extensions from {0}, {1} and others", + "extensions from {0} and {1}", + "extensions from {0}", + "Do you want to install the recommended {0} for {1}?", + "You have {0} installed on your system. Do you want to install the recommended {1} for it?", + "Install", + "Install (Do not sync)", + "Show Recommendations" ], - "vs/workbench/contrib/terminalContrib/developer/browser/terminal.developer.contribution": [ - "Show Terminal Texture Atlas", - "Write Data to Terminal", - "Enter data to write directly to the terminal, bypassing the pty" + "vs/workbench/contrib/extensions/browser/abstractRuntimeExtensionsEditor": [ + "Activated by {0} on start-up", + "Activated by {1} because a file matching {0} exists in your workspace", + "Activated by {1} because file {0} exists in your workspace", + "Activated by {1} because searching for {0} took too long", + "Activated by {0} after start-up finished", + "Activated by {1} because you opened a {0} file", + "Activated by {1} on {0}", + "Extension is activating...", + "Extension has caused the extension host to freeze.", + "{0} uncaught errors", + "Runtime Extensions", + "Copy id ({0})", + "Disable (Workspace)", + "Disable", + "Show Running Extensions" ], - "vs/workbench/contrib/terminalContrib/accessibility/browser/terminal.accessibility.contribution": [ - "Show Terminal Accessibility Help", - "Focus Accessible Buffer", - "Navigate Accessible Buffer", - "Accessible Buffer Go to Next Command", - "Accessible Buffer Go to Previous Command" + "vs/workbench/contrib/extensions/browser/extensionEnablementWorkspaceTrustTransitionParticipant": [ + "Restarting extension host due to workspace trust change." ], - "vs/workbench/contrib/terminalContrib/find/browser/terminal.find.contribution": [ - "Focus Find", - "Hide Find", - "Toggle Find Using Regex", - "Toggle Find Using Whole Word", - "Toggle Find Using Case Sensitive", - "Find Next", - "Find Previous", - "Search Workspace" + "vs/workbench/contrib/extensions/browser/extensionsCompletionItemsProvider": [ + "Example" ], - "vs/workbench/contrib/terminalContrib/links/browser/terminal.links.contribution": [ - "Open Detected Link...", - "Open Last URL Link", - "Open Last Local File Link" + "vs/workbench/contrib/extensions/browser/deprecatedExtensionsChecker": [ + "You have deprecated extensions installed. We recommend to review them and migrate to alternatives.", + "Show Deprecated Extensions", + "Don't Show Again" + ], + "vs/workbench/contrib/output/browser/logViewer": [ + "Log viewer" ], "vs/workbench/contrib/tasks/common/problemMatcher": [ "The problem pattern is missing a regular expression.", @@ -24845,9 +25127,6 @@ "ESLint stylish problems", "Go problems" ], - "vs/workbench/contrib/terminalContrib/quickFix/browser/terminal.quickFix.contribution": [ - "Show Terminal Quick Fixes" - ], "vs/workbench/contrib/tasks/browser/runAutomaticTasks": [ "Manage Automatic Tasks", "Allow Automatic Tasks", @@ -24863,10 +25142,6 @@ "Linux specific command configuration", "Specifies whether the command is a shell command or an external program. Defaults to false if omitted." ], - "vs/workbench/contrib/tasks/browser/tasksQuickAccess": [ - "No matching tasks", - "Select the task to run" - ], "vs/workbench/contrib/tasks/common/jsonSchema_v2": [ "Specifies whether the command is a shell command or an external program. Defaults to false if omitted.", "The property isShellCommand is deprecated. Use the type property of the task and the shell property in the options instead. See also the 1.14 release notes.", @@ -24951,13 +25226,9 @@ "Mac specific command configuration", "Linux specific command configuration" ], - "vs/workbench/contrib/remote/browser/tunnelFactory": [ - "Private", - "Public" - ], - "vs/workbench/contrib/emmet/browser/actions/expandAbbreviation": [ - "Emmet: Expand Abbreviation", - "Emmet: E&&xpand Abbreviation" + "vs/workbench/contrib/tasks/browser/tasksQuickAccess": [ + "No matching tasks", + "Select the task to run" ], "vs/workbench/contrib/tasks/common/taskDefinitionRegistry": [ "The actual task type. Please note that types starting with a '$' are reserved for internal usage.", @@ -24966,6 +25237,37 @@ "The task type configuration is missing the required 'taskType' property", "Contributes task kinds" ], + "vs/workbench/contrib/remote/browser/tunnelFactory": [ + "Private", + "Public" + ], + "vs/workbench/contrib/remote/browser/remote": [ + "The ID of a Get Started walkthrough to open.", + "Contributes help information for Remote", + "The url, or a command that returns the url, to your project's Getting Started page, or a walkthrough ID contributed by your project's extension", + "The url, or a command that returns the url, to your project's documentation page", + "The url, or a command that returns the url, to your project's feedback reporter", + "Use {0} instead", + "The url, or a command that returns the url, to your project's issue reporter", + "The url, or a command that returns the url, to your project's issues list", + "Get Started", + "Read Documentation", + "Review Issues", + "Report Issue", + "Select url to open", + "Help and feedback", + "Remote Help", + "Remote Explorer", + "Remote Explorer", + "Attempting to reconnect in {0} second...", + "Attempting to reconnect in {0} seconds...", + "Reconnect Now", + "Reload Window", + "Connection Lost", + "Disconnected. Attempting to reconnect...", + "Cannot reconnect. Please reload the window.", + "&&Reload Window" + ], "vs/workbench/contrib/remote/browser/remoteIndicator": [ "Status bar background color when the workbench is offline. The status bar is shown in the bottom of the window", "Status bar foreground color when the workbench is offline. The status bar is shown in the bottom of the window", @@ -24988,8 +25290,47 @@ "Close Remote Connection", "Reload Window", "Close Remote Workspace", - "Install Additional Remote Extensions...", - "Select an option to open a Remote Window" + "Learn More", + "Install", + "Select an option to open a Remote Window", + "Installing extension... " + ], + "vs/workbench/contrib/terminal/browser/terminal.contribution": [ + "Type the name of a terminal to open.", + "Show All Opened Terminals", + "Terminal", + "Terminal", + "&&Terminal" + ], + "vs/workbench/contrib/terminalContrib/accessibility/browser/terminal.accessibility.contribution": [ + "Focus Accessible Buffer", + "Navigate Accessible Buffer", + "Accessible Buffer Go to Next Command", + "Accessible Buffer Go to Previous Command" + ], + "vs/workbench/contrib/terminal/browser/terminalView": [ + "Use 'monospace'", + "The terminal only supports monospace fonts. Be sure to restart VS Code if this is a newly installed font.", + "Open Terminals.", + "Starting..." + ], + "vs/workbench/contrib/terminalContrib/developer/browser/terminal.developer.contribution": [ + "Show Terminal Texture Atlas", + "Write Data to Terminal", + "Enter data to write directly to the terminal, bypassing the pty", + "Restart Pty Host" + ], + "vs/workbench/contrib/terminalContrib/environmentChanges/browser/terminal.environmentChanges.contribution": [ + "Show Environment Contributions", + "Terminal Environment Changes", + "Extension: {0}" + ], + "vs/workbench/contrib/terminalContrib/quickFix/browser/terminal.quickFix.contribution": [ + "Show Terminal Quick Fixes" + ], + "vs/workbench/contrib/emmet/browser/actions/expandAbbreviation": [ + "Emmet: Expand Abbreviation", + "Emmet: E&&xpand Abbreviation" ], "vs/workbench/contrib/codeEditor/browser/accessibility/accessibility": [ "Accessibility Help", @@ -25011,41 +25352,28 @@ "Press Command+H now to open a browser window with more VS Code information related to Accessibility.", "Press Control+H now to open a browser window with more VS Code information related to Accessibility.", "You can dismiss this tooltip and return to the editor by pressing Escape or Shift+Escape.", - "Show Accessibility Help", "Toggle Screen Reader Accessibility Mode" ], - "vs/workbench/contrib/remote/browser/remote": [ - "The ID of a Get Started walkthrough to open.", - "Contributes help information for Remote", - "The url, or a command that returns the url, to your project's Getting Started page, or a walkthrough ID contributed by your project's extension", - "The url, or a command that returns the url, to your project's documentation page", - "The url, or a command that returns the url, to your project's feedback reporter", - "Use {0} instead", - "The url, or a command that returns the url, to your project's issue reporter", - "The url, or a command that returns the url, to your project's issues list", - "Get Started", - "Read Documentation", - "Review Issues", - "Report Issue", - "Select url to open", - "Help and feedback", - "Remote Help", - "Remote Explorer", - "Remote Explorer", - "Attempting to reconnect in {0} second...", - "Attempting to reconnect in {0} seconds...", - "Reconnect Now", - "Reload Window", - "Connection Lost", - "Disconnected. Attempting to reconnect...", - "Cannot reconnect. Please reload the window.", - "&&Reload Window" + "vs/workbench/contrib/terminalContrib/links/browser/terminal.links.contribution": [ + "Open Detected Link...", + "Open Last URL Link", + "Open Last Local File Link" ], "vs/workbench/contrib/codeEditor/browser/diffEditorHelper": [ "The diff algorithm was stopped early (after {0} ms.)", "Remove Limit", "Show Whitespace Differences" ], + "vs/workbench/contrib/terminalContrib/find/browser/terminal.find.contribution": [ + "Focus Find", + "Hide Find", + "Toggle Find Using Regex", + "Toggle Find Using Whole Word", + "Toggle Find Using Case Sensitive", + "Find Next", + "Find Previous", + "Search Workspace" + ], "vs/workbench/contrib/codeEditor/browser/inspectKeybindings": [ "Inspect Key Mappings", "Inspect Key Mappings (JSON)" @@ -25055,28 +25383,28 @@ "Forcefully Enable Features", "Please reopen file in order for this setting to take effect." ], + "vs/workbench/contrib/codeEditor/browser/inspectEditorTokens/inspectEditorTokens": [ + "Developer: Inspect Editor Tokens and Scopes", + "Loading..." + ], "vs/workbench/contrib/codeEditor/browser/quickaccess/gotoLineQuickAccess": [ "Go to Line/Column...", "Type the line number and optional column to go to (e.g. 42:5 for line 42 and column 5).", "Go to Line/Column" ], - "vs/workbench/contrib/codeEditor/browser/toggleMinimap": [ - "Toggle Minimap", - "&&Minimap" - ], - "vs/workbench/contrib/codeEditor/browser/toggleColumnSelection": [ - "Toggle Column Selection Mode", - "Column &&Selection Mode" - ], "vs/workbench/contrib/codeEditor/browser/saveParticipants": [ "Running '{0}' Formatter ([configure]({1})).", "Quick Fixes", "Getting code actions from '{0}' ([configure]({1})).", "Applying code action '{0}'." ], - "vs/workbench/contrib/codeEditor/browser/inspectEditorTokens/inspectEditorTokens": [ - "Developer: Inspect Editor Tokens and Scopes", - "Loading..." + "vs/workbench/contrib/codeEditor/browser/toggleColumnSelection": [ + "Toggle Column Selection Mode", + "Column &&Selection Mode" + ], + "vs/workbench/contrib/codeEditor/browser/toggleMinimap": [ + "Toggle Minimap", + "&&Minimap" ], "vs/workbench/contrib/codeEditor/browser/toggleMultiCursorModifier": [ "Toggle Multi-Cursor Modifier", @@ -25084,14 +25412,14 @@ "Switch to Cmd+Click for Multi-Cursor", "Switch to Ctrl+Click for Multi-Cursor" ], - "vs/workbench/contrib/codeEditor/browser/toggleRenderWhitespace": [ - "Toggle Render Whitespace", - "&&Render Whitespace" - ], "vs/workbench/contrib/codeEditor/browser/toggleRenderControlCharacter": [ "Toggle Control Characters", "Render &&Control Characters" ], + "vs/workbench/contrib/codeEditor/browser/toggleRenderWhitespace": [ + "Toggle Render Whitespace", + "&&Render Whitespace" + ], "vs/workbench/contrib/codeEditor/browser/toggleWordWrap": [ "Whether the editor is currently using word wrapping.", "View: Toggle Word Wrap", @@ -25102,11 +25430,51 @@ "vs/workbench/contrib/codeEditor/browser/untitledTextEditorHint/untitledTextEditorHint": [ "[[Select a language]], or [[fill with template]], or [[open a different editor]] to get started.\nStart typing to dismiss or [[don't show]] this again." ], - "vs/workbench/contrib/format/browser/formatActionsNone": [ - "Format Document", - "This file cannot be formatted because it is too large", - "There is no formatter for '{0}' files installed.", - "&&Install Formatter..." + "vs/workbench/contrib/snippets/browser/commands/configureSnippets": [ + "(global)", + "({0})", + "({0}) {1}", + "Type snippet file name", + "Invalid file name", + "'{0}' is not a valid file name", + "'{0}' already exists", + "Configure User Snippets", + "User Snippets", + "User &&Snippets", + "global", + "New Global Snippets file...", + "{0} workspace", + "New Snippets file for '{0}'...", + "Existing Snippets", + "New Snippets", + "New Snippets", + "Select Snippets File or Create Snippets" + ], + "vs/workbench/contrib/snippets/browser/commands/fileTemplateSnippets": [ + "Fill File with Snippet", + "Select a snippet" + ], + "vs/workbench/contrib/snippets/browser/commands/insertSnippet": [ + "Insert Snippet" + ], + "vs/workbench/contrib/snippets/browser/commands/surroundWithSnippet": [ + "Surround With Snippet..." + ], + "vs/workbench/contrib/snippets/browser/snippetCodeActionProvider": [ + "Surround With: {0}", + "Start with Snippet", + "Start with: {0}" + ], + "vs/workbench/contrib/snippets/browser/snippetsService": [ + "Expected string in `contributes.{0}.path`. Provided value: {1}", + "When omitting the language, the value of `contributes.{0}.path` must be a `.code-snippets`-file. Provided value: {1}", + "Unknown language in `contributes.{0}.language`. Provided value: {1}", + "Expected `contributes.{0}.path` ({1}) to be included inside extension's folder ({2}). This might make the extension non-portable.", + "Contributes snippets.", + "Language identifier for which this snippet is contributed to.", + "Path of the snippets file. The path is relative to the extension folder and typically starts with './snippets/'.", + "One or more snippets from the extension '{0}' very likely confuse snippet-variables and snippet-placeholders (see https://code.visualstudio.com/docs/editor/userdefinedsnippets#_snippet-syntax for more details)", + "The snippet file \"{0}\" could not be read." ], "vs/workbench/contrib/format/browser/formatActionsMultiple": [ "None", @@ -25129,34 +25497,14 @@ "Format Document With...", "Format Selection With..." ], - "vs/workbench/contrib/format/browser/formatModified": [ - "Format Modified Lines" - ], - "vs/workbench/contrib/snippets/browser/snippetCodeActionProvider": [ - "Surround With: {0}", - "Start with Snippet", - "Start with: {0}" - ], - "vs/workbench/contrib/snippets/browser/snippetsService": [ - "Expected string in `contributes.{0}.path`. Provided value: {1}", - "When omitting the language, the value of `contributes.{0}.path` must be a `.code-snippets`-file. Provided value: {1}", - "Unknown language in `contributes.{0}.language`. Provided value: {1}", - "Expected `contributes.{0}.path` ({1}) to be included inside extension's folder ({2}). This might make the extension non-portable.", - "Contributes snippets.", - "Language identifier for which this snippet is contributed to.", - "Path of the snippets file. The path is relative to the extension folder and typically starts with './snippets/'.", - "One or more snippets from the extension '{0}' very likely confuse snippet-variables and snippet-placeholders (see https://code.visualstudio.com/docs/editor/userdefinedsnippets#_snippet-syntax for more details)", - "The snippet file \"{0}\" could not be read." - ], - "vs/workbench/contrib/snippets/browser/commands/insertSnippet": [ - "Insert Snippet" - ], - "vs/workbench/contrib/snippets/browser/commands/surroundWithSnippet": [ - "Surround With Snippet..." + "vs/workbench/contrib/format/browser/formatActionsNone": [ + "Format Document", + "This file cannot be formatted because it is too large", + "There is no formatter for '{0}' files installed.", + "&&Install Formatter..." ], - "vs/workbench/contrib/snippets/browser/commands/fileTemplateSnippets": [ - "Fill File with Snippet", - "Select a snippet" + "vs/workbench/contrib/format/browser/formatModified": [ + "Format Modified Lines" ], "vs/workbench/contrib/update/browser/update": [ "This version of {0} does not have release notes online", @@ -25201,48 +25549,11 @@ "vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedInput": [ "Welcome" ], - "vs/workbench/contrib/welcomeGettingStarted/browser/startupPage": [ - "Could not open markdown preview: {0}.\n\nPlease make sure the markdown extension is enabled." - ], - "vs/workbench/contrib/snippets/browser/commands/configureSnippets": [ - "(global)", - "({0})", - "({0}) {1}", - "Type snippet file name", - "Invalid file name", - "'{0}' is not a valid file name", - "'{0}' already exists", - "Configure User Snippets", - "User Snippets", - "User &&Snippets", - "global", - "New Global Snippets file...", - "{0} workspace", - "New Snippets file for '{0}'...", - "Existing Snippets", - "New Snippets", - "New Snippets", - "Select Snippets File or Create Snippets" - ], "vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedService": [ "Built-In", "Developer", "Reset Welcome Page Walkthrough Progress" ], - "vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedIcons": [ - "Used to represent walkthrough steps which have not been completed", - "Used to represent walkthrough steps which have been completed" - ], - "vs/workbench/contrib/remote/browser/remoteStartEntry": [ - "Remote", - "Show Remote Start Entry Actions", - "Show Start Entry for Remote Tunnels", - "Learn More", - "Install", - "Select an option to connect", - "Installing extension... ", - "When enabled, a start list entry for getting started with remote experiences in shown on the welcome page." - ], "vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted": [ "Overview of how to get up to speed with your editor.", "Open Walkthrough...", @@ -25276,10 +25587,25 @@ "opt out", "{0} collects usage data. Read our {1} and learn how to {2}." ], + "vs/workbench/contrib/welcomeGettingStarted/browser/startupPage": [ + "Welcome Page", + "Could not open markdown preview: {0}.\n\nPlease make sure the markdown extension is enabled." + ], + "vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedIcons": [ + "Used to represent walkthrough steps which have not been completed", + "Used to represent walkthrough steps which have been completed" + ], "vs/workbench/contrib/welcomeWalkthrough/browser/walkThroughPart": [ "unbound", "It looks like Git is not installed on your system." ], + "vs/workbench/contrib/welcomeWalkthrough/browser/editor/editorWalkThrough": [ + "Editor Playground", + "Interactive Editor Playground" + ], + "vs/workbench/contrib/welcomeViews/common/viewsWelcomeContribution": [ + "The viewsWelcome contribution in '{0}' requires 'enabledApiProposals: [\"contribViewsWelcome\"]' in order to use the 'group' proposed property." + ], "vs/workbench/contrib/welcomeViews/common/viewsWelcomeExtensionPoint": [ "Contributed views welcome content. Welcome content will be rendered in tree based views whenever they have no meaningful content to display, ie. the File Explorer when no folder is open. Such content is useful as in-product documentation to drive users to use certain features before they are available. A good example would be a `Clone Repository` button in the File Explorer welcome view.", "Contributed welcome content for a specific view.", @@ -25290,9 +25616,6 @@ "Group to which this welcome content belongs. Proposed API.", "Condition when the welcome content buttons and command links should be enabled." ], - "vs/workbench/contrib/welcomeViews/common/viewsWelcomeContribution": [ - "The viewsWelcome contribution in '{0}' requires 'enabledApiProposals: [\"contribViewsWelcome\"]' in order to use the 'group' proposed property." - ], "vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek": [ "Calls from '{0}'", "Callers of '{0}'", @@ -25359,15 +25682,6 @@ "Tweet Feedback", "Tweet Feedback" ], - "vs/workbench/contrib/editSessions/common/editSessions": [ - "Cloud Changes", - "Cloud Changes", - "View icon of the cloud changes view." - ], - "vs/workbench/contrib/welcomeWalkthrough/browser/editor/editorWalkThrough": [ - "Editor Playground", - "Interactive Editor Playground" - ], "vs/workbench/contrib/userDataSync/browser/userDataSync": [ "Turn Off", "Configure...", @@ -25447,12 +25761,65 @@ "Complete Merge", "Clear Data in Cloud..." ], + "vs/workbench/contrib/userDataProfile/browser/userDataProfile": [ + "Create an Empty Profile...", + "Create from Current Profile...", + "Profiles ({0})", + "Switch Profile...", + "Select Profile", + "Rename...", + "Show Contents...", + "Export Profile...", + "Export Profile ({0})...", + "Import Profile...", + "Create from profile template file", + "Create from profile template URL", + "Create Profile from Profile Template...", + "Provide profile template URL or select profile template file", + "Error while creating profile: {0}", + "Select Profile Template File", + "Import Profile...", + "Profile name", + "Create from Current Profile...", + "Create an Empty Profile...", + "Profile with name {0} already exists.", + "Create Profile...", + "Empty Profile", + "Using Current Profile", + "Profile Templates", + "Create Profile...", + "Delete Profile...", + "Current", + "Delete Profile...", + "Select Profiles to Delete", + "Create Profile from Templates...", + "{0}: Create...", + "There are no templates to create from" + ], + "vs/workbench/contrib/userDataProfile/browser/userDataProfileActions": [ + "Create a Temporary Profile", + "Rename...", + "Rename {0}", + "Profile with name {0} already exists.", + "Current", + "Rename Profile...", + "Select Profile to Rename", + "Manage...", + "Cleanup Profiles", + "Reset Workspace Profiles Associations" + ], + "vs/workbench/contrib/editSessions/common/editSessions": [ + "Cloud Changes", + "Cloud Changes", + "View icon of the cloud changes view." + ], "vs/workbench/contrib/editSessions/browser/editSessionsStorageService": [ "Select an account to store your working changes in the cloud", "Signed In", "Others", "Sign in with {0}", "Turn on Cloud Changes...", + "Turn on Cloud Changes... (1)", "Turn off Cloud Changes...", "Do you want to disable storing working changes in the cloud?", "Delete all stored data from the cloud." @@ -25496,6 +25863,26 @@ "Code Action kinds to be run on save.", "Controls whether '{0}' actions should be run on file save." ], + "vs/workbench/contrib/timeline/browser/timelinePane": [ + "Loading...", + "Load more", + "Timeline", + "The active editor cannot provide timeline information.", + "No timeline information was provided.", + "The active editor cannot provide timeline information.", + "{0}: {1}", + "Timeline", + "Loading timeline for {0}...", + "Icon for the refresh timeline action.", + "Icon for the pin timeline action.", + "Icon for the unpin timeline action.", + "Refresh", + "Timeline", + "Pin the Current Timeline", + "Timeline", + "Unpin the Current Timeline", + "Timeline" + ], "vs/workbench/contrib/localHistory/browser/localHistoryTimeline": [ "Local History" ], @@ -25515,6 +25902,7 @@ "Find Entry to Restore", "Select the file to show local history for", "Select the local history entry to open", + "Local History: Find Entry to Restore...", "Rename", "Rename Local History Entry", "Enter the new name of the local history entry", @@ -25533,76 +25921,6 @@ "{0} ({1} • {2}) ↔ {3}", "{0} ({1} • {2}) ↔ {3} ({4} • {5})" ], - "vs/workbench/contrib/userDataProfile/browser/userDataProfile": [ - "Create an Empty Profile...", - "Create from Current Profile...", - "Profiles ({0})", - "Switch Profile...", - "Select Profile", - "Rename...", - "Show Contents...", - "Export Profile...", - "Export Profile ({0})...", - "Import Profile...", - "Create from profile template file", - "Create from profile template URL", - "Create Profile from Profile Template...", - "Provide profile template URL or select profile template file", - "Error while creating profile: {0}", - "Select Profile Template File", - "Import Profile...", - "Profile name", - "Create from Current Profile...", - "Create an Empty Profile...", - "Profile with name {0} already exists.", - "Create Profile...", - "Empty Profile", - "Using Current Profile", - "Profile Templates", - "Create Profile...", - "Delete Profile...", - "Current", - "Delete Profile...", - "Select Profiles to Delete", - "Create Profile from Templates...", - "{0}: Create...", - "There are no templates to create from" - ], - "vs/workbench/contrib/userDataProfile/browser/userDataProfileActions": [ - "Create a Temporary Profile", - "Rename...", - "Rename {0}", - "Profile with name {0} already exists.", - "Current", - "Rename Profile...", - "Select Profile to Rename", - "Manage...", - "Cleanup Profiles", - "Reset Workspace Profiles Associations" - ], - "vs/workbench/contrib/timeline/browser/timelinePane": [ - "Loading...", - "Load more", - "Timeline", - "The active editor cannot provide timeline information.", - "No timeline information was provided.", - "The active editor cannot provide timeline information.", - "{0}: {1}", - "Timeline", - "Loading timeline for {0}...", - "Icon for the refresh timeline action.", - "Icon for the pin timeline action.", - "Icon for the unpin timeline action.", - "Refresh", - "Timeline", - "Pin the Current Timeline", - "Timeline", - "Unpin the Current Timeline", - "Timeline" - ], - "vs/workbench/services/workspaces/browser/workspaceTrustEditorInput": [ - "Workspace Trust" - ], "vs/workbench/contrib/workspace/browser/workspaceTrustEditor": [ "Icon for workspace trust ion the banner.", "Icon for the checkmark in the workspace trust editor.", @@ -25676,101 +25994,18 @@ "This folder is trusted via the bolded entries in the the trusted folders below.", "This window is trusted by nature of the workspace that is opened." ], - "vs/workbench/contrib/audioCues/browser/commands": [ - "Help: List Audio Cues", - "Disabled", - "Enable/Disable Audio Cue", - "Select an audio cue to play" - ], - "vs/workbench/contrib/share/browser/shareService": [ - "The number of available share providers", - "Choose how to share {0}" - ], - "vs/workbench/contrib/accessibility/browser/accessibilityContribution": [ - "Accessibility", - "Provide information about how to access the terminal accessibility help menu when the terminal is focused", - "Provide information about how to navigate changes in the diff editor when it is focused", - "Provide information about how to access the chat help menu when the chat input is focused", - "Provide information about how to access the interactive editor accessibility help menu when the interactive editor input is focused", - "Provide information about how to change a keybinding in the keybindings editor when a row is focused", - "Provide information about how to focus the cell container or inner editor when a notebook cell is focused." - ], - "vs/workbench/browser/parts/notifications/notificationsCenter": [ - "No new notifications", - "Notifications", - "Notification Center Actions", - "Notifications Center" - ], - "vs/workbench/browser/parts/notifications/notificationsStatus": [ - "Notifications", - "Notifications", - "Do Not Disturb", - "Do Not Disturb Mode is Enabled", - "Hide Notifications", - "No Notifications", - "No New Notifications", - "1 New Notification", - "{0} New Notifications", - "No New Notifications ({0} in progress)", - "1 New Notification ({0} in progress)", - "{0} New Notifications ({1} in progress)", - "Status Message" - ], - "vs/workbench/browser/parts/notifications/notificationsCommands": [ - "Notifications", - "Show Notifications", - "Hide Notifications", - "Clear All Notifications", - "Accept Notification Primary Action", - "Toggle Do Not Disturb Mode", - "Focus Notification Toast" + "vs/workbench/services/workspaces/browser/workspaceTrustEditorInput": [ + "Workspace Trust" ], - "vs/workbench/browser/parts/notifications/notificationsToasts": [ - "{0}, notification", - "{0}, source: {1}, notification" + "vs/workbench/contrib/audioCues/browser/commands": [ + "Help: List Audio Cues", + "Disabled", + "Enable/Disable Audio Cue", + "Select an audio cue to play" ], - "vs/workbench/services/configuration/common/configurationEditing": [ - "Open Tasks Configuration", - "Open Launch Configuration", - "Open Settings", - "Open Tasks Configuration", - "Open Launch Configuration", - "Save and Retry", - "Save and Retry", - "Open Settings", - "Unable to write {0} because it is configured in system policy.", - "Unable to write to {0} because {1} is not a registered configuration.", - "Unable to write {0} to Workspace Settings. This setting can be written only into User settings.", - "Unable to write {0} to Workspace Settings. This setting can be written only into User settings.", - "Unable to write to Folder Settings because {0} does not support the folder resource scope.", - "Unable to write to User Settings because {0} does not support for global scope.", - "Unable to write to Workspace Settings because {0} does not support for workspace scope in a multi folder workspace.", - "Unable to write to Folder Settings because no resource is provided.", - "Unable to write to Language Settings because {0} is not a resource language setting.", - "Unable to write to {0} because no workspace is opened. Please open a workspace first and try again.", - "Unable to write into the tasks configuration file. Please open it to correct errors/warnings in it and try again.", - "Unable to write into the launch configuration file. Please open it to correct errors/warnings in it and try again.", - "Unable to write into user settings. Please open the user settings to correct errors/warnings in it and try again.", - "Unable to write into remote user settings. Please open the remote user settings to correct errors/warnings in it and try again.", - "Unable to write into workspace settings. Please open the workspace settings to correct errors/warnings in the file and try again.", - "Unable to write into folder settings. Please open the '{0}' folder settings to correct errors/warnings in it and try again.", - "Unable to write into tasks configuration file because the file has unsaved changes. Please save it first and then try again.", - "Unable to write into launch configuration file because the file has unsaved changes. Please save it first and then try again.", - "Unable to write into user settings because the file has unsaved changes. Please save the user settings file first and then try again.", - "Unable to write into remote user settings because the file has unsaved changes. Please save the remote user settings file first and then try again.", - "Unable to write into workspace settings because the file has unsaved changes. Please save the workspace settings file first and then try again.", - "Unable to write into folder settings because the file has unsaved changes. Please save the '{0}' folder settings file first and then try again.", - "Unable to write into tasks configuration file because the content of the file is newer.", - "Unable to write into launch configuration file because the content of the file is newer.", - "Unable to write into user settings because the content of the file is newer.", - "Unable to write into remote user settings because the content of the file is newer.", - "Unable to write into workspace settings because the content of the file is newer.", - "Unable to write into folder settings because the content of the file is newer.", - "Unable to write to {0} because of an internal error.", - "User Settings", - "Remote User Settings", - "Workspace Settings", - "Folder Settings" + "vs/workbench/contrib/share/browser/shareService": [ + "The number of available share providers", + "Choose how to share {0}" ], "vs/workbench/services/textfile/common/textFileEditorModelManager": [ "Failed to save '{0}': {1}" @@ -25783,11 +26018,6 @@ "Command Center", "Layout Controls" ], - "vs/workbench/browser/parts/notifications/notificationsAlerts": [ - "Error: {0}", - "Warning: {0}", - "Info: {0}" - ], "vs/workbench/services/configurationResolver/common/variableResolver": [ "Variable {0} can not be resolved. Please open an editor.", "Variable {0}: can not find workspace folder of '{1}'.", @@ -25836,41 +26066,15 @@ "vs/workbench/contrib/extensions/common/reportExtensionIssueAction": [ "Report Issue" ], - "vs/workbench/contrib/terminal/browser/terminalProfileResolverService": [ - "The terminal is using deprecated shell/shellArgs settings, do you want to migrate it to a profile?", - "Migrate" - ], "vs/workbench/contrib/terminal/electron-sandbox/terminalRemote": [ "Create New Integrated Terminal (Local)" ], - "vs/workbench/contrib/terminal/browser/baseTerminalBackend": [ - "Restart pty host", - "The connection to the terminal's pty host process is unresponsive, the terminals may stop working." - ], "vs/workbench/contrib/tasks/common/taskTemplates": [ "Executes .NET Core build command", "Executes the build target", "Example to run an arbitrary external command", "Executes common maven commands" ], - "vs/workbench/contrib/tasks/common/taskConfiguration": [ - "Warning: options.cwd must be of type string. Ignoring value {0}\n", - "Error: command argument must either be a string or a quoted string. Provided value is:\n{0}", - "Warning: shell configuration is only supported when executing tasks in the terminal.", - "Error: Problem Matcher in declare scope must have a name:\n{0}\n", - "Warning: the defined problem matcher is unknown. Supported types are string | ProblemMatcher | Array.\n{0}\n", - "Error: Invalid problemMatcher reference: {0}\n", - "Error: tasks configuration must have a type property. The configuration will be ignored.\n{0}\n", - "Error: there is no registered task type '{0}'. Did you miss installing an extension that provides a corresponding task provider?", - "Error: the task configuration '{0}' is missing the required property 'type'. The task configuration will be ignored.", - "Error: the task configuration '{0}' is using an unknown type. The task configuration will be ignored.", - "Error: tasks is not declared as a custom task. The configuration will be ignored.\n{0}\n", - "Error: a task must provide a label property. The task will be ignored.\n{0}\n", - "Warning: {0} tasks are unavailable in the current environment.\n", - "Error: the task '{0}' neither specifies a command nor a dependsOn property. The task will be ignored. Its definition is:\n{1}", - "Error: the task '{0}' doesn't define a command. The task will be ignored. Its definition is:\n{1}", - "Task version 2.0.0 doesn't support global OS specific tasks. Convert them to a task with a OS specific command. Affected tasks are:\n{0}" - ], "vs/workbench/contrib/tasks/browser/taskQuickPick": [ "Show All Tasks...", "Configuration icon in the tasks selection list.", @@ -25890,6 +26094,30 @@ "No {0} tasks found. Go back ↩", "There is no task provider registered for tasks of type \"{0}\"." ], + "vs/workbench/contrib/tasks/common/taskConfiguration": [ + "Warning: options.cwd must be of type string. Ignoring value {0}\n", + "Error: command argument must either be a string or a quoted string. Provided value is:\n{0}", + "Warning: shell configuration is only supported when executing tasks in the terminal.", + "Error: Problem Matcher in declare scope must have a name:\n{0}\n", + "Warning: the defined problem matcher is unknown. Supported types are string | ProblemMatcher | Array.\n{0}\n", + "Error: Invalid problemMatcher reference: {0}\n", + "Error: tasks configuration must have a type property. The configuration will be ignored.\n{0}\n", + "Error: there is no registered task type '{0}'. Did you miss installing an extension that provides a corresponding task provider?", + "Error: the task configuration '{0}' is missing the required property 'type'. The task configuration will be ignored.", + "Error: the task configuration '{0}' is using an unknown type. The task configuration will be ignored.", + "Error: tasks is not declared as a custom task. The configuration will be ignored.\n{0}\n", + "Error: a task must provide a label property. The task will be ignored.\n{0}\n", + "Warning: {0} tasks are unavailable in the current environment.\n", + "Error: the task '{0}' neither specifies a command nor a dependsOn property. The task will be ignored. Its definition is:\n{1}", + "Error: the task '{0}' doesn't define a command. The task will be ignored. Its definition is:\n{1}", + "Task version 2.0.0 doesn't support global OS specific tasks. Convert them to a task with a OS specific command. Affected tasks are:\n{0}" + ], + "vs/workbench/contrib/terminal/browser/baseTerminalBackend": [ + "Pty Host Status", + "Pty Host", + "The connection to the terminal's pty host process is unresponsive, terminals may stop working. Click to manually restart the pty host.", + "Pty Host is unresponsive" + ], "vs/workbench/contrib/tasks/browser/taskTerminalStatus": [ "Task is running", "Task succeeded", @@ -25979,27 +26207,10 @@ "A single path to a shell executable or an array of paths that will be used as fallbacks when one fails.", "A single path to a shell executable.", "A set of terminal profile customizations for {0} which allows adding, removing or changing how terminals are launched. Profiles are made up of a mandatory path, optional arguments and other presentation options.\n\nTo override an existing profile use its profile name as the key, for example:\n\n{1}\n\n{2}Read more about configuring profiles{3}.", - "This is deprecated, the new recommended way to configure your default shell is by creating a terminal profile in {0} and setting its profile name as the default in {1}. This will currently take priority over the new profiles settings but that will change in the future.", - "This is deprecated, the new recommended way to configure your default shell is by creating a terminal profile in {0} and setting its profile name as the default in {1}. This will currently take priority over the new profiles settings but that will change in the future.", - "This is deprecated, the new recommended way to configure your default shell is by creating a terminal profile in {0} and setting its profile name as the default in {1}. This will currently take priority over the new profiles settings but that will change in the future.", - "This is deprecated, the new recommended way to configure your automation shell is by creating a terminal automation profile with {0}. This will currently take priority over the new automation profile settings but that will change in the future.", - "This is deprecated, the new recommended way to configure your automation shell is by creating a terminal automation profile with {0}. This will currently take priority over the new automation profile settings but that will change in the future.", - "This is deprecated, the new recommended way to configure your automation shell is by creating a terminal automation profile with {0}. This will currently take priority over the new automation profile settings but that will change in the future.", "Integrated Terminal", - "A path that when set will override {0} and ignore {1} values for automation-related terminal usage like tasks and debug.", - "A path that when set will override {0} and ignore {1} values for automation-related terminal usage like tasks and debug.", - "A path that when set will override {0} and ignore {1} values for automation-related terminal usage like tasks and debug.", - "The terminal profile to use on Linux for automation-related terminal usage like tasks and debug. This setting will currently be ignored if {0} (now deprecated) is set.", - "The terminal profile to use on macOS for automation-related terminal usage like tasks and debug. This setting will currently be ignored if {0} (now deprecated) is set.", + "The terminal profile to use on Linux for automation-related terminal usage like tasks and debug.", + "The terminal profile to use on macOS for automation-related terminal usage like tasks and debug.", "The terminal profile to use for automation-related terminal usage like tasks and debug. This setting will currently be ignored if {0} (now deprecated) is set.", - "The path of the shell that the terminal uses on Linux. [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_terminal-profiles).", - "The path of the shell that the terminal uses on macOS. [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_terminal-profiles).", - "The path of the shell that the terminal uses on Windows. [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_terminal-profiles).", - "The command line arguments to use when on the Linux terminal. [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_terminal-profiles).", - "The command line arguments to use when on the macOS terminal. [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_terminal-profiles).", - "The command line arguments to use when on the Windows terminal. [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_terminal-profiles).", - "The command line arguments to use when on the Windows terminal. [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_terminal-profiles).", - "The command line arguments in [command-line format](https://msdn.microsoft.com/en-au/08dfcab2-eb6e-49a4-80eb-87d4076c98c6) to use when on the Windows terminal. [Read more about configuring the shell](https://code.visualstudio.com/docs/editor/integrated-terminal#_terminal-profiles).", "A profile source that will auto detect the paths to the shell. Note that non-standard executable locations are not supported and must be created manually in a new profile.", "The extension that contributed this profile.", "The id of the extension terminal", @@ -26016,9 +26227,9 @@ "Whether to show hovers for links in the terminal output.", "A set of process names to ignore when using the {0} setting.", "Integrated Terminal", - "The default profile used on Linux. This setting will currently be ignored if either {0} or {1} are set.", - "The default profile used on macOS. This setting will currently be ignored if either {0} or {1} are set.", - "The default profile used on Windows. This setting will currently be ignored if either {0} or {1} are set." + "The default terminal profile on Linux.", + "The default terminal profile on macOS.", + "The default terminal profile on Windows." ], "vs/base/browser/ui/findinput/findInput": [ "input" @@ -26030,6 +26241,34 @@ "for history", "Cleared Input" ], + "vs/workbench/browser/parts/notifications/notificationsList": [ + "{0}, notification", + "{0}, source: {1}, notification", + "Notifications List" + ], + "vs/workbench/browser/parts/notifications/notificationsActions": [ + "Icon for the clear action in notifications.", + "Icon for the clear all action in notifications.", + "Icon for the hide action in notifications.", + "Icon for the expand action in notifications.", + "Icon for the collapse action in notifications.", + "Icon for the configure action in notifications.", + "Icon for the mute all action in notifications.", + "Clear Notification", + "Clear All Notifications", + "Toggle Do Not Disturb Mode", + "Hide Notifications", + "Expand Notification", + "Collapse Notification", + "Configure Notification", + "Copy Text" + ], + "vs/base/browser/ui/dropdown/dropdownActionViewItem": [ + "More Actions..." + ], + "vs/base/browser/ui/actionbar/actionViewItems": [ + "{0} ({1})" + ], "vs/editor/browser/widget/diffReview": [ "Icon for 'Insert' in diff review.", "Icon for 'Remove' in diff review.", @@ -26043,9 +26282,7 @@ "{0} unchanged line {1}", "{0} original line {1} modified line {2}", "+ {0} modified line {1}", - "- {0} original line {1}", - "Go to Next Difference", - "Go to Previous Difference" + "- {0} original line {1}" ], "vs/editor/browser/widget/inlineDiffMargin": [ "Copy deleted lines", @@ -26092,14 +26329,15 @@ "Auto Fix...", "No auto fixes available" ], + "vs/editor/contrib/codeAction/browser/codeActionController": [ + "Hide Disabled", + "Show Disabled" + ], "vs/editor/contrib/codeAction/browser/lightBulbWidget": [ "Show Code Actions. Preferred Quick Fix Available ({0})", "Show Code Actions ({0})", "Show Code Actions" ], - "vs/base/browser/ui/actionbar/actionViewItems": [ - "{0} ({1})" - ], "vs/editor/contrib/dropOrPasteInto/browser/copyPasteController": [ "Whether the paste widget is showing", "Show paste options...", @@ -26130,6 +26368,7 @@ "Icon for 'Replace All' in the editor find widget.", "Icon for 'Find Previous' in the editor find widget.", "Icon for 'Find Next' in the editor find widget.", + "Find / Replace", "Find", "Find", "Previous Match", @@ -26164,9 +26403,6 @@ "Made 1 formatting edit between lines {0} and {1}", "Made {0} formatting edits between lines {1} and {2}" ], - "vs/editor/contrib/inlineCompletions/browser/hoverParticipant": [ - "Suggestion:" - ], "vs/editor/contrib/inlineCompletions/browser/commands": [ "Show Next Inline Suggestion", "Show Previous Inline Suggestion", @@ -26180,16 +26416,14 @@ "Hide Inline Suggestion", "Always Show Toolbar" ], + "vs/editor/contrib/inlineCompletions/browser/hoverParticipant": [ + "Suggestion:" + ], "vs/editor/contrib/gotoSymbol/browser/peek/referencesController": [ "Whether reference peek is visible, like 'Peek References' or 'Peek Definition'", "Loading...", "{0} ({1})" ], - "vs/editor/contrib/gotoSymbol/browser/symbolNavigation": [ - "Whether there are symbol locations that can be navigated via keyboard-only.", - "Symbol {0} of {1}, {2} for next", - "Symbol {0} of {1}" - ], "vs/editor/contrib/gotoSymbol/browser/referencesModel": [ "in {0} on line {1} at column {2}", "{0} in {1} on line {2} at column {3}", @@ -26200,6 +26434,11 @@ "Found {0} symbols in {1}", "Found {0} symbols in {1} files" ], + "vs/editor/contrib/gotoSymbol/browser/symbolNavigation": [ + "Whether there are symbol locations that can be navigated via keyboard-only.", + "Symbol {0} of {1}, {2} for next", + "Symbol {0} of {1}" + ], "vs/editor/contrib/message/browser/messageController": [ "Whether the editor is currently showing an inline message" ], @@ -26219,10 +26458,6 @@ "Editor marker navigation widget info heading background.", "Editor marker navigation widget background." ], - "vs/editor/contrib/codeAction/browser/codeActionController": [ - "Hide Disabled", - "Show Disabled" - ], "vs/editor/contrib/hover/browser/markdownHoverParticipant": [ "Loading...", "Rendering paused for long line for performance reasons. This can be configured via `editor.stopRenderingLineAfter`.", @@ -26304,12 +26539,6 @@ "{0}, {1}", "{0}, docs: {1}" ], - "vs/workbench/api/browser/mainThreadWebviews": [ - "An error occurred while loading view: {0}" - ], - "vs/workbench/browser/parts/editor/textEditor": [ - "Editor" - ], "vs/platform/theme/common/tokenClassificationRegistry": [ "Colors and styles for the token.", "Foreground color for the token.", @@ -26352,7 +26581,13 @@ "Style to use for symbols that are deprecated.", "Style to use for write accesses.", "Style to use for symbols that are async.", - "Style to use for symbols that are readonly." + "Style to use for symbols that are read-only." + ], + "vs/workbench/api/browser/mainThreadWebviews": [ + "An error occurred while loading view: {0}" + ], + "vs/workbench/browser/parts/editor/textEditor": [ + "Editor" ], "vs/workbench/contrib/terminal/browser/terminalEditorInput": [ "Do you want to terminate running processes?", @@ -26386,9 +26621,6 @@ "[Ln {0}-{1}]", "Last reply from {0}" ], - "vs/workbench/contrib/notebook/common/notebookEditorModel": [ - "Notebook '{0}' could not be saved." - ], "vs/workbench/contrib/testing/common/testResult": [ "Test run at {0}" ], @@ -26412,25 +26644,6 @@ "Checked", "Unchecked" ], - "vs/workbench/contrib/remote/browser/remoteIcons": [ - "Getting started icon in the remote explorer view.", - "Documentation icon in the remote explorer view.", - "Feedback icon in the remote explorer view.", - "Review issue icon in the remote explorer view.", - "Report issue icon in the remote explorer view.", - "View icon of the remote explorer view.", - "View icon of the remote ports view.", - "Icon representing a remote port.", - "Icon representing a private remote port.", - "Icon for the forward action.", - "Icon for the stop forwarding action.", - "Icon for the open browser action.", - "Icon for the open preview action.", - "Icon for the copy local address action.", - "Icon for the label port action.", - "Icon for forwarded ports that don't have a running process.", - "Icon for forwarded ports that do have a running process." - ], "vs/base/browser/ui/splitview/paneview": [ "{0} Section" ], @@ -26495,6 +26708,36 @@ "Change Port Protocol", "The color of the icon for a port that has an associated running process." ], + "vs/workbench/contrib/remote/browser/remoteIcons": [ + "Getting started icon in the remote explorer view.", + "Documentation icon in the remote explorer view.", + "Feedback icon in the remote explorer view.", + "Review issue icon in the remote explorer view.", + "Report issue icon in the remote explorer view.", + "View icon of the remote explorer view.", + "View icon of the remote ports view.", + "Icon representing a remote port.", + "Icon representing a private remote port.", + "Icon for the forward action.", + "Icon for the stop forwarding action.", + "Icon for the open browser action.", + "Icon for the open preview action.", + "Icon for the copy local address action.", + "Icon for the label port action.", + "Icon for forwarded ports that don't have a running process.", + "Icon for forwarded ports that do have a running process." + ], + "vs/workbench/browser/parts/editor/textCodeEditor": [ + "Text Editor" + ], + "vs/workbench/browser/parts/editor/binaryEditor": [ + "Binary Viewer", + "The file is not displayed in the text editor because it is either binary or uses an unsupported text encoding.", + "Open Anyway" + ], + "vs/editor/browser/widget/diffEditorWidget2/colors": [ + "The border color for text that got moved in the diff editor." + ], "vs/workbench/browser/parts/editor/editorPanes": [ "Unable to open '{0}'", "&&OK" @@ -26516,17 +26759,6 @@ "Toggle Full Screen", "Show Settings" ], - "vs/workbench/browser/parts/editor/textCodeEditor": [ - "Text Editor" - ], - "vs/editor/browser/widget/diffEditorWidget2/diffEditorWidget2": [ - " use Shift + F7 to navigate changes" - ], - "vs/workbench/browser/parts/editor/binaryEditor": [ - "Binary Viewer", - "The file is not displayed in the text editor because it is either binary or uses an unsupported text encoding.", - "Open Anyway" - ], "vs/workbench/browser/parts/activitybar/activitybarActions": [ "Loading...", "{0} is currently unavailable", @@ -26562,14 +26794,14 @@ "Installing Update...", "Restart to &&Update" ], - "vs/base/browser/ui/toolbar/toolbar": [ - "More Actions..." - ], "vs/workbench/browser/parts/compositePart": [ "{0} actions", "Views and More Actions...", "{0} ({1})" ], + "vs/base/browser/ui/toolbar/toolbar": [ + "More Actions..." + ], "vs/workbench/browser/parts/sidebar/sidebarActions": [ "Focus into Primary Side Bar" ], @@ -26615,6 +26847,9 @@ "Incorrect type. Expected an object.", "Property {0} is not allowed.\n" ], + "vs/editor/common/model/editStack": [ + "Typing" + ], "vs/platform/quickinput/browser/quickInput": [ "Back", "Press 'Enter' to confirm your input or 'Escape' to cancel", @@ -26640,8 +26875,17 @@ "Defines which scope names contain balanced brackets.", "Defines which scope names do not contain balanced brackets." ], - "vs/editor/common/model/editStack": [ - "Typing" + "vs/workbench/contrib/preferences/browser/preferencesWidgets": [ + "User", + "Remote", + "Workspace", + "Folder", + "Settings Switcher", + "User", + "Remote", + "Workspace", + "User", + "Workspace" ], "vs/base/browser/ui/keybindingLabel/keybindingLabel": [ "Unbound" @@ -26683,17 +26927,8 @@ "This setting can only be applied in a trusted workspace.", "Unknown Configuration Setting", "Manage Workspace Trust", - "Manage Workspace Trust", - "Unsupported Property" - ], - "vs/workbench/contrib/preferences/browser/preferencesWidgets": [ - "User", - "Remote", - "Workspace", - "Folder", - "Settings Switcher", - "Workspace", - "User" + "Manage Workspace Trust", + "Unsupported Property" ], "vs/workbench/contrib/preferences/browser/settingsLayout": [ "Commonly Used", @@ -26733,7 +26968,7 @@ "Notebook", "Audio Cues", "Merge Editor", - "Interactive Session", + "Chat", "Application", "Proxy", "Keyboard", @@ -26749,22 +26984,6 @@ "Settings Table of Contents", "{0}, group" ], - "vs/workbench/contrib/preferences/browser/settingsSearchMenu": [ - "Modified", - "Add or remove modified settings filter", - "Extension ID...", - "Add extension ID filter", - "Feature...", - "Add feature filter", - "Tag...", - "Add tag filter", - "Language...", - "Add language ID filter", - "Online services", - "Show settings for online services", - "Policy services", - "Show settings for policy services" - ], "vs/workbench/contrib/preferences/browser/settingsTree": [ "Extensions", "The setting has been configured in the current scope.", @@ -26784,6 +27003,26 @@ "Copy Setting as JSON", "Sync This Setting" ], + "vs/workbench/contrib/preferences/browser/settingsSearchMenu": [ + "Modified", + "Add or remove modified settings filter", + "Extension ID...", + "Add extension ID filter", + "Feature...", + "Add feature filter", + "Tag...", + "Add tag filter", + "Language...", + "Add language ID filter", + "Online services", + "Show settings for online services", + "Policy services", + "Show settings for policy services" + ], + "vs/workbench/contrib/notebook/browser/viewParts/notebookKernelView": [ + "Select Notebook Kernel", + "Notebook Kernel Args" + ], "vs/workbench/contrib/notebook/browser/notebookExtensionPoint": [ "Contributes notebook document provider.", "Type of the notebook.", @@ -26840,38 +27079,23 @@ "Cell editor background color.", "Notebook background color." ], - "vs/workbench/contrib/notebook/browser/viewParts/notebookKernelView": [ - "Select Notebook Kernel", - "Notebook Kernel Args" + "vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView": [ + "Empty markdown cell, double-click or press enter to edit.", + "No renderer found for '$0'", + "Could not render content for '$0'", + "Notebook webview content" ], "vs/workbench/services/workingCopy/common/fileWorkingCopyManager": [ "File Created", "File Replaced", "File Working Copy Decorations", - "Deleted, Read Only", - "Read Only", + "Deleted, Read-only", + "Read-only", "Deleted", "'{0}' already exists. Do you want to replace it?", "A file or folder with the name '{0}' already exists in the folder '{1}'. Replacing it will overwrite its current contents.", "&&Replace" ], - "vs/workbench/contrib/comments/common/commentContextKeys": [ - "Set when the comment thread has no comments", - "Set when the comment has no input", - "The context value of the comment", - "The context value of the comment thread", - "The comment controller id associated with a comment thread" - ], - "vs/workbench/contrib/notebook/browser/controller/cellOperations": [ - "Cannot join cells of different kinds", - "Join Notebook Cells" - ], - "vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView": [ - "Empty markdown cell, double-click or press enter to edit.", - "No renderer found for '$0'", - "Could not render content for '$0'", - "Notebook webview content" - ], "vs/workbench/contrib/notebook/browser/viewParts/notebookKernelQuickPickStrategy": [ "Currently Selected", "{0} - Currently Selected", @@ -26890,47 +27114,49 @@ "Detecting Kernels", "Select Kernel" ], - "vs/editor/contrib/codeAction/browser/codeAction": [ - "An unknown error occurred while applying the code action" - ], - "vs/workbench/contrib/chat/common/chatContextKeys": [ - "True when the provider has assigned an id to this response.", - "When the response has been voted up, is set to 'up'. When voted down, is set to 'down'. Otherwise an empty string.", - "True when the current request is still in progress.", - "The chat item is a response.", - "The chat item is a request", - "True when the chat input has text.", - "True when focus is in the chat input, false otherwise.", - "True when focus is in the chat widget, false otherwise.", - "True when some chat provider has been registered." + "vs/workbench/contrib/comments/common/commentContextKeys": [ + "Set when the comment thread has no comments", + "Set when the comment has no input", + "The context value of the comment", + "The context value of the comment thread", + "The comment controller id associated with a comment thread" ], - "vs/workbench/contrib/chat/browser/actions/chatAccessibilityHelp": [ - "Exit this menu and return to the input via the Escape key.", - "Chat responses will be announced as they come in. A response will indicate the number of code blocks, if any, and then the rest of the response.", - "In the input box, use UpArrow/DownArrow to navigate your request history. Edit input and use enter to run a new request.", - "The Focus Chat command ({0}) focuses the chat request/response list, which can be navigated with UpArrow/DownArrow.", - "The Focus Chat List command focuses the chat request/response list, which can be navigated with UpArrow/DownArrow and is currently not triggerable by a keybinding.", - "The Focus Chat Input command ({0}) focuses the input box for chat requests.", - "Focus Chat Input command focuses the input box for chat requests and is currently not triggerable by a keybinding.", - "The Chat: Next Code Block command ({0}) focuses the next code block within a response.", - "The Chat: Next Code Block command focuses the next code block within a response and is currently not triggerable by a keybinding.", - "The Chat Clear command ({0}) clears the request/response list.", - "The Chat Clear command clears the request/response list and is currently not triggerable by a keybinding.", - "Tab once to reach the make request button, which will re-run the request.", - "Tab again to enter the Diff editor with the changes and enter review mode with ({0}). Use Up/DownArrow to navigate lines with the proposed changes.", - "Tab again to enter the Diff editor with the changes and enter review mode with the Go to Next Difference Command. Use Up/DownArrow to navigate lines with the proposed changes.", - "Tab again to reach the action bar, which can be navigated with Left/RightArrow.", - "/explain commands will be run in the chat view.", - "To focus the chat view, run the GitHub Copilot: Focus on GitHub Copilot View command, which will focus the input box.", - "Use tab to reach conditional parts like commands, status message, message responses and more." + "vs/workbench/contrib/notebook/browser/controller/cellOperations": [ + "Cannot join cells of different kinds", + "Join Notebook Cells" ], "vs/workbench/contrib/notebook/browser/contrib/find/notebookFindWidget": [ "{0} found", "{0} found for '{1}'", "{0} found for '{1}'" ], - "vs/workbench/contrib/chat/common/chatViewModel": [ - "Thinking" + "vs/editor/contrib/codeAction/browser/codeAction": [ + "An unknown error occurred while applying the code action" + ], + "vs/workbench/contrib/chat/browser/actions/chatAccessibilityHelp": [ + "The chat view is comprised of an input box and a request/response list. The input box is used to make requests and the list is used to display responses.", + "In the input box, use up and down arrows to navigate your request history. Edit input and use enter or the submit button to run a new request.", + "Chat responses will be announced as they come in. A response will indicate the number of code blocks, if any, and then the rest of the response.", + "To focus the chat request/response list, which can be navigated with up and down arrows, invoke The Focus Chat command ({0}).", + "To focus the chat request/response list, which can be navigated with up and down arrows, invoke The Focus Chat List command, which is currently not triggerable by a keybinding.", + "To focus the input box for chat requests, invoke the Focus Chat Input command ({0})", + "To focus the input box for chat requests, invoke the Focus Chat Input command, which is currently not triggerable by a keybinding.", + "To focus the next code block within a response, invoke the Chat: Next Code Block command ({0}).", + "To focus the next code block within a response, invoke the Chat: Next Code Block command, which is currently not triggerable by a keybinding.", + "To clear the request/response list, invoke the Chat Clear command ({0}).", + "To clear the request/response list, invoke the Chat Clear command, which is currently not triggerable by a keybinding.", + "Inline chat occurs within a code editor and takes into account the current selection. It is useful for making changes to the current editor. For example, fixing diagnostics, documenting or refactoring code. Keep in mind that AI generated code may be incorrect.", + "It can be activated via code actions or directly using the command: Inline Chat: Start Code Chat ({0}).", + "In the input box, use {0} and {1} to navigate your request history. Edit input and use enter or the submit button to run a new request.", + "Context menu actions may run a request prefixed with /fix or /explain. Type / to discover more ready-made commands.", + "When a request is prefixed with /fix, a response will indicate the problem with the current code. A diff editor will be rendered and can be reached by tabbing.", + "Once in the diff editor, enter review mode with ({0}). Use up and down arrows to navigate lines with the proposed changes.", + "Tab again to enter the Diff editor with the changes and enter review mode with the Go to Next Difference Command. Use Up/DownArrow to navigate lines with the proposed changes.", + "When a request is prefixed with /explain, a response will explain the code in the current selection and the chat view will be focused.", + "Use tab to reach conditional parts like commands, status, message responses and more.", + "Audio cues can be changed via settings with a prefix of audioCues.chat. By default, if a request takes more than 4 seconds, you will hear an audio cue indicating that progress is still occurring.", + "Chat accessibility help", + "Inline chat accessibility help" ], "vs/workbench/contrib/chat/browser/chatListRenderer": [ "Chat", @@ -26942,10 +27168,23 @@ "Code block {0}" ], "vs/workbench/contrib/chat/browser/chatInputPart": [ - "Chat Input, Type code here and press enter to run. Use {0} for Chat Accessibility Help.", + "Chat Input, Type to ask questions or type / for topics, press enter to send out the request. Use {0} for Chat Accessibility Help.", "Chat Input, Type code here and press Enter to run. Use the Chat Accessibility Help command for more information.", "Chat Input" ], + "vs/workbench/contrib/inlineChat/browser/inlineChatStrategies": [ + "Nothing changed", + "Changed 1 line", + "Changed {0} lines" + ], + "vs/workbench/contrib/inlineChat/browser/inlineChatWidget": [ + "Inline Chat Input", + "Original", + "Modified", + "Inline Chat Input, Use {0} for Inline Chat Accessibility Help.", + "Inline Chat Input, Run the Inline Chat Accessibility Help command for more information.", + "Closed inline chat widget" + ], "vs/workbench/contrib/testing/browser/theme": [ "Color for the 'failed' icon in the test explorer.", "Color for the 'Errored' icon in the test explorer.", @@ -26986,17 +27225,35 @@ "Show Hidden Tests", "Unhide All Tests" ], - "vs/workbench/contrib/interactiveEditor/browser/interactiveEditorStrategies": [ - "Nothing changed", - "Changed 1 line", - "Changed {0} lines" + "vs/workbench/contrib/terminal/browser/xterm/xtermTerminal": [ + "The terminal has no selection to copy", + "Yes", + "No", + "Don't Show Again", + "Terminal GPU acceleration appears to be slow on your computer. Would you like to switch to disable it which may improve performance? [Read more about terminal settings](https://code.visualstudio.com/docs/editor/integrated-terminal#_changing-how-the-terminal-is-rendered)." ], - "vs/workbench/contrib/interactiveEditor/browser/interactiveEditorWidget": [ - "Interactive Editor Input", - "Original", - "Modified", - "Interactive Editor Input, Use {0} for Interactive Editor Accessibility Help.", - "Interactive Editor Input, Run the Interactive Editor Accessibility Help command for more information." + "vs/workbench/contrib/terminal/common/terminalColorRegistry": [ + "The background color of the terminal, this allows coloring the terminal differently to the panel.", + "The foreground color of the terminal.", + "The foreground color of the terminal cursor.", + "The background color of the terminal cursor. Allows customizing the color of a character overlapped by a block cursor.", + "The selection background color of the terminal.", + "The selection background color of the terminal when it does not have focus.", + "The selection foreground color of the terminal. When this is null the selection foreground will be retained and have the minimum contrast ratio feature applied.", + "The default terminal command decoration background color.", + "The terminal command decoration background color for successful commands.", + "The terminal command decoration background color for error commands.", + "The overview ruler cursor color.", + "The color of the border that separates split panes within the terminal. This defaults to panel.border.", + "Color of the current search match in the terminal. The color must not be opaque so as not to hide underlying terminal content.", + "Border color of the other search matches in the terminal.", + "Border color of the current search match in the terminal.", + "Color of the other search matches in the terminal. The color must not be opaque so as not to hide underlying terminal content.", + "Border color of the other search matches in the terminal.", + "Overview ruler marker color for find matches in the terminal.", + "Background color when dragging on top of terminals. The color should have transparency so that the terminal contents can still shine through.", + "Border on the side of the terminal tab in the panel. This defaults to tab.activeBorder.", + "'{0}' ANSI color in the terminal." ], "vs/platform/quickinput/browser/commandsQuickAccess": [ "recently used", @@ -27080,10 +27337,6 @@ "(deleting)", "{0} - {1}" ], - "vs/workbench/contrib/search/browser/replaceService": [ - "Search and Replace", - "{0} ↔ {1} (Replace Preview)" - ], "vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess": [ "To go to a symbol, first open a text editor with symbol information.", "The active text editor does not provide symbol information.", @@ -27119,6 +27372,10 @@ "fields ({0})", "constants ({0})" ], + "vs/workbench/contrib/search/browser/replaceService": [ + "Search and Replace", + "{0} ↔ {1} (Replace Preview)" + ], "vs/workbench/contrib/search/browser/searchFindInput": [ "Notebook Find Filters" ], @@ -27167,6 +27424,13 @@ "Install extension...", "Select debugger" ], + "vs/workbench/contrib/debug/browser/debugConfigurationManager": [ + "Edit Debug Configuration in launch.json", + "Select Launch Configuration", + "Unable to create 'launch.json' file inside the '.vscode' folder ({0}).", + "workspace", + "user settings" + ], "vs/workbench/contrib/debug/browser/debugTaskRunner": [ "Errors exist after running preLaunchTask '{0}'.", "Error exists after running preLaunchTask '{0}'.", @@ -27228,9 +27492,6 @@ "vs/workbench/contrib/debug/common/debugSource": [ "Unknown Source" ], - "vs/base/browser/ui/dropdown/dropdownActionViewItem": [ - "More Actions..." - ], "vs/base/browser/ui/findinput/replaceInput": [ "input", "Preserve Case" @@ -27248,6 +27509,16 @@ "File", "Source" ], + "vs/workbench/contrib/mergeEditor/common/mergeEditor": [ + "The editor is a merge editor", + "The editor is a the result editor of a merge editor.", + "The layout mode of a merge editor", + "If the merge editor shows the base version", + "If base should be shown at the top", + "If the merge editor shows non-conflicting changes", + "The uri of the baser of a merge editor", + "The uri of the result of a merge editor" + ], "vs/workbench/contrib/mergeEditor/browser/mergeEditorInputModel": [ "Do you want keep the merge result of {0} files?", "Do you want keep the merge result of {0}?", @@ -27279,19 +27550,34 @@ "&&Close", "Don't ask again" ], - "vs/workbench/contrib/mergeEditor/common/mergeEditor": [ - "The editor is a merge editor", - "The editor is a the result editor of a merge editor.", - "The layout mode of a merge editor", - "If the merge editor shows the base version", - "If base should be shown at the top", - "If the merge editor shows non-conflicting changes", - "The uri of the baser of a merge editor", - "The uri of the result of a merge editor" + "vs/workbench/contrib/mergeEditor/browser/view/editors/baseCodeEditorView": [ + "Base", + "Comparing with {0}", + "Differences are highlighted with a background color." ], "vs/workbench/contrib/mergeEditor/browser/view/viewModel": [ "There is currently no conflict focused that can be toggled." ], + "vs/workbench/contrib/mergeEditor/browser/view/editors/resultCodeEditorView": [ + "Result", + "{0} Conflict Remaining", + "{0} Conflicts Remaining ", + "Go to next conflict", + "All conflicts handled, the merge can be completed now." + ], + "vs/workbench/contrib/mergeEditor/browser/view/editors/inputCodeEditorView": [ + "Input 1", + "Input 2", + "Accept {0}", + "Accept {0}", + "Accept Both", + "Swap", + "Mark as Handled", + "Accept", + "Accept (result is dirty)", + "Undo accept", + "Undo accept (currently second)" + ], "vs/workbench/contrib/mergeEditor/browser/view/colors": [ "The background color for changes.", "The background color for word changes.", @@ -27307,49 +27593,16 @@ "The background color of decorations in input 1.", "The background color of decorations in input 2." ], - "vs/workbench/contrib/debug/browser/debugConfigurationManager": [ - "Edit Debug Configuration in launch.json", - "Select Launch Configuration", - "Unable to create 'launch.json' file inside the '.vscode' folder ({0}).", - "workspace", - "user settings" - ], - "vs/workbench/contrib/mergeEditor/browser/view/editors/inputCodeEditorView": [ - "Input 1", - "Input 2", - "Accept {0}", - "Accept {0}", - "Accept Both", - "Swap", - "Mark as Handled", - "Accept", - "Accept (result is dirty)", - "Undo accept", - "Undo accept (currently second)" - ], "vs/workbench/contrib/comments/browser/commentsController": [ "Whether the position at the active cursor has a commenting range", "Select Comment Provider" ], - "vs/workbench/contrib/mergeEditor/browser/view/editors/resultCodeEditorView": [ - "Result", - "{0} Conflict Remaining", - "{0} Conflicts Remaining ", - "Go to next conflict", - "All conflicts handled, the merge can be completed now." - ], - "vs/workbench/contrib/mergeEditor/browser/view/editors/baseCodeEditorView": [ - "Base", - "Comparing with {0}", - "Differences are highlighted with a background color." - ], "vs/workbench/contrib/customEditor/common/contributedCustomEditors": [ "Built-in" ], - "vs/workbench/contrib/extensions/browser/extensionsViewer": [ - "Error", - "Unknown Extension:", - "Extensions" + "vs/platform/files/browser/htmlFileSystemProvider": [ + "Rename is only supported for files.", + "Insufficient permissions. Please retry and allow the operation." ], "vs/workbench/contrib/extensions/browser/extensionsWidgets": [ "Average rating: {0} out of 5", @@ -27377,6 +27630,11 @@ "The icon color for pre-release extension.", "The icon color for extension sponsor." ], + "vs/workbench/contrib/extensions/browser/extensionsViewer": [ + "Error", + "Unknown Extension:", + "Extensions" + ], "vs/workbench/contrib/extensions/browser/exeBasedRecommendations": [ "This extension is recommended because you have {0} installed." ], @@ -27393,35 +27651,76 @@ "vs/workbench/contrib/extensions/browser/configBasedRecommendations": [ "This extension is recommended because of the current workspace configuration" ], - "vs/workbench/contrib/extensions/browser/webRecommendations": [ - "This extension is recommended for {0} for the Web" + "vs/workbench/contrib/extensions/browser/webRecommendations": [ + "This extension is recommended for {0} for the Web" + ], + "vs/workbench/contrib/tasks/common/jsonSchemaCommon": [ + "Additional command options", + "The current working directory of the executed program or script. If omitted Code's current workspace root is used.", + "The environment of the executed program or shell. If omitted the parent process' environment is used.", + "Unrecognized problem matcher. Is the extension that contributes this problem matcher installed?", + "Unrecognized problem matcher. Is the extension that contributes this problem matcher installed?", + "Configures the shell to be used.", + "The shell to be used.", + "The shell arguments.", + "The command to be executed. Can be an external program or a shell command.", + "Arguments passed to the command when this task is invoked.", + "The task's name", + "The command to be executed. Can be an external program or a shell command.", + "Arguments passed to the command when this task is invoked.", + "Windows specific command configuration", + "The problem matcher(s) to use. Can either be a string or a problem matcher definition or an array of strings and problem matchers.", + "Mac specific command configuration", + "The problem matcher(s) to use. Can either be a string or a problem matcher definition or an array of strings and problem matchers.", + "Linux specific command configuration", + "The problem matcher(s) to use. Can either be a string or a problem matcher definition or an array of strings and problem matchers.", + "Controls whether the task name is added as an argument to the command. If omitted the globally defined value is used.", + "Controls whether the output of the running task is shown or not. If omitted the globally defined value is used.", + "Controls whether the executed command is echoed to the output. Default is false.", + "Deprecated. Use isBackground instead.", + "Whether the executed task is kept alive and is watching the file system.", + "Whether the executed task is kept alive and is running in the background.", + "Whether the user is prompted when VS Code closes with a running task.", + "Maps this task to Code's default build command.", + "Maps this task to Code's default test command.", + "The problem matcher(s) to use. Can either be a string or a problem matcher definition or an array of strings and problem matchers.", + "The command to be executed. Can be an external program or a shell command.", + "Additional arguments passed to the command.", + "Controls whether the output of the running task is shown or not. If omitted 'always' is used.", + "Deprecated. Use isBackground instead.", + "Whether the executed task is kept alive and is watching the file system.", + "Whether the executed task is kept alive and is running in the background.", + "Whether the user is prompted when VS Code closes with a running background task.", + "Controls whether the executed command is echoed to the output. Default is false.", + "Controls whether the task name is added as an argument to the command. Default is false.", + "Prefix to indicate that an argument is task.", + "The problem matcher(s) to use. Can either be a string or a problem matcher definition or an array of strings and problem matchers.", + "The task configurations. Usually these are enrichments of task already defined in the external task runner." + ], + "vs/workbench/services/configurationResolver/common/configurationResolverUtils": [ + "'env.', 'config.' and 'command.' are deprecated, use 'env:', 'config:' and 'command:' instead." ], - "vs/platform/files/browser/htmlFileSystemProvider": [ - "Rename is only supported for files.", - "Insufficient permissions. Please retry and allow the operation." + "vs/workbench/services/configurationResolver/common/configurationResolverSchema": [ + "The input's id is used to associate an input with a variable of the form ${input:id}.", + "The type of user input prompt to use.", + "The description is shown when the user is prompted for input.", + "The default value for the input.", + "User inputs. Used for defining user input prompts, such as free string input or a choice from several options.", + "The 'promptString' type opens an input box to ask the user for input.", + "Controls if a password input is shown. Password input hides the typed text.", + "The 'pickString' type shows a selection list.", + "An array of strings that defines the options for a quick pick.", + "Label for the option.", + "Value for the option.", + "The 'command' type executes a command.", + "The command to execute for this input variable.", + "Optional arguments passed to the command.", + "Optional arguments passed to the command.", + "Optional arguments passed to the command." ], - "vs/workbench/contrib/terminal/common/terminalColorRegistry": [ - "The background color of the terminal, this allows coloring the terminal differently to the panel.", - "The foreground color of the terminal.", - "The foreground color of the terminal cursor.", - "The background color of the terminal cursor. Allows customizing the color of a character overlapped by a block cursor.", - "The selection background color of the terminal.", - "The selection background color of the terminal when it does not have focus.", - "The selection foreground color of the terminal. When this is null the selection foreground will be retained and have the minimum contrast ratio feature applied.", - "The default terminal command decoration background color.", - "The terminal command decoration background color for successful commands.", - "The terminal command decoration background color for error commands.", - "The overview ruler cursor color.", - "The color of the border that separates split panes within the terminal. This defaults to panel.border.", - "Color of the current search match in the terminal. The color must not be opaque so as not to hide underlying terminal content.", - "Border color of the other search matches in the terminal.", - "Border color of the current search match in the terminal.", - "Color of the other search matches in the terminal. The color must not be opaque so as not to hide underlying terminal content.", - "Border color of the other search matches in the terminal.", - "Overview ruler marker color for find matches in the terminal.", - "Background color when dragging on top of terminals. The color should have transparency so that the terminal contents can still shine through.", - "Border on the side of the terminal tab in the panel. This defaults to tab.activeBorder.", - "'{0}' ANSI color in the terminal." + "vs/workbench/contrib/remote/browser/explorerViewItems": [ + "Switch Remote", + "Switch Remote" ], "vs/workbench/contrib/terminal/browser/terminalActions": [ "Show Tabs", @@ -27429,6 +27728,7 @@ "Open Help", "Create New Terminal (In Active Workspace)", "Create New Terminal in Editor Area", + "Create New Terminal in Editor Area", "Create New Terminal in Editor Area to the Side", "Show Tabs", "Focus Previous Terminal in Terminal Group", @@ -27463,7 +27763,6 @@ "Select To Next Command", "Select To Previous Line", "Select To Next Line", - "Toggle Escape Sequence Logging", "The sequence of text to send to the terminal", "The directory to start the terminal at", "The new name for the terminal", @@ -27517,44 +27816,6 @@ "Create New Terminal With Profile", "Rename Terminal" ], - "vs/workbench/contrib/terminal/browser/terminalIcons": [ - "View icon of the terminal view.", - "Icon for rename in the terminal quick menu.", - "Icon for killing a terminal instance.", - "Icon for creating a new terminal instance.", - "Icon for creating a new terminal profile.", - "Icon for a terminal decoration mark.", - "Icon for a terminal decoration of a command that was incomplete.", - "Icon for a terminal decoration of a command that errored.", - "Icon for a terminal decoration of a command that was successful.", - "Icon for removing a terminal command from command history.", - "Icon for viewing output of a terminal command.", - "Icon for toggling fuzzy search of command history." - ], - "vs/workbench/contrib/terminal/common/terminalStrings": [ - "Terminal", - "New Terminal", - "Do Not Show Again", - "current session", - "previous session", - "Terminal", - "Focus Terminal", - "Kill Terminal", - "Kill", - "Move Terminal into Editor Area", - "Move Terminal into Panel", - "Change Icon...", - "Change Color...", - "Split Terminal", - "Split", - "Unsplit Terminal", - "Rename...", - "Toggle Size to Content Width", - "Focus Hover", - "Send Custom Sequence To Terminal", - "Create New Terminal Starting in a Custom Working Directory", - "Rename the Currently Active Terminal" - ], "vs/workbench/contrib/terminal/common/terminalConfiguration": [ "the terminal's current working directory", "the terminal's current working directory, displayed for multi-root workspaces or in a single root workspace when the value differs from the initial working directory. On Windows, this will only be displayed when shell integration is enabled.", @@ -27697,7 +27958,21 @@ "Controls the number of recently used commands to keep in the terminal command history. Set to 0 to disable terminal command history.", "Enables experimental terminal Intellisense suggestions for supported shells when {0} is set to {1}. If shell integration is installed manually, {2} needs to be set to {3} before calling the script.", "Controls whether the terminal will scroll using an animation.", - "Enables experimental image support in the terminal. Both sixel and iTerm's inline image protocol are supported on Linux and macOS, Windows support will light up automatically when ConPTY passes through the sequences. Images will not be retained currently between window reloads/reconnects." + "Enables image support in the terminal, this will only work when {0} is enabled. Both sixel and iTerm's inline image protocol are supported on Linux and macOS, Windows support will light up automatically when ConPTY passes through the sequences. Images will currently not be restored between window reloads/reconnects." + ], + "vs/workbench/contrib/terminal/browser/terminalIcons": [ + "View icon of the terminal view.", + "Icon for rename in the terminal quick menu.", + "Icon for killing a terminal instance.", + "Icon for creating a new terminal instance.", + "Icon for creating a new terminal profile.", + "Icon for a terminal decoration mark.", + "Icon for a terminal decoration of a command that was incomplete.", + "Icon for a terminal decoration of a command that errored.", + "Icon for a terminal decoration of a command that was successful.", + "Icon for removing a terminal command from command history.", + "Icon for viewing output of a terminal command.", + "Icon for toggling fuzzy search of command history." ], "vs/workbench/contrib/terminal/browser/terminalMenus": [ "&&New Terminal", @@ -27735,10 +28010,32 @@ "{0} (Default)", "Split Terminal" ], - "vs/workbench/contrib/terminal/browser/terminalTabbedView": [ - "Move Tabs Right", - "Move Tabs Left", - "Hide Tabs" + "vs/workbench/contrib/terminal/common/terminalStrings": [ + "Terminal", + "New Terminal", + "Do Not Show Again", + "current session", + "previous session", + "Terminal", + "Focus Terminal", + "Kill Terminal", + "Kill", + "Move Terminal into Editor Area", + "Move Terminal into Panel", + "Change Icon...", + "Change Color...", + "Split Terminal", + "Split", + "Unsplit Terminal", + "Rename...", + "Toggle Size to Content Width", + "Focus Hover", + "Send Custom Sequence To Terminal", + "Create New Terminal Starting in a Custom Working Directory", + "Rename the Currently Active Terminal" + ], + "vs/platform/terminal/common/terminalLogService": [ + "Terminal" ], "vs/workbench/contrib/terminal/browser/terminalTooltip": [ "Shell integration activated", @@ -27747,146 +28044,73 @@ "Process ID ({0}): {1}", "Command line: {0}" ], - "vs/workbench/contrib/terminalContrib/accessibility/browser/terminalAccessibleBuffer": [ - "Terminal buffer", - "{0}" - ], - "vs/workbench/contrib/terminalContrib/accessibility/browser/terminalAccessibilityHelp": [ - "Terminal accessibility help", - "The Focus Accessible Buffer ({0}) command enables screen readers to read terminal contents.", - "The Focus Accessible Buffer command enables screen readers to read terminal contents and is currently not triggerable by a keybinding.", - "Consider using powershell instead of command prompt for an improved experience", - "The terminal has a feature called shell integration that offers an enhanced experience and provides useful commands for screen readers such as:", - "Go to Next Command ({0})", - "Go to Next Command is currently not triggerable by a keybinding.", - "Go to Previous Command ({0})", - "Go to Previous Command is currently not triggerable by a keybinding.", - "Navigate Accessible Buffer ({0})", - "Navigate Accessible Buffer is currently not triggerable by a keybinding.", - "Run Recent Command ({0})", - "Run Recent Command is currently not triggerable by a keybinding.", - "Go to Recent Directory ({0})", - "Go to Recent Directory is currently not triggerable by a keybinding.", - "The Go to Recent Directory command ({0}) enables screen readers to easily navigate to a directory that has been used in the terminal.", - "The Go to Recent Directory command enables screen readers to easily navigate to a directory that has been used in the terminal and is currently not triggerable by a keybinding.", - "The Open Detected Link ({0}) command enables screen readers to easily open links found in the terminal.", - "The Open Detected Link command enables screen readers to easily open links found in the terminal and is currently not triggerable by a keybinding.", - "The Create New Terminal (With Profile) ({0}) command allows for easy terminal creation using a specific profile.", - "The Create New Terminal (With Profile) command allows for easy terminal creation using a specific profile and is currently not triggerable by a keybinding.", - "Access accessibility settings such as `terminal.integrated.tabFocusMode` via the Preferences: Open Accessibility Settings command.", - "[Read more about terminal accessibility](https://code.visualstudio.com/docs/editor/accessibility#_terminal-accessibility)", - "You can dismiss this dialog by pressing Escape, tab, or focusing elsewhere.", - "Welcome to Terminal Accessibility Help" - ], - "vs/workbench/contrib/terminalContrib/links/browser/terminalLinkQuickpick": [ - "Select the link to open", - "Url", - "Local File", - "Workspace Search", - "Show more links" - ], - "vs/workbench/contrib/terminalContrib/links/browser/terminalLinkManager": [ - "option + click", - "alt + click", - "cmd + click", - "ctrl + click", - "Follow link", - "Follow link using forwarded port", - "Link" - ], - "vs/workbench/contrib/terminalContrib/quickFix/browser/terminalQuickFixService": [ - "Contributes terminal quick fixes.", - "The ID of the quick fix provider", - "A regular expression or string to test the command line against", - "A regular expression or string to match a single line of the output against, which provides groups to be referenced in terminalCommand and uri.\n\nFor example:\n\n `lineMatcher: /git push --set-upstream origin (?[^s]+)/;`\n\n`terminalCommand: 'git push --set-upstream origin ${group:branchName}';`\n", - "The command exit result to match on" - ], - "vs/workbench/contrib/tasks/common/jsonSchemaCommon": [ - "Additional command options", - "The current working directory of the executed program or script. If omitted Code's current workspace root is used.", - "The environment of the executed program or shell. If omitted the parent process' environment is used.", - "Unrecognized problem matcher. Is the extension that contributes this problem matcher installed?", - "Unrecognized problem matcher. Is the extension that contributes this problem matcher installed?", - "Configures the shell to be used.", - "The shell to be used.", - "The shell arguments.", - "The command to be executed. Can be an external program or a shell command.", - "Arguments passed to the command when this task is invoked.", - "The task's name", - "The command to be executed. Can be an external program or a shell command.", - "Arguments passed to the command when this task is invoked.", - "Windows specific command configuration", - "The problem matcher(s) to use. Can either be a string or a problem matcher definition or an array of strings and problem matchers.", - "Mac specific command configuration", - "The problem matcher(s) to use. Can either be a string or a problem matcher definition or an array of strings and problem matchers.", - "Linux specific command configuration", - "The problem matcher(s) to use. Can either be a string or a problem matcher definition or an array of strings and problem matchers.", - "Controls whether the task name is added as an argument to the command. If omitted the globally defined value is used.", - "Controls whether the output of the running task is shown or not. If omitted the globally defined value is used.", - "Controls whether the executed command is echoed to the output. Default is false.", - "Deprecated. Use isBackground instead.", - "Whether the executed task is kept alive and is watching the file system.", - "Whether the executed task is kept alive and is running in the background.", - "Whether the user is prompted when VS Code closes with a running task.", - "Maps this task to Code's default build command.", - "Maps this task to Code's default test command.", - "The problem matcher(s) to use. Can either be a string or a problem matcher definition or an array of strings and problem matchers.", - "The command to be executed. Can be an external program or a shell command.", - "Additional arguments passed to the command.", - "Controls whether the output of the running task is shown or not. If omitted 'always' is used.", - "Deprecated. Use isBackground instead.", - "Whether the executed task is kept alive and is watching the file system.", - "Whether the executed task is kept alive and is running in the background.", - "Whether the user is prompted when VS Code closes with a running background task.", - "Controls whether the executed command is echoed to the output. Default is false.", - "Controls whether the task name is added as an argument to the command. Default is false.", - "Prefix to indicate that an argument is task.", - "The problem matcher(s) to use. Can either be a string or a problem matcher definition or an array of strings and problem matchers.", - "The task configurations. Usually these are enrichments of task already defined in the external task runner." + "vs/workbench/contrib/terminal/browser/terminalTabbedView": [ + "Move Tabs Right", + "Move Tabs Left", + "Hide Tabs" ], - "vs/workbench/services/configurationResolver/common/configurationResolverUtils": [ - "'env.', 'config.' and 'command.' are deprecated, use 'env:', 'config:' and 'command:' instead." + "vs/workbench/contrib/terminalContrib/accessibility/browser/terminalAccessibilityHelp": [ + "terminal accessibility help", + "The Focus Accessible Buffer ({0}) command enables screen readers to read terminal contents.", + "The Focus Accessible Buffer command enables screen readers to read terminal contents and is currently not triggerable by a keybinding.", + "Consider using powershell instead of command prompt for an improved experience", + "The terminal has a feature called shell integration that offers an enhanced experience and provides useful commands for screen readers such as:", + "Go to Next Command ({0})", + "Go to Next Command is currently not triggerable by a keybinding.", + "Go to Previous Command ({0})", + "Go to Previous Command is currently not triggerable by a keybinding.", + "Navigate Accessible Buffer ({0})", + "Navigate Accessible Buffer is currently not triggerable by a keybinding.", + "Run Recent Command ({0})", + "Run Recent Command is currently not triggerable by a keybinding.", + "Go to Recent Directory ({0})", + "Go to Recent Directory is currently not triggerable by a keybinding.", + "The Go to Recent Directory command ({0}) enables screen readers to easily navigate to a directory that has been used in the terminal.", + "The Go to Recent Directory command enables screen readers to easily navigate to a directory that has been used in the terminal and is currently not triggerable by a keybinding.", + "The Open Detected Link ({0}) command enables screen readers to easily open links found in the terminal.", + "The Open Detected Link command enables screen readers to easily open links found in the terminal and is currently not triggerable by a keybinding.", + "The Create New Terminal (With Profile) ({0}) command allows for easy terminal creation using a specific profile.", + "The Create New Terminal (With Profile) command allows for easy terminal creation using a specific profile and is currently not triggerable by a keybinding.", + "Access accessibility settings such as `terminal.integrated.tabFocusMode` via the Preferences: Open Accessibility Settings command." ], - "vs/workbench/services/configurationResolver/common/configurationResolverSchema": [ - "The input's id is used to associate an input with a variable of the form ${input:id}.", - "The type of user input prompt to use.", - "The description is shown when the user is prompted for input.", - "The default value for the input.", - "User inputs. Used for defining user input prompts, such as free string input or a choice from several options.", - "The 'promptString' type opens an input box to ask the user for input.", - "Controls if a password input is shown. Password input hides the typed text.", - "The 'pickString' type shows a selection list.", - "An array of strings that defines the options for a quick pick.", - "Label for the option.", - "Value for the option.", - "The 'command' type executes a command.", - "The command to execute for this input variable.", - "Optional arguments passed to the command.", - "Optional arguments passed to the command.", - "Optional arguments passed to the command." + "vs/workbench/contrib/terminalContrib/accessibility/browser/terminalAccessibleBuffer": [ + "Terminal buffer", + "{0}" + ], + "vs/workbench/contrib/terminalContrib/quickFix/browser/terminalQuickFixBuiltinActions": [ + "Free port {0}", + "Create PR {0}" ], "vs/workbench/contrib/terminalContrib/quickFix/browser/quickFixAddon": [ "Run: {0}", "Open: {0}", "Quick Fix" ], - "vs/workbench/contrib/remote/browser/explorerViewItems": [ - "Switch Remote", - "Switch Remote" + "vs/workbench/contrib/terminalContrib/quickFix/browser/terminalQuickFixService": [ + "Contributes terminal quick fixes.", + "The ID of the quick fix provider", + "A regular expression or string to test the command line against", + "A regular expression or string to match a single line of the output against, which provides groups to be referenced in terminalCommand and uri.\n\nFor example:\n\n `lineMatcher: /git push --set-upstream origin (?[^s]+)/;`\n\n`terminalCommand: 'git push --set-upstream origin ${group:branchName}';`\n", + "The command exit result to match on" ], - "vs/workbench/contrib/terminalContrib/quickFix/browser/terminalQuickFixBuiltinActions": [ - "Free port {0}", - "Create PR {0}" + "vs/workbench/contrib/terminalContrib/links/browser/terminalLinkManager": [ + "option + click", + "alt + click", + "cmd + click", + "ctrl + click", + "Follow link", + "Follow link using forwarded port", + "Link" ], - "vs/workbench/contrib/snippets/browser/snippetsFile": [ - "Workspace Snippet", - "Global User Snippet", - "User Snippet" + "vs/workbench/contrib/terminalContrib/links/browser/terminalLinkQuickpick": [ + "Select the link to open", + "Url", + "Local File", + "Workspace Search", + "Show more links" ], - "vs/workbench/contrib/snippets/browser/snippetCompletionProvider": [ - "{0} ({1})", - "{0}, {1}", - "{0}, {1}" + "vs/workbench/contrib/snippets/browser/commands/abstractSnippetsActions": [ + "Snippets" ], "vs/workbench/contrib/snippets/browser/snippetPicker": [ "User Snippets", @@ -27897,14 +28121,21 @@ "Select a snippet", "No snippet available" ], + "vs/workbench/contrib/snippets/browser/snippetsFile": [ + "Workspace Snippet", + "Global User Snippet", + "User Snippet" + ], + "vs/workbench/contrib/snippets/browser/snippetCompletionProvider": [ + "{0} ({1})", + "{0}, {1}", + "{0}, {1}" + ], "vs/workbench/contrib/update/browser/releaseNotesEditor": [ "Release Notes: {0}", "unassigned", "Show release notes after an update" ], - "vs/workbench/contrib/snippets/browser/commands/abstractSnippetsActions": [ - "Snippets" - ], "vs/workbench/contrib/welcomeGettingStarted/common/gettingStartedContent": [ "Icon used for the setup category of welcome page", "Icon used for the beginner category of welcome page", @@ -27996,6 +28227,9 @@ "Tune your settings", "Tweak every aspect of VS Code and your extensions to your liking. Commonly used settings are listed first to get you started.\n{0}", "Tweak my Settings", + "Customize VS Code with Profiles", + "Profiles let you create sets of VS Code customizations that include settings, extensions and UI state. Create your own profile from scratch or use the predefined set of profile templates for your specific workflow.\n{0}", + "Try Profiles", "Safely browse and edit code", "{0} lets you decide whether your project folders should **allow or restrict** automatic code execution __(required for extensions, debugging, etc)__.\nOpening a file/folder will prompt to grant trust. You can always {1} later.", "Workspace Trust", @@ -28073,8 +28307,7 @@ "Context key expression to control the visibility of this step." ], "vs/workbench/contrib/welcomeGettingStarted/browser/featuredExtensionService": [ - "Featured", - "Featured" + "Recommended" ], "vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedColors": [ "Background color for the Welcome page.", @@ -28085,6 +28318,9 @@ "Background color for the Welcome page progress bars.", "Foreground color of the heading of each walkthrough step" ], + "vs/workbench/contrib/welcomeWalkthrough/common/walkThroughUtils": [ + "Background color for the embedded editors on the Interactive Playground." + ], "vs/workbench/contrib/callHierarchy/browser/callHierarchyTree": [ "Call Hierarchy", "calls from {0}", @@ -28182,33 +28418,13 @@ "Last Synced Remotes", "Current" ], - "vs/workbench/contrib/welcomeWalkthrough/common/walkThroughUtils": [ - "Background color for the embedded editors on the Interactive Playground." - ], - "vs/workbench/browser/parts/notifications/notificationsActions": [ - "Icon for the clear action in notifications.", - "Icon for the clear all action in notifications.", - "Icon for the hide action in notifications.", - "Icon for the expand action in notifications.", - "Icon for the collapse action in notifications.", - "Icon for the configure action in notifications.", - "Icon for the mute all action in notifications.", - "Clear Notification", - "Clear All Notifications", - "Toggle Do Not Disturb Mode", - "Hide Notifications", - "Expand Notification", - "Collapse Notification", - "Configure Notification", - "Copy Text" - ], "vs/workbench/services/textfile/common/textFileSaveParticipant": [ "Saving '{0}'" ], - "vs/workbench/browser/parts/notifications/notificationsList": [ - "{0}, notification", - "{0}, source: {1}, notification", - "Notifications List" + "vs/workbench/browser/parts/titlebar/windowTitle": [ + "[Administrator]", + "[Superuser]", + "[Extension Development Host]" ], "vs/workbench/browser/parts/titlebar/commandCenterControl": [ "Search", @@ -28225,11 +28441,6 @@ "Active border color of the command center", "Border color of the command center when the window is inactive" ], - "vs/workbench/browser/parts/titlebar/windowTitle": [ - "[Administrator]", - "[Superuser]", - "[Extension Development Host]" - ], "vs/workbench/services/workingCopy/common/storedFileWorkingCopy": [ "Failed to save '{0}': The content of the file is newer. Do you want to overwrite the file with your changes?", "Overwrite", @@ -28286,10 +28497,24 @@ "Match Whole Word", "Use Regular Expression" ], + "vs/workbench/browser/parts/notifications/notificationsViewer": [ + "Click to execute command '{0}'", + "Notification Actions", + "Source: {0}" + ], + "vs/platform/languagePacks/common/localizedStrings": [ + "open", + "close", + "find" + ], "vs/editor/browser/controller/textAreaHandler": [ "editor", "The editor is not accessible at this time. Press {0} for options." ], + "vs/editor/browser/widget/diffEditor.contribution": [ + "Go to Next Difference", + "Go to Previous Difference" + ], "vs/editor/contrib/codeAction/browser/codeActionMenu": [ "More Actions...", "Quick Fix...", @@ -28300,10 +28525,6 @@ "Surround With...", "Source Action..." ], - "vs/editor/contrib/colorPicker/browser/colorPickerWidget": [ - "Click to toggle color options (rgb/hsl/hex)", - "Icon to close the color picker" - ], "vs/platform/actionWidget/browser/actionWidget": [ "Whether the action widget list is visible", "Hide action widget", @@ -28312,6 +28533,10 @@ "Accept selected action", "Preview selected action" ], + "vs/editor/contrib/colorPicker/browser/colorPickerWidget": [ + "Click to toggle color options (rgb/hsl/hex)", + "Icon to close the color picker" + ], "vs/editor/contrib/inlineCompletions/browser/inlineCompletionContextKeys": [ "Whether an inline suggestion is visible", "Whether the inline suggestion starts with whitespace", @@ -28401,6 +28626,27 @@ "Color of background for currently selected or hovered comment range.", "Color of border for currently selected or hovered comment range." ], + "vs/editor/browser/widget/diffEditorWidget2/diffReview": [ + "Icon for 'Insert' in diff review.", + "Icon for 'Remove' in diff review.", + "Icon for 'Close' in diff review.", + "Close", + "no lines changed", + "1 line changed", + "{0} lines changed", + "Difference {0} of {1}: original line {2}, {3}, modified line {4}, {5}", + "blank", + "{0} unchanged line {1}", + "{0} original line {1} modified line {2}", + "+ {0} modified line {1}", + "- {0} original line {1}" + ], + "vs/editor/browser/widget/diffEditorWidget2/unchangedRanges": [ + "Fold Unchanged Region" + ], + "vs/editor/browser/widget/diffEditorWidget2/diffEditorEditors": [ + " use Shift + F7 to navigate changes" + ], "vs/workbench/browser/parts/editor/editorPlaceholder": [ "Workspace Trust Required", "The file is not displayed in the editor because trust has not been granted to the folder.", @@ -28433,54 +28679,11 @@ "Application Menu", "More" ], - "vs/platform/quickinput/browser/quickInputList": [ - "Quick Input" - ], "vs/platform/quickinput/browser/quickInputUtils": [ "Click to execute command '{0}'" ], - "vs/workbench/contrib/preferences/browser/settingsWidgets": [ - "OK", - "Cancel", - "List item `{0}`", - "List item `{0}` with sibling `${1}`", - "Remove Item", - "Edit Item", - "Add Item", - "Item...", - "Sibling...", - "Exclude files matching `{0}`", - "Exclude files matching `{0}`, only when a file matching `{1}` is present", - "Remove Exclude Item", - "Edit Exclude Item", - "Add Pattern", - "Exclude Pattern...", - "When Pattern Is Present...", - "Include files matching `{0}`", - "Include files matching `{0}`, only when a file matching `{1}` is present", - "Remove Include Item", - "Edit Include Item", - "Add Pattern", - "Include Pattern...", - "When Pattern Is Present...", - "OK", - "Cancel", - "Key", - "Value", - "The property `{0}` is set to `{1}`.", - "Remove Item", - "Reset Item", - "Edit Item", - "Add Item", - "Item", - "Value", - "The property `{0}` is set to `{1}`.", - "Remove Item", - "Reset Item", - "Edit Item", - "Add Item", - "Item", - "Value" + "vs/platform/quickinput/browser/quickInputList": [ + "Quick Input" ], "vs/workbench/contrib/preferences/browser/settingsEditorSettingIndicators": [ "Setting value not applied", @@ -28522,6 +28725,49 @@ "{0} overrides the default value", "Language-specific default values exist for {0}" ], + "vs/workbench/contrib/preferences/browser/settingsWidgets": [ + "OK", + "Cancel", + "List item `{0}`", + "List item `{0}` with sibling `${1}`", + "Remove Item", + "Edit Item", + "Add Item", + "Item...", + "Sibling...", + "Exclude files matching `{0}`", + "Exclude files matching `{0}`, only when a file matching `{1}` is present", + "Remove Exclude Item", + "Edit Exclude Item", + "Add Pattern", + "Exclude Pattern...", + "When Pattern Is Present...", + "Include files matching `{0}`", + "Include files matching `{0}`, only when a file matching `{1}` is present", + "Remove Include Item", + "Edit Include Item", + "Add Pattern", + "Include Pattern...", + "When Pattern Is Present...", + "OK", + "Cancel", + "Key", + "Value", + "The property `{0}` is set to `{1}`.", + "Remove Item", + "Reset Item", + "Edit Item", + "Add Item", + "Item", + "Value", + "The property `{0}` is set to `{1}`.", + "Remove Item", + "Reset Item", + "Edit Item", + "Add Item", + "Item", + "Value" + ], "vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer": [ "Execution Order" ], @@ -28546,6 +28792,26 @@ "Code Cell Source", "Code Cell Output" ], + "vs/platform/actions/browser/buttonbar": [ + "{0} ({1})" + ], + "vs/workbench/contrib/terminal/browser/xterm/decorationAddon": [ + "Rerun Command", + "Do you want to run the command: {0}", + "Yes", + "No", + "Copy Command", + "Copy Output", + "Copy Output as HTML", + "Run Recent Command", + "Go To Recent Directory", + "Configure Command Decorations", + "Learn About Shell Integration", + "Toggle visibility", + "Toggle visibility", + "Gutter command decorations", + "Overview ruler command decorations" + ], "vs/workbench/contrib/debug/common/debugger": [ "Cannot find debug adapter for type '{0}'.", "Use IntelliSense to learn about possible attributes.", @@ -28601,13 +28867,6 @@ "Controls whether manually terminating one session will stop all of the compound sessions.", "Task to run before any of the compound configurations start." ], - "vs/base/browser/ui/selectBox/selectBoxCustom": [ - "Select Box" - ], - "vs/workbench/contrib/mergeEditor/browser/mergeMarkers/mergeMarkersController": [ - "1 Conflicting Line", - "{0} Conflicting Lines" - ], "vs/workbench/contrib/debug/browser/rawDebugSession": [ "No debug adapter, can not start debug session.", "The debugger needs to open a new tab or window for the debuggee but the browser prevented this. You must give permission to continue.", @@ -28615,10 +28874,51 @@ "No debugger available found. Can not send '{0}'.", "More Info" ], + "vs/base/browser/ui/selectBox/selectBoxCustom": [ + "Select Box" + ], + "vs/workbench/contrib/mergeEditor/browser/mergeMarkers/mergeMarkersController": [ + "1 Conflicting Line", + "{0} Conflicting Lines" + ], "vs/workbench/contrib/mergeEditor/browser/model/mergeEditorModel": [ "Set Input Handled", "Undo Mark As Handled" ], + "vs/workbench/contrib/comments/browser/commentGlyphWidget": [ + "Editor gutter decoration color for commenting ranges. This color should be opaque.", + "Editor overview ruler decoration color for resolved comments. This color should be opaque.", + "Editor overview ruler decoration color for unresolved comments. This color should be opaque.", + "Editor gutter decoration color for commenting glyphs.", + "Editor gutter decoration color for commenting glyphs for unresolved comment threads." + ], + "vs/workbench/contrib/customEditor/common/extensionPoint": [ + "Contributed custom editors.", + "Identifier for the custom editor. This must be unique across all custom editors, so we recommend including your extension id as part of `viewType`. The `viewType` is used when registering custom editors with `vscode.registerCustomEditorProvider` and in the `onCustomEditor:${id}` [activation event](https://code.visualstudio.com/api/references/activation-events).", + "Human readable name of the custom editor. This is displayed to users when selecting which editor to use.", + "Set of globs that the custom editor is enabled for.", + "Glob that the custom editor is enabled for.", + "Controls if the custom editor is enabled automatically when the user opens a file. This may be overridden by users using the `workbench.editorAssociations` setting.", + "The editor is automatically used when the user opens a resource, provided that no other default custom editors are registered for that resource.", + "The editor is not automatically used when the user opens a resource, but a user can switch to the editor using the `Reopen With` command." + ], + "vs/workbench/contrib/terminal/browser/terminalConfigHelper": [ + "The '{0}' extension is recommended for opening a terminal in WSL.", + "Install" + ], + "vs/workbench/contrib/terminal/browser/terminalProfileQuickpick": [ + "Select the terminal profile to create", + "Select your default terminal profile", + "Enter terminal profile name", + "A terminal profile already exists with that name", + "profiles", + "contributed", + "detected", + "This terminal profile uses a potentially unsafe path that can be modified by another user: {0}. Are you sure you want to use it?", + "Yes", + "Cancel", + "Configure Terminal Profile" + ], "vs/workbench/contrib/mergeEditor/browser/view/conflictActions": [ "Accept {0}", "Accept {0} in the result document.", @@ -28642,37 +28942,15 @@ "Reset to base", "Reset this conflict to the common ancestor of both the right and left changes." ], - "vs/workbench/contrib/comments/browser/commentGlyphWidget": [ - "Editor gutter decoration color for commenting ranges. This color should be opaque.", - "Editor overview ruler decoration color for resolved comments. This color should be opaque.", - "Editor overview ruler decoration color for unresolved comments. This color should be opaque.", - "Editor gutter decoration color for commenting glyphs.", - "Editor gutter decoration color for commenting glyphs for unresolved comment threads." - ], - "vs/workbench/contrib/customEditor/common/extensionPoint": [ - "Contributed custom editors.", - "Identifier for the custom editor. This must be unique across all custom editors, so we recommend including your extension id as part of `viewType`. The `viewType` is used when registering custom editors with `vscode.registerCustomEditorProvider` and in the `onCustomEditor:${id}` [activation event](https://code.visualstudio.com/api/references/activation-events).", - "Human readable name of the custom editor. This is displayed to users when selecting which editor to use.", - "Set of globs that the custom editor is enabled for.", - "Glob that the custom editor is enabled for.", - "Controls if the custom editor is enabled automatically when the user opens a file. This may be overridden by users using the `workbench.editorAssociations` setting.", - "The editor is automatically used when the user opens a resource, provided that no other default custom editors are registered for that resource.", - "The editor is not automatically used when the user opens a resource, but a user can switch to the editor using the `Reopen With` command." - ], - "vs/workbench/contrib/terminal/browser/terminalConfigHelper": [ - "The '{0}' extension is recommended for opening a terminal in WSL.", - "Install" - ], "vs/workbench/contrib/terminal/browser/terminalInstance": [ + "Task", + "Local", "Terminal input", "Use the accessible buffer {0} to manually review output", "Use the Terminal: Focus Accessible Buffer command to manually review output", - "Task", - "Local", "Bell", "Some keybindings don't go to the terminal by default and are handled by {0} instead.", "Configure Terminal Settings", - "The terminal has no selection to copy", "Preview:", "Are you sure you want to paste {0} lines of text into the terminal?", "&&Paste", @@ -28697,19 +28975,6 @@ "The terminal process terminated with exit code: {0}.", "The terminal process failed to launch: {0}." ], - "vs/workbench/contrib/terminal/browser/terminalProfileQuickpick": [ - "Select the terminal profile to create", - "Select your default terminal profile", - "Enter terminal profile name", - "A terminal profile already exists with that name", - "profiles", - "contributed", - "detected", - "This terminal profile uses a potentially unsafe path that can be modified by another user: {0}. Are you sure you want to use it?", - "Yes", - "Cancel", - "Configure Terminal Profile" - ], "vs/workbench/contrib/terminal/browser/terminalTabsList": [ "Type terminal name. Press Enter to confirm or Escape to cancel.", "Terminal tabs", @@ -28717,6 +28982,19 @@ "Terminal {0} {1}", "Terminal" ], + "vs/workbench/contrib/terminal/browser/xterm/decorationStyles": [ + "Show Command Actions", + "Command executed {0} and failed", + "Command executed {0} and failed (Exit Code {1})", + "Command executed {0}" + ], + "vs/workbench/contrib/terminalContrib/links/browser/terminalLinkDetectorAdapter": [ + "Search workspace", + "Open file in editor", + "Focus folder in explorer", + "Open folder in new window", + "Follow link" + ], "vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget": [ "Find", "Find (⇅ for history)", @@ -28728,19 +29006,6 @@ "{0} found for '{1}'", "{0} found for '{1}'" ], - "vs/workbench/contrib/terminalContrib/links/browser/terminalLinkDetectorAdapter": [ - "Search workspace", - "Open file in editor", - "Focus folder in explorer", - "Open folder in new window", - "Follow link" - ], - "vs/workbench/contrib/terminal/browser/xterm/decorationStyles": [ - "Show Command Actions", - "Command executed {0} and failed", - "Command executed {0} and failed (Exit Code {1})", - "Command executed {0}" - ], "vs/workbench/contrib/welcomeGettingStarted/common/media/theme_picker": [ "Dark Modern", "Light Modern", @@ -28758,21 +29023,11 @@ "Theirs", "Yours" ], - "vs/platform/languagePacks/common/localizedStrings": [ - "open", - "close", - "find" - ], "vs/workbench/contrib/welcomeGettingStarted/common/media/notebookProfile": [ "Default", "Jupyter", "Colab" ], - "vs/workbench/browser/parts/notifications/notificationsViewer": [ - "Click to execute command '{0}'", - "Notification Actions", - "Source: {0}" - ], "vs/platform/actionWidget/browser/actionList": [ "{0} to apply, {1} to preview", "{0} to apply", @@ -28784,6 +29039,20 @@ "{0} reference", "References" ], + "vs/editor/browser/widget/diffEditorWidget2/decorations": [ + "Line decoration for inserts in the diff editor.", + "Line decoration for removals in the diff editor.", + "Click to revert change" + ], + "vs/editor/browser/widget/diffEditorWidget2/inlineDiffDeletedCodeMargin": [ + "Copy deleted lines", + "Copy deleted line", + "Copy changed lines", + "Copy changed line", + "Copy deleted line ({0})", + "Copy changed line ({0})", + "Revert this change" + ], "vs/workbench/browser/parts/editor/breadcrumbs": [ "Breadcrumb Navigation", "Enable/disable navigation breadcrumbs.", @@ -28830,12 +29099,25 @@ "vs/workbench/browser/parts/editor/breadcrumbsPicker": [ "Breadcrumbs" ], + "vs/workbench/contrib/notebook/browser/diff/diffElementOutputs": [ + "Choose a different output mimetype, available mimetypes: {0}", + "Cell has no output", + "No renderer could be found for output. It has the following mimetypes: {0}", + "Currently Active", + "Select mimetype to render for current output. Rich mimetypes are available only when the notebook is trusted", + "Select mimetype to render for current output", + "built-in" + ], "vs/workbench/contrib/notebook/browser/view/cellParts/cellEditorOptions": [ "Controls the display of line numbers in the cell editor.", "Toggle Notebook Line Numbers", "Notebook Line Numbers", "Show Cell Line Numbers" ], + "vs/workbench/contrib/notebook/browser/view/cellParts/codeCell": [ + "Double-click to expand cell input ({0})", + "Expand Cell Input ({0})" + ], "vs/workbench/contrib/notebook/browser/view/cellParts/codeCellRunToolbar": [ "More..." ], @@ -28848,22 +29130,20 @@ "1 cell hidden", "{0} cells hidden" ], - "vs/workbench/contrib/notebook/browser/view/cellParts/codeCell": [ - "Double-click to expand cell input ({0})", - "Expand Cell Input ({0})" - ], "vs/workbench/contrib/notebook/browser/view/cellParts/markupCell": [ "Double-click to expand cell input ({0})", "Expand Cell Input ({0})" ], - "vs/workbench/contrib/notebook/browser/diff/diffElementOutputs": [ - "Choose a different output mimetype, available mimetypes: {0}", - "Cell has no output", - "No renderer could be found for output. It has the following mimetypes: {0}", - "Currently Active", - "Select mimetype to render for current output. Rich mimetypes are available only when the notebook is trusted", - "Select mimetype to render for current output", - "built-in" + "vs/workbench/services/suggest/browser/simpleSuggestWidget": [ + "Suggest", + "{0}{1}, {2}", + "{0}{1}", + "{0}, {1}", + "{0}, docs: {1}" + ], + "vs/workbench/contrib/terminal/browser/terminalProcessManager": [ + "Could not kill process listening on port {0}, command exited with error {1}", + "Restarting the terminal because the connection to the shell process was lost..." ], "vs/workbench/contrib/terminal/browser/terminalRunRecentQuickPick": [ "Remove from Command History", @@ -28874,20 +29154,15 @@ "Select a directory to go to (hold Option-key to edit the command)", "Select a directory to go to (hold Alt-key to edit the command)" ], - "vs/workbench/contrib/terminal/browser/terminalProcessManager": [ - "Could not kill process listening on port {0}, command exited with error {1}", - "Restarting the terminal because the connection to the shell process was lost..." - ], - "vs/workbench/contrib/terminal/browser/xterm/xtermTerminal": [ - "Yes", - "No", - "Don't Show Again", - "Terminal GPU acceleration appears to be slow on your computer. Would you like to switch to disable it which may improve performance? [Read more about terminal settings](https://code.visualstudio.com/docs/editor/integrated-terminal#_changing-how-the-terminal-is-rendered)." - ], - "vs/workbench/contrib/comments/browser/commentThreadBody": [ - "Comment thread with {0} comments on lines {1} through {2}. {3}.", - "Comment thread with {0} comments on the entire document. {1}.", - "Comment thread with {0} comments. {1}." + "vs/workbench/contrib/notebook/browser/view/cellParts/cellOutput": [ + "Cell has no output", + "No renderer could be found for output. It has the following mimetypes: {0}", + "Change Presentation", + "Currently Active", + "Install additional renderers from the marketplace", + "Select mimetype to render for current output", + "Select mimetype to render for current output", + "renderer not available" ], "vs/workbench/contrib/notebook/browser/view/cellParts/codeCellExecutionIcon": [ "Success", @@ -28895,6 +29170,11 @@ "Pending", "Executing" ], + "vs/workbench/contrib/comments/browser/commentThreadBody": [ + "Comment thread with {0} comments on lines {1} through {2}. {3}.", + "Comment thread with {0} comments on the entire document. {1}.", + "Comment thread with {0} comments. {1}." + ], "vs/workbench/contrib/comments/browser/commentThreadHeader": [ "Icon to collapse a review comment.", "Collapse", @@ -28907,33 +29187,6 @@ "Show environment contributions", "workspace" ], - "vs/workbench/contrib/terminal/browser/xterm/decorationAddon": [ - "Rerun Command", - "Do you want to run the command: {0}", - "Yes", - "No", - "Copy Command", - "Copy Output", - "Copy Output as HTML", - "Run Recent Command", - "Go To Recent Directory", - "Configure Command Decorations", - "Learn About Shell Integration", - "Toggle visibility", - "Toggle visibility", - "Gutter command decorations", - "Overview ruler command decorations" - ], - "vs/workbench/contrib/notebook/browser/view/cellParts/cellOutput": [ - "Cell has no output", - "No renderer could be found for output. It has the following mimetypes: {0}", - "Change Presentation", - "Currently Active", - "Install additional renderers from the marketplace", - "Select mimetype to render for current output", - "Select mimetype to render for current output", - "renderer not available" - ], "vs/workbench/contrib/comments/browser/commentNode": [ "Toggle Reaction", "Toggling the comment reaction failed: {0}.", @@ -28943,13 +29196,6 @@ "Deleting the comment reaction failed: {0}.", "Deleting the comment reaction failed" ], - "vs/workbench/services/suggest/browser/simpleSuggestWidget": [ - "Suggest", - "{0}{1}, {2}", - "{0}{1}", - "{0}, {1}", - "{0}, docs: {1}" - ], "vs/workbench/contrib/comments/browser/reactionsAction": [ "Pick Reactions...", "Toggle reaction, ", @@ -28986,9 +29232,15 @@ "vs/editor/browser/coreCommands", "vs/editor/browser/editorExtensions", "vs/editor/browser/widget/codeEditorWidget", + "vs/editor/browser/widget/diffEditor.contribution", "vs/editor/browser/widget/diffEditorWidget", - "vs/editor/browser/widget/diffEditorWidget2/diffEditorWidget2", + "vs/editor/browser/widget/diffEditorWidget2/colors", + "vs/editor/browser/widget/diffEditorWidget2/decorations", + "vs/editor/browser/widget/diffEditorWidget2/diffEditorEditors", "vs/editor/browser/widget/diffEditorWidget2/diffEditorWidget2.contribution", + "vs/editor/browser/widget/diffEditorWidget2/diffReview", + "vs/editor/browser/widget/diffEditorWidget2/inlineDiffDeletedCodeMargin", + "vs/editor/browser/widget/diffEditorWidget2/unchangedRanges", "vs/editor/browser/widget/diffReview", "vs/editor/browser/widget/inlineDiffMargin", "vs/editor/common/config/editorConfigurationSchema", @@ -29082,6 +29334,7 @@ "vs/platform/action/common/actionCommonCategories", "vs/platform/actionWidget/browser/actionList", "vs/platform/actionWidget/browser/actionWidget", + "vs/platform/actions/browser/buttonbar", "vs/platform/actions/browser/menuEntryActionViewItem", "vs/platform/actions/browser/toolbar", "vs/platform/actions/common/menuResetAction", @@ -29119,6 +29372,7 @@ "vs/platform/remoteTunnel/common/remoteTunnel", "vs/platform/request/common/request", "vs/platform/telemetry/common/telemetryService", + "vs/platform/terminal/common/terminalLogService", "vs/platform/terminal/common/terminalPlatformConfiguration", "vs/platform/terminal/common/terminalProfiles", "vs/platform/theme/common/colorRegistry", @@ -29229,7 +29483,9 @@ "vs/workbench/common/editor/textEditorModel", "vs/workbench/common/theme", "vs/workbench/common/views", + "vs/workbench/contrib/accessibility/browser/accessibility.contribution", "vs/workbench/contrib/accessibility/browser/accessibilityContribution", + "vs/workbench/contrib/accessibility/browser/accessibleView", "vs/workbench/contrib/audioCues/browser/audioCues.contribution", "vs/workbench/contrib/audioCues/browser/commands", "vs/workbench/contrib/bulkEdit/browser/bulkEditService", @@ -29359,7 +29615,6 @@ "vs/workbench/contrib/editSessions/common/editSessions", "vs/workbench/contrib/editSessions/common/editSessionsLogService", "vs/workbench/contrib/emmet/browser/actions/expandAbbreviation", - "vs/workbench/contrib/experiments/browser/experiments.contribution", "vs/workbench/contrib/extensions/browser/abstractRuntimeExtensionsEditor", "vs/workbench/contrib/extensions/browser/configBasedRecommendations", "vs/workbench/contrib/extensions/browser/deprecatedExtensionsChecker", @@ -29424,13 +29679,13 @@ "vs/workbench/contrib/format/browser/formatActionsNone", "vs/workbench/contrib/format/browser/formatModified", "vs/workbench/contrib/inlayHints/browser/inlayHintsAccessibilty", + "vs/workbench/contrib/inlineChat/browser/inlineChatActions", + "vs/workbench/contrib/inlineChat/browser/inlineChatController", + "vs/workbench/contrib/inlineChat/browser/inlineChatStrategies", + "vs/workbench/contrib/inlineChat/browser/inlineChatWidget", + "vs/workbench/contrib/inlineChat/common/inlineChat", "vs/workbench/contrib/interactive/browser/interactive.contribution", "vs/workbench/contrib/interactive/browser/interactiveEditor", - "vs/workbench/contrib/interactiveEditor/browser/interactiveEditorActions", - "vs/workbench/contrib/interactiveEditor/browser/interactiveEditorController", - "vs/workbench/contrib/interactiveEditor/browser/interactiveEditorStrategies", - "vs/workbench/contrib/interactiveEditor/browser/interactiveEditorWidget", - "vs/workbench/contrib/interactiveEditor/common/interactiveEditor", "vs/workbench/contrib/issue/common/issue.contribution", "vs/workbench/contrib/issue/electron-sandbox/issue.contribution", "vs/workbench/contrib/keybindings/browser/keybindings.contribution", @@ -29497,6 +29752,7 @@ "vs/workbench/contrib/notebook/browser/diff/notebookDiffActions", "vs/workbench/contrib/notebook/browser/diff/notebookDiffEditor", "vs/workbench/contrib/notebook/browser/notebook.contribution", + "vs/workbench/contrib/notebook/browser/notebookAccessibilityHelp", "vs/workbench/contrib/notebook/browser/notebookEditor", "vs/workbench/contrib/notebook/browser/notebookEditorWidget", "vs/workbench/contrib/notebook/browser/notebookExtensionPoint", @@ -29518,7 +29774,7 @@ "vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer", "vs/workbench/contrib/notebook/browser/viewParts/notebookKernelQuickPickStrategy", "vs/workbench/contrib/notebook/browser/viewParts/notebookKernelView", - "vs/workbench/contrib/notebook/common/notebookEditorModel", + "vs/workbench/contrib/notebook/common/notebookEditorInput", "vs/workbench/contrib/outline/browser/outline.contribution", "vs/workbench/contrib/outline/browser/outlineActions", "vs/workbench/contrib/outline/browser/outlinePane", @@ -29555,7 +29811,6 @@ "vs/workbench/contrib/remote/browser/remoteExplorer", "vs/workbench/contrib/remote/browser/remoteIcons", "vs/workbench/contrib/remote/browser/remoteIndicator", - "vs/workbench/contrib/remote/browser/remoteStartEntry", "vs/workbench/contrib/remote/browser/tunnelFactory", "vs/workbench/contrib/remote/browser/tunnelView", "vs/workbench/contrib/remote/common/remote.contribution", @@ -29636,7 +29891,6 @@ "vs/workbench/contrib/terminal/browser/terminalMenus", "vs/workbench/contrib/terminal/browser/terminalProcessManager", "vs/workbench/contrib/terminal/browser/terminalProfileQuickpick", - "vs/workbench/contrib/terminal/browser/terminalProfileResolverService", "vs/workbench/contrib/terminal/browser/terminalQuickAccess", "vs/workbench/contrib/terminal/browser/terminalRunRecentQuickPick", "vs/workbench/contrib/terminal/browser/terminalService", @@ -29675,7 +29929,6 @@ "vs/workbench/contrib/testing/browser/testingExplorerFilter", "vs/workbench/contrib/testing/browser/testingExplorerView", "vs/workbench/contrib/testing/browser/testingOutputPeek", - "vs/workbench/contrib/testing/browser/testingOutputTerminalService", "vs/workbench/contrib/testing/browser/testingProgressUiService", "vs/workbench/contrib/testing/browser/testingViewPaneContainer", "vs/workbench/contrib/testing/browser/theme", @@ -29741,6 +29994,7 @@ "vs/workbench/electron-sandbox/parts/dialogs/dialogHandler", "vs/workbench/electron-sandbox/window", "vs/workbench/services/actions/common/menusExtensionPoint", + "vs/workbench/services/assignment/common/assignmentService", "vs/workbench/services/authentication/browser/authenticationService", "vs/workbench/services/configuration/browser/configurationService", "vs/workbench/services/configuration/common/configurationEditing", @@ -29768,9 +30022,11 @@ "vs/workbench/services/extensions/electron-sandbox/cachedExtensionScanner", "vs/workbench/services/extensions/electron-sandbox/localProcessExtensionHost", "vs/workbench/services/extensions/electron-sandbox/nativeExtensionService", + "vs/workbench/services/filesConfiguration/common/filesConfigurationService", "vs/workbench/services/history/browser/historyService", "vs/workbench/services/hover/browser/hoverWidget", "vs/workbench/services/integrity/electron-sandbox/integrityService", + "vs/workbench/services/issue/browser/issueTroubleshoot", "vs/workbench/services/keybinding/browser/keybindingService", "vs/workbench/services/keybinding/common/keybindingEditing", "vs/workbench/services/label/common/labelService", @@ -29788,6 +30044,7 @@ "vs/workbench/services/remote/common/remoteExplorerService", "vs/workbench/services/remote/electron-sandbox/remoteAgentService", "vs/workbench/services/search/common/queryBuilder", + "vs/workbench/services/secrets/electron-sandbox/secretStorageService", "vs/workbench/services/suggest/browser/simpleSuggestWidget", "vs/workbench/services/textMate/browser/textMateTokenizationFeatureImpl", "vs/workbench/services/textMate/common/TMGrammars", diff --git a/packages/editor/src/browser/editor-widget-factory.ts b/packages/editor/src/browser/editor-widget-factory.ts index 0204e6b387634..5197088090a44 100644 --- a/packages/editor/src/browser/editor-widget-factory.ts +++ b/packages/editor/src/browser/editor-widget-factory.ts @@ -73,7 +73,7 @@ export class EditorWidgetFactory implements WidgetFactory { private setLabels(editor: EditorWidget, uri: URI): void { editor.title.caption = uri.path.fsPath(); if (editor.editor.isReadonly) { - editor.title.caption += ` • ${nls.localizeByDefault('Read Only')}`; + editor.title.caption += ` • ${nls.localizeByDefault('Read-only')}`; } const icon = this.labelProvider.getIcon(uri); editor.title.label = this.labelProvider.getName(uri); diff --git a/packages/filesystem/src/browser/file-service.ts b/packages/filesystem/src/browser/file-service.ts index bf3bea1404fca..5cefe4c1007b1 100644 --- a/packages/filesystem/src/browser/file-service.ts +++ b/packages/filesystem/src/browser/file-service.ts @@ -1681,7 +1681,7 @@ export class FileService { protected throwIfFileSystemIsReadonly(provider: T, resource: URI): T { if (provider.capabilities & FileSystemProviderCapabilities.Readonly) { - throw new FileOperationError(nls.localizeByDefault("Unable to modify readonly file '{0}'", this.resourceForError(resource)), FileOperationResult.FILE_PERMISSION_DENIED); + throw new FileOperationError(nls.localizeByDefault("Unable to modify read-only file '{0}'", this.resourceForError(resource)), FileOperationResult.FILE_PERMISSION_DENIED); } return provider; diff --git a/packages/filesystem/src/browser/filesystem-preferences.ts b/packages/filesystem/src/browser/filesystem-preferences.ts index 99a1f2fcbc58d..3d41948137509 100644 --- a/packages/filesystem/src/browser/filesystem-preferences.ts +++ b/packages/filesystem/src/browser/filesystem-preferences.ts @@ -40,7 +40,7 @@ export const filesystemPreferenceSchema: PreferenceSchema = { properties: { 'files.watcherExclude': { // eslint-disable-next-line max-len - description: nls.localizeByDefault('Configure paths or glob patterns to exclude from file watching. Paths can either be relative to the watched folder or absolute. Glob patterns are matched relative from the watched folder. When you experience the file watcher process consuming a lot of CPU, make sure to exclude large folders that are of less interest (such as build output folders).'), + description: nls.localizeByDefault('Configure paths or [glob patterns](https://aka.ms/vscode-glob-patterns) to exclude from file watching. Paths can either be relative to the watched folder or absolute. Glob patterns are matched relative from the watched folder. When you experience the file watcher process consuming a lot of CPU, make sure to exclude large folders that are of less interest (such as build output folders).'), additionalProperties: { type: 'boolean' }, From 5d7a655eaeb42809be8128ec4e92fa8f34d6d7dc Mon Sep 17 00:00:00 2001 From: erezmus <2045191+erezmus@users.noreply.github.com> Date: Wed, 30 Aug 2023 12:06:50 +0100 Subject: [PATCH 38/79] Fix unhandled promise rejection during git operations (#12433) --- packages/git/src/node/git-repository-manager.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/git/src/node/git-repository-manager.ts b/packages/git/src/node/git-repository-manager.ts index 622ea34760643..8f0b1af4c1a06 100644 --- a/packages/git/src/node/git-repository-manager.ts +++ b/packages/git/src/node/git-repository-manager.ts @@ -30,7 +30,8 @@ export class GitRepositoryManager { run(repository: Repository, op: () => Promise): Promise { const result = op(); - result.then(() => this.sync(repository)); + result.then(() => this.sync(repository).catch(e => console.log(e))); + return result; } From 109adc41f1340ef2e5aee862ece1cd49ca792323 Mon Sep 17 00:00:00 2001 From: "Christian W. Damus" Date: Thu, 31 Aug 2023 05:33:41 -0400 Subject: [PATCH 39/79] tabbar: support icon-less items (#12804) VS Code renders action buttons in the tab bar for commands that do not have icons using their title text, instead. This commit does the same in Theia. Additionally, two related minor issues are fixed: - the $(icon) specifiers for icons show in the tooltip of an action, which is confusing - the roll-over highlight shows only on action buttons for commands that use the "icon" property, not those that embed icon specifiers in their titles Fixes #12686 Signed-off-by: Christian W. Damus --- .../core/src/browser/label-parser.spec.ts | 38 +++++++++++++++++++ packages/core/src/browser/label-parser.ts | 15 ++++++++ .../shell/tab-bar-toolbar/tab-bar-toolbar.tsx | 31 ++++++++++++--- packages/core/src/browser/style/tabs.css | 5 +++ 4 files changed, 83 insertions(+), 6 deletions(-) diff --git a/packages/core/src/browser/label-parser.spec.ts b/packages/core/src/browser/label-parser.spec.ts index 9224692b44665..2c1be315cf6c7 100644 --- a/packages/core/src/browser/label-parser.spec.ts +++ b/packages/core/src/browser/label-parser.spec.ts @@ -124,4 +124,42 @@ describe('StatusBarEntryUtility', () => { expect((iconArr[3] as LabelIcon).name).equals('icon3'); }); + it('should strip nothing from an empty string', () => { + text = ''; + const stripped: string = statusBarEntryUtility.stripIcons(text); + expect(stripped).to.be.equal(text); + }); + + it('should strip nothing from an string containing no icons', () => { + // Deliberate double space to verify not concatenating these words + text = 'foo bar'; + const stripped: string = statusBarEntryUtility.stripIcons(text); + expect(stripped).to.be.equal(text); + }); + + it("should strip a medial '$(icon)' from a string", () => { + text = 'foo $(icon) bar'; + const stripped: string = statusBarEntryUtility.stripIcons(text); + expect(stripped).to.be.equal('foo bar'); + }); + + it("should strip a terminal '$(icon)' from a string", () => { + // Deliberate double space to verify not concatenating these words + text = 'foo bar $(icon)'; + const stripped: string = statusBarEntryUtility.stripIcons(text); + expect(stripped).to.be.equal('foo bar'); + }); + + it("should strip an initial '$(icon)' from a string", () => { + // Deliberate double space to verify not concatenating these words + text = '$(icon) foo bar'; + const stripped: string = statusBarEntryUtility.stripIcons(text); + expect(stripped).to.be.equal('foo bar'); + }); + + it("should strip multiple '$(icon)' specifiers from a string", () => { + text = '$(icon1) foo $(icon2)$(icon3) bar $(icon4) $(icon5)'; + const stripped: string = statusBarEntryUtility.stripIcons(text); + expect(stripped).to.be.equal('foo bar'); + }); }); diff --git a/packages/core/src/browser/label-parser.ts b/packages/core/src/browser/label-parser.ts index 5918d60c59b7d..2fcb9e13b9bf8 100644 --- a/packages/core/src/browser/label-parser.ts +++ b/packages/core/src/browser/label-parser.ts @@ -90,4 +90,19 @@ export class LabelParser { return parserArray; } + /** + * Strips icon specifiers from the given `text`, leaving only a + * space-separated concatenation of the non-icon segments. + * + * @param text text to be stripped of icon specifiers + * @returns the `text` with icon specifiers stripped out + */ + stripIcons(text: string): string { + return this.parse(text) + .filter(item => !LabelIcon.is(item)) + .map(s => (s as string).trim()) + .filter(s => s.length) + .join(' '); + } + } diff --git a/packages/core/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.tsx b/packages/core/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.tsx index e00dc47c51d3e..092c5b90313fe 100644 --- a/packages/core/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.tsx +++ b/packages/core/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.tsx @@ -33,6 +33,11 @@ export interface TabBarToolbarFactory { (): TabBarToolbar; } +/** + * Class name indicating rendering of a toolbar item without an icon but instead with a text label. + */ +const NO_ICON_CLASS = 'no-icon'; + /** * Tab-bar toolbar widget representing the active [tab-bar toolbar items](TabBarToolbarItem). */ @@ -178,8 +183,12 @@ export class TabBarToolbar extends ReactWidget { protected renderItem(item: AnyToolbarItem): React.ReactNode { let innerText = ''; const classNames = []; - if (item.text) { - for (const labelPart of this.labelParser.parse(item.text)) { + const command = item.command ? this.commands.getCommand(item.command) : undefined; + // Fall back to the item ID in extremis so there is _something_ to render in the + // case that there is neither an icon nor a title + const itemText = item.text || command?.label || command?.id || item.id; + if (itemText) { + for (const labelPart of this.labelParser.parse(itemText)) { if (LabelIcon.is(labelPart)) { const className = `fa fa-${labelPart.name}${labelPart.animation ? ' fa-' + labelPart.animation : ''}`; classNames.push(...className.split(' ')); @@ -188,13 +197,23 @@ export class TabBarToolbar extends ReactWidget { } } } - const command = item.command ? this.commands.getCommand(item.command) : undefined; - let iconClass = (typeof item.icon === 'function' && item.icon()) || item.icon as string || (command && command.iconClass); + const iconClass = (typeof item.icon === 'function' && item.icon()) || item.icon as string || (command && command.iconClass); if (iconClass) { - iconClass += ` ${ACTION_ITEM}`; classNames.push(iconClass); } - const tooltip = `${item.tooltip || (command && command.label) || ''}${this.resolveKeybindingForCommand(command?.id)}`; + const tooltipText = item.tooltip || (command && command.label) || ''; + const tooltip = `${this.labelParser.stripIcons(tooltipText)}${this.resolveKeybindingForCommand(command?.id)}`; + + // Only present text if there is no icon + if (classNames.length) { + innerText = ''; + } else if (innerText) { + // Make room for the label text + classNames.push(NO_ICON_CLASS); + } + + // In any case, this is an action item, with or without icon. + classNames.push(ACTION_ITEM); const toolbarItemClassNames = this.getToolbarItemClassNames(item); return
div.no-icon { + /* Make room for a text label instead of an icon. */ + width: 100%; +} + .p-TabBar-toolbar .item .collapse-all { background: var(--theia-icon-collapse-all) no-repeat; } From 97fe17eecbc2657c9b0a4e5d0a65558611a5acd6 Mon Sep 17 00:00:00 2001 From: Jonah Iden Date: Thu, 31 Aug 2023 14:28:13 +0200 Subject: [PATCH 40/79] Notebook API Support (#12442) Full feature support including: * Notebook widget rendering * Kernel selection * Cell execution * Custom output rendering * Plugin host support Signed-off-by: Jonah Iden Co-authored-by: Mark Sujew --- examples/browser/package.json | 1 + examples/browser/tsconfig.json | 3 + package.json | 1 - packages/core/src/browser/saveable.ts | 43 +- packages/core/src/common/array-utils.ts | 20 + packages/core/src/common/event.ts | 14 +- packages/core/src/common/types.ts | 17 + packages/core/src/common/uri.ts | 4 + .../src/browser/editor-frontend-module.ts | 3 + .../src/browser}/undo-redo-service.ts | 8 +- .../monaco/src/browser/monaco-code-editor.ts | 210 +++ .../src/browser/monaco-editor-provider.ts | 10 +- .../monaco/src/browser/monaco-languages.ts | 4 + packages/notebook/.eslintrc.js | 10 + packages/notebook/README.md | 30 + packages/notebook/package.json | 51 + .../notebook-actions-contribution.ts | 171 +++ .../notebook-cell-actions-contribution.ts | 204 +++ .../notebook-color-contribution.ts | 268 ++++ .../contributions/notebook-context-keys.ts | 99 ++ packages/notebook/src/browser/index.ts | 26 + .../notebook-cell-resource-resolver.ts | 79 ++ .../browser/notebook-editor-widget-factory.ts | 70 + .../src/browser/notebook-editor-widget.tsx | 157 +++ .../src/browser/notebook-frontend-module.ts | 95 ++ .../src/browser/notebook-open-handler.ts | 87 ++ .../src/browser/notebook-renderer-registry.ts | 62 + .../src/browser/notebook-type-registry.ts | 30 + .../browser/renderers/cell-output-webview.ts | 32 + .../service/notebook-cell-context-manager.ts | 70 + .../service/notebook-editor-service.ts | 86 ++ .../service/notebook-execution-service.ts | 139 ++ .../notebook-execution-state-service.ts | 322 +++++ .../notebook-kernel-history-service.ts | 109 ++ .../notebook-kernel-quick-pick-service.ts | 494 +++++++ .../service/notebook-kernel-service.ts | 357 +++++ .../notebook-model-resolver-service.ts | 141 ++ .../notebook-renderer-messaging-service.ts | 111 ++ .../src/browser/service/notebook-service.ts | 178 +++ packages/notebook/src/browser/style/index.css | 236 ++++ .../browser/view-model/notebook-cell-model.ts | 271 ++++ .../view-model/notebook-cell-output-model.ts | 69 + .../src/browser/view-model/notebook-model.ts | 372 +++++ .../src/browser/view/notebook-cell-editor.tsx | 97 ++ .../browser/view/notebook-cell-list-view.tsx | 171 +++ .../view/notebook-cell-toolbar-factory.tsx | 91 ++ .../browser/view/notebook-cell-toolbar.tsx | 70 + .../browser/view/notebook-code-cell-view.tsx | 190 +++ .../browser/view/notebook-main-toolbar.tsx | 115 ++ .../view/notebook-markdown-cell-view.tsx | 73 + packages/notebook/src/common/index.ts | 18 + .../notebook/src/common/notebook-common.ts | 462 +++++++ .../notebook/src/common/notebook-protocol.ts | 35 + .../notebook/src/common/notebook-range.ts | 30 + packages/notebook/tsconfig.json | 25 + packages/plugin-ext/package.json | 2 + packages/plugin-ext/src/common/collections.ts | 17 + .../plugin-ext/src/common/plugin-api-rpc.ts | 326 ++++- .../plugin-ext/src/common/plugin-protocol.ts | 18 + .../src/hosted/browser/hosted-plugin.ts | 12 + .../src/hosted/node/scanners/scanner-theia.ts | 6 + .../custom-editors/custom-editor-widget.ts | 2 +- .../custom-editors/custom-editors-main.ts | 2 +- .../browser/editors-and-documents-main.ts | 1 + .../src/main/browser/languages-main.ts | 11 +- .../src/main/browser/main-context.ts | 19 + .../notebook-documents-and-editors-main.ts | 238 ++++ .../notebooks/notebook-documents-main.ts | 166 +++ .../main/browser/notebooks/notebook-dto.ts | 141 ++ .../notebooks/notebook-editors-main.ts | 70 + .../notebooks/notebook-kernels-main.ts | 291 ++++ .../notebooks/notebook-renderers-main.ts | 47 + .../main/browser/notebooks/notebooks-main.ts | 124 ++ .../renderers/cell-output-webview.tsx | 198 +++ .../renderers/output-webview-internal.ts | 476 +++++++ .../renderers/webview-communication.ts | 79 ++ .../browser/plugin-contribution-handler.ts | 28 +- .../browser/plugin-ext-frontend-module.ts | 10 +- .../src/main/browser/webview/webview.ts | 6 + .../src/plugin/editors-and-documents.ts | 2 +- .../src/plugin/notebook/notebook-document.ts | 438 ++++++ .../src/plugin/notebook/notebook-documents.ts | 58 + .../src/plugin/notebook/notebook-editor.ts | 116 ++ .../src/plugin/notebook/notebook-editors.ts | 71 + .../src/plugin/notebook/notebook-kernels.ts | 616 +++++++++ .../src/plugin/notebook/notebook-renderers.ts | 72 + .../src/plugin/notebook/notebooks.ts | 385 ++++++ .../plugin-ext/src/plugin/plugin-context.ts | 145 +- .../plugin-ext/src/plugin/plugin-manager.ts | 10 +- .../plugin-ext/src/plugin/type-converters.ts | 372 ++++- packages/plugin-ext/src/plugin/types-impl.ts | 209 ++- packages/plugin-ext/tsconfig.json | 3 + packages/plugin/src/theia.d.ts | 1229 ++++++++--------- ...a.proposed.notebookCellExecutionState.d.ts | 68 + .../theia.proposed.notebookKernelSource.d.ts | 62 + .../src/theia.proposed.notebookMessaging.d.ts | 84 ++ tsconfig.json | 3 + yarn.lock | 5 + 98 files changed, 11549 insertions(+), 830 deletions(-) rename packages/{plugin-ext/src/main/browser/custom-editors => editor/src/browser}/undo-redo-service.ts (95%) create mode 100644 packages/monaco/src/browser/monaco-code-editor.ts create mode 100644 packages/notebook/.eslintrc.js create mode 100644 packages/notebook/README.md create mode 100644 packages/notebook/package.json create mode 100644 packages/notebook/src/browser/contributions/notebook-actions-contribution.ts create mode 100644 packages/notebook/src/browser/contributions/notebook-cell-actions-contribution.ts create mode 100644 packages/notebook/src/browser/contributions/notebook-color-contribution.ts create mode 100644 packages/notebook/src/browser/contributions/notebook-context-keys.ts create mode 100644 packages/notebook/src/browser/index.ts create mode 100644 packages/notebook/src/browser/notebook-cell-resource-resolver.ts create mode 100644 packages/notebook/src/browser/notebook-editor-widget-factory.ts create mode 100644 packages/notebook/src/browser/notebook-editor-widget.tsx create mode 100644 packages/notebook/src/browser/notebook-frontend-module.ts create mode 100644 packages/notebook/src/browser/notebook-open-handler.ts create mode 100644 packages/notebook/src/browser/notebook-renderer-registry.ts create mode 100644 packages/notebook/src/browser/notebook-type-registry.ts create mode 100644 packages/notebook/src/browser/renderers/cell-output-webview.ts create mode 100644 packages/notebook/src/browser/service/notebook-cell-context-manager.ts create mode 100644 packages/notebook/src/browser/service/notebook-editor-service.ts create mode 100644 packages/notebook/src/browser/service/notebook-execution-service.ts create mode 100644 packages/notebook/src/browser/service/notebook-execution-state-service.ts create mode 100644 packages/notebook/src/browser/service/notebook-kernel-history-service.ts create mode 100644 packages/notebook/src/browser/service/notebook-kernel-quick-pick-service.ts create mode 100644 packages/notebook/src/browser/service/notebook-kernel-service.ts create mode 100644 packages/notebook/src/browser/service/notebook-model-resolver-service.ts create mode 100644 packages/notebook/src/browser/service/notebook-renderer-messaging-service.ts create mode 100644 packages/notebook/src/browser/service/notebook-service.ts create mode 100644 packages/notebook/src/browser/style/index.css create mode 100644 packages/notebook/src/browser/view-model/notebook-cell-model.ts create mode 100644 packages/notebook/src/browser/view-model/notebook-cell-output-model.ts create mode 100644 packages/notebook/src/browser/view-model/notebook-model.ts create mode 100644 packages/notebook/src/browser/view/notebook-cell-editor.tsx create mode 100644 packages/notebook/src/browser/view/notebook-cell-list-view.tsx create mode 100644 packages/notebook/src/browser/view/notebook-cell-toolbar-factory.tsx create mode 100644 packages/notebook/src/browser/view/notebook-cell-toolbar.tsx create mode 100644 packages/notebook/src/browser/view/notebook-code-cell-view.tsx create mode 100644 packages/notebook/src/browser/view/notebook-main-toolbar.tsx create mode 100644 packages/notebook/src/browser/view/notebook-markdown-cell-view.tsx create mode 100644 packages/notebook/src/common/index.ts create mode 100644 packages/notebook/src/common/notebook-common.ts create mode 100644 packages/notebook/src/common/notebook-protocol.ts create mode 100644 packages/notebook/src/common/notebook-range.ts create mode 100644 packages/notebook/tsconfig.json create mode 100644 packages/plugin-ext/src/main/browser/notebooks/notebook-documents-and-editors-main.ts create mode 100644 packages/plugin-ext/src/main/browser/notebooks/notebook-documents-main.ts create mode 100644 packages/plugin-ext/src/main/browser/notebooks/notebook-dto.ts create mode 100644 packages/plugin-ext/src/main/browser/notebooks/notebook-editors-main.ts create mode 100644 packages/plugin-ext/src/main/browser/notebooks/notebook-kernels-main.ts create mode 100644 packages/plugin-ext/src/main/browser/notebooks/notebook-renderers-main.ts create mode 100644 packages/plugin-ext/src/main/browser/notebooks/notebooks-main.ts create mode 100644 packages/plugin-ext/src/main/browser/notebooks/renderers/cell-output-webview.tsx create mode 100644 packages/plugin-ext/src/main/browser/notebooks/renderers/output-webview-internal.ts create mode 100644 packages/plugin-ext/src/main/browser/notebooks/renderers/webview-communication.ts create mode 100644 packages/plugin-ext/src/plugin/notebook/notebook-document.ts create mode 100644 packages/plugin-ext/src/plugin/notebook/notebook-documents.ts create mode 100644 packages/plugin-ext/src/plugin/notebook/notebook-editor.ts create mode 100644 packages/plugin-ext/src/plugin/notebook/notebook-editors.ts create mode 100644 packages/plugin-ext/src/plugin/notebook/notebook-kernels.ts create mode 100644 packages/plugin-ext/src/plugin/notebook/notebook-renderers.ts create mode 100644 packages/plugin-ext/src/plugin/notebook/notebooks.ts create mode 100644 packages/plugin/src/theia.proposed.notebookCellExecutionState.d.ts create mode 100644 packages/plugin/src/theia.proposed.notebookKernelSource.d.ts create mode 100644 packages/plugin/src/theia.proposed.notebookMessaging.d.ts diff --git a/examples/browser/package.json b/examples/browser/package.json index fe1a8d23a2fe1..00bad2b4b44b9 100644 --- a/examples/browser/package.json +++ b/examples/browser/package.json @@ -34,6 +34,7 @@ "@theia/mini-browser": "1.40.0", "@theia/monaco": "1.40.0", "@theia/navigator": "1.40.0", + "@theia/notebook": "1.40.0", "@theia/outline-view": "1.40.0", "@theia/output": "1.40.0", "@theia/plugin-dev": "1.40.0", diff --git a/examples/browser/tsconfig.json b/examples/browser/tsconfig.json index d4bcfc14426b9..885bcb416bb9c 100644 --- a/examples/browser/tsconfig.json +++ b/examples/browser/tsconfig.json @@ -65,6 +65,9 @@ { "path": "../../packages/navigator" }, + { + "path": "../../packages/notebook" + }, { "path": "../../packages/outline-view" }, diff --git a/package.json b/package.json index ff123fe48011f..929fb05554183 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,6 @@ "vscode.git-base", "vscode.github", "vscode.github-authentication", - "vscode.ipynb", "vscode.microsoft-authentication", "ms-vscode.references-view" ] diff --git a/packages/core/src/browser/saveable.ts b/packages/core/src/browser/saveable.ts index 02f8c07af11be..a0d0810b447be 100644 --- a/packages/core/src/browser/saveable.ts +++ b/packages/core/src/browser/saveable.ts @@ -16,13 +16,13 @@ import { Widget } from '@phosphor/widgets'; import { Message } from '@phosphor/messaging'; -import { Event } from '../common/event'; +import { Emitter, Event } from '../common/event'; import { MaybePromise } from '../common/types'; import { Key } from './keyboard/keys'; import { AbstractDialog } from './dialogs'; import { waitForClosed } from './widgets'; import { nls } from '../common/nls'; -import { isObject } from '../common'; +import { Disposable, isObject } from '../common'; export interface Saveable { readonly dirty: boolean; @@ -50,6 +50,45 @@ export interface SaveableSource { readonly saveable: Saveable; } +export class SaveableDelegate implements Saveable { + dirty = false; + protected readonly onDirtyChangedEmitter = new Emitter(); + + get onDirtyChanged(): Event { + return this.onDirtyChangedEmitter.event; + } + autoSave: 'off' | 'afterDelay' | 'onFocusChange' | 'onWindowChange' = 'off'; + + async save(options?: SaveOptions): Promise { + await this.delegate?.save(options); + } + + revert?(options?: Saveable.RevertOptions): Promise; + createSnapshot?(): Saveable.Snapshot; + applySnapshot?(snapshot: object): void; + + protected delegate?: Saveable; + protected toDispose?: Disposable; + + set(delegate: Saveable): void { + this.toDispose?.dispose(); + this.delegate = delegate; + this.toDispose = this.delegate.onDirtyChanged(() => { + this.dirty = delegate.dirty; + this.onDirtyChangedEmitter.fire(); + }); + this.autoSave = delegate.autoSave; + if (this.dirty !== delegate.dirty) { + this.dirty = delegate.dirty; + this.onDirtyChangedEmitter.fire(); + } + this.revert = delegate.revert?.bind(delegate); + this.createSnapshot = delegate.createSnapshot?.bind(delegate); + this.applySnapshot = delegate.applySnapshot?.bind(delegate); + } + +} + export namespace Saveable { export interface RevertOptions { /** diff --git a/packages/core/src/common/array-utils.ts b/packages/core/src/common/array-utils.ts index c8781cef5ad3c..0d50e35058db0 100644 --- a/packages/core/src/common/array-utils.ts +++ b/packages/core/src/common/array-utils.ts @@ -106,4 +106,24 @@ export namespace ArrayUtils { export function coalesce(array: ReadonlyArray): T[] { return array.filter(e => !!e); } + + /** + * groups array elements through a comparator function + * @param data array of elements to group + * @param compare comparator function: return of 0 means should group, anything above means not group + * @returns array of arrays with grouped elements + */ + export function groupBy(data: ReadonlyArray, compare: (a: T, b: T) => number): T[][] { + const result: T[][] = []; + let currentGroup: T[] | undefined = undefined; + for (const element of data.slice(0).sort(compare)) { + if (!currentGroup || compare(currentGroup[0], element) !== 0) { + currentGroup = [element]; + result.push(currentGroup); + } else { + currentGroup.push(element); + } + } + return result; + } } diff --git a/packages/core/src/common/event.ts b/packages/core/src/common/event.ts index 80b57dba57a76..d97e79977a256 100644 --- a/packages/core/src/common/event.ts +++ b/packages/core/src/common/event.ts @@ -16,7 +16,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { Disposable, DisposableGroup } from './disposable'; +import { Disposable, DisposableGroup, DisposableCollection } from './disposable'; import { MaybePromise } from './types'; /** @@ -67,6 +67,16 @@ export namespace Event { set maxListeners(maxListeners: number) { } }); } + + /** + * Given a collection of events, returns a single event which emits whenever any of the provided events emit. + */ + export function any(...events: Event[]): Event; + export function any(...events: Event[]): Event; + export function any(...events: Event[]): Event { + return (listener, thisArgs = undefined, disposables?: Disposable[]) => + new DisposableCollection(...events.map(event => event(e => listener.call(thisArgs, e), undefined, disposables))); + } } type Callback = (...args: any[]) => any; @@ -276,7 +286,7 @@ export class Emitter { */ fire(event: T): any { if (this._callbacks) { - this._callbacks.invoke(event); + return this._callbacks.invoke(event); } } diff --git a/packages/core/src/common/types.ts b/packages/core/src/common/types.ts index e5c7bb26462c5..ab819250e9b7e 100644 --- a/packages/core/src/common/types.ts +++ b/packages/core/src/common/types.ts @@ -56,6 +56,23 @@ export function isFunction unknown>(value: unk return typeof value === 'function'; } +/** + * @returns whether the provided parameter is an empty JavaScript Object or not. + */ +export function isEmptyObject(obj: unknown): obj is object { + if (!isObject(obj)) { + return false; + } + + for (const key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + return false; + } + } + + return true; +} + export function isObject(value: unknown): value is UnknownObject { // eslint-disable-next-line no-null/no-null return typeof value === 'object' && value !== null; diff --git a/packages/core/src/common/uri.ts b/packages/core/src/common/uri.ts index fe24bc2e54339..2076519c7d6f6 100644 --- a/packages/core/src/common/uri.ts +++ b/packages/core/src/common/uri.ts @@ -27,6 +27,10 @@ export class URI { return new URI(Uri.file(path)); } + public static isUri(uri: unknown): boolean { + return Uri.isUri(uri); + } + private readonly codeUri: Uri; private _path: Path | undefined; diff --git a/packages/editor/src/browser/editor-frontend-module.ts b/packages/editor/src/browser/editor-frontend-module.ts index fea78996564e9..48c0524489116 100644 --- a/packages/editor/src/browser/editor-frontend-module.ts +++ b/packages/editor/src/browser/editor-frontend-module.ts @@ -38,6 +38,7 @@ import { QuickAccessContribution } from '@theia/core/lib/browser/quick-input/qui import { QuickEditorService } from './quick-editor-service'; import { EditorLanguageStatusService } from './language-status/editor-language-status-service'; import { EditorLineNumberContribution } from './editor-linenumber-contribution'; +import { UndoRedoService } from './undo-redo-service'; export default new ContainerModule(bind => { bindEditorPreferences(bind); @@ -86,4 +87,6 @@ export default new ContainerModule(bind => { bind(ActiveEditorAccess).toSelf().inSingletonScope(); bind(EditorAccess).to(CurrentEditorAccess).inSingletonScope().whenTargetNamed(EditorAccess.CURRENT); bind(EditorAccess).to(ActiveEditorAccess).inSingletonScope().whenTargetNamed(EditorAccess.ACTIVE); + + bind(UndoRedoService).toSelf().inSingletonScope(); }); diff --git a/packages/plugin-ext/src/main/browser/custom-editors/undo-redo-service.ts b/packages/editor/src/browser/undo-redo-service.ts similarity index 95% rename from packages/plugin-ext/src/main/browser/custom-editors/undo-redo-service.ts rename to packages/editor/src/browser/undo-redo-service.ts index 36b628e23953b..a66b02990e0d2 100644 --- a/packages/plugin-ext/src/main/browser/custom-editors/undo-redo-service.ts +++ b/packages/editor/src/browser/undo-redo-service.ts @@ -94,16 +94,16 @@ export class ResourceEditStack { this.past.push(element); } - getClosestPastElement(): StackElement | null { + getClosestPastElement(): StackElement | undefined { if (this.past.length === 0) { - return null; + return undefined; } return this.past[this.past.length - 1]; } - getClosestFutureElement(): StackElement | null { + getClosestFutureElement(): StackElement | undefined { if (this.future.length === 0) { - return null; + return undefined; } return this.future[this.future.length - 1]; } diff --git a/packages/monaco/src/browser/monaco-code-editor.ts b/packages/monaco/src/browser/monaco-code-editor.ts new file mode 100644 index 0000000000000..62a57e8a56fd8 --- /dev/null +++ b/packages/monaco/src/browser/monaco-code-editor.ts @@ -0,0 +1,210 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { EditorServiceOverrides, MonacoEditor, MonacoEditorServices } from './monaco-editor'; + +import { CodeEditorWidget } from '@theia/monaco-editor-core/esm/vs/editor/browser/widget/codeEditorWidget'; +import { IInstantiationService } from '@theia/monaco-editor-core/esm/vs/platform/instantiation/common/instantiation'; +import { StandaloneServices } from '@theia/monaco-editor-core/esm/vs/editor/standalone/browser/standaloneServices'; +import { ServiceCollection } from '@theia/monaco-editor-core/esm/vs/platform/instantiation/common/serviceCollection'; +import { Disposable, DisposableCollection, Emitter, TextDocumentContentChangeDelta, URI } from '@theia/core'; +import { MonacoEditorModel } from './monaco-editor-model'; +import { Dimension, EditorMouseEvent, MouseTarget, Position, TextDocumentChangeEvent } from '@theia/editor/lib/browser'; +import * as monaco from '@theia/monaco-editor-core'; +import { ElementExt } from '@theia/core/shared/@phosphor/domutils'; + +export class MonacoCodeEditor extends MonacoEditorServices implements Disposable { + + protected editor: CodeEditorWidget; + protected readonly toDispose = new DisposableCollection(); + + protected readonly onCursorPositionChangedEmitter = new Emitter(); + protected readonly onSelectionChangedEmitter = new Emitter(); + protected readonly onFocusChangedEmitter = new Emitter(); + protected readonly onDocumentContentChangedEmitter = new Emitter(); + readonly onDocumentContentChanged = this.onDocumentContentChangedEmitter.event; + protected readonly onMouseDownEmitter = new Emitter(); + protected readonly onLanguageChangedEmitter = new Emitter(); + readonly onLanguageChanged = this.onLanguageChangedEmitter.event; + protected readonly onScrollChangedEmitter = new Emitter(); + readonly onEncodingChanged = this.document.onDidChangeEncoding; + protected readonly onResizeEmitter = new Emitter(); + readonly onDidResize = this.onResizeEmitter.event; + + constructor( + readonly uri: URI, + readonly document: MonacoEditorModel, + readonly node: HTMLElement, + services: MonacoEditorServices, + options?: MonacoEditor.IOptions, + override?: EditorServiceOverrides + ) { + super(services); + this.toDispose.pushAll([ + this.onCursorPositionChangedEmitter, + this.onSelectionChangedEmitter, + this.onFocusChangedEmitter, + this.onDocumentContentChangedEmitter, + this.onMouseDownEmitter, + this.onLanguageChangedEmitter, + this.onScrollChangedEmitter + ]); + this.toDispose.push(this.create(options, override)); + this.addHandlers(this.editor); + this.editor.setModel(document.textEditorModel); + } + + getControl(): CodeEditorWidget { + return this.editor; + } + + protected create(options?: MonacoEditor.IOptions, override?: EditorServiceOverrides): Disposable { + const combinedOptions = { + ...options, + lightbulb: { enabled: true }, + fixedOverflowWidgets: true, + automaticLayout: true, + scrollbar: { + useShadows: false, + verticalHasArrows: false, + horizontalHasArrows: false, + verticalScrollbarSize: 10, + horizontalScrollbarSize: 10, + ...options?.scrollbar, + } + }; + const instantiator = this.getInstantiatorWithOverrides(override); + return this.editor = instantiator.createInstance(CodeEditorWidget, this.node, { + ...combinedOptions, + dimension: { + width: 0, + height: 0 + }, + }, { + + }); + } + + protected addHandlers(codeEditor: CodeEditorWidget): void { + this.toDispose.push(codeEditor.onDidChangeModelLanguage(e => + this.fireLanguageChanged(e.newLanguage) + )); + this.toDispose.push(codeEditor.onDidChangeConfiguration(() => this.refresh())); + this.toDispose.push(codeEditor.onDidChangeModel(() => this.refresh())); + this.toDispose.push(codeEditor.onDidChangeModelContent(e => { + this.refresh(); + this.onDocumentContentChangedEmitter.fire({ document: this.document, contentChanges: e.changes.map(this.mapModelContentChange.bind(this)) }); + })); + this.toDispose.push(codeEditor.onMouseDown(e => { + const { element, position, range } = e.target; + this.onMouseDownEmitter.fire({ + target: { + ...(e.target as unknown as MouseTarget), + element: element || undefined, + mouseColumn: this.m2p.asPosition(undefined, e.target.mouseColumn).character, + range: range && this.m2p.asRange(range) || undefined, + position: position && this.m2p.asPosition(position.lineNumber, position.column) || undefined, + detail: undefined + }, + event: e.event.browserEvent + }); + })); + this.toDispose.push(codeEditor.onDidScrollChange(e => { + this.onScrollChangedEmitter.fire(undefined); + })); + } + + setLanguage(languageId: string): void { + monaco.editor.setModelLanguage(this.document.textEditorModel, languageId); + } + + protected fireLanguageChanged(languageId: string): void { + this.onLanguageChangedEmitter.fire(languageId); + } + + protected getInstantiatorWithOverrides(override?: EditorServiceOverrides): IInstantiationService { + const instantiator = StandaloneServices.initialize({}); + if (override) { + const overrideServices = new ServiceCollection(...override); + return instantiator.createChild(overrideServices); + } + return instantiator; + } + + protected mapModelContentChange(change: monaco.editor.IModelContentChange): TextDocumentContentChangeDelta { + return { + range: this.m2p.asRange(change.range), + rangeLength: change.rangeLength, + text: change.text + }; + } + + refresh(): void { + this.autoresize(); + } + + resizeToFit(): void { + this.autoresize(); + // eslint-disable-next-line no-null/no-null + this.onResizeEmitter.fire(null); + } + + setSize(dimension: Dimension): void { + this.resize(dimension); + this.onResizeEmitter.fire(dimension); + } + + protected autoresize(): void { + this.resize(); + } + + protected resize(dimension?: Dimension): void { + if (this.node) { + const layoutSize = this.computeLayoutSize(this.node, dimension); + this.editor.layout(layoutSize); + } + } + + protected computeLayoutSize(hostNode: HTMLElement, dimension: monaco.editor.IDimension | undefined): monaco.editor.IDimension { + if (dimension && dimension.width >= 0 && dimension.height >= 0) { + return dimension; + } + const boxSizing = ElementExt.boxSizing(hostNode); + + const width = (!dimension || dimension.width < 0) ? + this.getWidth(hostNode, boxSizing) : + dimension.width; + + const height = (!dimension || dimension.height < 0) ? + this.getHeight(hostNode, boxSizing) : + dimension.height; + + return { width, height }; + } + + protected getWidth(hostNode: HTMLElement, boxSizing: ElementExt.IBoxSizing): number { + return hostNode.offsetWidth - boxSizing.horizontalSum; + } + + protected getHeight(hostNode: HTMLElement, boxSizing: ElementExt.IBoxSizing): number { + return this.editor.getContentHeight(); + } + + dispose(): void { + this.toDispose.dispose(); + } + +} diff --git a/packages/monaco/src/browser/monaco-editor-provider.ts b/packages/monaco/src/browser/monaco-editor-provider.ts index 20bf5ff613a71..e939ee5f2cc6c 100644 --- a/packages/monaco/src/browser/monaco-editor-provider.ts +++ b/packages/monaco/src/browser/monaco-editor-provider.ts @@ -235,7 +235,7 @@ export class MonacoEditorProvider { protected get preferencePrefixes(): string[] { return ['editor.']; } - protected async createMonacoEditor(uri: URI, override: EditorServiceOverrides, toDispose: DisposableCollection): Promise { + async createMonacoEditor(uri: URI, override: EditorServiceOverrides, toDispose: DisposableCollection): Promise { const model = await this.getModel(uri, toDispose); const options = this.createMonacoEditorOptions(model); const factory = this.factories.getContributions().find(({ scheme }) => uri.scheme === scheme); @@ -403,10 +403,10 @@ export class MonacoEditorProvider { const overrides = override ? Array.from(override) : []; overrides.push([IContextMenuService, { showContextMenu: () => {/** no op! */ } }]); const document = new MonacoEditorModel({ - uri, - readContents: async () => '', - dispose: () => { } - }, this.m2p, this.p2m); + uri, + readContents: async () => '', + dispose: () => { } + }, this.m2p, this.p2m); toDispose.push(document); const model = (await document.load()).textEditorModel; return new MonacoEditor( diff --git a/packages/monaco/src/browser/monaco-languages.ts b/packages/monaco/src/browser/monaco-languages.ts index d533475d804e0..6bfb920e8bf74 100644 --- a/packages/monaco/src/browser/monaco-languages.ts +++ b/packages/monaco/src/browser/monaco-languages.ts @@ -85,6 +85,10 @@ export class MonacoLanguages implements LanguageService { return this.getLanguage(languageId)?.extensions.values().next().value; } + getLanguageIdByLanguageName(languageName: string): string | undefined { + return monaco.languages.getLanguages().find(language => language.aliases?.includes(languageName))?.id; + } + protected mergeLanguages(registered: monaco.languages.ILanguageExtensionPoint[]): Map> { const languages = new Map>(); for (const { id, aliases, extensions, filenames } of registered) { diff --git a/packages/notebook/.eslintrc.js b/packages/notebook/.eslintrc.js new file mode 100644 index 0000000000000..13089943582b6 --- /dev/null +++ b/packages/notebook/.eslintrc.js @@ -0,0 +1,10 @@ +/** @type {import('eslint').Linter.Config} */ +module.exports = { + extends: [ + '../../configs/build.eslintrc.json' + ], + parserOptions: { + tsconfigRootDir: __dirname, + project: 'tsconfig.json' + } +}; diff --git a/packages/notebook/README.md b/packages/notebook/README.md new file mode 100644 index 0000000000000..7dd65bc96ec64 --- /dev/null +++ b/packages/notebook/README.md @@ -0,0 +1,30 @@ +
+ +
+ +theia-ext-logo + +

ECLIPSE THEIA - NOTEBOOK EXTENSION

+ +
+ +
+ +## Description + +The `@theia/notebook` extension contributes functionality for integrated notebooks + +## Additional Information + +- [API documentation for `@theia/notebook`](https://eclipse-theia.github.io/theia/docs/next/modules/notebook.html) +- [Theia - GitHub](https://github.com/eclipse-theia/theia) +- [Theia - Website](https://theia-ide.org/) + +## License + +- [Eclipse Public License 2.0](http://www.eclipse.org/legal/epl-2.0/) +- [一 (Secondary) GNU General Public License, version 2 with the GNU Classpath Exception](https://projects.eclipse.org/license/secondary-gpl-2.0-cp) + +## Trademark +"Theia" is a trademark of the Eclipse Foundation +https://www.eclipse.org/theia diff --git a/packages/notebook/package.json b/packages/notebook/package.json new file mode 100644 index 0000000000000..34cc9629e9bbd --- /dev/null +++ b/packages/notebook/package.json @@ -0,0 +1,51 @@ +{ + "name": "@theia/notebook", + "version": "1.40.0", + "description": "Theia - Notebook Extension", + "dependencies": { + "@theia/core": "1.40.0", + "@theia/editor": "1.40.0", + "@theia/filesystem": "1.40.0", + "@theia/monaco": "1.40.0", + "uuid": "^8.3.2" + }, + "publishConfig": { + "access": "public" + }, + "theiaExtensions": [ + { + "frontend": "lib/browser/notebook-frontend-module" + } + ], + "keywords": [ + "theia-extension" + ], + "license": "EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0", + "repository": { + "type": "git", + "url": "https://github.com/eclipse-theia/theia.git" + }, + "bugs": { + "url": "https://github.com/eclipse-theia/theia/issues" + }, + "homepage": "https://github.com/eclipse-theia/theia", + "files": [ + "lib", + "src" + ], + "scripts": { + "build": "theiaext build", + "clean": "theiaext clean", + "compile": "theiaext compile", + "docs": "theiaext docs", + "lint": "theiaext lint", + "watch": "theiaext watch" + }, + "devDependencies": { + "@theia/ext-scripts": "1.40.0", + "@types/vscode-notebook-renderer": "^1.72.0" + }, + "nyc": { + "extends": "../../configs/nyc.json" + } +} diff --git a/packages/notebook/src/browser/contributions/notebook-actions-contribution.ts b/packages/notebook/src/browser/contributions/notebook-actions-contribution.ts new file mode 100644 index 0000000000000..abd9516f3b346 --- /dev/null +++ b/packages/notebook/src/browser/contributions/notebook-actions-contribution.ts @@ -0,0 +1,171 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { Command, CommandContribution, CommandRegistry, CompoundMenuNodeRole, MenuContribution, MenuModelRegistry, nls } from '@theia/core'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { ApplicationShell, codicon, CommonCommands } from '@theia/core/lib/browser'; +import { NotebookModel } from '../view-model/notebook-model'; +import { NotebookService } from '../service/notebook-service'; +import { CellEditType, CellKind } from '../../common'; +import { KernelPickerMRUStrategy, NotebookKernelQuickPickService } from '../service/notebook-kernel-quick-pick-service'; +import { NotebookExecutionService } from '../service/notebook-execution-service'; +import { NotebookEditorWidget } from '../notebook-editor-widget'; + +export namespace NotebookCommands { + export const ADD_NEW_CELL_COMMAND = Command.toDefaultLocalizedCommand({ + id: 'notebook.add-new-cell', + iconClass: codicon('add') + }); + + export const ADD_NEW_MARKDOWN_CELL_COMMAND = Command.toDefaultLocalizedCommand({ + id: 'notebook.add-new-markdown-cell', + iconClass: codicon('add') + }); + + export const ADD_NEW_CODE_CELL_COMMAND = Command.toDefaultLocalizedCommand({ + id: 'notebook.add-new-code-cell', + iconClass: codicon('add') + }); + + export const SELECT_KERNEL_COMMAND = Command.toDefaultLocalizedCommand({ + id: 'notebook.selectKernel', + category: 'Notebook', + iconClass: codicon('server-environment') + }); + + export const EXECUTE_NOTEBOOK_COMMAND = Command.toDefaultLocalizedCommand({ + id: 'notebook.execute', + category: 'Notebook', + iconClass: codicon('run-all') + }); + + export const CLEAR_ALL_OUTPUTS_COMMAND = Command.toDefaultLocalizedCommand({ + id: 'notebook.clear-all-outputs', + category: 'Notebook', + iconClass: codicon('clear-all') + }); +} + +@injectable() +export class NotebookActionsContribution implements CommandContribution, MenuContribution { + + @inject(NotebookService) + protected notebookService: NotebookService; + + @inject(NotebookKernelQuickPickService) + protected notebookKernelQuickPickService: KernelPickerMRUStrategy; + + @inject(NotebookExecutionService) + protected notebookExecutionService: NotebookExecutionService; + + @inject(ApplicationShell) + protected shell: ApplicationShell; + + registerCommands(commands: CommandRegistry): void { + commands.registerCommand(NotebookCommands.ADD_NEW_CELL_COMMAND, { + execute: (notebookModel: NotebookModel, cellKind: CellKind, index?: number) => { + const insertIndex = index ?? (notebookModel.selectedCell ? notebookModel.cells.indexOf(notebookModel.selectedCell) : 0); + let firstCodeCell; + if (cellKind === CellKind.Code) { + firstCodeCell = notebookModel.cells.find(cell => cell.cellKind === CellKind.Code); + } + + notebookModel.applyEdits([{ + editType: CellEditType.Replace, + index: insertIndex, + count: 0, + cells: [{ + cellKind, + language: firstCodeCell?.language ?? 'markdown', + source: '', + outputs: [], + metadata: {}, + }] + }], true); + } + }); + + commands.registerCommand(NotebookCommands.ADD_NEW_MARKDOWN_CELL_COMMAND, { + execute: (notebookModel: NotebookModel) => commands.executeCommand(NotebookCommands.ADD_NEW_CELL_COMMAND.id, notebookModel, CellKind.Markup) + }); + + commands.registerCommand(NotebookCommands.ADD_NEW_CODE_CELL_COMMAND, { + execute: (notebookModel: NotebookModel) => commands.executeCommand(NotebookCommands.ADD_NEW_CELL_COMMAND.id, notebookModel, CellKind.Code) + }); + + commands.registerCommand(NotebookCommands.SELECT_KERNEL_COMMAND, { + execute: (notebookModel: NotebookModel) => this.notebookKernelQuickPickService.showQuickPick(notebookModel) + }); + + commands.registerCommand(NotebookCommands.EXECUTE_NOTEBOOK_COMMAND, { + execute: (notebookModel: NotebookModel) => this.notebookExecutionService.executeNotebookCells(notebookModel, notebookModel.cells) + }); + + commands.registerCommand(NotebookCommands.CLEAR_ALL_OUTPUTS_COMMAND, { + execute: (notebookModel: NotebookModel) => + notebookModel.cells.forEach(cell => cell.spliceNotebookCellOutputs({ start: 0, deleteCount: cell.outputs.length, newOutputs: [] })) + }); + + commands.registerHandler(CommonCommands.UNDO.id, { + isEnabled: () => this.shell.activeWidget instanceof NotebookEditorWidget, + execute: () => (this.shell.activeWidget as NotebookEditorWidget).undo() + }); + commands.registerHandler(CommonCommands.REDO.id, { + isEnabled: () => this.shell.activeWidget instanceof NotebookEditorWidget, + execute: () => (this.shell.activeWidget as NotebookEditorWidget).redo() + }); + } + + registerMenus(menus: MenuModelRegistry): void { + // independent submenu for plugins to add commands + menus.registerIndependentSubmenu(NotebookMenus.NOTEBOOK_MAIN_TOOLBAR, 'Notebook Main Toolbar'); + // Add Notebook Cell items + menus.registerSubmenu(NotebookMenus.NOTEBOOK_MAIN_TOOLBAR_CELL_ADD_GROUP, 'Add Notebook Cell', { role: CompoundMenuNodeRole.Group }); + menus.registerMenuAction(NotebookMenus.NOTEBOOK_MAIN_TOOLBAR_CELL_ADD_GROUP, { + commandId: NotebookCommands.ADD_NEW_CODE_CELL_COMMAND.id, + label: nls.localizeByDefault('Code'), + icon: codicon('add'), + }); + menus.registerMenuAction(NotebookMenus.NOTEBOOK_MAIN_TOOLBAR_CELL_ADD_GROUP, { + commandId: NotebookCommands.ADD_NEW_MARKDOWN_CELL_COMMAND.id, + label: nls.localizeByDefault('Markdown'), + icon: codicon('add'), + }); + + // Execution related items + menus.registerSubmenu(NotebookMenus.NOTEBOOK_MAIN_TOOLBAR_EXECUTION_GROUP, 'Cell Execution', { role: CompoundMenuNodeRole.Group }); + menus.registerMenuAction(NotebookMenus.NOTEBOOK_MAIN_TOOLBAR_EXECUTION_GROUP, { + commandId: NotebookCommands.EXECUTE_NOTEBOOK_COMMAND.id, + label: nls.localizeByDefault('Run All'), + icon: codicon('run-all'), + order: '10' + }); + menus.registerMenuAction(NotebookMenus.NOTEBOOK_MAIN_TOOLBAR_EXECUTION_GROUP, { + commandId: NotebookCommands.CLEAR_ALL_OUTPUTS_COMMAND.id, + label: nls.localizeByDefault('Clear All Outputs'), + icon: codicon('clear-all'), + order: '30' + }); + // other items + } + +} + +export namespace NotebookMenus { + export const NOTEBOOK_MAIN_TOOLBAR = 'notebook/toolbar'; + export const NOTEBOOK_MAIN_TOOLBAR_CELL_ADD_GROUP = [NOTEBOOK_MAIN_TOOLBAR, 'cell-add-group']; + export const NOTEBOOK_MAIN_TOOLBAR_EXECUTION_GROUP = [NOTEBOOK_MAIN_TOOLBAR, 'cell-execution-group']; +} diff --git a/packages/notebook/src/browser/contributions/notebook-cell-actions-contribution.ts b/packages/notebook/src/browser/contributions/notebook-cell-actions-contribution.ts new file mode 100644 index 0000000000000..d06d0d94c0dfc --- /dev/null +++ b/packages/notebook/src/browser/contributions/notebook-cell-actions-contribution.ts @@ -0,0 +1,204 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { Command, CommandContribution, CommandRegistry, CompoundMenuNodeRole, MenuContribution, MenuModelRegistry, nls } from '@theia/core'; +import { codicon } from '@theia/core/lib/browser'; +import { inject, injectable, postConstruct } from '@theia/core/shared/inversify'; +import { NotebookModel } from '../view-model/notebook-model'; +import { NotebookCellModel } from '../view-model/notebook-cell-model'; +import { NOTEBOOK_CELL_MARKDOWN_EDIT_MODE, NOTEBOOK_CELL_TYPE, NotebookContextKeys, NOTEBOOK_CELL_EXECUTING } from './notebook-context-keys'; +import { ContextKeyService } from '@theia/core/lib/browser/context-key-service'; +import { NotebookExecutionService } from '../service/notebook-execution-service'; +import { NotebookCellOutputModel } from '../view-model/notebook-cell-output-model'; +import { CellEditType } from '../../common'; + +export namespace NotebookCellCommands { + export const EDIT_COMMAND = Command.toDefaultLocalizedCommand({ + id: 'notebook.cell.edit', + iconClass: codicon('edit') + }); + export const STOP_EDIT_COMMAND = Command.toDefaultLocalizedCommand({ + id: 'notebook.cell.stop-edit', + iconClass: codicon('check') + }); + export const DELETE_COMMAND = Command.toDefaultLocalizedCommand({ + id: 'notebook.cell.delete', + iconClass: codicon('trash') + }); + export const SPLIT_CELL_COMMAND = Command.toDefaultLocalizedCommand({ + id: 'notebook.cell.split-cell', + iconClass: codicon('split-vertical'), + }); + export const EXECUTE_SINGLE_CELL_COMMAND = Command.toDefaultLocalizedCommand({ + id: 'notebook.cell.execute-cell', + iconClass: codicon('play'), + }); + export const STOP_CELL_EXECUTION_COMMAND = Command.toDefaultLocalizedCommand({ + id: 'notebook.cell.stop-cell-execution', + iconClass: codicon('stop'), + }); + + export const CLEAR_OUTPUTS_COMMAND = Command.toDefaultLocalizedCommand({ + id: 'notebook.cell.clear-outputs', + label: 'Clear Cell Outputs', + }); + export const CHANGE_OUTPUT_PRESENTATION_COMMAND = Command.toDefaultLocalizedCommand({ + id: 'notebook.cell.change-presentation', + label: 'Change Presentation', + }); +} + +@injectable() +export class NotebookCellActionContribution implements MenuContribution, CommandContribution { + + @inject(ContextKeyService) + protected contextKeyService: ContextKeyService; + + @inject(NotebookExecutionService) + protected notebookExecutionService: NotebookExecutionService; + + @postConstruct() + protected init(): void { + NotebookContextKeys.initNotebookContextKeys(this.contextKeyService); + } + + registerMenus(menus: MenuModelRegistry): void { + menus.registerMenuAction(NotebookCellActionContribution.ACTION_MENU, { + commandId: NotebookCellCommands.EDIT_COMMAND.id, + icon: NotebookCellCommands.EDIT_COMMAND.iconClass, + when: `${NOTEBOOK_CELL_TYPE} == 'markdown' && !${NOTEBOOK_CELL_MARKDOWN_EDIT_MODE}`, + label: nls.localizeByDefault('Edit Cell'), + order: '10' + }); + menus.registerMenuAction(NotebookCellActionContribution.ACTION_MENU, { + commandId: NotebookCellCommands.STOP_EDIT_COMMAND.id, + icon: NotebookCellCommands.STOP_EDIT_COMMAND.iconClass, + when: `${NOTEBOOK_CELL_TYPE} == 'markdown' && ${NOTEBOOK_CELL_MARKDOWN_EDIT_MODE}`, + label: nls.localizeByDefault('Stop Editing Cell'), + order: '10' + }); + menus.registerMenuAction(NotebookCellActionContribution.ACTION_MENU, { + commandId: NotebookCellCommands.EXECUTE_SINGLE_CELL_COMMAND.id, + icon: NotebookCellCommands.EXECUTE_SINGLE_CELL_COMMAND.iconClass, + when: `${NOTEBOOK_CELL_TYPE} == 'code'`, + label: nls.localizeByDefault('Execute Cell'), + order: '10' + }); + + menus.registerMenuAction(NotebookCellActionContribution.ACTION_MENU, { + commandId: NotebookCellCommands.SPLIT_CELL_COMMAND.id, + icon: NotebookCellCommands.SPLIT_CELL_COMMAND.iconClass, + label: nls.localizeByDefault('Split Cell'), + order: '20' + }); + menus.registerMenuAction(NotebookCellActionContribution.ACTION_MENU, { + commandId: NotebookCellCommands.DELETE_COMMAND.id, + icon: NotebookCellCommands.DELETE_COMMAND.iconClass, + label: nls.localizeByDefault('Delete Cell'), + order: '999' + }); + + menus.registerSubmenu( + NotebookCellActionContribution.ADDITIONAL_ACTION_MENU, + nls.localizeByDefault('More'), + { + icon: codicon('ellipsis'), + role: CompoundMenuNodeRole.Submenu, + order: '30' + } + ); + + menus.registerIndependentSubmenu(NotebookCellActionContribution.CONTRIBUTED_CELL_ACTION_MENU, '', { role: CompoundMenuNodeRole.Flat }); + // since contributions are adding to an independent submenu we have to manually add it to the more submenu + menus.getMenu(NotebookCellActionContribution.ADDITIONAL_ACTION_MENU).addNode(menus.getMenuNode(NotebookCellActionContribution.CONTRIBUTED_CELL_ACTION_MENU)); + + // code cell sidebar menu + menus.registerMenuAction(NotebookCellActionContribution.CODE_CELL_SIDEBAR_MENU, { + commandId: NotebookCellCommands.EXECUTE_SINGLE_CELL_COMMAND.id, + icon: NotebookCellCommands.EXECUTE_SINGLE_CELL_COMMAND.iconClass, + label: nls.localizeByDefault('Execute Cell'), + when: `!${NOTEBOOK_CELL_EXECUTING}` + }); + menus.registerMenuAction(NotebookCellActionContribution.CODE_CELL_SIDEBAR_MENU, { + commandId: NotebookCellCommands.STOP_CELL_EXECUTION_COMMAND.id, + icon: NotebookCellCommands.STOP_CELL_EXECUTION_COMMAND.iconClass, + label: nls.localizeByDefault('Stop Cell Execution'), + when: NOTEBOOK_CELL_EXECUTING + }); + + // Notebook Cell extra execution options + menus.registerIndependentSubmenu(NotebookCellActionContribution.CONTRIBUTED_CELL_EXECUTION_MENU, + nls.localizeByDefault('More...'), + { role: CompoundMenuNodeRole.Flat, icon: codicon('chevron-down') }); + menus.getMenu(NotebookCellActionContribution.CODE_CELL_SIDEBAR_MENU).addNode(menus.getMenuNode(NotebookCellActionContribution.CONTRIBUTED_CELL_EXECUTION_MENU)); + + // code cell output sidebar menu + menus.registerSubmenu( + NotebookCellActionContribution.ADDITIONAL_OUTPUT_SIDEBAR_MENU, + nls.localizeByDefault('More'), + { + icon: codicon('ellipsis'), + role: CompoundMenuNodeRole.Submenu + }); + menus.registerMenuAction(NotebookCellActionContribution.ADDITIONAL_OUTPUT_SIDEBAR_MENU, { + commandId: NotebookCellCommands.CLEAR_OUTPUTS_COMMAND.id, + label: nls.localizeByDefault('Clear Cell Outputs'), + }); + menus.registerMenuAction(NotebookCellActionContribution.ADDITIONAL_OUTPUT_SIDEBAR_MENU, { + commandId: NotebookCellCommands.CHANGE_OUTPUT_PRESENTATION_COMMAND.id, + label: nls.localizeByDefault('Change Presentation'), + }); + + } + + registerCommands(commands: CommandRegistry): void { + commands.registerCommand(NotebookCellCommands.EDIT_COMMAND, { execute: (_, cell: NotebookCellModel) => cell.requestEdit() }); + commands.registerCommand(NotebookCellCommands.STOP_EDIT_COMMAND, { execute: (_, cell: NotebookCellModel) => cell.requestStopEdit() }); + commands.registerCommand(NotebookCellCommands.DELETE_COMMAND, { + execute: (notebookModel: NotebookModel, cell: NotebookCellModel) => notebookModel.applyEdits([{ + editType: CellEditType.Replace, + index: notebookModel.cells.indexOf(cell), + count: 1, + cells: [] + }], true) + }); + commands.registerCommand(NotebookCellCommands.SPLIT_CELL_COMMAND); + + commands.registerCommand(NotebookCellCommands.EXECUTE_SINGLE_CELL_COMMAND, { + execute: (notebookModel: NotebookModel, cell: NotebookCellModel) => this.notebookExecutionService.executeNotebookCells(notebookModel, [cell]) + }); + commands.registerCommand(NotebookCellCommands.STOP_CELL_EXECUTION_COMMAND, { + execute: (notebookModel: NotebookModel, cell: NotebookCellModel) => this.notebookExecutionService.cancelNotebookCells(notebookModel, [cell]) + }); + commands.registerCommand(NotebookCellCommands.CLEAR_OUTPUTS_COMMAND, { + execute: (notebookModel: NotebookModel, cell: NotebookCellModel) => cell.spliceNotebookCellOutputs({ start: 0, deleteCount: cell.outputs.length, newOutputs: [] }) + }); + commands.registerCommand(NotebookCellCommands.CHANGE_OUTPUT_PRESENTATION_COMMAND, { + execute: (_, __, output: NotebookCellOutputModel) => output.requestOutputPresentationUpdate() + }); + } +} + +export namespace NotebookCellActionContribution { + export const ACTION_MENU = ['notebook-cell-actions-menu']; + export const ADDITIONAL_ACTION_MENU = [...ACTION_MENU, 'more']; + export const CONTRIBUTED_CELL_ACTION_MENU = 'notebook/cell/title'; + export const CONTRIBUTED_CELL_EXECUTION_MENU = 'notebook/cell/execute'; + export const CODE_CELL_SIDEBAR_MENU = ['code-cell-sidebar-menu']; + export const OUTPUT_SIDEBAR_MENU = ['code-cell-output-sidebar-menu']; + export const ADDITIONAL_OUTPUT_SIDEBAR_MENU = [...OUTPUT_SIDEBAR_MENU, 'more']; + +} diff --git a/packages/notebook/src/browser/contributions/notebook-color-contribution.ts b/packages/notebook/src/browser/contributions/notebook-color-contribution.ts new file mode 100644 index 0000000000000..0e7ca598fa36b --- /dev/null +++ b/packages/notebook/src/browser/contributions/notebook-color-contribution.ts @@ -0,0 +1,268 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { ColorContribution } from '@theia/core/lib/browser/color-application-contribution'; +import { ColorRegistry } from '@theia/core/lib/browser/color-registry'; +import { Color } from '@theia/core/lib/common/color'; +import { injectable } from '@theia/core/shared/inversify'; + +@injectable() +export class NotebookColorContribution implements ColorContribution { + registerColors(colors: ColorRegistry): void { + colors.register( + { + id: 'notebook.cellBorderColor', + defaults: { + dark: Color.transparent('list.inactiveSelectionBackground', 1), + light: Color.transparent('list.inactiveSelectionBackground', 1), + hcDark: 'panel.border', + hcLight: 'panel.border' + }, + description: 'The border color for notebook cells.' + }, + { + id: 'notebook.focusedEditorBorder', + defaults: { + dark: 'focusBorder', + light: 'focusBorder', + hcDark: 'focusBorder', + hcLight: 'focusBorder' + }, + description: 'The color of the notebook cell editor border.' + }, + { + id: 'notebookStatusSuccessIcon.foreground', + defaults: { + dark: 'debugIcon.startForeground', + light: 'debugIcon.startForeground', + hcDark: 'debugIcon.startForeground', + hcLight: 'debugIcon.startForeground' + }, + description: 'The error icon color of notebook cells in the cell status bar.' + }, + { + id: 'notebookEditorOverviewRuler.runningCellForeground', + defaults: { + dark: 'debugIcon.startForeground', + light: 'debugIcon.startForeground', + hcDark: 'debugIcon.startForeground', + hcLight: 'debugIcon.startForeground' + }, + description: 'The color of the running cell decoration in the notebook editor overview ruler.' + }, + { + id: 'notebookStatusErrorIcon.foreground', + defaults: { + dark: 'errorForeground', + light: 'errorForeground', + hcDark: 'errorForeground', + hcLight: 'errorForeground' + }, + description: 'The error icon color of notebook cells in the cell status bar.' + }, + { + id: 'notebookStatusRunningIcon.foreground', + defaults: { + dark: 'foreground', + light: 'foreground', + hcDark: 'foreground', + hcLight: 'foreground' + }, + description: 'The running icon color of notebook cells in the cell status bar.' + }, + { + id: 'notebook.outputContainerBorderColor', + defaults: { + dark: undefined, + light: undefined, + hcDark: undefined, + hcLight: undefined + }, + description: 'The border color of the notebook output container.' + }, + { + id: 'notebook.outputContainerBackgroundColor', + defaults: { + dark: undefined, + light: undefined, + hcDark: undefined, + hcLight: undefined + }, + description: 'The color of the notebook output container background.' + }, + { + id: 'notebook.cellToolbarSeparator', + defaults: { + dark: Color.rgba(128, 128, 128, 0.35), + light: Color.rgba(128, 128, 128, 0.35), + hcDark: 'contrastBorder', + hcLight: 'contrastBorder' + }, + description: 'The color of the separator in the cell bottom toolbar' + }, + { + id: 'notebook.focusedCellBackground', + defaults: { + dark: undefined, + light: undefined, + hcDark: undefined, + hcLight: undefined + }, + description: 'The background color of a cell when the cell is focused.' + }, + { + id: 'notebook.selectedCellBackground', + defaults: { + dark: 'list.inactiveSelectionBackground', + light: 'list.inactiveSelectionBackground', + hcDark: undefined, + hcLight: undefined + }, + description: 'The background color of a cell when the cell is selected.' + }, + { + id: 'notebook.cellHoverBackground', + defaults: { + dark: Color.transparent('notebook.focusedCellBackground', 0.5), + light: Color.transparent('notebook.focusedCellBackground', 0.7), + hcDark: undefined, + hcLight: undefined + }, + description: 'The background color of a cell when the cell is hovered.' + }, + { + id: 'notebook.selectedCellBorder', + defaults: { + dark: 'notebook.cellBorderColor', + light: 'notebook.cellBorderColor', + hcDark: 'contrastBorder', + hcLight: 'contrastBorder' + }, + description: "The color of the cell's top and bottom border when the cell is selected but not focused." + }, + { + id: 'notebook.inactiveSelectedCellBorder', + defaults: { + dark: undefined, + light: undefined, + hcDark: 'focusBorder', + hcLight: 'focusBorder' + }, + description: "The color of the cell's borders when multiple cells are selected." + }, + { + id: 'notebook.focusedCellBorder', + defaults: { + dark: 'focusBorder', + light: 'focusBorder', + hcDark: 'focusBorder', + hcLight: 'focusBorder' + }, + description: "The color of the cell's focus indicator borders when the cell is focused." + }, + { + id: 'notebook.inactiveFocusedCellBorder', + defaults: { + dark: 'notebook.cellBorderColor', + light: 'notebook.cellBorderColor', + hcDark: 'notebook.cellBorderColor', + hcLight: 'notebook.cellBorderColor' + }, + description: "The color of the cell's top and bottom border when a cell is focused while the primary focus is outside of the editor." + }, + { + id: 'notebook.cellStatusBarItemHoverBackground', + defaults: { + dark: Color.rgba(0, 0, 0, 0.08), + light: Color.rgba(255, 255, 255, 0.15), + hcDark: Color.rgba(0, 0, 0, 0.08), + hcLight: Color.rgba(255, 255, 255, 0.15) + }, + description: 'The background color of notebook cell status bar items.' + }, + { + id: 'notebook.cellInsertionIndicator', + defaults: { + dark: 'focusBorder', + light: 'focusBorder', + hcDark: 'focusBorder', + hcLight: undefined + }, + description: 'Notebook background color.' + }, + { + id: 'notebookScrollbarSlider.background', + defaults: { + dark: 'scrollbarSlider.background', + light: 'scrollbarSlider.background', + hcDark: 'scrollbarSlider.background', + hcLight: 'scrollbarSlider.background' + }, + description: 'Notebook scrollbar slider background color.' + }, + { + id: 'notebookScrollbarSlider.hoverBackground', + defaults: { + dark: 'scrollbarSlider.hoverBackground', + light: 'scrollbarSlider.hoverBackground', + hcDark: 'scrollbarSlider.hoverBackground', + hcLight: 'scrollbarSlider.hoverBackground' + }, + description: 'Notebook scrollbar slider background color when hovering.' + }, + { + id: 'notebookScrollbarSlider.activeBackground', + defaults: { + dark: 'scrollbarSlider.activeBackground', + light: 'scrollbarSlider.activeBackground', + hcDark: 'scrollbarSlider.activeBackground', + hcLight: 'scrollbarSlider.activeBackground' + }, + description: 'Notebook scrollbar slider background color when clicked on.' + }, + { + id: 'notebook.symbolHighlightBackground', + defaults: { + dark: Color.rgba(255, 255, 255, 0.04), + light: Color.rgba(253, 255, 0, 0.2), + hcDark: undefined, + hcLight: undefined + }, + description: 'Background color of highlighted cell' + }, + { + id: 'notebook.cellEditorBackground', + defaults: { + dark: 'sideBar.background', + light: 'sideBar.background', + hcDark: undefined, + hcLight: undefined + }, + description: 'Cell editor background color.' + }, + { + id: 'notebook.editorBackground', + defaults: { + dark: 'editorPane.background', + light: 'editorPane.background', + hcDark: undefined, + hcLight: undefined + }, + description: 'Notebook background color.' + } + ); + } +} diff --git a/packages/notebook/src/browser/contributions/notebook-context-keys.ts b/packages/notebook/src/browser/contributions/notebook-context-keys.ts new file mode 100644 index 0000000000000..aff494546161f --- /dev/null +++ b/packages/notebook/src/browser/contributions/notebook-context-keys.ts @@ -0,0 +1,99 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { ContextKeyService } from '@theia/core/lib/browser/context-key-service'; + +export type NotebookCellExecutionStateContext = 'idle' | 'pending' | 'executing' | 'succeeded' | 'failed'; + +export const HAS_OPENED_NOTEBOOK = 'userHasOpenedNotebook'; +export const KEYBINDING_CONTEXT_NOTEBOOK_FIND_WIDGET_FOCUSED = 'notebookFindWidgetFocused'; +export const NOTEBOOK_EDITOR_FOCUSED = 'notebookEditorFocused'; +export const NOTEBOOK_CELL_LIST_FOCUSED = 'notebookCellListFocused'; +export const NOTEBOOK_OUTPUT_FOCUSED = 'notebookOutputFocused'; +export const NOTEBOOK_EDITOR_EDITABLE = 'notebookEditable'; +export const NOTEBOOK_HAS_RUNNING_CELL = 'notebookHasRunningCell'; +export const NOTEBOOK_USE_CONSOLIDATED_OUTPUT_BUTTON = 'notebookUseConsolidatedOutputButton'; +export const NOTEBOOK_BREAKPOINT_MARGIN_ACTIVE = 'notebookBreakpointMargin'; +export const NOTEBOOK_CELL_TOOLBAR_LOCATION = 'notebookCellToolbarLocation'; +export const NOTEBOOK_CURSOR_NAVIGATION_MODE = 'notebookCursorNavigationMode'; +export const NOTEBOOK_LAST_CELL_FAILED = 'notebookLastCellFailed'; +export const NOTEBOOK_VIEW_TYPE = 'notebookType'; +export const NOTEBOOK_CELL_TYPE = 'notebookCellType'; +export const NOTEBOOK_CELL_EDITABLE = 'notebookCellEditable'; +export const NOTEBOOK_CELL_FOCUSED = 'notebookCellFocused'; +export const NOTEBOOK_CELL_EDITOR_FOCUSED = 'notebookCellEditorFocused'; +export const NOTEBOOK_CELL_MARKDOWN_EDIT_MODE = 'notebookCellMarkdownEditMode'; +export const NOTEBOOK_CELL_LINE_NUMBERS = 'notebookCellLineNumbers'; +export const NOTEBOOK_CELL_EXECUTION_STATE = 'notebookCellExecutionState'; +export const NOTEBOOK_CELL_EXECUTING = 'notebookCellExecuting'; +export const NOTEBOOK_CELL_HAS_OUTPUTS = 'notebookCellHasOutputs'; +export const NOTEBOOK_CELL_INPUT_COLLAPSED = 'notebookCellInputIsCollapsed'; +export const NOTEBOOK_CELL_OUTPUT_COLLAPSED = 'notebookCellOutputIsCollapsed'; +export const NOTEBOOK_CELL_RESOURCE = 'notebookCellResource'; +export const NOTEBOOK_KERNEL = 'notebookKernel'; +export const NOTEBOOK_KERNEL_COUNT = 'notebookKernelCount'; +export const NOTEBOOK_KERNEL_SOURCE_COUNT = 'notebookKernelSourceCount'; +export const NOTEBOOK_KERNEL_SELECTED = 'notebookKernelSelected'; +export const NOTEBOOK_INTERRUPTIBLE_KERNEL = 'notebookInterruptibleKernel'; +export const NOTEBOOK_MISSING_KERNEL_EXTENSION = 'notebookMissingKernelExtension'; +export const NOTEBOOK_HAS_OUTPUTS = 'notebookHasOutputs'; + +export namespace NotebookContextKeys { + export function initNotebookContextKeys(service: ContextKeyService): void { + service.createKey(HAS_OPENED_NOTEBOOK, false); + service.createKey(KEYBINDING_CONTEXT_NOTEBOOK_FIND_WIDGET_FOCUSED, false); + + // // Is Notebook + // export const NOTEBOOK_IS_ACTIVE_EDITOR = ContextKeyExpr.equals('activeEditor', NOTEBOOK_EDITOR_ID); + // export const INTERACTIVE_WINDOW_IS_ACTIVE_EDITOR = ContextKeyExpr.equals('activeEditor', INTERACTIVE_WINDOW_EDITOR_ID); + + // Editor keys + service.createKey(NOTEBOOK_EDITOR_FOCUSED, false); + service.createKey(NOTEBOOK_CELL_LIST_FOCUSED, false); + service.createKey(NOTEBOOK_OUTPUT_FOCUSED, false); + service.createKey(NOTEBOOK_EDITOR_EDITABLE, true); + service.createKey(NOTEBOOK_HAS_RUNNING_CELL, false); + service.createKey(NOTEBOOK_USE_CONSOLIDATED_OUTPUT_BUTTON, false); + service.createKey(NOTEBOOK_BREAKPOINT_MARGIN_ACTIVE, false); + service.createKey(NOTEBOOK_CELL_TOOLBAR_LOCATION, 'left'); + service.createKey(NOTEBOOK_CURSOR_NAVIGATION_MODE, false); + service.createKey(NOTEBOOK_LAST_CELL_FAILED, false); + + // Cell keys + service.createKey(NOTEBOOK_VIEW_TYPE, undefined); + service.createKey(NOTEBOOK_CELL_TYPE, undefined); + service.createKey(NOTEBOOK_CELL_EDITABLE, false); + service.createKey(NOTEBOOK_CELL_FOCUSED, false); + service.createKey(NOTEBOOK_CELL_EDITOR_FOCUSED, false); + service.createKey(NOTEBOOK_CELL_MARKDOWN_EDIT_MODE, false); + service.createKey(NOTEBOOK_CELL_LINE_NUMBERS, 'inherit'); + service.createKey(NOTEBOOK_CELL_EXECUTION_STATE, undefined); + service.createKey(NOTEBOOK_CELL_EXECUTING, false); + service.createKey(NOTEBOOK_CELL_HAS_OUTPUTS, false); + service.createKey(NOTEBOOK_CELL_INPUT_COLLAPSED, false); + service.createKey(NOTEBOOK_CELL_OUTPUT_COLLAPSED, false); + service.createKey(NOTEBOOK_CELL_RESOURCE, ''); + + // Kernels + service.createKey(NOTEBOOK_KERNEL, undefined); + service.createKey(NOTEBOOK_KERNEL_COUNT, 0); + service.createKey(NOTEBOOK_KERNEL_SOURCE_COUNT, 0); + service.createKey(NOTEBOOK_KERNEL_SELECTED, false); + service.createKey(NOTEBOOK_INTERRUPTIBLE_KERNEL, false); + service.createKey(NOTEBOOK_MISSING_KERNEL_EXTENSION, false); + service.createKey(NOTEBOOK_HAS_OUTPUTS, false); + } +} diff --git a/packages/notebook/src/browser/index.ts b/packages/notebook/src/browser/index.ts new file mode 100644 index 0000000000000..74299913c414f --- /dev/null +++ b/packages/notebook/src/browser/index.ts @@ -0,0 +1,26 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +export * from './notebook-type-registry'; +export * from './notebook-renderer-registry'; +export * from './notebook-editor-widget'; +export * from './service/notebook-service'; +export * from './service/notebook-editor-service'; +export * from './service/notebook-kernel-service'; +export * from './service/notebook-execution-state-service'; +export * from './service/notebook-model-resolver-service'; +export * from './service/notebook-renderer-messaging-service'; +export * from './renderers/cell-output-webview'; diff --git a/packages/notebook/src/browser/notebook-cell-resource-resolver.ts b/packages/notebook/src/browser/notebook-cell-resource-resolver.ts new file mode 100644 index 0000000000000..c09d85f3a30b2 --- /dev/null +++ b/packages/notebook/src/browser/notebook-cell-resource-resolver.ts @@ -0,0 +1,79 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { Emitter, Resource, ResourceReadOptions, ResourceResolver, ResourceVersion, URI } from '@theia/core'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { CellUri } from '../common'; +import { NotebookService } from './service/notebook-service'; +import { NotebookCellModel } from './view-model/notebook-cell-model'; + +export class NotebookCellResource implements Resource { + + protected readonly didChangeContentsEmitter = new Emitter(); + readonly onDidChangeContents = this.didChangeContentsEmitter.event; + + version?: ResourceVersion | undefined; + encoding?: string | undefined; + isReadonly?: boolean | undefined; + + private cell: NotebookCellModel; + + constructor(public uri: URI, cell: NotebookCellModel) { + this.cell = cell; + } + + readContents(options?: ResourceReadOptions | undefined): Promise { + return Promise.resolve(this.cell.source); + } + + dispose(): void { + this.didChangeContentsEmitter.dispose(); + } + +} + +@injectable() +export class NotebookCellResourceResolver implements ResourceResolver { + + @inject(NotebookService) + protected readonly notebookService: NotebookService; + + async resolve(uri: URI): Promise { + if (uri.scheme !== CellUri.scheme) { + throw new Error(`Cannot resolve cell uri with scheme '${uri.scheme}'`); + } + + const parsedUri = CellUri.parse(uri); + if (!parsedUri) { + throw new Error(`Cannot parse uri '${uri.toString()}'`); + } + + const notebookModel = this.notebookService.getNotebookEditorModel(parsedUri.notebook); + + if (!notebookModel) { + throw new Error(`No notebook found for uri '${parsedUri.notebook}'`); + } + + const notebookCellModel = notebookModel.cells.find(cell => cell.handle === parsedUri.handle); + + if (!notebookCellModel) { + throw new Error(`No cell found with handle '${parsedUri.handle}' in '${parsedUri.notebook}'`); + } + + return new NotebookCellResource(uri, notebookCellModel); + } + +} diff --git a/packages/notebook/src/browser/notebook-editor-widget-factory.ts b/packages/notebook/src/browser/notebook-editor-widget-factory.ts new file mode 100644 index 0000000000000..d17832b56fd8a --- /dev/null +++ b/packages/notebook/src/browser/notebook-editor-widget-factory.ts @@ -0,0 +1,70 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { URI } from '@theia/core'; +import { WidgetFactory, NavigatableWidgetOptions, LabelProvider } from '@theia/core/lib/browser'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { NotebookEditorWidget, NotebookEditorContainerFactory, NotebookEditorProps } from './notebook-editor-widget'; +import { NotebookService } from './service/notebook-service'; +import { NotebookModelResolverService } from './service/notebook-model-resolver-service'; + +export interface NotebookEditorWidgetOptions extends NavigatableWidgetOptions { + notebookType: string; +} + +@injectable() +export class NotebookEditorWidgetFactory implements WidgetFactory { + readonly id: string = NotebookEditorWidget.ID; + + @inject(NotebookService) + protected readonly notebookService: NotebookService; + + @inject(NotebookModelResolverService) + protected readonly notebookModelResolver: NotebookModelResolverService; + + @inject(LabelProvider) + protected readonly labelProvider: LabelProvider; + + @inject(NotebookEditorContainerFactory) + protected readonly createNotebookEditorWidget: (props: NotebookEditorProps) => NotebookEditorWidget; + + async createWidget(options?: NotebookEditorWidgetOptions): Promise { + if (!options) { + throw new Error('no options found for widget. Need at least uri and notebookType'); + } + const uri = new URI(options.uri); + + await this.notebookService.willOpenNotebook(options.notebookType); + + const editor = await this.createEditor(uri, options.notebookType); + + const icon = this.labelProvider.getIcon(uri); + editor.title.label = this.labelProvider.getName(uri); + editor.title.iconClass = icon + ' file-icon'; + + return editor; + } + + private async createEditor(uri: URI, notebookType: string): Promise { + + return this.createNotebookEditorWidget({ + uri, + notebookType, + notebookData: this.notebookModelResolver.resolve(uri, notebookType), + }); + } + +} diff --git a/packages/notebook/src/browser/notebook-editor-widget.tsx b/packages/notebook/src/browser/notebook-editor-widget.tsx new file mode 100644 index 0000000000000..7d600ce5afa08 --- /dev/null +++ b/packages/notebook/src/browser/notebook-editor-widget.tsx @@ -0,0 +1,157 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import * as React from '@theia/core/shared/react'; +import { CommandRegistry, MenuModelRegistry, URI } from '@theia/core'; +import { ReactWidget, Navigatable, SaveableSource, Message, SaveableDelegate } from '@theia/core/lib/browser'; +import { ReactNode } from '@theia/core/shared/react'; +import { CellKind } from '../common'; +import { CellRenderer as CellRenderer, NotebookCellListView } from './view/notebook-cell-list-view'; +import { NotebookCodeCellRenderer } from './view/notebook-code-cell-view'; +import { NotebookMarkdownCellRenderer } from './view/notebook-markdown-cell-view'; +import { NotebookModel } from './view-model/notebook-model'; +import { NotebookCellToolbarFactory } from './view/notebook-cell-toolbar-factory'; +import { inject, injectable, interfaces } from '@theia/core/shared/inversify'; +import { Emitter } from '@theia/core/shared/vscode-languageserver-protocol'; +import { NotebookEditorWidgetService } from './service/notebook-editor-service'; +import { NotebookMainToolbarRenderer } from './view/notebook-main-toolbar'; + +export const NotebookEditorContainerFactory = Symbol('NotebookModelFactory'); + +export function createNotebookEditorWidgetContainer(parent: interfaces.Container, props: NotebookEditorProps): interfaces.Container { + const child = parent.createChild(); + + child.bind(NotebookEditorProps).toConstantValue(props); + child.bind(NotebookEditorWidget).toSelf(); + + return child; +} + +const NotebookEditorProps = Symbol('NotebookEditorProps'); + +export interface NotebookEditorProps { + uri: URI, + readonly notebookType: string, + notebookData: Promise +} +export const NOTEBOOK_EDITOR_ID_PREFIX = 'notebook:'; + +@injectable() +export class NotebookEditorWidget extends ReactWidget implements Navigatable, SaveableSource { + static readonly ID = 'notebook'; + + readonly saveable = new SaveableDelegate(); + + @inject(NotebookCellToolbarFactory) + protected readonly cellToolbarFactory: NotebookCellToolbarFactory; + + @inject(CommandRegistry) + protected commandRegistry: CommandRegistry; + + @inject(MenuModelRegistry) + protected menuRegistry: MenuModelRegistry; + + @inject(NotebookEditorWidgetService) + protected notebookEditorService: NotebookEditorWidgetService; + + @inject(NotebookMainToolbarRenderer) + protected notebookMainToolbarRenderer: NotebookMainToolbarRenderer; + + protected readonly onDidChangeModelEmitter = new Emitter(); + readonly onDidChangeModel = this.onDidChangeModelEmitter.event; + + protected readonly renderers = new Map(); + protected _model?: NotebookModel; + + get notebookType(): string { + return this.props.notebookType; + } + + get model(): NotebookModel | undefined { + return this._model; + } + + constructor( + @inject(NotebookCodeCellRenderer) codeCellRenderer: NotebookCodeCellRenderer, + @inject(NotebookMarkdownCellRenderer) markdownCellRenderer: NotebookMarkdownCellRenderer, + @inject(NotebookEditorProps) private readonly props: NotebookEditorProps) { + super(); + this.id = NOTEBOOK_EDITOR_ID_PREFIX + this.props.uri.toString(); + this.node.tabIndex = -1; + + this.title.closable = true; + this.update(); + + this.toDispose.push(this.onDidChangeModelEmitter); + + this.renderers.set(CellKind.Markup, markdownCellRenderer); + this.renderers.set(CellKind.Code, codeCellRenderer); + this.waitForData(); + } + + protected async waitForData(): Promise { + this._model = await this.props.notebookData; + this.saveable.set(this._model); + this.toDispose.push(this._model); + // Ensure that the model is loaded before adding the editor + this.notebookEditorService.addNotebookEditor(this); + this.update(); + } + + protected override onActivateRequest(msg: Message): void { + super.onActivateRequest(msg); + this.node.focus(); + } + + getResourceUri(): URI | undefined { + return this.props.uri; + } + + createMoveToUri(resourceUri: URI): URI | undefined { + return this.props.uri; + } + + undo(): void { + this.model?.undo(); + } + + redo(): void { + this.model?.redo(); + } + + protected render(): ReactNode { + if (this._model) { + return
+ {this.notebookMainToolbarRenderer.render(this._model)} + +
; + } else { + return
; + } + } + + protected override onAfterAttach(msg: Message): void { + super.onAfterAttach(msg); + } + + protected override onAfterDetach(msg: Message): void { + super.onAfterDetach(msg); + this.notebookEditorService.removeNotebookEditor(this); + } +} diff --git a/packages/notebook/src/browser/notebook-frontend-module.ts b/packages/notebook/src/browser/notebook-frontend-module.ts new file mode 100644 index 0000000000000..7746ad0f10ec8 --- /dev/null +++ b/packages/notebook/src/browser/notebook-frontend-module.ts @@ -0,0 +1,95 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** +import '../../src/browser/style/index.css'; + +import { ContainerModule } from '@theia/core/shared/inversify'; +import { OpenHandler, WidgetFactory } from '@theia/core/lib/browser'; +import { ColorContribution } from '@theia/core/lib/browser/color-application-contribution'; +import { NotebookOpenHandler } from './notebook-open-handler'; +import { CommandContribution, MenuContribution, ResourceResolver, } from '@theia/core'; +import { NotebookTypeRegistry } from './notebook-type-registry'; +import { NotebookRendererRegistry } from './notebook-renderer-registry'; +import { NotebookService } from './service/notebook-service'; +import { NotebookEditorWidgetFactory } from './notebook-editor-widget-factory'; +import { NotebookCellResourceResolver } from './notebook-cell-resource-resolver'; +import { NotebookModelResolverService } from './service/notebook-model-resolver-service'; +import { NotebookCellActionContribution } from './contributions/notebook-cell-actions-contribution'; +import { NotebookCellToolbarFactory } from './view/notebook-cell-toolbar-factory'; +import { createNotebookModelContainer, NotebookModel, NotebookModelFactory, NotebookModelProps } from './view-model/notebook-model'; +import { createNotebookCellModelContainer, NotebookCellModel, NotebookCellModelFactory, NotebookCellModelProps } from './view-model/notebook-cell-model'; +import { createNotebookEditorWidgetContainer, NotebookEditorContainerFactory, NotebookEditorProps, NotebookEditorWidget } from './notebook-editor-widget'; +import { NotebookCodeCellRenderer } from './view/notebook-code-cell-view'; +import { NotebookMarkdownCellRenderer } from './view/notebook-markdown-cell-view'; +import { NotebookActionsContribution } from './contributions/notebook-actions-contribution'; +import { NotebookExecutionService } from './service/notebook-execution-service'; +import { NotebookExecutionStateService } from './service/notebook-execution-state-service'; +import { NotebookKernelService } from './service/notebook-kernel-service'; +import { KernelPickerMRUStrategy, NotebookKernelQuickPickService } from './service/notebook-kernel-quick-pick-service'; +import { NotebookKernelHistoryService } from './service/notebook-kernel-history-service'; +import { NotebookEditorWidgetService } from './service/notebook-editor-service'; +import { NotebookRendererMessagingService } from './service/notebook-renderer-messaging-service'; +import { NotebookColorContribution } from './contributions/notebook-color-contribution'; +import { NotebookCellContextManager } from './service/notebook-cell-context-manager'; +import { NotebookMainToolbarRenderer } from './view/notebook-main-toolbar'; + +export default new ContainerModule(bind => { + bind(NotebookColorContribution).toSelf().inSingletonScope(); + bind(ColorContribution).toService(NotebookColorContribution); + + bind(NotebookOpenHandler).toSelf().inSingletonScope(); + bind(OpenHandler).toService(NotebookOpenHandler); + + bind(NotebookTypeRegistry).toSelf().inSingletonScope(); + bind(NotebookRendererRegistry).toSelf().inSingletonScope(); + + bind(WidgetFactory).to(NotebookEditorWidgetFactory).inSingletonScope(); + bind(NotebookCellToolbarFactory).toSelf().inSingletonScope(); + + bind(NotebookService).toSelf().inSingletonScope(); + bind(NotebookEditorWidgetService).toSelf().inSingletonScope(); + bind(NotebookExecutionService).toSelf().inSingletonScope(); + bind(NotebookExecutionStateService).toSelf().inSingletonScope(); + bind(NotebookKernelService).toSelf().inSingletonScope(); + bind(NotebookRendererMessagingService).toSelf().inSingletonScope(); + bind(NotebookKernelHistoryService).toSelf().inSingletonScope(); + bind(NotebookKernelQuickPickService).to(KernelPickerMRUStrategy).inSingletonScope(); + + bind(NotebookCellResourceResolver).toSelf().inSingletonScope(); + bind(ResourceResolver).toService(NotebookCellResourceResolver); + bind(NotebookModelResolverService).toSelf().inSingletonScope(); + + bind(NotebookCellActionContribution).toSelf().inSingletonScope(); + bind(MenuContribution).toService(NotebookCellActionContribution); + bind(CommandContribution).toService(NotebookCellActionContribution); + + bind(NotebookActionsContribution).toSelf().inSingletonScope(); + bind(CommandContribution).toService(NotebookActionsContribution); + bind(MenuContribution).toService(NotebookActionsContribution); + + bind(NotebookCodeCellRenderer).toSelf().inSingletonScope(); + bind(NotebookMarkdownCellRenderer).toSelf().inSingletonScope(); + bind(NotebookMainToolbarRenderer).toSelf().inSingletonScope(); + + bind(NotebookEditorContainerFactory).toFactory(ctx => (props: NotebookEditorProps) => + createNotebookEditorWidgetContainer(ctx.container, props).get(NotebookEditorWidget) + ); + bind(NotebookModelFactory).toFactory(ctx => (props: NotebookModelProps) => + createNotebookModelContainer(ctx.container, props).get(NotebookModel) + ); + bind(NotebookCellModelFactory).toFactory(ctx => (props: NotebookCellModelProps) => + createNotebookCellModelContainer(ctx.container, props, NotebookCellContextManager).get(NotebookCellModel) + ); +}); diff --git a/packages/notebook/src/browser/notebook-open-handler.ts b/packages/notebook/src/browser/notebook-open-handler.ts new file mode 100644 index 0000000000000..7edb01ca97db5 --- /dev/null +++ b/packages/notebook/src/browser/notebook-open-handler.ts @@ -0,0 +1,87 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { URI, MaybePromise } from '@theia/core'; +import { NavigatableWidgetOpenHandler, WidgetOpenerOptions } from '@theia/core/lib/browser'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { NotebookFileSelector, NotebookTypeDescriptor } from '../common/notebook-protocol'; +import { NotebookTypeRegistry } from './notebook-type-registry'; +import { NotebookEditorWidget } from './notebook-editor-widget'; +import { match } from '@theia/core/lib/common/glob'; +import { NotebookEditorWidgetOptions } from './notebook-editor-widget-factory'; + +@injectable() +export class NotebookOpenHandler extends NavigatableWidgetOpenHandler { + + id: string = 'notebook'; + + constructor(@inject(NotebookTypeRegistry) private notebookTypeRegistry: NotebookTypeRegistry) { + super(); + } + + canHandle(uri: URI, options?: WidgetOpenerOptions | undefined): MaybePromise { + const priorities = this.notebookTypeRegistry.notebookTypes + .filter(notebook => notebook.selector && this.matches(notebook.selector, uri)) + .map(notebook => this.calculatePriority(notebook)); + return Math.max(...priorities); + } + + protected findHighestPriorityType(uri: URI): NotebookTypeDescriptor | undefined { + const matchingTypes = this.notebookTypeRegistry.notebookTypes + .filter(notebookType => notebookType.selector && this.matches(notebookType.selector, uri)) + .map(notebookType => ({ descriptor: notebookType, priority: this.calculatePriority(notebookType) })); + + if (matchingTypes.length === 0) { + return undefined; + } + let type = matchingTypes[0]; + for (let i = 1; i < matchingTypes.length; i++) { + const notebookType = matchingTypes[i]; + if (notebookType.priority > type.priority) { + type = notebookType; + } + } + return type.descriptor; + } + + protected calculatePriority(notebookType: NotebookTypeDescriptor | undefined): number { + if (!notebookType) { + return -1; + } + return notebookType.priority === 'option' ? 100 : 200; + } + + protected override createWidgetOptions(uri: URI, options?: WidgetOpenerOptions | undefined): NotebookEditorWidgetOptions { + const widgetOptions = super.createWidgetOptions(uri, options); + const notebookType = this.findHighestPriorityType(uri); + if (!notebookType) { + throw new Error('No notebook types registered for uri: ' + uri.toString()); + } + return { + notebookType: notebookType.type, + ...widgetOptions + }; + } + + matches(selectors: readonly NotebookFileSelector[], resource: URI): boolean { + return selectors.some(selector => this.selectorMatches(selector, resource)); + } + + selectorMatches(selector: NotebookFileSelector, resource: URI): boolean { + return !!selector.filenamePattern + && match(selector.filenamePattern, resource.path.name + resource.path.ext); + } +} diff --git a/packages/notebook/src/browser/notebook-renderer-registry.ts b/packages/notebook/src/browser/notebook-renderer-registry.ts new file mode 100644 index 0000000000000..782830968cee7 --- /dev/null +++ b/packages/notebook/src/browser/notebook-renderer-registry.ts @@ -0,0 +1,62 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Disposable, Path } from '@theia/core'; +import { injectable } from '@theia/core/shared/inversify'; +import { NotebookRendererDescriptor } from '../common/notebook-protocol'; + +export interface NotebookRendererInfo { + readonly id: string; + readonly displayName: string; + readonly mimeTypes: string[]; + readonly entrypoint: { readonly extends?: string; readonly uri: string }; + readonly requiresMessaging: boolean; +} + +@injectable() +export class NotebookRendererRegistry { + + readonly notebookRenderers: NotebookRendererInfo[] = []; + + registerNotebookRenderer(type: NotebookRendererDescriptor, basePath: string): Disposable { + let entrypoint; + if (typeof type.entrypoint === 'string') { + entrypoint = { + uri: new Path(basePath).join(type.entrypoint).toString() + }; + } else { + entrypoint = { + uri: new Path(basePath).join(type.entrypoint.path).toString(), + extends: type.entrypoint.extends + }; + } + + this.notebookRenderers.push({ + ...type, + mimeTypes: type.mimeTypes || [], + requiresMessaging: type.requiresMessaging === 'always' || type.requiresMessaging === 'optional', + entrypoint + }); + return Disposable.create(() => { + this.notebookRenderers.splice(this.notebookRenderers.findIndex(renderer => renderer.id === type.id), 1); + }); + } +} + diff --git a/packages/notebook/src/browser/notebook-type-registry.ts b/packages/notebook/src/browser/notebook-type-registry.ts new file mode 100644 index 0000000000000..973652e2304b6 --- /dev/null +++ b/packages/notebook/src/browser/notebook-type-registry.ts @@ -0,0 +1,30 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** +import { Disposable } from '@theia/core'; +import { injectable } from '@theia/core/shared/inversify'; +import { NotebookTypeDescriptor } from '../common/notebook-protocol'; + +@injectable() +export class NotebookTypeRegistry { + readonly notebookTypes: NotebookTypeDescriptor[] = []; + + registerNotebookType(type: NotebookTypeDescriptor): Disposable { + this.notebookTypes.push(type); + return Disposable.create(() => { + this.notebookTypes.splice(this.notebookTypes.indexOf(type), 1); + }); + } +} diff --git a/packages/notebook/src/browser/renderers/cell-output-webview.ts b/packages/notebook/src/browser/renderers/cell-output-webview.ts new file mode 100644 index 0000000000000..3e84347f854fb --- /dev/null +++ b/packages/notebook/src/browser/renderers/cell-output-webview.ts @@ -0,0 +1,32 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { Disposable } from '@theia/core'; +import { NotebookCellModel } from '../view-model/notebook-cell-model'; + +export const CellOutputWebviewFactory = Symbol('outputWebviewFactory'); + +export type CellOutputWebviewFactory = (cell: NotebookCellModel) => Promise; + +export interface CellOutputWebview extends Disposable { + + readonly id: string; + + render(): React.JSX.Element; + + attachWebview(): void; + isAttached(): boolean +} diff --git a/packages/notebook/src/browser/service/notebook-cell-context-manager.ts b/packages/notebook/src/browser/service/notebook-cell-context-manager.ts new file mode 100644 index 0000000000000..a0d4386f0128a --- /dev/null +++ b/packages/notebook/src/browser/service/notebook-cell-context-manager.ts @@ -0,0 +1,70 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { inject, injectable } from '@theia/core/shared/inversify'; +import { ContextKeyService, ScopedValueStore } from '@theia/core/lib/browser/context-key-service'; +import { NotebookCellModel } from '../view-model/notebook-cell-model'; +import { NOTEBOOK_CELL_EXECUTING, NOTEBOOK_CELL_EXECUTION_STATE, NOTEBOOK_CELL_MARKDOWN_EDIT_MODE, NOTEBOOK_CELL_TYPE } from '../contributions/notebook-context-keys'; +import { Disposable, DisposableCollection, Emitter } from '@theia/core'; +import { CellKind } from '../../common'; +import { NotebookExecutionStateService } from '../service/notebook-execution-state-service'; + +@injectable() +export class NotebookCellContextManager implements Disposable { + @inject(ContextKeyService) protected contextKeyService: ContextKeyService; + + @inject(NotebookExecutionStateService) + protected readonly executionStateService: NotebookExecutionStateService; + + protected readonly toDispose = new DisposableCollection(); + + protected currentStore: ScopedValueStore; + protected currentContext: HTMLLIElement; + + protected readonly onDidChangeContextEmitter = new Emitter(); + readonly onDidChangeContext = this.onDidChangeContextEmitter.event; + + updateCellContext(cell: NotebookCellModel, newHtmlContext: HTMLLIElement): void { + if (newHtmlContext !== this.currentContext) { + this.toDispose.dispose(); + this.currentStore?.dispose(); + + this.currentContext = newHtmlContext; + this.currentStore = this.contextKeyService.createScoped(newHtmlContext); + + this.currentStore.setContext(NOTEBOOK_CELL_TYPE, cell.cellKind === CellKind.Code ? 'code' : 'markdown'); + + this.toDispose.push(cell.onDidRequestCellEditChange(cellEdit => { + this.currentStore?.setContext(NOTEBOOK_CELL_MARKDOWN_EDIT_MODE, cellEdit); + this.onDidChangeContextEmitter.fire(); + })); + this.toDispose.push(this.executionStateService.onDidChangeExecution(e => { + if (e.affectsCell(cell.uri)) { + this.currentStore?.setContext(NOTEBOOK_CELL_EXECUTING, !!e.changed); + this.currentStore?.setContext(NOTEBOOK_CELL_EXECUTION_STATE, e.changed?.state ?? 'idle'); + this.onDidChangeContextEmitter.fire(); + } + })); + this.onDidChangeContextEmitter.fire(); + } + } + + dispose(): void { + this.toDispose.dispose(); + this.currentStore?.dispose(); + this.onDidChangeContextEmitter.dispose(); + } +} diff --git a/packages/notebook/src/browser/service/notebook-editor-service.ts b/packages/notebook/src/browser/service/notebook-editor-service.ts new file mode 100644 index 0000000000000..2cce03f68e1ae --- /dev/null +++ b/packages/notebook/src/browser/service/notebook-editor-service.ts @@ -0,0 +1,86 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Disposable, DisposableCollection, Emitter } from '@theia/core'; +import { inject, injectable, postConstruct } from '@theia/core/shared/inversify'; +import { ApplicationShell } from '@theia/core/lib/browser'; +import { NotebookEditorWidget, NOTEBOOK_EDITOR_ID_PREFIX } from '../notebook-editor-widget'; + +@injectable() +export class NotebookEditorWidgetService implements Disposable { + + @inject(ApplicationShell) + protected applicationShell: ApplicationShell; + + private readonly notebookEditors = new Map(); + + private readonly onNotebookEditorAddEmitter = new Emitter(); + private readonly onNotebookEditorsRemoveEmitter = new Emitter(); + readonly onDidAddNotebookEditor = this.onNotebookEditorAddEmitter.event; + readonly onDidRemoveNotebookEditor = this.onNotebookEditorsRemoveEmitter.event; + + private readonly onFocusedEditorChangedEmitter = new Emitter(); + readonly onFocusedEditorChanged = this.onFocusedEditorChangedEmitter.event; + + private readonly toDispose = new DisposableCollection(); + + currentFocusedEditor?: NotebookEditorWidget = undefined; + + @postConstruct() + protected init(): void { + this.toDispose.push(this.applicationShell.onDidChangeActiveWidget(event => { + if (event.newValue?.id.startsWith(NOTEBOOK_EDITOR_ID_PREFIX) && event.newValue !== this.currentFocusedEditor) { + this.currentFocusedEditor = event.newValue as NotebookEditorWidget; + this.onFocusedEditorChangedEmitter.fire(this.currentFocusedEditor); + } + })); + } + + dispose(): void { + this.onNotebookEditorAddEmitter.dispose(); + this.onNotebookEditorsRemoveEmitter.dispose(); + this.onFocusedEditorChangedEmitter.dispose(); + this.toDispose.dispose(); + } + + // --- editor management + + addNotebookEditor(editor: NotebookEditorWidget): void { + this.notebookEditors.set(editor.id, editor); + this.onNotebookEditorAddEmitter.fire(editor); + } + + removeNotebookEditor(editor: NotebookEditorWidget): void { + if (this.notebookEditors.has(editor.id)) { + this.notebookEditors.delete(editor.id); + this.onNotebookEditorsRemoveEmitter.fire(editor); + } + } + + getNotebookEditor(editorId: string): NotebookEditorWidget | undefined { + return this.notebookEditors.get(editorId); + } + + listNotebookEditors(): readonly NotebookEditorWidget[] { + return [...this.notebookEditors].map(e => e[1]); + } + +} diff --git a/packages/notebook/src/browser/service/notebook-execution-service.ts b/packages/notebook/src/browser/service/notebook-execution-service.ts new file mode 100644 index 0000000000000..d0e3525194f8a --- /dev/null +++ b/packages/notebook/src/browser/service/notebook-execution-service.ts @@ -0,0 +1,139 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { inject, injectable } from '@theia/core/shared/inversify'; +import { CellExecution, NotebookExecutionStateService } from '../service/notebook-execution-state-service'; +import { CellKind, NotebookCellExecutionState } from '../../common'; +import { NotebookCellModel } from '../view-model/notebook-cell-model'; +import { NotebookModel } from '../view-model/notebook-model'; +import { NotebookKernelService, NotebookKernel } from './notebook-kernel-service'; +import { CommandService, Disposable } from '@theia/core'; +import { NotebookKernelQuickPickService, NotebookKernelQuickPickServiceImpl } from './notebook-kernel-quick-pick-service'; +import { NotebookKernelHistoryService } from './notebook-kernel-history-service'; +import { NotebookCommands } from '../contributions/notebook-actions-contribution'; + +export interface CellExecutionParticipant { + onWillExecuteCell(executions: CellExecution[]): Promise; +} + +@injectable() +export class NotebookExecutionService { + + @inject(NotebookExecutionStateService) + protected notebookExecutionStateService: NotebookExecutionStateService; + + @inject(NotebookKernelService) + protected notebookKernelService: NotebookKernelService; + + @inject(NotebookKernelHistoryService) + protected notebookKernelHistoryService: NotebookKernelHistoryService; + + @inject(CommandService) + protected commandService: CommandService; + + @inject(NotebookKernelQuickPickService) + protected notebookKernelQuickPickService: NotebookKernelQuickPickServiceImpl; + + private readonly cellExecutionParticipants = new Set(); + + async executeNotebookCells(notebook: NotebookModel, cells: Iterable): Promise { + const cellsArr = Array.from(cells) + .filter(c => c.cellKind === CellKind.Code); + if (!cellsArr.length) { + return; + } + + // create cell executions + const cellExecutions: [NotebookCellModel, CellExecution][] = []; + for (const cell of cellsArr) { + const cellExe = this.notebookExecutionStateService.getCellExecution(cell.uri); + if (!cellExe) { + cellExecutions.push([cell, this.notebookExecutionStateService.createCellExecution(notebook.uri, cell.handle)]); + } + } + + const kernel = await this.resolveKernel(notebook); + + if (!kernel) { + // clear all pending cell executions + cellExecutions.forEach(cellExe => cellExe[1].complete({})); + return; + } + + // filter cell executions based on selected kernel + const validCellExecutions: CellExecution[] = []; + for (const [cell, cellExecution] of cellExecutions) { + if (!kernel.supportedLanguages.includes(cell.language)) { + cellExecution.complete({}); + } else { + validCellExecutions.push(cellExecution); + } + } + + // request execution + if (validCellExecutions.length > 0) { + await this.runExecutionParticipants(validCellExecutions); + + this.notebookKernelService.selectKernelForNotebook(kernel, notebook); + await kernel.executeNotebookCellsRequest(notebook.uri, validCellExecutions.map(c => c.cellHandle)); + // the connecting state can change before the kernel resolves executeNotebookCellsRequest + const unconfirmed = validCellExecutions.filter(exe => exe.state === NotebookCellExecutionState.Unconfirmed); + if (unconfirmed.length) { + unconfirmed.forEach(exe => exe.complete({})); + } + } + } + + registerExecutionParticipant(participant: CellExecutionParticipant): Disposable { + this.cellExecutionParticipants.add(participant); + return Disposable.create(() => this.cellExecutionParticipants.delete(participant)); + } + + private async runExecutionParticipants(executions: CellExecution[]): Promise { + for (const participant of this.cellExecutionParticipants) { + await participant.onWillExecuteCell(executions); + } + return; + } + + async cancelNotebookCellHandles(notebook: NotebookModel, cells: Iterable): Promise { + const cellsArr = Array.from(cells); + const kernel = this.notebookKernelService.getSelectedOrSuggestedKernel(notebook); + if (kernel) { + await kernel.cancelNotebookCellExecution(notebook.uri, cellsArr); + } + } + + async cancelNotebookCells(notebook: NotebookModel, cells: Iterable): Promise { + this.cancelNotebookCellHandles(notebook, Array.from(cells, cell => cell.handle)); + } + + async resolveKernel(notebook: NotebookModel): Promise { + const alreadySelected = this.notebookKernelHistoryService.getKernels(notebook); + + if (alreadySelected.selected) { + return alreadySelected.selected; + } + + await this.commandService.executeCommand(NotebookCommands.SELECT_KERNEL_COMMAND.id, notebook); + const { selected } = this.notebookKernelHistoryService.getKernels(notebook); + return selected; + } +} diff --git a/packages/notebook/src/browser/service/notebook-execution-state-service.ts b/packages/notebook/src/browser/service/notebook-execution-state-service.ts new file mode 100644 index 0000000000000..63227fd5b6545 --- /dev/null +++ b/packages/notebook/src/browser/service/notebook-execution-state-service.ts @@ -0,0 +1,322 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Disposable, Emitter, URI } from '@theia/core'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { NotebookService } from './notebook-service'; +import { + CellEditType, CellExecuteOutputEdit, CellExecuteOutputItemEdit, CellExecutionUpdateType, + CellUri, CellPartialInternalMetadataEditByHandle, NotebookCellExecutionState, CellEditOperation, NotebookCellInternalMetadata +} from '../../common'; +import { NotebookModel } from '../view-model/notebook-model'; +import { v4 } from 'uuid'; + +export type CellExecuteUpdate = CellExecuteOutputEdit | CellExecuteOutputItemEdit | CellExecutionStateUpdate; + +export interface CellExecutionComplete { + runEndTime?: number; + lastRunSuccess?: boolean; +} + +export interface CellExecutionStateUpdate { + editType: CellExecutionUpdateType.ExecutionState; + executionOrder?: number; + runStartTime?: number; + didPause?: boolean; + isPaused?: boolean; +} + +export interface ICellExecutionStateUpdate { + editType: CellExecutionUpdateType.ExecutionState; + executionOrder?: number; + runStartTime?: number; + didPause?: boolean; + isPaused?: boolean; +} + +export interface ICellExecutionStateUpdate { + editType: CellExecutionUpdateType.ExecutionState; + executionOrder?: number; + runStartTime?: number; + didPause?: boolean; + isPaused?: boolean; +} + +export interface ICellExecutionComplete { + runEndTime?: number; + lastRunSuccess?: boolean; +} +export enum NotebookExecutionType { + cell, + notebook +} + +export interface NotebookFailStateChangedEvent { + visible: boolean; + notebook: URI; +} + +export interface FailedCellInfo { + cellHandle: number; + disposable: Disposable; + visible: boolean; +} + +@injectable() +export class NotebookExecutionStateService implements Disposable { + + @inject(NotebookService) + protected notebookService: NotebookService; + + protected readonly executions = new Map(); + + private readonly onDidChangeExecutionEmitter = new Emitter(); + onDidChangeExecution = this.onDidChangeExecutionEmitter.event; + + private readonly onDidChangeLastRunFailStateEmitter = new Emitter(); + onDidChangeLastRunFailState = this.onDidChangeLastRunFailStateEmitter.event; + + createCellExecution(notebookUri: URI, cellHandle: number): CellExecution { + const notebook = this.notebookService.getNotebookEditorModel(notebookUri); + + if (!notebook) { + throw new Error(`Notebook not found: ${notebookUri.toString()}`); + } + + let execution = this.executions.get(`${notebookUri}/${cellHandle}`); + + if (!execution) { + execution = this.createNotebookCellExecution(notebook, cellHandle); + this.executions.set(`${notebookUri}/${cellHandle}`, execution); + execution.initialize(); + this.onDidChangeExecutionEmitter.fire(new CellExecutionStateChangedEvent(notebookUri, cellHandle, execution)); + } + + return execution; + + } + + private createNotebookCellExecution(notebook: NotebookModel, cellHandle: number): CellExecution { + const notebookUri = notebook.uri; + const execution = new CellExecution(cellHandle, notebook); + execution.onDidUpdate(() => this.onDidChangeExecutionEmitter.fire(new CellExecutionStateChangedEvent(notebookUri, cellHandle, execution))); + execution.onDidComplete(lastRunSuccess => this.onCellExecutionDidComplete(notebookUri, cellHandle, execution, lastRunSuccess)); + + return execution; + } + + private onCellExecutionDidComplete(notebookUri: URI, cellHandle: number, exe: CellExecution, lastRunSuccess?: boolean): void { + const notebookExecutions = this.executions.get(`${notebookUri}/${cellHandle}`); + if (!notebookExecutions) { + return; + } + + exe.dispose(); + this.executions.delete(`${notebookUri}/${cellHandle}`); + + this.onDidChangeExecutionEmitter.fire(new CellExecutionStateChangedEvent(notebookUri, cellHandle)); + } + + getCellExecution(cellUri: URI): CellExecution | undefined { + const parsed = CellUri.parse(cellUri); + if (!parsed) { + throw new Error(`Not a cell URI: ${cellUri}`); + } + + return this.executions.get(`${parsed.notebook.toString()}/${parsed.handle}`); + } + + dispose(): void { + this.onDidChangeExecutionEmitter.dispose(); + this.onDidChangeLastRunFailStateEmitter.dispose(); + + this.executions.forEach(cellExecution => cellExecution.dispose()); + } + +} + +export class CellExecution implements Disposable { + private readonly onDidUpdateEmitter = new Emitter(); + readonly onDidUpdate = this.onDidUpdateEmitter.event; + + private readonly onDidCompleteEmitter = new Emitter(); + readonly onDidComplete = this.onDidCompleteEmitter.event; + + private _state: NotebookCellExecutionState = NotebookCellExecutionState.Unconfirmed; + get state(): NotebookCellExecutionState { + return this._state; + } + + get notebookURI(): URI { + return this.notebook.uri; + } + + private _didPause = false; + get didPause(): boolean { + return this._didPause; + } + + private _isPaused = false; + get isPaused(): boolean { + return this._isPaused; + } + + constructor( + readonly cellHandle: number, + private readonly notebook: NotebookModel, + ) { + console.debug(`CellExecution#ctor ${this.getCellLog()}`); + } + + initialize(): void { + const startExecuteEdit: CellPartialInternalMetadataEditByHandle = { + editType: CellEditType.PartialInternalMetadata, + handle: this.cellHandle, + internalMetadata: { + executionId: v4(), + runStartTime: undefined, + runEndTime: undefined, + lastRunSuccess: undefined, + executionOrder: undefined, + renderDuration: undefined, + } + }; + this.applyExecutionEdits([startExecuteEdit]); + } + + private getCellLog(): string { + return `${this.notebookURI.toString()}, ${this.cellHandle}`; + } + + confirm(): void { + this._state = NotebookCellExecutionState.Pending; + this.onDidUpdateEmitter.fire(); + } + + update(updates: CellExecuteUpdate[]): void { + if (updates.some(u => u.editType === CellExecutionUpdateType.ExecutionState)) { + this._state = NotebookCellExecutionState.Executing; + } + + if (!this._didPause && updates.some(u => u.editType === CellExecutionUpdateType.ExecutionState && u.didPause)) { + this._didPause = true; + } + + const lastIsPausedUpdate = [...updates].reverse().find(u => u.editType === CellExecutionUpdateType.ExecutionState && typeof u.isPaused === 'boolean'); + if (lastIsPausedUpdate) { + this._isPaused = (lastIsPausedUpdate as ICellExecutionStateUpdate).isPaused!; + } + + const cellModel = this.notebook.cells.find(c => c.handle === this.cellHandle); + if (!cellModel) { + console.debug(`CellExecution#update, updating cell not in notebook: ${this.notebook.uri.toString()}, ${this.cellHandle}`); + } else { + const edits = updates.map(update => updateToEdit(update, this.cellHandle)); + this.applyExecutionEdits(edits); + } + + if (updates.some(u => u.editType === CellExecutionUpdateType.ExecutionState)) { + this.onDidUpdateEmitter.fire(); + } + + } + + complete(completionData: CellExecutionComplete): void { + const cellModel = this.notebook.cells.find(c => c.handle === this.cellHandle); + if (!cellModel) { + console.debug(`CellExecution#complete, completing cell not in notebook: ${this.notebook.uri.toString()}, ${this.cellHandle}`); + } else { + const edit: CellEditOperation = { + editType: CellEditType.PartialInternalMetadata, + handle: this.cellHandle, + internalMetadata: { + lastRunSuccess: completionData.lastRunSuccess, + // eslint-disable-next-line no-null/no-null + runStartTime: this._didPause ? null : cellModel.internalMetadata.runStartTime, + // eslint-disable-next-line no-null/no-null + runEndTime: this._didPause ? null : completionData.runEndTime, + } + }; + this.applyExecutionEdits([edit]); + } + + this.onDidCompleteEmitter.fire(completionData.lastRunSuccess); + + } + + dispose(): void { + this.onDidUpdateEmitter.dispose(); + this.onDidCompleteEmitter.dispose(); + } + + private applyExecutionEdits(edits: CellEditOperation[]): void { + this.notebook.applyEdits(edits, false); + } +} + +export class CellExecutionStateChangedEvent { + readonly type = NotebookExecutionType.cell; + constructor( + readonly notebook: URI, + readonly cellHandle: number, + readonly changed?: CellExecution + ) { } + + affectsCell(cell: URI): boolean { + const parsedUri = CellUri.parse(cell); + return !!parsedUri && this.notebook.isEqual(parsedUri.notebook) && this.cellHandle === parsedUri.handle; + } + + affectsNotebook(notebook: URI): boolean { + return this.notebook.toString() === notebook.toString(); + } +} + +export function updateToEdit(update: CellExecuteUpdate, cellHandle: number): CellEditOperation { + if (update.editType === CellExecutionUpdateType.Output) { + return { + editType: CellEditType.Output, + handle: update.cellHandle, + append: update.append, + outputs: update.outputs, + }; + } else if (update.editType === CellExecutionUpdateType.OutputItems) { + return { + editType: CellEditType.OutputItems, + items: update.items, + append: update.append, + }; + } else if (update.editType === CellExecutionUpdateType.ExecutionState) { + const newInternalMetadata: Partial = {}; + if (typeof update.executionOrder !== 'undefined') { + newInternalMetadata.executionOrder = update.executionOrder; + } + if (typeof update.runStartTime !== 'undefined') { + newInternalMetadata.runStartTime = update.runStartTime; + } + return { + editType: CellEditType.PartialInternalMetadata, + handle: cellHandle, + internalMetadata: newInternalMetadata + }; + } + + throw new Error('Unknown cell update type'); +} diff --git a/packages/notebook/src/browser/service/notebook-kernel-history-service.ts b/packages/notebook/src/browser/service/notebook-kernel-history-service.ts new file mode 100644 index 0000000000000..a28cba3bbccc4 --- /dev/null +++ b/packages/notebook/src/browser/service/notebook-kernel-history-service.ts @@ -0,0 +1,109 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { inject, injectable, postConstruct } from '@theia/core/shared/inversify'; +import { StorageService } from '@theia/core/lib/browser'; +import { NotebookKernel, NotebookTextModelLike, NotebookKernelService } from './notebook-kernel-service'; +import { Disposable } from '@theia/core'; + +interface KernelsList { + [viewType: string]: string[]; +} + +interface MostRecentKernelsResult { + selected?: NotebookKernel, + all: NotebookKernel[] +} + +const MAX_KERNELS_IN_HISTORY = 5; + +@injectable() +export class NotebookKernelHistoryService implements Disposable { + + @inject(StorageService) + protected storageService: StorageService; + + @inject(NotebookKernelService) + protected notebookKernelService: NotebookKernelService; + + declare serviceBrand: undefined; + + private static STORAGE_KEY = 'notebook.kernelHistory'; + private mostRecentKernelsMap: KernelsList = {}; + + @postConstruct() + protected init(): void { + this.loadState(); + } + + getKernels(notebook: NotebookTextModelLike): MostRecentKernelsResult { + const allAvailableKernels = this.notebookKernelService.getMatchingKernel(notebook); + const allKernels = allAvailableKernels.all; + const selectedKernel = allAvailableKernels.selected; + // We will suggest the only kernel + const suggested = allAvailableKernels.all.length === 1 ? allAvailableKernels.all[0] : undefined; + const mostRecentKernelIds = this.mostRecentKernelsMap[notebook.viewType] ? this.mostRecentKernelsMap[notebook.viewType].map(kernel => kernel[1]) : []; + const all = mostRecentKernelIds.map(kernelId => allKernels.find(kernel => kernel.id === kernelId)).filter(kernel => !!kernel) as NotebookKernel[]; + + return { + selected: selectedKernel ?? suggested, + all + }; + } + + addMostRecentKernel(kernel: NotebookKernel): void { + const viewType = kernel.viewType; + const recentKernels = this.mostRecentKernelsMap[viewType] ?? [kernel.id]; + + if (recentKernels.length > MAX_KERNELS_IN_HISTORY) { + recentKernels.splice(MAX_KERNELS_IN_HISTORY); + } + + this.mostRecentKernelsMap[viewType] = recentKernels; + this.saveState(); + } + + private saveState(): void { + let notEmpty = false; + for (const [_, kernels] of Object.entries(this.mostRecentKernelsMap)) { + notEmpty = notEmpty || Object.entries(kernels).length > 0; + } + + this.storageService.setData(NotebookKernelHistoryService.STORAGE_KEY, notEmpty ? this.mostRecentKernelsMap : undefined); + } + + private async loadState(): Promise { + const kernelMap = await this.storageService.getData(NotebookKernelHistoryService.STORAGE_KEY); + if (kernelMap) { + this.mostRecentKernelsMap = kernelMap as KernelsList; + } else { + this.mostRecentKernelsMap = {}; + } + } + + clear(): void { + this.mostRecentKernelsMap = {}; + this.saveState(); + } + + dispose(): void { + + } +} diff --git a/packages/notebook/src/browser/service/notebook-kernel-quick-pick-service.ts b/packages/notebook/src/browser/service/notebook-kernel-quick-pick-service.ts new file mode 100644 index 0000000000000..14777243002ea --- /dev/null +++ b/packages/notebook/src/browser/service/notebook-kernel-quick-pick-service.ts @@ -0,0 +1,494 @@ + +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { ArrayUtils, Command, CommandService, DisposableCollection, Event, nls, QuickInputButton, QuickInputService, QuickPickInput, QuickPickItem, URI, } from '@theia/core'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { NotebookKernelService, NotebookKernel, NotebookKernelMatchResult, SourceCommand } from './notebook-kernel-service'; +import { NotebookModel } from '../view-model/notebook-model'; +import { NotebookEditorWidget } from '../notebook-editor-widget'; +import { codicon, OpenerService } from '@theia/core/lib/browser'; +import { NotebookKernelHistoryService } from './notebook-kernel-history-service'; +import debounce = require('@theia/core/shared/lodash.debounce'); + +export const JUPYTER_EXTENSION_ID = 'ms-toolsai.jupyter'; + +export const NotebookKernelQuickPickService = Symbol('NotebookKernelQuickPickService'); + +type KernelPick = QuickPickItem & { kernel: NotebookKernel }; +function isKernelPick(item: QuickPickInput): item is KernelPick { + return 'kernel' in item; +} +type GroupedKernelsPick = QuickPickItem & { kernels: NotebookKernel[]; source: string }; +function isGroupedKernelsPick(item: QuickPickInput): item is GroupedKernelsPick { + return 'kernels' in item; +} +type SourcePick = QuickPickItem & { action: SourceCommand }; +function isSourcePick(item: QuickPickInput): item is SourcePick { + return 'action' in item; +} +type InstallExtensionPick = QuickPickItem & { extensionIds: string[] }; + +type KernelSourceQuickPickItem = QuickPickItem & { command: Command; documentation?: string }; +function isKernelSourceQuickPickItem(item: QuickPickItem): item is KernelSourceQuickPickItem { + return 'command' in item; +} + +function supportAutoRun(item: QuickPickInput): item is QuickPickItem { + return 'autoRun' in item && !!item.autoRun; +} + +type KernelQuickPickItem = (QuickPickItem & { autoRun?: boolean }) | InstallExtensionPick | KernelPick | GroupedKernelsPick | SourcePick | KernelSourceQuickPickItem; + +const KERNEL_PICKER_UPDATE_DEBOUNCE = 200; + +export type KernelQuickPickContext = + { id: string; extension: string } | + { notebookEditorId: string } | + { id: string; extension: string; notebookEditorId: string } | + { ui?: boolean; notebookEditor?: NotebookEditorWidget }; + +function toKernelQuickPick(kernel: NotebookKernel, selected: NotebookKernel | undefined): KernelPick { + const res: KernelPick = { + kernel, + label: kernel.label, + description: kernel.description, + detail: kernel.detail + }; + if (kernel.id === selected?.id) { + if (!res.description) { + res.description = nls.localizeByDefault('Currently Selected'); + } else { + res.description = nls.localizeByDefault('{0} - Currently Selected', res.description); + } + } + return res; +} + +@injectable() +export abstract class NotebookKernelQuickPickServiceImpl { + + @inject(NotebookKernelService) + protected readonly notebookKernelService: NotebookKernelService; + @inject(QuickInputService) + protected readonly quickInputService: QuickInputService; + @inject(CommandService) + protected readonly commandService: CommandService; + + async showQuickPick(editor: NotebookModel, wantedId?: string, skipAutoRun?: boolean): Promise { + const notebook = editor; + const matchResult = this.getMatchingResult(notebook); + const { selected, all } = matchResult; + + let newKernel: NotebookKernel | undefined; + if (wantedId) { + for (const candidate of all) { + if (candidate.id === wantedId) { + newKernel = candidate; + break; + } + } + if (!newKernel) { + console.warn(`wanted kernel DOES NOT EXIST, wanted: ${wantedId}, all: ${all.map(k => k.id)}`); + return false; + } + } + + if (newKernel) { + this.selectKernel(notebook, newKernel); + return true; + } + + const quickPick = this.quickInputService.createQuickPick(); + const quickPickItems = this.getKernelPickerQuickPickItems(matchResult); + + if (quickPickItems.length === 1 && supportAutoRun(quickPickItems[0]) && !skipAutoRun) { + return this.handleQuickPick(editor, quickPickItems[0], quickPickItems as KernelQuickPickItem[]); + } + + quickPick.items = quickPickItems; + quickPick.canSelectMany = false; + quickPick.placeholder = selected + ? nls.localizeByDefault("Change kernel for '{0}'", 'current') // TODO get label for current notebook from a label provider + : nls.localizeByDefault("Select kernel for '{0}'", 'current'); + + quickPick.busy = this.notebookKernelService.getKernelDetectionTasks(notebook).length > 0; + + const kernelDetectionTaskListener = this.notebookKernelService.onDidChangeKernelDetectionTasks(() => { + quickPick.busy = this.notebookKernelService.getKernelDetectionTasks(notebook).length > 0; + }); + + const kernelChangeEventListener = debounce( + Event.any( + this.notebookKernelService.onDidChangeSourceActions, + this.notebookKernelService.onDidAddKernel, + this.notebookKernelService.onDidRemoveKernel, + this.notebookKernelService.onDidChangeNotebookAffinity + ), + KERNEL_PICKER_UPDATE_DEBOUNCE + )(async () => { + // reset quick pick progress + quickPick.busy = false; + + const currentActiveItems = quickPick.activeItems; + const newMatchResult = this.getMatchingResult(notebook); + const newQuickPickItems = this.getKernelPickerQuickPickItems(newMatchResult); + quickPick.keepScrollPosition = true; + + // recalculate active items + const activeItems: KernelQuickPickItem[] = []; + for (const item of currentActiveItems) { + if (isKernelPick(item)) { + const kernelId = item.kernel.id; + const sameItem = newQuickPickItems.find(pi => isKernelPick(pi) && pi.kernel.id === kernelId) as KernelPick | undefined; + if (sameItem) { + activeItems.push(sameItem); + } + } else if (isSourcePick(item)) { + const sameItem = newQuickPickItems.find(pi => isSourcePick(pi) && pi.action.command.id === item.action.command.id) as SourcePick | undefined; + if (sameItem) { + activeItems.push(sameItem); + } + } + } + + quickPick.items = newQuickPickItems; + quickPick.activeItems = activeItems; + }, this); + + const pick = await new Promise<{ selected: KernelQuickPickItem | undefined; items: KernelQuickPickItem[] }>((resolve, reject) => { + quickPick.onDidAccept(() => { + const item = quickPick.selectedItems[0]; + if (item) { + resolve({ selected: item, items: quickPick.items as KernelQuickPickItem[] }); + } else { + resolve({ selected: undefined, items: quickPick.items as KernelQuickPickItem[] }); + } + + quickPick.hide(); + }); + + quickPick.onDidHide(() => { + kernelDetectionTaskListener.dispose(); + kernelChangeEventListener?.dispose(); + quickPick.dispose(); + resolve({ selected: undefined, items: quickPick.items as KernelQuickPickItem[] }); + }); + quickPick.show(); + }); + + if (pick.selected) { + return this.handleQuickPick(editor, pick.selected, pick.items); + } + + return false; + } + + protected getMatchingResult(notebook: NotebookModel): NotebookKernelMatchResult { + return this.notebookKernelService.getMatchingKernel(notebook); + } + + protected abstract getKernelPickerQuickPickItems(matchResult: NotebookKernelMatchResult): QuickPickInput[]; + + protected async handleQuickPick(editor: NotebookModel, pick: KernelQuickPickItem, quickPickItems: KernelQuickPickItem[]): Promise { + if (isKernelPick(pick)) { + const newKernel = pick.kernel; + this.selectKernel(editor, newKernel); + return true; + } + + if (isSourcePick(pick)) { + // selected explicitly, it should trigger the execution? + pick.action.run(); + } + + return true; + } + + protected selectKernel(notebook: NotebookModel, kernel: NotebookKernel): void { + this.notebookKernelService.selectKernelForNotebook(kernel, notebook); + } +} +@injectable() +export class KernelPickerMRUStrategy extends NotebookKernelQuickPickServiceImpl { + + @inject(OpenerService) + protected openerService: OpenerService; + + @inject(NotebookKernelHistoryService) + protected notebookKernelHistoryService: NotebookKernelHistoryService; + + protected getKernelPickerQuickPickItems(matchResult: NotebookKernelMatchResult): QuickPickInput[] { + const quickPickItems: QuickPickInput[] = []; + + if (matchResult.selected) { + const kernelItem = toKernelQuickPick(matchResult.selected, matchResult.selected); + quickPickItems.push(kernelItem); + } + + // TODO use suggested here when kernel affinity is implemented. For now though show all kernels + matchResult.all.filter(kernel => kernel.id !== matchResult.selected?.id).map(kernel => toKernelQuickPick(kernel, matchResult.selected)) + .forEach(kernel => { + quickPickItems.push(kernel); + }); + + const shouldAutoRun = quickPickItems.length === 0; + + if (quickPickItems.length > 0) { + quickPickItems.push({ + type: 'separator' + }); + } + + // select another kernel quick pick + quickPickItems.push({ + id: 'selectAnother', + label: nls.localizeByDefault('Select Another Kernel...'), + autoRun: shouldAutoRun + }); + + return quickPickItems; + } + + protected override selectKernel(notebook: NotebookModel, kernel: NotebookKernel): void { + const currentInfo = this.notebookKernelService.getMatchingKernel(notebook); + if (currentInfo.selected) { + // there is already a selected kernel + this.notebookKernelHistoryService.addMostRecentKernel(currentInfo.selected); + } + super.selectKernel(notebook, kernel); + this.notebookKernelHistoryService.addMostRecentKernel(kernel); + } + + protected override getMatchingResult(notebook: NotebookModel): NotebookKernelMatchResult { + const { selected, all } = this.notebookKernelHistoryService.getKernels(notebook); + const matchingResult = this.notebookKernelService.getMatchingKernel(notebook); + return { + selected: selected, + all: matchingResult.all, + suggestions: all, + hidden: [] + }; + } + + protected override async handleQuickPick(editor: NotebookModel, pick: KernelQuickPickItem, items: KernelQuickPickItem[]): Promise { + if (pick.id === 'selectAnother') { + return this.displaySelectAnotherQuickPick(editor, items.length === 1 && items[0] === pick); + } + + return super.handleQuickPick(editor, pick, items); + } + + private async displaySelectAnotherQuickPick(editor: NotebookModel, kernelListEmpty: boolean): Promise { + const notebook: NotebookModel = editor; + const disposables = new DisposableCollection(); + const quickPick = this.quickInputService.createQuickPick(); + const quickPickItem = await new Promise(resolve => { + // select from kernel sources + quickPick.title = kernelListEmpty ? nls.localizeByDefault('Select Kernel') : nls.localizeByDefault('Select Another Kernel'); + quickPick.placeholder = nls.localizeByDefault('Type to choose a kernel source'); + quickPick.busy = true; + // quickPick.buttons = [this.quickInputService.backButton]; + quickPick.show(); + + disposables.push(quickPick.onDidTriggerButton(button => { + if (button === this.quickInputService.backButton) { + resolve(button); + } + })); + quickPick.onDidTriggerItemButton(async e => { + + if (isKernelSourceQuickPickItem(e.item) && e.item.documentation !== undefined) { + const uri: URI | undefined = URI.isUri(e.item.documentation) ? new URI(e.item.documentation) : await this.commandService.executeCommand(e.item.documentation); + if (uri) { + (await this.openerService.getOpener(uri, { openExternal: true })).open(uri, { openExternal: true }); + } + } + }); + disposables.push(quickPick.onDidAccept(async () => { + resolve(quickPick.selectedItems[0]); + })); + disposables.push(quickPick.onDidHide(() => { + resolve(undefined); + })); + + this.calculateKernelSources(editor).then(quickPickItems => { + quickPick.items = quickPickItems; + if (quickPick.items.length > 0) { + quickPick.busy = false; + } + }); + + debounce( + Event.any( + this.notebookKernelService.onDidChangeSourceActions, + this.notebookKernelService.onDidAddKernel, + this.notebookKernelService.onDidRemoveKernel + ), + KERNEL_PICKER_UPDATE_DEBOUNCE, + )(async () => { + quickPick.busy = true; + const quickPickItems = await this.calculateKernelSources(editor); + quickPick.items = quickPickItems; + quickPick.busy = false; + }); + }); + + quickPick.hide(); + disposables.dispose(); + + if (quickPickItem === this.quickInputService.backButton) { + return this.showQuickPick(editor, undefined, true); + } + + if (quickPickItem) { + const selectedKernelPickItem = quickPickItem as KernelQuickPickItem; + if (isKernelSourceQuickPickItem(selectedKernelPickItem)) { + try { + const selectedKernelId = await this.executeCommand(notebook, selectedKernelPickItem.command); + if (selectedKernelId) { + const { all } = this.getMatchingResult(notebook); + const notebookKernel = all.find(kernel => kernel.id === `ms-toolsai.jupyter/${selectedKernelId}`); + if (notebookKernel) { + this.selectKernel(notebook, notebookKernel); + return true; + } + return true; + } else { + return this.displaySelectAnotherQuickPick(editor, false); + } + } catch (ex) { + return false; + } + } else if (isKernelPick(selectedKernelPickItem)) { + this.selectKernel(notebook, selectedKernelPickItem.kernel); + return true; + } else if (isGroupedKernelsPick(selectedKernelPickItem)) { + await this.selectOneKernel(notebook, selectedKernelPickItem.source, selectedKernelPickItem.kernels); + return true; + } else if (isSourcePick(selectedKernelPickItem)) { + // selected explicilty, it should trigger the execution? + try { + await selectedKernelPickItem.action.run(); + return true; + } catch (ex) { + return false; + } + } + // } else if (isSearchMarketplacePick(selectedKernelPickItem)) { + // await this.showKernelExtension( + // this.paneCompositePartService, + // this.extensionWorkbenchService, + // this.extensionService, + // editor.textModel.viewType, + // [] + // ); + // return true; + // } else if (isInstallExtensionPick(selectedKernelPickItem)) { + // await this.showKernelExtension( + // this.paneCompositePartService, + // this.extensionWorkbenchService, + // this.extensionService, + // editor.textModel.viewType, + // selectedKernelPickItem.extensionIds, + // ); + // return true; + // } + } + + return false; + } + + private async calculateKernelSources(editor: NotebookModel): Promise[]> { + const notebook: NotebookModel = editor; + + const actions = await this.notebookKernelService.getKernelSourceActionsFromProviders(notebook); + const matchResult = this.getMatchingResult(notebook); + + const others = matchResult.all.filter(item => item.extension !== JUPYTER_EXTENSION_ID); + const quickPickItems: QuickPickInput[] = []; + + // group controllers by extension + for (const group of ArrayUtils.groupBy(others, (a, b) => a.extension === b.extension ? 0 : 1)) { + const source = group[0].extension; + if (group.length > 1) { + quickPickItems.push({ + label: source, + kernels: group + }); + } else { + quickPickItems.push({ + label: group[0].label, + kernel: group[0] + }); + } + } + + const validActions = actions.filter(action => action.command); + + quickPickItems.push(...validActions.map(action => { + const buttons = action.documentation ? [{ + iconClass: codicon('info'), + tooltip: nls.localizeByDefault('Learn More'), + }] : []; + return { + id: typeof action.command! === 'string' ? action.command! : action.command!.id, + label: action.label, + description: action.description, + command: action.command, + documentation: action.documentation, + buttons + }; + })); + + return quickPickItems; + } + + private async selectOneKernel(notebook: NotebookModel, source: string, kernels: NotebookKernel[]): Promise { + const quickPickItems: QuickPickInput[] = kernels.map(kernel => toKernelQuickPick(kernel, undefined)); + const quickPick = this.quickInputService.createQuickPick(); + quickPick.items = quickPickItems; + quickPick.canSelectMany = false; + + quickPick.title = nls.localizeByDefault('Select Kernel from {0}', source); + + quickPick.onDidAccept(async () => { + if (quickPick.selectedItems && quickPick.selectedItems.length > 0 && isKernelPick(quickPick.selectedItems[0])) { + this.selectKernel(notebook, quickPick.selectedItems[0].kernel); + } + + quickPick.hide(); + quickPick.dispose(); + }); + + quickPick.onDidHide(() => { + quickPick.dispose(); + }); + + quickPick.show(); + } + + private async executeCommand(notebook: NotebookModel, command: string | Command): Promise { + const id = typeof command === 'string' ? command : command.id; + + return this.commandService.executeCommand(id, { uri: notebook.uri }); + + } +} diff --git a/packages/notebook/src/browser/service/notebook-kernel-service.ts b/packages/notebook/src/browser/service/notebook-kernel-service.ts new file mode 100644 index 0000000000000..756dc86237848 --- /dev/null +++ b/packages/notebook/src/browser/service/notebook-kernel-service.ts @@ -0,0 +1,357 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Command, CommandRegistry, Disposable, Emitter, Event, URI } from '@theia/core'; +import { inject, injectable, postConstruct } from '@theia/core/shared/inversify'; +import { StorageService } from '@theia/core/lib/browser'; +import { NotebookKernelSourceAction } from '../../common'; +import { NotebookModel } from '../view-model/notebook-model'; +import { NotebookService } from './notebook-service'; + +export interface SelectedNotebookKernelChangeEvent { + notebook: URI; + oldKernel: string | undefined; + newKernel: string | undefined; +} + +export interface NotebookKernelMatchResult { + readonly selected: NotebookKernel | undefined; + readonly suggestions: NotebookKernel[]; + readonly all: NotebookKernel[]; + readonly hidden: NotebookKernel[]; +} + +export interface NotebookKernelChangeEvent { + label?: true; + description?: true; + detail?: true; + supportedLanguages?: true; + hasExecutionOrder?: true; + hasInterruptHandler?: true; +} + +export interface NotebookKernel { + readonly id: string; + readonly viewType: string; + readonly onDidChange: Event>; + readonly extension: string; + + readonly localResourceRoot: URI; + readonly preloadUris: URI[]; + readonly preloadProvides: string[]; + + label: string; + description?: string; + detail?: string; + supportedLanguages: string[]; + implementsInterrupt?: boolean; + implementsExecutionOrder?: boolean; + + executeNotebookCellsRequest(uri: URI, cellHandles: number[]): Promise; + cancelNotebookCellExecution(uri: URI, cellHandles: number[]): Promise; +} + +export const enum ProxyKernelState { + Disconnected = 1, + Connected = 2, + Initializing = 3 +} + +export interface INotebookProxyKernelChangeEvent extends NotebookKernelChangeEvent { + connectionState?: true; +} + +export interface NotebookKernelDetectionTask { + readonly notebookType: string; +} + +export interface NotebookTextModelLike { uri: URI; viewType: string } + +class KernelInfo { + + private static logicClock = 0; + + readonly kernel: NotebookKernel; + public score: number; + readonly time: number; + + constructor(kernel: NotebookKernel) { + this.kernel = kernel; + this.score = -1; + this.time = KernelInfo.logicClock++; + } +} + +export interface NotebookSourceActionChangeEvent { + notebook?: URI; + viewType: string; +} + +export interface KernelSourceActionProvider { + readonly viewType: string; + onDidChangeSourceActions?: Event; + provideKernelSourceActions(): Promise; +} + +export class SourceCommand implements Disposable { + execution: Promise | undefined; + protected readonly onDidChangeStateEmitter = new Emitter(); + readonly onDidChangeState = this.onDidChangeStateEmitter.event; + + constructor( + readonly commandRegistry: CommandRegistry, + readonly command: Command, + readonly model: NotebookTextModelLike, + readonly isPrimary: boolean + ) { } + + async run(): Promise { + if (this.execution) { + return this.execution; + } + + this.execution = this.runCommand(); + this.onDidChangeStateEmitter.fire(); + await this.execution; + this.execution = undefined; + this.onDidChangeStateEmitter.fire(); + } + + private async runCommand(): Promise { + try { + await this.commandRegistry.executeCommand(this.command.id, { + uri: this.model.uri, + }); + + } catch (error) { + console.warn(`Kernel source command failed: ${error}`); + } + } + + dispose(): void { + this.onDidChangeStateEmitter.dispose(); + } + +} + +const NOTEBOOK_KERNEL_BINDING_STORAGE_KEY = 'notebook.kernel.bindings'; +@injectable() +export class NotebookKernelService implements Disposable { + + @inject(NotebookService) + protected notebookService: NotebookService; + + @inject(StorageService) + protected storageService: StorageService; + + private readonly kernels = new Map(); + + private notebookBindings: { [key: string]: string } = {}; + + private readonly kernelDetectionTasks = new Map(); + private readonly onDidChangeKernelDetectionTasksEmitter = new Emitter(); + readonly onDidChangeKernelDetectionTasks = this.onDidChangeKernelDetectionTasksEmitter.event; + + private readonly onDidChangeSourceActionsEmitter = new Emitter(); + private readonly kernelSourceActionProviders = new Map(); + readonly onDidChangeSourceActions: Event = this.onDidChangeSourceActionsEmitter.event; + + private readonly onDidAddKernelEmitter = new Emitter(); + readonly onDidAddKernel: Event = this.onDidAddKernelEmitter.event; + + private readonly onDidRemoveKernelEmitter = new Emitter(); + readonly onDidRemoveKernel: Event = this.onDidRemoveKernelEmitter.event; + + private readonly onDidChangeSelectedNotebookKernelBindingEmitter = new Emitter(); + readonly onDidChangeSelectedKernel: Event = this.onDidChangeSelectedNotebookKernelBindingEmitter.event; + + private readonly onDidChangeNotebookAffinityEmitter = new Emitter(); + readonly onDidChangeNotebookAffinity: Event = this.onDidChangeNotebookAffinityEmitter.event; + + @postConstruct() + init(): void { + this.storageService.getData(NOTEBOOK_KERNEL_BINDING_STORAGE_KEY).then((value: { [key: string]: string } | undefined) => { + if (value) { + this.notebookBindings = value; + } + }); + } + + registerKernel(kernel: NotebookKernel): Disposable { + if (this.kernels.has(kernel.id)) { + throw new Error(`NOTEBOOK CONTROLLER with id '${kernel.id}' already exists`); + } + + this.kernels.set(kernel.id, new KernelInfo(kernel)); + this.onDidAddKernelEmitter.fire(kernel); + + // auto associate the new kernel to existing notebooks it was + // associated to in the past. + for (const notebook of this.notebookService.getNotebookModels()) { + this.tryAutoBindNotebook(notebook, kernel); + } + + return Disposable.create(() => { + if (this.kernels.delete(kernel.id)) { + this.onDidRemoveKernelEmitter.fire(kernel); + } + }); + } + + getMatchingKernel(notebook: NotebookTextModelLike): NotebookKernelMatchResult { + const kernels: { kernel: NotebookKernel; instanceAffinity: number; score: number }[] = []; + for (const info of this.kernels.values()) { + const score = NotebookKernelService.score(info.kernel, notebook); + if (score) { + kernels.push({ + score, + kernel: info.kernel, + instanceAffinity: 1 /* vscode.NotebookControllerPriority.Default */, + }); + } + } + + kernels + .sort((a, b) => b.instanceAffinity - a.instanceAffinity || a.score - b.score || a.kernel.label.localeCompare(b.kernel.label)); + const all = kernels.map(obj => obj.kernel); + + // bound kernel + const selectedId = this.notebookBindings[`${notebook.viewType}/${notebook.uri}`]; + const selected = selectedId ? this.kernels.get(selectedId)?.kernel : undefined; + const suggestions = kernels.filter(item => item.instanceAffinity > 1).map(item => item.kernel); // TODO implement notebookAffinity + const hidden = kernels.filter(item => item.instanceAffinity < 0).map(item => item.kernel); + return { all, selected, suggestions, hidden }; + + } + + selectKernelForNotebook(kernel: NotebookKernel | undefined, notebook: NotebookTextModelLike): void { + const key = `${notebook.viewType}/${notebook.uri}`; + const oldKernel = this.notebookBindings[key]; + if (oldKernel !== kernel?.id) { + if (kernel) { + this.notebookBindings[key] = kernel.id; + } else { + delete this.notebookBindings[key]; + } + this.storageService.setData(NOTEBOOK_KERNEL_BINDING_STORAGE_KEY, this.notebookBindings); + this.onDidChangeSelectedNotebookKernelBindingEmitter.fire({ notebook: notebook.uri, oldKernel, newKernel: kernel?.id }); + } + } + + getSelectedOrSuggestedKernel(notebook: NotebookModel): NotebookKernel | undefined { + const info = this.getMatchingKernel(notebook); + if (info.selected) { + return info.selected; + } + + return info.all.length === 1 ? info.all[0] : undefined; + } + + getKernel(id: string): NotebookKernel | undefined { + return this.kernels.get(id)?.kernel; + } + + private static score(kernel: NotebookKernel, notebook: NotebookTextModelLike): number { + if (kernel.viewType === '*') { + return 5; + } else if (kernel.viewType === notebook.viewType) { + return 10; + } else { + return 0; + } + } + + private tryAutoBindNotebook(notebook: NotebookModel, onlyThisKernel?: NotebookKernel): void { + + const id = this.notebookBindings[`${notebook.viewType}/${notebook.uri}`]; + if (!id) { + // no kernel associated + return; + } + const existingKernel = this.kernels.get(id); + if (!existingKernel || !NotebookKernelService.score(existingKernel.kernel, notebook)) { + // associated kernel not known, not matching + return; + } + if (!onlyThisKernel || existingKernel.kernel === onlyThisKernel) { + this.onDidChangeSelectedNotebookKernelBindingEmitter.fire({ notebook: notebook.uri, oldKernel: undefined, newKernel: existingKernel.kernel.id }); + } + } + + registerNotebookKernelDetectionTask(task: NotebookKernelDetectionTask): Disposable { + const notebookType = task.notebookType; + const all = this.kernelDetectionTasks.get(notebookType) ?? []; + all.push(task); + this.kernelDetectionTasks.set(notebookType, all); + this.onDidChangeKernelDetectionTasksEmitter.fire(notebookType); + return Disposable.create(() => { + const allTasks = this.kernelDetectionTasks.get(notebookType) ?? []; + const taskIndex = allTasks.indexOf(task); + if (taskIndex >= 0) { + allTasks.splice(taskIndex, 1); + this.kernelDetectionTasks.set(notebookType, allTasks); + this.onDidChangeKernelDetectionTasksEmitter.fire(notebookType); + } + }); + } + + getKernelDetectionTasks(notebook: NotebookTextModelLike): NotebookKernelDetectionTask[] { + return this.kernelDetectionTasks.get(notebook.viewType) ?? []; + } + + registerKernelSourceActionProvider(viewType: string, provider: KernelSourceActionProvider): Disposable { + const providers = this.kernelSourceActionProviders.get(viewType) ?? []; + providers.push(provider); + this.kernelSourceActionProviders.set(viewType, providers); + this.onDidChangeSourceActionsEmitter.fire({ viewType: viewType }); + + const eventEmitterDisposable = provider.onDidChangeSourceActions?.(() => { + this.onDidChangeSourceActionsEmitter.fire({ viewType: viewType }); + }); + + return Disposable.create(() => { + const sourceProviders = this.kernelSourceActionProviders.get(viewType) ?? []; + const providerIndex = sourceProviders.indexOf(provider); + if (providerIndex >= 0) { + sourceProviders.splice(providerIndex, 1); + this.kernelSourceActionProviders.set(viewType, sourceProviders); + } + + eventEmitterDisposable?.dispose(); + }); + } + + async getKernelSourceActionsFromProviders(notebook: NotebookTextModelLike): Promise { + const viewType = notebook.viewType; + const providers = this.kernelSourceActionProviders.get(viewType) ?? []; + const promises = providers.map(provider => provider.provideKernelSourceActions()); + const allActions = await Promise.all(promises); + return allActions.flat(); + } + + dispose(): void { + this.onDidChangeKernelDetectionTasksEmitter.dispose(); + this.onDidChangeSourceActionsEmitter.dispose(); + this.onDidAddKernelEmitter.dispose(); + this.onDidRemoveKernelEmitter.dispose(); + this.onDidChangeSelectedNotebookKernelBindingEmitter.dispose(); + this.onDidChangeNotebookAffinityEmitter.dispose(); + } +} diff --git a/packages/notebook/src/browser/service/notebook-model-resolver-service.ts b/packages/notebook/src/browser/service/notebook-model-resolver-service.ts new file mode 100644 index 0000000000000..07386ab739c0d --- /dev/null +++ b/packages/notebook/src/browser/service/notebook-model-resolver-service.ts @@ -0,0 +1,141 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { Emitter, URI } from '@theia/core'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { UriComponents } from '@theia/core/lib/common/uri'; +import { FileService } from '@theia/filesystem/lib/browser/file-service'; +import { CellKind, NotebookData } from '../../common'; +import { NotebookModel } from '../view-model/notebook-model'; +import { NotebookService } from './notebook-service'; +import { NotebookTypeRegistry } from '../notebook-type-registry'; +import { NotebookFileSelector } from '../../common/notebook-protocol'; + +export interface UntitledResource { + untitledResource: URI | undefined +} +@injectable() +export class NotebookModelResolverService { + + @inject(FileService) + protected fileService: FileService; + + @inject(NotebookService) + protected notebookService: NotebookService; + + @inject(NotebookTypeRegistry) + protected notebookTypeRegistry: NotebookTypeRegistry; + + protected onDidChangeDirtyEmitter = new Emitter(); + readonly onDidChangeDirty = this.onDidChangeDirtyEmitter.event; + protected onDidSaveNotebookEmitter = new Emitter(); + readonly onDidSaveNotebook = this.onDidSaveNotebookEmitter.event; + + async resolve(resource: URI, viewType?: string): Promise; + async resolve(resource: UntitledResource, viewType: string): Promise; + async resolve(arg: URI | UntitledResource, viewType: string): Promise { + let resource: URI; + // let hasAssociatedFilePath = false; + if (arg instanceof URI) { + resource = arg; + } else { + arg = arg as UntitledResource; + if (!arg.untitledResource) { + const notebookTypeInfo = this.notebookTypeRegistry.notebookTypes.find(info => info.type === viewType); + if (!notebookTypeInfo) { + throw new Error('UNKNOWN view type: ' + viewType); + } + + const suffix = this.getPossibleFileEndings(notebookTypeInfo.selector ?? []) ?? ''; + for (let counter = 1; ; counter++) { + const candidate = new URI() + .withScheme('untitled') + .withPath(`Untitled-notebook-${counter}${suffix}`) + .withQuery(viewType); + if (!this.notebookService.getNotebookEditorModel(candidate)) { + resource = candidate; + break; + } + } + } else if (arg.untitledResource.scheme === 'untitled') { + resource = arg.untitledResource; + } else { + resource = arg.untitledResource.withScheme('untitled'); + // hasAssociatedFilePath = true; + } + } + + const notebookData = await this.resolveExistingNotebookData(resource, viewType!); + + const notebookModel = await this.notebookService.createNotebookModel(notebookData, viewType, resource); + + notebookModel.onDirtyChanged(() => this.onDidChangeDirtyEmitter.fire(notebookModel)); + notebookModel.onDidSaveNotebook(() => this.onDidSaveNotebookEmitter.fire(notebookModel.uri.toComponents())); + + return notebookModel; + } + + protected async resolveExistingNotebookData(resource: URI, viewType: string): Promise { + if (resource.scheme === 'untitled') { + + return { + cells: [ + { + cellKind: CellKind.Markup, + language: 'markdown', + outputs: [], + source: '' + } + ], + metadata: {} + }; + } else { + const file = await this.fileService.readFile(resource); + + const dataProvider = await this.notebookService.getNotebookDataProvider(viewType); + const notebook = await dataProvider.serializer.dataToNotebook(file.value); + + return notebook; + } + } + + protected getPossibleFileEndings(selectors: readonly NotebookFileSelector[]): string | undefined { + for (const selector of selectors) { + const ending = this.possibleFileEnding(selector); + if (ending) { + return ending; + } + } + return undefined; + } + + protected possibleFileEnding(selector: NotebookFileSelector): string | undefined { + + const pattern = /^.*(\.[a-zA-Z0-9_-]+)$/; + + const candidate: string | undefined = typeof selector === 'string' ? selector : selector.filenamePattern; + + if (candidate) { + const match = pattern.exec(candidate); + if (match) { + return match[1]; + } + } + + return undefined; + } + +} diff --git a/packages/notebook/src/browser/service/notebook-renderer-messaging-service.ts b/packages/notebook/src/browser/service/notebook-renderer-messaging-service.ts new file mode 100644 index 0000000000000..923dafbb1db93 --- /dev/null +++ b/packages/notebook/src/browser/service/notebook-renderer-messaging-service.ts @@ -0,0 +1,111 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Emitter } from '@theia/core'; +import { injectable } from '@theia/core/shared/inversify'; +import { Disposable } from '@theia/core/shared/vscode-languageserver-protocol'; + +interface MessageToSend { + editorId: string; + rendererId: string; + message: unknown +}; + +export interface ScopedRendererMessaging extends Disposable { + /** + * Method called when a message is received. Should return a boolean + * indicating whether a renderer received it. + */ + receiveMessageHandler?: (rendererId: string, message: unknown) => Promise; + + /** + * Sends a message to an extension from a renderer. + */ + postMessage(rendererId: string, message: unknown): void; +} + +@injectable() +export class NotebookRendererMessagingService implements Disposable { + + private readonly postMessageEmitter = new Emitter(); + readonly onShouldPostMessage = this.postMessageEmitter.event; + + private readonly activations = new Map(); + private readonly scopedMessaging = new Map(); + + receiveMessage(editorId: string | undefined, rendererId: string, message: unknown): Promise { + if (editorId === undefined) { + const sends = [...this.scopedMessaging.values()].map(e => e.receiveMessageHandler?.(rendererId, message)); + return Promise.all(sends).then(values => values.some(value => !!value)); + } + + return this.scopedMessaging.get(editorId)?.receiveMessageHandler?.(rendererId, message) ?? Promise.resolve(false); + } + + prepare(rendererId: string): void { + if (this.activations.has(rendererId)) { + return; + } + + const queue: MessageToSend[] = []; + this.activations.set(rendererId, queue); + + // activate renderer + // this.extensionService.activateByEvent(`onRenderer:${rendererId}`).then(() => { + // for (const message of queue) { + // this.postMessageEmitter.fire(message); + // } + // this.activations.set(rendererId, undefined); + // }); + } + + public getScoped(editorId: string): ScopedRendererMessaging { + const existing = this.scopedMessaging.get(editorId); + if (existing) { + return existing; + } + + const messaging: ScopedRendererMessaging = { + postMessage: (rendererId, message) => this.postMessage(editorId, rendererId, message), + dispose: () => this.scopedMessaging.delete(editorId), + }; + + this.scopedMessaging.set(editorId, messaging); + return messaging; + } + + private postMessage(editorId: string, rendererId: string, message: unknown): void { + if (!this.activations.has(rendererId)) { + this.prepare(rendererId); + } + + const activation = this.activations.get(rendererId); + const toSend = { rendererId, editorId, message }; + if (activation === undefined) { + this.postMessageEmitter.fire(toSend); + } else { + activation.push(toSend); + } + } + + dispose(): void { + this.postMessageEmitter.dispose(); + } +} diff --git a/packages/notebook/src/browser/service/notebook-service.ts b/packages/notebook/src/browser/service/notebook-service.ts new file mode 100644 index 0000000000000..2bf7bc0c6c0da --- /dev/null +++ b/packages/notebook/src/browser/service/notebook-service.ts @@ -0,0 +1,178 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { Disposable, DisposableCollection, Emitter, URI } from '@theia/core'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { BinaryBuffer } from '@theia/core/lib/common/buffer'; +import { NotebookData, NotebookExtensionDescription, TransientOptions } from '../../common'; +import { NotebookModel, NotebookModelFactory, NotebookModelProps } from '../view-model/notebook-model'; +import { FileService } from '@theia/filesystem/lib/browser/file-service'; +import { MonacoTextModelService } from '@theia/monaco/lib/browser/monaco-text-model-service'; +import { NotebookCellModel, NotebookCellModelFactory, NotebookCellModelProps } from '../view-model/notebook-cell-model'; +import { Deferred } from '@theia/core/lib/common/promise-util'; + +export const NotebookProvider = Symbol('notebook provider'); + +export interface SimpleNotebookProviderInfo { + readonly notebookType: string, + readonly serializer: NotebookSerializer, + readonly extensionData: NotebookExtensionDescription +} + +export interface NotebookSerializer { + options: TransientOptions; + dataToNotebook(data: BinaryBuffer): Promise; + notebookToData(data: NotebookData): Promise; +} + +@injectable() +export class NotebookService implements Disposable { + + @inject(FileService) + protected fileService: FileService; + + @inject(MonacoTextModelService) + protected modelService: MonacoTextModelService; + + @inject(NotebookModelFactory) + protected notebookModelFactory: (props: NotebookModelProps) => NotebookModel; + + @inject(NotebookCellModelFactory) + protected notebookCellModelFactory: (props: NotebookCellModelProps) => NotebookCellModel; + + protected notebookSerializerEmitter = new Emitter(); + readonly onNotebookSerializer = this.notebookSerializerEmitter.event; + + protected readonly disposables = new DisposableCollection(); + + protected readonly notebookProviders = new Map(); + protected readonly notebookModels = new Map(); + + protected readonly didAddViewTypeEmitter = new Emitter(); + readonly onDidAddViewType = this.didAddViewTypeEmitter.event; + + protected readonly didRemoveViewTypeEmitter = new Emitter(); + readonly onDidRemoveViewType = this.didRemoveViewTypeEmitter.event; + + protected readonly willOpenNotebookTypeEmitter = new Emitter(); + readonly onWillOpenNotebook = this.willOpenNotebookTypeEmitter.event; + + protected readonly willAddNotebookDocumentEmitter = new Emitter(); + readonly onWillAddNotebookDocument = this.willAddNotebookDocumentEmitter.event; + protected readonly didAddNotebookDocumentEmitter = new Emitter(); + readonly onDidAddNotebookDocument = this.didAddNotebookDocumentEmitter.event; + protected readonly willRemoveNotebookDocumentEmitter = new Emitter(); + readonly onWillRemoveNotebookDocument = this.willRemoveNotebookDocumentEmitter.event; + protected readonly didRemoveNotebookDocumentEmitter = new Emitter(); + readonly onDidRemoveNotebookDocument = this.didRemoveNotebookDocumentEmitter.event; + + dispose(): void { + this.disposables.dispose(); + } + + protected readonly ready = new Deferred(); + + /** + * Marks the notebook service as ready. From this point on, the service will start dispatching the `onNotebookSerializer` event. + */ + markReady(): void { + this.ready.resolve(); + } + + registerNotebookSerializer(notebookType: string, extensionData: NotebookExtensionDescription, serializer: NotebookSerializer): Disposable { + if (this.notebookProviders.has(notebookType)) { + throw new Error(`notebook provider for viewtype '${notebookType}' already exists`); + } + + this.notebookProviders.set(notebookType, { notebookType: notebookType, serializer, extensionData }); + this.didAddViewTypeEmitter.fire(notebookType); + + return Disposable.create(() => { + this.notebookProviders.delete(notebookType); + this.didRemoveViewTypeEmitter.fire(notebookType); + }); + } + + async createNotebookModel(data: NotebookData, viewType: string, uri: URI): Promise { + const serializer = this.notebookProviders.get(viewType)?.serializer; + if (!serializer) { + throw new Error('no notebook serializer for ' + viewType); + } + + this.willAddNotebookDocumentEmitter.fire(uri); + const model = this.notebookModelFactory({ data, uri, viewType, serializer }); + this.notebookModels.set(uri.toString(), model); + // Resolve cell text models right after creating the notebook model + // This ensures that all text models are available in the plugin host + await Promise.all(model.cells.map(e => e.resolveTextModel())); + this.didAddNotebookDocumentEmitter.fire(model); + return model; + } + + async getNotebookDataProvider(viewType: string): Promise { + await this.ready.promise; + await this.notebookSerializerEmitter.sequence(async listener => listener(`onNotebookSerializer:${viewType}`)); + + const result = await this.waitForNotebookProvider(viewType); + if (!result) { + throw new Error(`No provider registered for view type: '${viewType}'`); + } + return result; + } + + /** + * When the application starts up, notebook providers from plugins are not registered yet. + * It takes a few seconds for the plugin host to start so that notebook data providers can be registered. + * This methods waits until the notebook provider is registered. + */ + protected async waitForNotebookProvider(type: string): Promise { + if (this.notebookProviders.has(type)) { + return this.notebookProviders.get(type); + } + const deferred = new Deferred(); + // 20 seconds of timeout + const timeoutDuration = 20_000; + const disposable = this.onDidAddViewType(viewType => { + if (viewType === type) { + clearTimeout(timeout); + disposable.dispose(); + deferred.resolve(this.notebookProviders.get(type)); + } + }); + const timeout = setTimeout(() => { + clearTimeout(timeout); + disposable.dispose(); + deferred.reject(); + }, timeoutDuration); + return deferred.promise; + } + + getNotebookEditorModel(uri: URI): NotebookModel | undefined { + return this.notebookModels.get(uri.toString()); + } + + getNotebookModels(): Iterable { + return this.notebookModels.values(); + } + + async willOpenNotebook(type: string): Promise { + return this.willOpenNotebookTypeEmitter.sequence(async listener => listener(type)); + } + + listNotebookDocuments(): NotebookModel[] { + return [...this.notebookModels.values()]; + } +} diff --git a/packages/notebook/src/browser/style/index.css b/packages/notebook/src/browser/style/index.css new file mode 100644 index 0000000000000..2c9b1844a0641 --- /dev/null +++ b/packages/notebook/src/browser/style/index.css @@ -0,0 +1,236 @@ +/******************************************************************************** + * Copyright (C) 2023 TypeFox and others. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the Eclipse + * Public License v. 2.0 are satisfied: GNU General Public License, version 2 + * with the GNU Classpath Exception which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 + ********************************************************************************/ + +:root { + --theia-notebook-markdown-size: 17px; +} + +.theia-notebook-cell-list { + overflow-y: auto; + list-style: none; + padding-left: 0px; + background-color: var(--theia-notebook-editorBackground); +} + +.theia-notebook-cell { + cursor: grab; + display: flex; + margin: 10px 0px; +} + +.theia-notebook-cell:hover .theia-notebook-cell-marker { + visibility: visible; +} + +.theia-notebook-cell-marker { + background-color: var(--theia-notebook-inactiveFocusedCellBorder); + width: 3px; + margin: 0px 8px 0px 4px; + border-radius: 4px; + visibility: hidden; +} + +.theia-notebook-cell-marker-selected { + visibility: visible; + background-color: var(--theia-notebook-focusedCellBorder); +} + +.theia-notebook-cell-marker:hover { + width: 5px; + margin: 0px 6px 0px 4px; +} + +.theia-notebook-cell-content { + flex: 1; + width: calc(100% - 15px); +} + +.theia-notebook-markdown-content { + padding: 8px 16px 8px 36px; + font-size: var(--theia-notebook-markdown-size); +} + +.theia-notebook-markdown-content > *:first-child { + margin-top: 0; + padding-top: 0; +} + +.theia-notebook-markdown-content > *:only-child, +.theia-notebook-markdown-content > *:last-child { + margin-bottom: 0; + padding-bottom: 0; +} + +.theia-notebook-empty-markdown { + opacity: 0.6; +} + +.theia-notebook-cell-editor { + padding: 10px 10px 0 10px; +} + +.theia-notebook-cell-editor-container { + width: calc(100% - 46px); + flex: 1; + outline: 1px solid var(--theia-notebook-cellBorderColor); + margin: 0px 10px; +} + +.theia-notebook-cell.focused .theia-notebook-cell-editor-container { + outline-color: var(--theia-notebook-focusedEditorBorder); +} + +.notebook-cell-status { + display: flex; + flex-direction: row; + font-size: 12px; + height: 16px; +} + +.notebook-cell-status-left { + display: flex; + flex-direction: row; + flex-grow: 1; +} + +.notebook-cell-status-right { + margin: 0 5px; +} + +.notebook-cell-status-item { + margin: 0 3px; + padding: 0 3px; + display: flex; + align-items: center; +} + +.theia-notebook-cell-toolbar { + border: 1px solid var(--theia-notebook-cellToolbarSeparator); + display: flex; + position: absolute; + margin: -20px 0 0 66px; + padding: 2px; + background-color: var(--theia-editor-background); +} + +.theia-notebook-cell-sidebar { + display: flex; + flex-direction: column; + padding: 2px; + background-color: var(--theia-editor-background); +} + +.theia-notebook-cell-toolbar-item { + height: 18px; + width: 18px; +} + +.theia-notebook-cell-toolbar-item:hover { + background-color: var(--theia-toolbar-hoverBackground); +} + +.theia-notebook-cell-toolbar-item:active { + background-color: var(--theia-toolbar-active); +} + +.theia-notebook-cell-divider { + height: 20px; + width: 100%; +} + +.theia-notebook-cell-with-sidebar { + display: flex; + flex-direction: row; +} + +.theia-notebook-cell-sidebar { + display: flex; + flex-direction: column; +} + +.theia-notebook-main-toolbar { + position: sticky; + top: 0; + background: var(--theia-editor-background); + display: flex; + flex-direction: row; + z-index: 1; + /*needed to be on rendered on top of monaco editors*/ +} + +.theia-notebook-main-toolbar-item { + height: 22px; + display: flex; + align-items: center; + margin: 0 4px; + padding: 2px; + text-align: center; + color: var(--theia-foreground) !important; + cursor: pointer; +} + +.theia-notebook-main-toolbar-item:hover { + background-color: var(--theia-toolbar-hoverBackground); +} + +.theia-notebook-main-toolbar-item-text { + padding: 0 4px; +} + +.theia-notebook-toolbar-separator { + width: 1px; + background-color: var(--theia-notebook-cellToolbarSeparator); + margin: 0 4px; +} + +.theia-notebook-add-cell-buttons { + justify-content: center; + display: flex; +} + +.theia-notebook-add-cell-button { + border: 1px solid var(--theia-notebook-cellToolbarSeparator); + background-color: var(--theia-editor-background); + color: var(--theia-foreground); + vertical-align: middle; + text-align: center; + height: 24px; + margin: 0 8px; +} + +.theia-notebook-add-cell-button:hover { + background-color: var(--theia-toolbar-hoverBackground); +} + +.theia-notebook-add-cell-button:active { + background-color: var(--theia-toolbar-active); +} + +.theia-notebook-add-cell-button-icon { + vertical-align: middle; +} + +.theia-notebook-cell-output-webview { + padding: 5px 0px; + margin: 0px 10px; + width: 100%; +} + +.theia-notebook-cell-drop-indicator { + height: 2px; + background-color: var(--theia-notebook-focusedCellBorder); + width: 100%; +} diff --git a/packages/notebook/src/browser/view-model/notebook-cell-model.ts b/packages/notebook/src/browser/view-model/notebook-cell-model.ts new file mode 100644 index 0000000000000..44551c8f19d40 --- /dev/null +++ b/packages/notebook/src/browser/view-model/notebook-cell-model.ts @@ -0,0 +1,271 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Disposable, DisposableCollection, Emitter, Event, URI } from '@theia/core'; +import { inject, injectable, interfaces, postConstruct } from '@theia/core/shared/inversify'; +import { MonacoEditorModel } from '@theia/monaco/lib/browser/monaco-editor-model'; +import { MonacoTextModelService } from '@theia/monaco/lib/browser/monaco-text-model-service'; +import { + CellInternalMetadataChangedEvent, CellKind, NotebookCellCollapseState, NotebookCellInternalMetadata, + NotebookCellMetadata, NotebookCellOutputsSplice, CellOutput, CellData, NotebookCell +} from '../../common'; +import { NotebookCellOutputModel } from './notebook-cell-output-model'; + +export const NotebookCellModelFactory = Symbol('NotebookModelFactory'); + +export function createNotebookCellModelContainer(parent: interfaces.Container, props: NotebookCellModelProps, + notebookCellContextManager: new (...args: never[]) => unknown): interfaces.Container { + const child = parent.createChild(); + + child.bind(NotebookCellModelProps).toConstantValue(props); + // We need the constructor as property here to avoid circular dependencies for the context manager + child.bind(NotebookCellContextManager).to(notebookCellContextManager).inSingletonScope(); + child.bind(NotebookCellModel).toSelf(); + + return child; +} + +const NotebookCellContextManager = Symbol('NotebookCellContextManager'); +interface NotebookCellContextManager { + updateCellContext(cell: NotebookCellModel, context: HTMLElement): void; + dispose(): void; + onDidChangeContext: Event; +} + +const NotebookCellModelProps = Symbol('NotebookModelProps'); +export interface NotebookCellModelProps { + readonly uri: URI, + readonly handle: number, + source: string, + language: string, + readonly cellKind: CellKind, + outputs: CellOutput[], + metadata?: NotebookCellMetadata | undefined, + internalMetadata?: NotebookCellInternalMetadata | undefined, + readonly collapseState?: NotebookCellCollapseState | undefined, + +} + +@injectable() +export class NotebookCellModel implements NotebookCell, Disposable { + + protected readonly onDidChangeOutputsEmitter = new Emitter(); + readonly onDidChangeOutputs: Event = this.onDidChangeOutputsEmitter.event; + + protected readonly onDidChangeOutputItemsEmitter = new Emitter(); + readonly onDidChangeOutputItems: Event = this.onDidChangeOutputItemsEmitter.event; + + protected readonly onDidChangeContentEmitter = new Emitter<'content' | 'language' | 'mime'>(); + readonly onDidChangeContent: Event<'content' | 'language' | 'mime'> = this.onDidChangeContentEmitter.event; + + protected readonly onDidChangeMetadataEmitter = new Emitter(); + readonly onDidChangeMetadata: Event = this.onDidChangeMetadataEmitter.event; + + protected readonly onDidChangeInternalMetadataEmitter = new Emitter(); + readonly onDidChangeInternalMetadata: Event = this.onDidChangeInternalMetadataEmitter.event; + + protected readonly onDidChangeLanguageEmitter = new Emitter(); + readonly onDidChangeLanguage: Event = this.onDidChangeLanguageEmitter.event; + + protected readonly onDidRequestCellEditChangeEmitter = new Emitter(); + readonly onDidRequestCellEditChange = this.onDidRequestCellEditChangeEmitter.event; + + @inject(NotebookCellContextManager) + readonly notebookCellContextManager: NotebookCellContextManager; + + @inject(NotebookCellModelProps) + protected readonly props: NotebookCellModelProps; + @inject(MonacoTextModelService) + protected readonly textModelService: MonacoTextModelService; + + get outputs(): NotebookCellOutputModel[] { + return this._outputs; + } + + protected _outputs: NotebookCellOutputModel[]; + + get metadata(): NotebookCellMetadata { + return this._metadata; + } + + protected _metadata: NotebookCellMetadata; + + protected toDispose = new DisposableCollection(); + + protected _internalMetadata: NotebookCellInternalMetadata; + + get internalMetadata(): NotebookCellInternalMetadata { + return this._internalMetadata; + } + + set internalMetadata(newInternalMetadata: NotebookCellInternalMetadata) { + const lastRunSuccessChanged = this._internalMetadata.lastRunSuccess !== newInternalMetadata.lastRunSuccess; + newInternalMetadata = { + ...newInternalMetadata, + ...{ runStartTimeAdjustment: computeRunStartTimeAdjustment(this._internalMetadata, newInternalMetadata) } + }; + this._internalMetadata = newInternalMetadata; + this.onDidChangeInternalMetadataEmitter.fire({ lastRunSuccessChanged }); + + } + + textModel: MonacoEditorModel; + + protected htmlContext: HTMLLIElement; + + get context(): HTMLLIElement { + return this.htmlContext; + } + + get textBuffer(): string { + return this.textModel ? this.textModel.getText() : this.source; + } + + get source(): string { + return this.props.source; + } + set source(source: string) { + this.props.source = source; + } + get language(): string { + return this.props.language; + } + + set language(newLanguage: string) { + if (this.language === newLanguage) { + return; + } + + this.props.language = newLanguage; + if (this.textModel) { + this.textModel.setLanguageId(newLanguage); + } + + this.language = newLanguage; + this.onDidChangeLanguageEmitter.fire(newLanguage); + this.onDidChangeContentEmitter.fire('language'); + } + + get uri(): URI { + return this.props.uri; + } + get handle(): number { + return this.props.handle; + } + get cellKind(): CellKind { + return this.props.cellKind; + } + + @postConstruct() + protected init(): void { + this._outputs = this.props.outputs.map(op => new NotebookCellOutputModel(op)); + this._metadata = this.props.metadata ?? {}; + this._internalMetadata = this.props.internalMetadata ?? {}; + } + + refChanged(node: HTMLLIElement): void { + if (node) { + this.htmlContext = node; + this.notebookCellContextManager.updateCellContext(this, node); + } + } + + dispose(): void { + this.onDidChangeOutputsEmitter.dispose(); + this.onDidChangeOutputItemsEmitter.dispose(); + this.onDidChangeContentEmitter.dispose(); + this.onDidChangeMetadataEmitter.dispose(); + this.onDidChangeInternalMetadataEmitter.dispose(); + this.onDidChangeLanguageEmitter.dispose(); + this.notebookCellContextManager.dispose(); + this.textModel.dispose(); + this.toDispose.dispose(); + } + + requestEdit(): void { + this.onDidRequestCellEditChangeEmitter.fire(true); + } + + requestStopEdit(): void { + this.onDidRequestCellEditChangeEmitter.fire(false); + } + + spliceNotebookCellOutputs(splice: NotebookCellOutputsSplice): void { + if (splice.deleteCount > 0 && splice.newOutputs.length > 0) { + const commonLen = Math.min(splice.deleteCount, splice.newOutputs.length); + // update + for (let i = 0; i < commonLen; i++) { + const currentOutput = this.outputs[splice.start + i]; + const newOutput = splice.newOutputs[i]; + + this.replaceOutputItems(currentOutput.outputId, newOutput); + } + + this.outputs.splice(splice.start + commonLen, splice.deleteCount - commonLen, ...splice.newOutputs.slice(commonLen).map(op => new NotebookCellOutputModel(op))); + this.onDidChangeOutputsEmitter.fire({ start: splice.start + commonLen, deleteCount: splice.deleteCount - commonLen, newOutputs: splice.newOutputs.slice(commonLen) }); + } else { + this.outputs.splice(splice.start, splice.deleteCount, ...splice.newOutputs.map(op => new NotebookCellOutputModel(op))); + this.onDidChangeOutputsEmitter.fire(splice); + } + } + + replaceOutputItems(outputId: string, newOutputItem: CellOutput): boolean { + const output = this.outputs.find(out => out.outputId === outputId); + + if (!output) { + return false; + } + + output.replaceData(newOutputItem); + this.onDidChangeOutputItemsEmitter.fire(); + return true; + } + + getData(): CellData { + return { + cellKind: this.cellKind, + language: this.language, + outputs: this.outputs.map(output => output.getData()), + source: this.textBuffer, + collapseState: this.props.collapseState, + internalMetadata: this.internalMetadata, + metadata: this.metadata + }; + } + + async resolveTextModel(): Promise { + if (this.textModel) { + return this.textModel; + } + + const ref = await this.textModelService.createModelReference(this.uri); + this.textModel = ref.object; + return ref.object; + } +} + +function computeRunStartTimeAdjustment(oldMetadata: NotebookCellInternalMetadata, newMetadata: NotebookCellInternalMetadata): number | undefined { + if (oldMetadata.runStartTime !== newMetadata.runStartTime && typeof newMetadata.runStartTime === 'number') { + const offset = Date.now() - newMetadata.runStartTime; + return offset < 0 ? Math.abs(offset) : 0; + } else { + return newMetadata.runStartTimeAdjustment; + } +} diff --git a/packages/notebook/src/browser/view-model/notebook-cell-output-model.ts b/packages/notebook/src/browser/view-model/notebook-cell-output-model.ts new file mode 100644 index 0000000000000..0e9205c4fcaf2 --- /dev/null +++ b/packages/notebook/src/browser/view-model/notebook-cell-output-model.ts @@ -0,0 +1,69 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { Disposable, Emitter } from '@theia/core'; +import { CellOutput, CellOutputItem } from '../../common'; + +export class NotebookCellOutputModel implements Disposable { + + private didChangeDataEmitter = new Emitter(); + readonly onDidChangeData = this.didChangeDataEmitter.event; + + private requestOutputPresentationChangeEmitter = new Emitter(); + readonly onRequestOutputPresentationChange = this.requestOutputPresentationChangeEmitter.event; + + get outputId(): string { + return this.rawOutput.outputId; + } + + get outputs(): CellOutputItem[] { + return this.rawOutput.outputs || []; + } + + get metadata(): Record | undefined { + return this.rawOutput.metadata; + } + + constructor(private rawOutput: CellOutput) { } + + replaceData(rawData: CellOutput): void { + this.rawOutput = rawData; + this.didChangeDataEmitter.fire(); + } + + appendData(items: CellOutputItem[]): void { + this.rawOutput.outputs.push(...items); + this.didChangeDataEmitter.fire(); + } + + dispose(): void { + this.didChangeDataEmitter.dispose(); + this.requestOutputPresentationChangeEmitter.dispose(); + } + + requestOutputPresentationUpdate(): void { + this.requestOutputPresentationChangeEmitter.fire(); + } + + getData(): CellOutput { + return { + outputs: this.outputs, + metadata: this.metadata, + outputId: this.outputId + }; + } + +} diff --git a/packages/notebook/src/browser/view-model/notebook-model.ts b/packages/notebook/src/browser/view-model/notebook-model.ts new file mode 100644 index 0000000000000..624ecedad58b5 --- /dev/null +++ b/packages/notebook/src/browser/view-model/notebook-model.ts @@ -0,0 +1,372 @@ +// ***************************************************************************** +// Copyright (C) 20023 Typefox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { Disposable, Emitter, URI } from '@theia/core'; +import { Saveable, SaveOptions } from '@theia/core/lib/browser'; +import { + CellData, + CellEditOperation, CellEditType, CellUri, NotebookCellInternalMetadata, + NotebookCellsChangeType, NotebookCellTextModelSplice, NotebookData, + NotebookDocumentMetadata, NotebookModelWillAddRemoveEvent, + NotebookTextModelChangedEvent, NullablePartialNotebookCellInternalMetadata +} from '../../common'; +import { NotebookSerializer } from '../service/notebook-service'; +import { FileService } from '@theia/filesystem/lib/browser/file-service'; +import { NotebookCellModel, NotebookCellModelFactory, NotebookCellModelProps } from './notebook-cell-model'; +import { MonacoTextModelService } from '@theia/monaco/lib/browser/monaco-text-model-service'; +import { inject, injectable, interfaces } from '@theia/core/shared/inversify'; +import { NotebookKernel } from '../service/notebook-kernel-service'; +import { UndoRedoService } from '@theia/editor/lib/browser/undo-redo-service'; + +export const NotebookModelFactory = Symbol('NotebookModelFactory'); + +export function createNotebookModelContainer(parent: interfaces.Container, props: NotebookModelProps): interfaces.Container { + const child = parent.createChild(); + + child.bind(NotebookModelProps).toConstantValue(props); + child.bind(NotebookModel).toSelf(); + + return child; +} + +const NotebookModelProps = Symbol('NotebookModelProps'); +export interface NotebookModelProps { + data: NotebookData, + uri: URI, + viewType: string, + serializer: NotebookSerializer, +} + +@injectable() +export class NotebookModel implements Saveable, Disposable { + + private readonly onDirtyChangedEmitter = new Emitter(); + readonly onDirtyChanged = this.onDirtyChangedEmitter.event; + + private readonly onDidSaveNotebookEmitter = new Emitter(); + readonly onDidSaveNotebook = this.onDidSaveNotebookEmitter.event; + + private readonly onDidAddOrRemoveCellEmitter = new Emitter(); + readonly onDidAddOrRemoveCell = this.onDidAddOrRemoveCellEmitter.event; + + private readonly onDidChangeContentEmitter = new Emitter(); + readonly onDidChangeContent = this.onDidChangeContentEmitter.event; + + @inject(FileService) + private readonly fileService: FileService; + + @inject(UndoRedoService) + private readonly undoRedoService: UndoRedoService; + + readonly autoSave: 'off' | 'afterDelay' | 'onFocusChange' | 'onWindowChange'; + + nextHandle: number = 0; + + kernel?: NotebookKernel; + + dirty: boolean; + selectedCell?: NotebookCellModel; + private dirtyCells: NotebookCellModel[] = []; + + cells: NotebookCellModel[]; + + get uri(): URI { + return this.props.uri; + } + + get viewType(): string { + return this.props.viewType; + } + + metadata: NotebookDocumentMetadata = {}; + + constructor(@inject(NotebookModelProps) private props: NotebookModelProps, + @inject(MonacoTextModelService) modelService: MonacoTextModelService, + @inject(NotebookCellModelFactory) private cellModelFactory: (props: NotebookCellModelProps) => NotebookCellModel) { + this.dirty = false; + + this.cells = props.data.cells.map((cell, index) => cellModelFactory({ + uri: CellUri.generate(props.uri, index), + handle: index, + source: cell.source, + language: cell.language, + cellKind: cell.cellKind, + outputs: cell.outputs, + metadata: cell.metadata, + internalMetadata: cell.internalMetadata, + collapseState: cell.collapseState + })); + + this.addCellOutputListeners(this.cells); + + this.metadata = this.metadata; + + modelService.onDidCreate(editorModel => { + const modelUri = new URI(editorModel.uri); + if (modelUri.scheme === CellUri.scheme) { + const cellUri = CellUri.parse(modelUri); + if (cellUri && cellUri.notebook.isEqual(this.uri)) { + const cell = this.cells.find(c => c.handle === cellUri.handle); + if (cell) { + cell.textModel = editorModel; + } + } + } + }); + this.nextHandle = this.cells.length; + } + + dispose(): void { + this.onDirtyChangedEmitter.dispose(); + this.onDidSaveNotebookEmitter.dispose(); + this.onDidAddOrRemoveCellEmitter.dispose(); + this.onDidChangeContentEmitter.dispose(); + this.cells.forEach(cell => cell.dispose()); + } + + async save(options: SaveOptions): Promise { + this.dirtyCells = []; + this.dirty = false; + this.onDirtyChangedEmitter.fire(); + + const serializedNotebook = await this.props.serializer.notebookToData({ + cells: this.cells.map(cell => cell.getData()), + metadata: this.metadata + }); + this.fileService.writeFile(this.uri, serializedNotebook); + + this.onDidSaveNotebookEmitter.fire(); + } + + createSnapshot(): Saveable.Snapshot { + const model = this; + return { + read(): string { + return JSON.stringify({ + cells: model.cells.map(cell => cell.getData()), + metadata: model.metadata + }); + } + }; + } + + async revert(options?: Saveable.RevertOptions): Promise { + this.dirty = false; + this.onDirtyChangedEmitter.fire(); + } + + isDirty(): boolean { + return this.dirty; + } + + cellDirtyChanged(cell: NotebookCellModel, dirtyState: boolean): void { + if (dirtyState) { + this.dirtyCells.push(cell); + } else { + this.dirtyCells.splice(this.dirtyCells.indexOf(cell), 1); + } + + const oldDirtyState = this.dirty; + this.dirty = this.dirtyCells.length > 0; + if (this.dirty !== oldDirtyState) { + this.onDirtyChangedEmitter.fire(); + } + } + + undo(): void { + // TODO we probably need to check if a monaco editor is focused and if so, not undo + this.undoRedoService.undo(this.uri); + } + + redo(): void { + // TODO see undo + this.undoRedoService.redo(this.uri); + } + + setSelectedCell(cell: NotebookCellModel): void { + this.selectedCell = cell; + } + + private addCellOutputListeners(cells: NotebookCellModel[]): void { + for (const cell of cells) { + cell.onDidChangeOutputs(() => { + this.dirty = true; + this.onDirtyChangedEmitter.fire(); + }); + } + } + + applyEdits(rawEdits: CellEditOperation[], computeUndoRedo: boolean): void { + const editsWithDetails = rawEdits.map((edit, index) => { + let cellIndex: number = -1; + if ('index' in edit) { + cellIndex = edit.index; + } else if ('handle' in edit) { + cellIndex = this.getCellIndexByHandle(edit.handle); + } + + return { + edit, + cellIndex, + end: edit.editType === CellEditType.Replace ? edit.index + edit.count : cellIndex, + originalIndex: index + }; + }).filter(edit => !!edit); + + for (const { edit, cellIndex } of editsWithDetails) { + const cell = this.cells[cellIndex]; + if (cell) { + this.cellDirtyChanged(cell, true); + } + switch (edit.editType) { + case CellEditType.Replace: + this.replaceCells(edit.index, edit.count, edit.cells, computeUndoRedo); + break; + case CellEditType.Output: { + if (edit.append) { + cell.spliceNotebookCellOutputs({ deleteCount: 0, newOutputs: edit.outputs, start: cell.outputs.length }); + } else { + // could definitely be more efficient. See vscode __spliceNotebookCellOutputs2 + // For now, just replace the whole existing output with the new output + cell.spliceNotebookCellOutputs({ start: 0, deleteCount: cell.outputs.length, newOutputs: edit.outputs }); + } + + break; + } + case CellEditType.OutputItems: + break; + case CellEditType.Metadata: + this.updateNotebookMetadata(edit.metadata, computeUndoRedo); + break; + case CellEditType.PartialInternalMetadata: + this.changeCellInternalMetadataPartial(this.cells[cellIndex], edit.internalMetadata); + break; + case CellEditType.CellLanguage: + this.changeCellLanguage(this.cells[cellIndex], edit.language, computeUndoRedo); + break; + case CellEditType.DocumentMetadata: + break; + case CellEditType.Move: + this.moveCellToIndex(cellIndex, edit.length, edit.newIdx, computeUndoRedo); + break; + + } + } + } + + private replaceCells(start: number, deleteCount: number, newCells: CellData[], computeUndoRedo: boolean): void { + const cells = newCells.map(cell => { + const handle = this.nextHandle++; + return this.cellModelFactory({ + uri: CellUri.generate(this.uri, handle), + handle: handle, + source: cell.source, + language: cell.language, + cellKind: cell.cellKind, + outputs: cell.outputs, + metadata: cell.metadata, + internalMetadata: cell.internalMetadata, + collapseState: cell.collapseState + }); + }); + this.addCellOutputListeners(cells); + + const changes: NotebookCellTextModelSplice[] = [[start, deleteCount, cells]]; + + const deletedCells = this.cells.splice(start, deleteCount, ...cells); + + for (const cell of deletedCells) { + cell.dispose(); + } + + if (computeUndoRedo) { + this.undoRedoService.pushElement(this.uri, + async () => this.replaceCells(start, newCells.length, deletedCells.map(cell => cell.getData()), false), + async () => this.replaceCells(start, deleteCount, newCells, false)); + } + + this.onDidAddOrRemoveCellEmitter.fire({ rawEvent: { kind: NotebookCellsChangeType.ModelChange, changes } }); + this.onDidChangeContentEmitter.fire({ rawEvents: [{ kind: NotebookCellsChangeType.ModelChange, changes }] }); + } + + private changeCellInternalMetadataPartial(cell: NotebookCellModel, internalMetadata: NullablePartialNotebookCellInternalMetadata): void { + const newInternalMetadata: NotebookCellInternalMetadata = { + ...cell.internalMetadata + }; + let k: keyof NotebookCellInternalMetadata; + // eslint-disable-next-line guard-for-in + for (k in internalMetadata) { + newInternalMetadata[k] = (internalMetadata[k] ?? undefined) as never; + } + + cell.internalMetadata = newInternalMetadata; + this.onDidChangeContentEmitter.fire({ + rawEvents: [ + { kind: NotebookCellsChangeType.ChangeCellInternalMetadata, index: this.cells.indexOf(cell), internalMetadata: newInternalMetadata } + ] + }); + } + + private updateNotebookMetadata(metadata: NotebookDocumentMetadata, computeUndoRedo: boolean): void { + const oldMetadata = this.metadata; + if (computeUndoRedo) { + this.undoRedoService.pushElement(this.uri, + async () => this.updateNotebookMetadata(oldMetadata, false), + async () => this.updateNotebookMetadata(metadata, false) + ); + } + + this.metadata = metadata; + this.onDidChangeContentEmitter.fire({ + rawEvents: [{ kind: NotebookCellsChangeType.ChangeDocumentMetadata, metadata: this.metadata }], + synchronous: true, + }); + } + + private changeCellLanguage(cell: NotebookCellModel, languageId: string, computeUndoRedo: boolean): void { + if (cell.language === languageId) { + return; + } + + cell.language = languageId; + + this.onDidChangeContentEmitter.fire({ + rawEvents: [{ kind: NotebookCellsChangeType.ChangeCellLanguage, index: this.cells.indexOf(cell), language: languageId }], + synchronous: true, + }); + } + + private moveCellToIndex(fromIndex: number, length: number, toIndex: number, computeUndoRedo: boolean): boolean { + if (computeUndoRedo) { + this.undoRedoService.pushElement(this.uri, + async () => { this.moveCellToIndex(toIndex, length, fromIndex, false); }, + async () => { this.moveCellToIndex(fromIndex, length, toIndex, false); } + ); + } + + const cells = this.cells.splice(fromIndex, length); + this.cells.splice(toIndex, 0, ...cells); + this.onDidChangeContentEmitter.fire({ + rawEvents: [{ kind: NotebookCellsChangeType.Move, index: fromIndex, length, newIdx: toIndex, cells }], + }); + + return true; + } + + private getCellIndexByHandle(handle: number): number { + return this.cells.findIndex(c => c.handle === handle); + } +} diff --git a/packages/notebook/src/browser/view/notebook-cell-editor.tsx b/packages/notebook/src/browser/view/notebook-cell-editor.tsx new file mode 100644 index 0000000000000..da6afb8e97ee4 --- /dev/null +++ b/packages/notebook/src/browser/view/notebook-cell-editor.tsx @@ -0,0 +1,97 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import * as React from '@theia/core/shared/react'; +import { NotebookModel } from '../view-model/notebook-model'; +import { NotebookCellModel } from '../view-model/notebook-cell-model'; +import { MonacoCodeEditor } from '@theia/monaco/lib/browser/monaco-code-editor'; +import { MonacoEditorServices } from '@theia/monaco/lib/browser/monaco-editor'; +import { MonacoEditorProvider } from '@theia/monaco/lib/browser/monaco-editor-provider'; +import { DisposableCollection } from '@theia/core'; + +interface CellEditorProps { + notebookModel: NotebookModel, + cell: NotebookCellModel, + monacoServices: MonacoEditorServices +} + +const DEFAULT_EDITOR_OPTIONS = { + ...MonacoEditorProvider.inlineOptions, + minHeight: -1, + maxHeight: -1, + scrollbar: { + ...MonacoEditorProvider.inlineOptions.scrollbar, + alwaysConsumeMouseWheel: false + } +}; + +export class CellEditor extends React.Component { + + protected editor?: MonacoCodeEditor; + protected toDispose = new DisposableCollection(); + protected container?: HTMLDivElement; + + override componentDidMount(): void { + this.disposeEditor(); + this.initEditor(); + } + + override componentWillUnmount(): void { + this.disposeEditor(); + } + + protected disposeEditor(): void { + this.toDispose.dispose(); + this.toDispose = new DisposableCollection(); + } + + protected async initEditor(): Promise { + const { cell, notebookModel, monacoServices } = this.props; + if (this.container) { + const editorNode = this.container; + const editorModel = await cell.resolveTextModel(); + const uri = cell.uri; + this.editor = new MonacoCodeEditor(uri, + editorModel, + editorNode, + monacoServices, + DEFAULT_EDITOR_OPTIONS); + this.toDispose.push(this.editor); + this.editor.setLanguage(cell.language); + this.toDispose.push(this.editor.getControl().onDidContentSizeChange(() => { + editorNode.style.height = this.editor!.getControl().getContentHeight() + 7 + 'px'; + this.editor!.setSize({ width: -1, height: this.editor!.getControl().getContentHeight() }); + })); + this.toDispose.push(this.editor.onDocumentContentChanged(e => { + notebookModel.cellDirtyChanged(cell, true); + cell.source = e.document.getText(); + })); + } + } + + protected assignRef = (component: HTMLDivElement) => { + this.container = component; + }; + + protected handleResize = () => { + this.editor?.refresh(); + }; + + override render(): React.ReactNode { + return
; + } + +} diff --git a/packages/notebook/src/browser/view/notebook-cell-list-view.tsx b/packages/notebook/src/browser/view/notebook-cell-list-view.tsx new file mode 100644 index 0000000000000..ada36f51fc247 --- /dev/null +++ b/packages/notebook/src/browser/view/notebook-cell-list-view.tsx @@ -0,0 +1,171 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** +import * as React from '@theia/core/shared/react'; +import { CellEditType, CellKind } from '../../common'; +import { NotebookCellModel } from '../view-model/notebook-cell-model'; +import { NotebookModel } from '../view-model/notebook-model'; +import { NotebookCellToolbarFactory } from './notebook-cell-toolbar-factory'; +import { codicon } from '@theia/core/lib/browser'; +import { CommandRegistry, DisposableCollection, nls } from '@theia/core'; +import { NotebookCommands } from '../contributions/notebook-actions-contribution'; +import { NotebookCellActionContribution } from '../contributions/notebook-cell-actions-contribution'; + +export interface CellRenderer { + render(notebookData: NotebookModel, cell: NotebookCellModel, index: number): React.ReactNode +} + +interface CellListProps { + renderers: Map; + notebookModel: NotebookModel; + toolbarRenderer: NotebookCellToolbarFactory; + commandRegistry: CommandRegistry +} + +interface NotebookCellListState { + selectedCell?: NotebookCellModel; + dragOverIndicator: { cell: NotebookCellModel, position: 'top' | 'bottom' } | undefined; +} + +export class NotebookCellListView extends React.Component { + + protected toDispose = new DisposableCollection(); + + constructor(props: CellListProps) { + super(props); + this.state = { selectedCell: undefined, dragOverIndicator: undefined }; + this.toDispose.push(props.notebookModel.onDidAddOrRemoveCell(e => { + this.setState({ selectedCell: undefined }); + })); + } + + override componentWillUnmount(): void { + this.toDispose.dispose(); + } + + override render(): React.ReactNode { + return
    + {this.props.notebookModel.cells + .map((cell, index) => + + this.onAddNewCell(kind, index)} + onDrop={e => this.onDrop(e, index)} + onDragOver={e => this.onDragOver(e, cell, 'top')} /> + {this.shouldRenderDragOverIndicator(cell, 'top') && } +
  • { + this.setState({ selectedCell: cell }); + this.props.notebookModel.setSelectedCell(cell); + }} + onDragStart={e => this.onDragStart(e, index)} + onDragOver={e => this.onDragOver(e, cell)} + onDrop={e => this.onDrop(e, index)} + draggable={true} + ref={(node: HTMLLIElement) => cell.refChanged(node)}> +
    +
    + {this.renderCellContent(cell, index)} +
    + {this.state.selectedCell === cell && + this.props.toolbarRenderer.renderCellToolbar(NotebookCellActionContribution.ACTION_MENU, this.props.notebookModel, cell)} +
  • + {this.shouldRenderDragOverIndicator(cell, 'bottom') && } +
    + ) + } + this.onAddNewCell(kind, this.props.notebookModel.cells.length)} + onDrop={e => this.onDrop(e, this.props.notebookModel.cells.length - 1)} + onDragOver={e => this.onDragOver(e, this.props.notebookModel.cells[this.props.notebookModel.cells.length - 1], 'bottom')} /> +
; + } + + renderCellContent(cell: NotebookCellModel, index: number): React.ReactNode { + const renderer = this.props.renderers.get(cell.cellKind); + if (!renderer) { + throw new Error(`No renderer found for cell type ${cell.cellKind}`); + } + return renderer.render(this.props.notebookModel, cell, index); + } + + protected onDragStart(event: React.DragEvent, index: number): void { + event.stopPropagation(); + event.dataTransfer.setData('text/notebook-cell-index', index.toString()); + } + + protected onDragOver(event: React.DragEvent, cell: NotebookCellModel, position?: 'top' | 'bottom'): void { + event.preventDefault(); + event.stopPropagation(); + // show indicator + this.setState({ ...this.state, dragOverIndicator: { cell, position: position ?? event.nativeEvent.offsetY < event.currentTarget.clientHeight / 2 ? 'top' : 'bottom' } }); + } + + protected onDrop(event: React.DragEvent, dropElementIndex: number): void { + const index = parseInt(event.dataTransfer.getData('text/notebook-cell-index')); + const isTargetBelow = index < dropElementIndex; + let newIdx = this.state.dragOverIndicator?.position === 'top' ? dropElementIndex : dropElementIndex + 1; + newIdx = isTargetBelow ? newIdx - 1 : newIdx; + if (index !== undefined && index !== dropElementIndex) { + this.props.notebookModel.applyEdits([{ + editType: CellEditType.Move, + length: 1, + index, + newIdx + }], true); + } + this.setState({ ...this.state, dragOverIndicator: undefined }); + } + + protected onAddNewCell(kind: CellKind, index: number): void { + this.props.commandRegistry.executeCommand(NotebookCommands.ADD_NEW_CELL_COMMAND.id, + this.props.notebookModel, + kind, + index + ); + } + + protected shouldRenderDragOverIndicator(cell: NotebookCellModel, position: 'top' | 'bottom'): boolean { + return this.state.dragOverIndicator !== undefined && + this.state.dragOverIndicator.cell === cell && + this.state.dragOverIndicator.position === position; + } + +} + +export interface NotebookCellDividerProps { + onAddNewCell: (type: CellKind) => void; + onDrop: (event: React.DragEvent) => void; + onDragOver: (event: React.DragEvent) => void; +} + +export function NotebookCellDivider({ onAddNewCell, onDrop, onDragOver }: NotebookCellDividerProps): React.JSX.Element { + const [hover, setHover] = React.useState(false); + + return
  • setHover(true)} onMouseLeave={() => setHover(false)} onDrop={onDrop} onDragOver={onDragOver}> + {hover &&
    + + +
    } +
  • ; +} + +function CellDropIndicator(): React.JSX.Element { + return
    ; +} diff --git a/packages/notebook/src/browser/view/notebook-cell-toolbar-factory.tsx b/packages/notebook/src/browser/view/notebook-cell-toolbar-factory.tsx new file mode 100644 index 0000000000000..31fb3a15d2e5c --- /dev/null +++ b/packages/notebook/src/browser/view/notebook-cell-toolbar-factory.tsx @@ -0,0 +1,91 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import * as React from '@theia/core/shared/react'; +import { CommandRegistry, CompoundMenuNodeRole, MenuModelRegistry, MenuNode } from '@theia/core'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { ContextKeyService } from '@theia/core/lib/browser/context-key-service'; +import { NotebookCellSidebar, NotebookCellToolbar } from './notebook-cell-toolbar'; +import { ContextMenuRenderer } from '@theia/core/lib/browser'; +import { NotebookModel } from '../view-model/notebook-model'; +import { NotebookCellModel } from '../view-model/notebook-cell-model'; +import { NotebookCellOutputModel } from '../view-model/notebook-cell-output-model'; + +export interface NotebookCellToolbarItem { + id: string; + icon?: string; + label?: string; + onClick: (e: React.MouseEvent) => void; +} + +@injectable() +export class NotebookCellToolbarFactory { + + @inject(MenuModelRegistry) + protected menuRegistry: MenuModelRegistry; + + @inject(ContextKeyService) + protected contextKeyService: ContextKeyService; + + @inject(ContextMenuRenderer) + protected readonly contextMenuRenderer: ContextMenuRenderer; + + @inject(CommandRegistry) + protected readonly commandRegistry: CommandRegistry; + + renderCellToolbar(menuPath: string[], notebookModel: NotebookModel, cell: NotebookCellModel): React.ReactNode { + return this.getMenuItems(menuPath, notebookModel, cell)} + onContextKeysChanged={cell.notebookCellContextManager.onDidChangeContext} />; + } + + renderSidebar(menuPath: string[], notebookModel: NotebookModel, cell: NotebookCellModel, output?: NotebookCellOutputModel): React.ReactNode { + return this.getMenuItems(menuPath, notebookModel, cell, output)} + onContextKeysChanged={cell.notebookCellContextManager.onDidChangeContext} />; + } + + private getMenuItems(menuItemPath: string[], notebookModel: NotebookModel, cell: NotebookCellModel, output?: NotebookCellOutputModel): NotebookCellToolbarItem[] { + const inlineItems: NotebookCellToolbarItem[] = []; + + for (const menuNode of this.menuRegistry.getMenu(menuItemPath).children) { + if (!menuNode.when || this.contextKeyService.match(menuNode.when, cell.context ?? undefined)) { + if (menuNode.role === CompoundMenuNodeRole.Flat) { + inlineItems.push(...menuNode.children?.map(child => this.createToolbarItem(child, notebookModel, cell, output)) ?? []); + } else { + inlineItems.push(this.createToolbarItem(menuNode, notebookModel, cell, output)); + } + } + } + return inlineItems; + } + + private createToolbarItem(menuNode: MenuNode, notebookModel: NotebookModel, cell: NotebookCellModel, output?: NotebookCellOutputModel): NotebookCellToolbarItem { + const menuPath = menuNode.role === CompoundMenuNodeRole.Submenu ? this.menuRegistry.getPath(menuNode) : undefined; + return { + id: menuNode.id, + icon: menuNode.icon, + label: menuNode.label, + onClick: menuPath ? + e => this.contextMenuRenderer.render( + { + anchor: e.nativeEvent, + menuPath, + includeAnchorArg: false, + args: [notebookModel, cell, output] + }) : + () => this.commandRegistry.executeCommand(menuNode.command!, notebookModel, cell, output) + }; + } +} diff --git a/packages/notebook/src/browser/view/notebook-cell-toolbar.tsx b/packages/notebook/src/browser/view/notebook-cell-toolbar.tsx new file mode 100644 index 0000000000000..d1e366eb43b1b --- /dev/null +++ b/packages/notebook/src/browser/view/notebook-cell-toolbar.tsx @@ -0,0 +1,70 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** +import * as React from '@theia/core/shared/react'; +import { ACTION_ITEM } from '@theia/core/lib/browser'; +import { NotebookCellToolbarItem } from './notebook-cell-toolbar-factory'; +import { DisposableCollection, Event } from '@theia/core'; + +export interface NotebookCellToolbarProps { + getMenuItems: () => NotebookCellToolbarItem[]; + onContextKeysChanged: Event; +} + +interface NotebookCellToolbarState { + inlineItems: NotebookCellToolbarItem[]; +} + +abstract class NotebookCellActionItems extends React.Component { + + protected toDispose = new DisposableCollection(); + + constructor(props: NotebookCellToolbarProps) { + super(props); + this.toDispose.push(props.onContextKeysChanged(e => { + this.setState({ inlineItems: this.props.getMenuItems() }); + })); + this.state = { inlineItems: this.props.getMenuItems() }; + } + + override componentWillUnmount(): void { + this.toDispose.dispose(); + } + + protected renderItem(item: NotebookCellToolbarItem): React.ReactNode { + return
    ; + } + +} + +export class NotebookCellToolbar extends NotebookCellActionItems { + + override render(): React.ReactNode { + return
    + {this.state.inlineItems.map(item => this.renderItem(item))} +
    ; + } + +} + +export class NotebookCellSidebar extends NotebookCellActionItems { + + override render(): React.ReactNode { + return
    + {this.state.inlineItems.map(item => this.renderItem(item))} +
    ; + } +} + diff --git a/packages/notebook/src/browser/view/notebook-code-cell-view.tsx b/packages/notebook/src/browser/view/notebook-code-cell-view.tsx new file mode 100644 index 0000000000000..4ef29d2c375e8 --- /dev/null +++ b/packages/notebook/src/browser/view/notebook-code-cell-view.tsx @@ -0,0 +1,190 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { inject, injectable } from '@theia/core/shared/inversify'; +import * as React from '@theia/core/shared/react'; +import { MonacoEditorServices } from '@theia/monaco/lib/browser/monaco-editor'; +import { CellOutputWebviewFactory, CellOutputWebview } from '../renderers/cell-output-webview'; +import { NotebookRendererRegistry } from '../notebook-renderer-registry'; +import { NotebookCellModel } from '../view-model/notebook-cell-model'; +import { NotebookModel } from '../view-model/notebook-model'; +import { CellEditor } from './notebook-cell-editor'; +import { CellRenderer } from './notebook-cell-list-view'; +import { NotebookCellToolbarFactory } from './notebook-cell-toolbar-factory'; +import { NotebookCellActionContribution } from '../contributions/notebook-cell-actions-contribution'; +import { CellExecution, NotebookExecutionStateService } from '../service/notebook-execution-state-service'; +import { codicon } from '@theia/core/lib/browser'; +import { NotebookCellExecutionState } from '../../common'; +import { DisposableCollection } from '@theia/core'; + +@injectable() +export class NotebookCodeCellRenderer implements CellRenderer { + @inject(MonacoEditorServices) + protected readonly monacoServices: MonacoEditorServices; + + @inject(NotebookRendererRegistry) + protected readonly notebookRendererRegistry: NotebookRendererRegistry; + + @inject(CellOutputWebviewFactory) + protected readonly cellOutputWebviewFactory: CellOutputWebviewFactory; + + @inject(NotebookCellToolbarFactory) + protected readonly notebookCellToolbarFactory: NotebookCellToolbarFactory; + + @inject(NotebookExecutionStateService) + protected readonly executionStateService: NotebookExecutionStateService; + + render(notebookModel: NotebookModel, cell: NotebookCellModel, handle: number): React.ReactNode { + return
    +
    +
    + {this.notebookCellToolbarFactory.renderSidebar(NotebookCellActionContribution.CODE_CELL_SIDEBAR_MENU, notebookModel, cell)} + {/* cell-execution-order needs an own component. Could be a little more complicated +

    {`[${cell.exec ?? ' '}]`}

    */} +
    +
    + + +
    +
    +
    + + this.notebookCellToolbarFactory.renderSidebar(NotebookCellActionContribution.OUTPUT_SIDEBAR_MENU, notebookModel, cell, cell.outputs[0])} /> +
    +
    ; + } +} + +export interface NotebookCodeCellStatusProps { + cell: NotebookCellModel; + executionStateService: NotebookExecutionStateService +} + +export class NotebookCodeCellStatus extends React.Component { + + protected toDispose = new DisposableCollection(); + + constructor(props: NotebookCodeCellStatusProps) { + super(props); + + this.state = {}; + + this.toDispose.push(props.executionStateService.onDidChangeExecution(event => { + if (event.affectsCell(this.props.cell.uri)) { + this.setState({ currentExecution: event.changed }); + } + })); + } + + override componentWillUnmount(): void { + this.toDispose.dispose(); + } + + override render(): React.ReactNode { + return
    +
    + {this.renderExecutionState()} +
    +
    + {this.props.cell.language} +
    +
    ; + } + + private renderExecutionState(): React.ReactNode { + const state = this.state.currentExecution?.state; + const { lastRunSuccess } = this.props.cell.internalMetadata; + + let iconClasses: string | undefined = undefined; + let color: string | undefined = undefined; + if (!state && lastRunSuccess) { + iconClasses = codicon('check'); + color = 'green'; + } else if (!state && lastRunSuccess === false) { + iconClasses = codicon('error'); + color = 'red'; + } else if (state === NotebookCellExecutionState.Pending || state === NotebookCellExecutionState.Unconfirmed) { + iconClasses = codicon('clock'); + } else if (state === NotebookCellExecutionState.Executing) { + iconClasses = `${codicon('sync')} theia-animation-spin`; + } + return <> + {iconClasses && + <> + +
    {this.getExecutionTime()}
    + } + ; + } + + private getExecutionTime(): string { + const { runStartTime, runEndTime } = this.props.cell.internalMetadata; + if (runStartTime && runEndTime) { + return `${((runEndTime - runStartTime) / 1000).toLocaleString(undefined, { maximumFractionDigits: 1, minimumFractionDigits: 1 })}s`; + } + return '0.0s'; + } +} + +interface NotebookCellOutputProps { + cell: NotebookCellModel; + outputWebviewFactory: CellOutputWebviewFactory; + renderSidebar: () => React.ReactNode; +} + +export class NotebookCodeCellOutputs extends React.Component { + + protected outputsWebview: CellOutputWebview | undefined; + + constructor(props: NotebookCellOutputProps) { + super(props); + } + + override async componentDidMount(): Promise { + const { cell, outputWebviewFactory } = this.props; + cell.onDidChangeOutputs(async () => { + if (!this.outputsWebview && cell.outputs.length > 0) { + this.outputsWebview = await outputWebviewFactory(cell); + } else if (this.outputsWebview && cell.outputs.length === 0) { + this.outputsWebview.dispose(); + this.outputsWebview = undefined; + } + this.forceUpdate(); + }); + if (cell.outputs.length > 0) { + this.outputsWebview = await outputWebviewFactory(cell); + this.forceUpdate(); + } + } + + override componentDidUpdate(): void { + if (!this.outputsWebview?.isAttached()) { + this.outputsWebview?.attachWebview(); + } + } + + override render(): React.ReactNode { + return this.outputsWebview ? + <> + {this.props.renderSidebar()} + {this.outputsWebview.render()} + : + <>; + + } + +} diff --git a/packages/notebook/src/browser/view/notebook-main-toolbar.tsx b/packages/notebook/src/browser/view/notebook-main-toolbar.tsx new file mode 100644 index 0000000000000..bc12319b10ca5 --- /dev/null +++ b/packages/notebook/src/browser/view/notebook-main-toolbar.tsx @@ -0,0 +1,115 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** +import { CommandRegistry, CompoundMenuNodeRole, DisposableCollection, MenuModelRegistry, MenuNode, nls } from '@theia/core'; +import * as React from '@theia/core/shared/react'; +import { codicon } from '@theia/core/lib/browser'; +import { NotebookCommands, NotebookMenus } from '../contributions/notebook-actions-contribution'; +import { NotebookModel } from '../view-model/notebook-model'; +import { NotebookKernelService } from '../service/notebook-kernel-service'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { ContextKeyService } from '@theia/core/lib/browser/context-key-service'; + +export interface NotebookMainToolbarProps { + notebookModel: NotebookModel + menuRegistry: MenuModelRegistry; + notebookKernelService: NotebookKernelService; + commandRegistry: CommandRegistry; + contextKeyService: ContextKeyService; +} + +@injectable() +export class NotebookMainToolbarRenderer { + @inject(NotebookKernelService) protected readonly notebookKernelService: NotebookKernelService; + @inject(CommandRegistry) protected readonly commandRegistry: CommandRegistry; + @inject(MenuModelRegistry) protected readonly menuRegistry: MenuModelRegistry; + @inject(ContextKeyService) protected readonly contextKeyService: ContextKeyService; + + render(notebookModel: NotebookModel): React.ReactNode { + return ; + } +} + +export class NotebookMainToolbar extends React.Component { + + protected toDispose = new DisposableCollection(); + + constructor(props: NotebookMainToolbarProps) { + super(props); + + this.state = { selectedKernelLabel: props.notebookKernelService.getSelectedOrSuggestedKernel(props.notebookModel)?.label }; + this.toDispose.push(props.notebookKernelService.onDidChangeSelectedKernel(event => { + if (props.notebookModel.uri.isEqual(event.notebook)) { + this.setState({ selectedKernelLabel: props.notebookKernelService.getKernel(event.newKernel ?? '')?.label }); + } + })); + // in case the selected kernel is added after the notebook is loaded + this.toDispose.push(props.notebookKernelService.onDidAddKernel(() => { + if (!this.state.selectedKernelLabel) { + this.setState({ selectedKernelLabel: props.notebookKernelService.getSelectedOrSuggestedKernel(props.notebookModel)?.label }); + } + })); + } + + override componentWillUnmount(): void { + this.toDispose.dispose(); + } + + override render(): React.ReactNode { + return
    + {this.getMenuItems().map(item => this.renderMenuItem(item))} +
    +
    this.props.commandRegistry.executeCommand(NotebookCommands.SELECT_KERNEL_COMMAND.id, this.props.notebookModel)}> + + + {this.state.selectedKernelLabel ?? nls.localizeByDefault('Select Kernel')} + +
    +
    ; + } + + protected renderMenuItem(item: MenuNode): React.ReactNode { + if (item.role === CompoundMenuNodeRole.Group) { + const itemNodes = item.children?.map(child => this.renderMenuItem(child)).filter(child => !!child); + return + {itemNodes} + {itemNodes && itemNodes.length > 0 && } + ; + } else if (!item.when || this.props.contextKeyService.match(item.when)) { + return
    { + if (item.command) { + this.props.commandRegistry.executeCommand(item.command, this.props.notebookModel); + } + }}> + + {item.label} +
    ; + } + return undefined; + } + + private getMenuItems(): readonly MenuNode[] { + const menuPath = NotebookMenus.NOTEBOOK_MAIN_TOOLBAR; + const pluginCommands = this.props.menuRegistry.getMenuNode(menuPath).children; + return this.props.menuRegistry.getMenu([menuPath]).children.concat(pluginCommands); + } +} diff --git a/packages/notebook/src/browser/view/notebook-markdown-cell-view.tsx b/packages/notebook/src/browser/view/notebook-markdown-cell-view.tsx new file mode 100644 index 0000000000000..3b48767a987ae --- /dev/null +++ b/packages/notebook/src/browser/view/notebook-markdown-cell-view.tsx @@ -0,0 +1,73 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import * as React from '@theia/core/shared/react'; +import { MarkdownRenderer } from '@theia/core/lib/browser/markdown-rendering/markdown-renderer'; +import { MarkdownStringImpl } from '@theia/core/lib/common/markdown-rendering/markdown-string'; +import { NotebookModel } from '../view-model/notebook-model'; +import { CellRenderer } from './notebook-cell-list-view'; +import { NotebookCellModel } from '../view-model/notebook-cell-model'; +import { CellEditor } from './notebook-cell-editor'; +import { inject, injectable } from '@theia/core/shared/inversify'; +import { MonacoEditorServices } from '@theia/monaco/lib/browser/monaco-editor'; +import { nls } from '@theia/core'; + +@injectable() +export class NotebookMarkdownCellRenderer implements CellRenderer { + + @inject(MarkdownRenderer) + private readonly markdownRenderer: MarkdownRenderer; + @inject(MonacoEditorServices) + protected readonly monacoServices: MonacoEditorServices; + + render(notebookModel: NotebookModel, cell: NotebookCellModel): React.ReactNode { + return ; + } + +} + +interface MarkdownCellProps { + markdownRenderer: MarkdownRenderer, + monacoServices: MonacoEditorServices + + cell: NotebookCellModel, + notebookModel: NotebookModel +} + +function MarkdownCell({ markdownRenderer, monacoServices, cell, notebookModel }: MarkdownCellProps): React.JSX.Element { + const [editMode, setEditMode] = React.useState(false); + + React.useEffect(() => { + const listener = cell.onDidRequestCellEditChange(cellEdit => setEditMode(cellEdit)); + return () => listener.dispose(); + }, [editMode]); + + let markdownContent = React.useMemo(() => markdownRenderer.render(new MarkdownStringImpl(cell.source)).element.innerHTML, [cell, editMode]); + if (markdownContent.length === 0) { + markdownContent = `${nls.localizeByDefault('Empty markdown cell, double-click or press enter to edit.')}`; + } + + return editMode ? + : +
    cell.requestEdit()} + // This sets the non React HTML node from the markdown renderers output as a child node to this react component + // This is currently sadly the best way we have to combine React (Virtual Nodes) and normal dom nodes + // the HTML is allready sanitized by the markdown renderer, so we don't need to sanitize it again + dangerouslySetInnerHTML={{ __html: markdownContent }} // eslint-disable-line react/no-danger + />; +} diff --git a/packages/notebook/src/common/index.ts b/packages/notebook/src/common/index.ts new file mode 100644 index 0000000000000..548224ec19729 --- /dev/null +++ b/packages/notebook/src/common/index.ts @@ -0,0 +1,18 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +export * from './notebook-common'; +export * from './notebook-range'; diff --git a/packages/notebook/src/common/notebook-common.ts b/packages/notebook/src/common/notebook-common.ts new file mode 100644 index 0000000000000..86b59ff7dd5b3 --- /dev/null +++ b/packages/notebook/src/common/notebook-common.ts @@ -0,0 +1,462 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { CancellationToken, Command, Event, URI } from '@theia/core'; +import { MarkdownString } from '@theia/core/lib/common/markdown-rendering/markdown-string'; +import { BinaryBuffer } from '@theia/core/lib/common/buffer'; +import { UriComponents } from '@theia/core/lib/common/uri'; +import { CellRange } from './notebook-range'; + +export enum CellKind { + Markup = 1, + Code = 2 +} + +export interface NotebookCellMetadata { + /** + * custom metadata + */ + [key: string]: unknown; +} + +export interface NotebookCellInternalMetadata { + executionId?: string; + executionOrder?: number; + lastRunSuccess?: boolean; + runStartTime?: number; + runStartTimeAdjustment?: number; + runEndTime?: number; + renderDuration?: { [key: string]: number }; +} + +export type NotebookDocumentMetadata = Record; + +export interface NotebookCellStatusBarItem { + readonly alignment: CellStatusbarAlignment; + readonly priority?: number; + readonly text: string; + // readonly color?: string | ThemeColor; + // readonly backgroundColor?: string | ThemeColor; + readonly tooltip?: string | MarkdownString; + readonly command?: string | Command; + // readonly accessibilityInformation?: IAccessibilityInformation; + readonly opacity?: string; + readonly onlyShowWhenActive?: boolean; +} + +export const enum CellStatusbarAlignment { + Left = 1, + Right = 2 +} + +export type TransientCellMetadata = { readonly [K in keyof NotebookCellMetadata]?: boolean }; +export type CellContentMetadata = { readonly [K in keyof NotebookCellMetadata]?: boolean }; +export type TransientDocumentMetadata = { readonly [K in keyof NotebookDocumentMetadata]?: boolean }; + +export interface TransientOptions { + readonly transientOutputs: boolean; + readonly transientCellMetadata: TransientCellMetadata; + readonly transientDocumentMetadata: TransientDocumentMetadata; +} + +export interface NotebookExtensionDescription { + readonly id: string; + readonly location: string | undefined; +} + +export interface CellOutputItem { + readonly mime: string; + readonly data: BinaryBuffer; +} + +export interface CellOutput { + outputId: string; + outputs: CellOutputItem[]; + metadata?: Record; +} + +export interface NotebookCellCollapseState { + inputCollapsed?: boolean; + outputCollapsed?: boolean; +} + +export interface NotebookCell { + readonly uri: URI; + handle: number; + language: string; + cellKind: CellKind; + outputs: CellOutput[]; + metadata: NotebookCellMetadata; + internalMetadata: NotebookCellInternalMetadata; + textBuffer: string; + onDidChangeOutputs?: Event; + onDidChangeOutputItems?: Event; + onDidChangeLanguage: Event; + onDidChangeMetadata: Event; + onDidChangeInternalMetadata: Event; + +} + +export interface CellData { + source: string; + language: string; + cellKind: CellKind; + outputs: CellOutput[]; + metadata?: NotebookCellMetadata; + internalMetadata?: NotebookCellInternalMetadata; + collapseState?: NotebookCellCollapseState; +} + +export interface CellReplaceEdit { + editType: CellEditType.Replace; + index: number; + count: number; + cells: CellData[]; +} + +export interface NotebookDocumentMetadataEdit { + editType: CellEditType.DocumentMetadata; + metadata: NotebookDocumentMetadata; +} + +export interface NotebookData { + readonly cells: CellData[]; + readonly metadata: NotebookDocumentMetadata; +} + +export interface NotebookContributionData { + extension?: string; + providerDisplayName: string; + displayName: string; + filenamePattern: (string)[]; + exclusive: boolean; +} + +export interface NotebookCellStatusBarItemList { + items: NotebookCellStatusBarItem[]; + dispose?(): void; +} + +export interface NotebookCellStatusBarItemProvider { + viewType: string; + onDidChangeStatusBarItems?: Event; + provideCellStatusBarItems(uri: UriComponents, index: number, token: CancellationToken): Promise; +} + +export interface NotebookCellOutputsSplice { + start: number /* start */; + deleteCount: number /* delete count */; + newOutputs: CellOutput[]; +}; + +export interface CellInternalMetadataChangedEvent { + readonly lastRunSuccessChanged?: boolean; +} + +export type NotebookCellTextModelSplice = [ + start: number, + deleteCount: number, + newItems: T[] +]; + +export enum NotebookCellsChangeType { + ModelChange = 1, + Move = 2, + ChangeCellLanguage = 5, + Initialize = 6, + ChangeCellMetadata = 7, + Output = 8, + OutputItem = 9, + ChangeCellContent = 10, + ChangeDocumentMetadata = 11, + ChangeCellInternalMetadata = 12, + // ChangeCellMime = 13, + Unknown = 100 +} + +export enum SelectionStateType { + Handle = 0, + Index = 1 +} +export interface SelectionHandleState { + kind: SelectionStateType.Handle; + primary: number | null; + selections: number[]; +} + +export interface SelectionIndexState { + kind: SelectionStateType.Index; + focus: CellRange; + selections: CellRange[]; +} + +export type SelectionState = SelectionHandleState | SelectionIndexState; + +export interface NotebookTextModelChangedEvent { + readonly rawEvents: NotebookRawContentEvent[]; + // readonly versionId: number; + readonly synchronous?: boolean; + readonly endSelectionState?: SelectionState; +}; + +export interface NotebookCellsInitializeEvent { + readonly kind: NotebookCellsChangeType.Initialize; + readonly changes: NotebookCellTextModelSplice[]; +} + +export interface NotebookCellsChangeLanguageEvent { + readonly kind: NotebookCellsChangeType.ChangeCellLanguage; + readonly index: number; + readonly language: string; +} + +export interface NotebookCellsModelChangedEvent { + readonly kind: NotebookCellsChangeType.ModelChange; + readonly changes: NotebookCellTextModelSplice[]; +} + +export interface NotebookCellsModelMoveEvent { + readonly kind: NotebookCellsChangeType.Move; + readonly index: number; + readonly length: number; + readonly newIdx: number; + readonly cells: T[]; +} + +export interface NotebookOutputChangedEvent { + readonly kind: NotebookCellsChangeType.Output; + readonly index: number; + readonly outputs: CellOutput[]; + readonly append: boolean; +} + +export interface NotebookOutputItemChangedEvent { + readonly kind: NotebookCellsChangeType.OutputItem; + readonly index: number; + readonly outputId: string; + readonly outputItems: CellOutputItem[]; + readonly append: boolean; +} +export interface NotebookCellsChangeMetadataEvent { + readonly kind: NotebookCellsChangeType.ChangeCellMetadata; + readonly index: number; + readonly metadata: NotebookCellMetadata; +} + +export interface NotebookCellsChangeInternalMetadataEvent { + readonly kind: NotebookCellsChangeType.ChangeCellInternalMetadata; + readonly index: number; + readonly internalMetadata: NotebookCellInternalMetadata; +} + +export interface NotebookDocumentChangeMetadataEvent { + readonly kind: NotebookCellsChangeType.ChangeDocumentMetadata; + readonly metadata: NotebookDocumentMetadata; +} + +export interface NotebookDocumentUnknownChangeEvent { + readonly kind: NotebookCellsChangeType.Unknown; +} + +export interface NotebookCellContentChangeEvent { + readonly kind: NotebookCellsChangeType.ChangeCellContent; + readonly index: number; +} + +export type NotebookRawContentEvent = (NotebookCellsInitializeEvent | NotebookDocumentChangeMetadataEvent | NotebookCellContentChangeEvent | + NotebookCellsModelChangedEvent | NotebookCellsModelMoveEvent | NotebookOutputChangedEvent | NotebookOutputItemChangedEvent | + NotebookCellsChangeLanguageEvent | NotebookCellsChangeMetadataEvent | + NotebookCellsChangeInternalMetadataEvent | NotebookDocumentUnknownChangeEvent); // & { transient: boolean }; + +export interface NotebookModelChangedEvent { + readonly rawEvents: NotebookRawContentEvent[]; + readonly versionId: number; + // readonly synchronous: boolean | undefined; + // readonly endSelectionState: ISelectionState | undefined; +}; + +export interface NotebookModelWillAddRemoveEvent { + readonly rawEvent: NotebookCellsModelChangedEvent; +}; + +export enum NotebookCellExecutionState { + Unconfirmed = 1, + Pending = 2, + Executing = 3 +} + +export enum CellExecutionUpdateType { + Output = 1, + OutputItems = 2, + ExecutionState = 3, +} + +export interface CellExecuteOutputEdit { + editType: CellExecutionUpdateType.Output; + cellHandle: number; + append?: boolean; + outputs: CellOutput[]; +} + +export interface CellExecuteOutputItemEdit { + editType: CellExecutionUpdateType.OutputItems; + append?: boolean; + items: CellOutputItem[]; +} + +export interface CellExecutionStateUpdateDto { + editType: CellExecutionUpdateType.ExecutionState; + executionOrder?: number; + runStartTime?: number; + didPause?: boolean; + isPaused?: boolean; +} + +export interface CellOutputEdit { + editType: CellEditType.Output; + index: number; + outputs: CellOutput[]; + append?: boolean; +} + +export interface CellOutputEditByHandle { + editType: CellEditType.Output; + handle: number; + outputs: CellOutput[]; + append?: boolean; +} + +export interface CellOutputItemEdit { + editType: CellEditType.OutputItems; + items: CellOutputItem[]; + append?: boolean; +} + +export interface CellMetadataEdit { + editType: CellEditType.Metadata; + index: number; + metadata: NotebookCellMetadata; +} + +export interface CellLanguageEdit { + editType: CellEditType.CellLanguage; + index: number; + language: string; +} + +export interface DocumentMetadataEdit { + editType: CellEditType.DocumentMetadata; + metadata: NotebookDocumentMetadata; +} + +export interface CellMoveEdit { + editType: CellEditType.Move; + index: number; + length: number; + newIdx: number; +} + +export const enum CellEditType { + Replace = 1, + Output = 2, + Metadata = 3, + CellLanguage = 4, + DocumentMetadata = 5, + Move = 6, + OutputItems = 7, + PartialMetadata = 8, + PartialInternalMetadata = 9, +} + +export type ImmediateCellEditOperation = CellOutputEditByHandle | CellOutputItemEdit | CellPartialInternalMetadataEditByHandle; // add more later on +export type CellEditOperation = ImmediateCellEditOperation | CellReplaceEdit | CellOutputEdit | + CellMetadataEdit | CellLanguageEdit | DocumentMetadataEdit | CellMoveEdit; // add more later on + +export type NullablePartialNotebookCellInternalMetadata = { + [Key in keyof Partial]: NotebookCellInternalMetadata[Key] | null +}; +export interface CellPartialInternalMetadataEditByHandle { + editType: CellEditType.PartialInternalMetadata; + handle: number; + internalMetadata: NullablePartialNotebookCellInternalMetadata; +} + +export interface NotebookKernelSourceAction { + readonly label: string; + readonly description?: string; + readonly detail?: string; + readonly command?: string | Command; + readonly documentation?: UriComponents | string; +} + +/** + * Whether the provided mime type is a text stream like `stdout`, `stderr`. + */ +export function isTextStreamMime(mimeType: string): boolean { + return ['application/vnd.code.notebook.stdout', 'application/vnd.code.notebook.stderr'].includes(mimeType); +} + +export namespace CellUri { + + export const scheme = 'vscode-notebook-cell'; + + const _lengths = ['W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f']; + const _padRegexp = new RegExp(`^[${_lengths.join('')}]+`); + const _radix = 7; + + export function generate(notebook: URI, handle: number): URI { + + const s = handle.toString(_radix); + const p = s.length < _lengths.length ? _lengths[s.length - 1] : 'z'; + + const fragment = `${p}${s}s${Buffer.from(BinaryBuffer.fromString(notebook.scheme).buffer).toString('base64')} `; + return notebook.withScheme(scheme).withFragment(fragment); + } + + export function parse(cell: URI): { notebook: URI; handle: number } | undefined { + if (cell.scheme !== scheme) { + return undefined; + } + + const idx = cell.fragment.indexOf('s'); + if (idx < 0) { + return undefined; + } + + const handle = parseInt(cell.fragment.substring(0, idx).replace(_padRegexp, ''), _radix); + const parsedScheme = Buffer.from(cell.fragment.substring(idx + 1), 'base64').toString(); + + if (isNaN(handle)) { + return undefined; + } + return { + handle, + notebook: cell.withScheme(parsedScheme).withoutFragment() + }; + } + + export function generateCellPropertyUri(notebook: URI, handle: number, cellScheme: string): URI { + return CellUri.generate(notebook, handle).withScheme(cellScheme); + } + + export function parseCellPropertyUri(uri: URI, propertyScheme: string): { notebook: URI; handle: number } | undefined { + if (uri.scheme !== propertyScheme) { + return undefined; + } + + return CellUri.parse(uri.withScheme(scheme)); + } +} diff --git a/packages/notebook/src/common/notebook-protocol.ts b/packages/notebook/src/common/notebook-protocol.ts new file mode 100644 index 0000000000000..4b306a395796d --- /dev/null +++ b/packages/notebook/src/common/notebook-protocol.ts @@ -0,0 +1,35 @@ +// ***************************************************************************** +// Copyright (C) 2023 Typefox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +export interface NotebookTypeDescriptor { + readonly type: string; + readonly displayName: string; + readonly priority?: string | undefined; + readonly selector?: readonly NotebookFileSelector[]; +} + +export interface NotebookFileSelector { + readonly filenamePattern?: string; + readonly excludeFileNamePattern?: string; +} + +export interface NotebookRendererDescriptor { + readonly id: string; + readonly displayName: string; + readonly mimeTypes: string[]; + readonly entrypoint: string | { readonly extends: string; readonly path: string }; + readonly requiresMessaging?: 'always' | 'optional' | 'never' +} diff --git a/packages/notebook/src/common/notebook-range.ts b/packages/notebook/src/common/notebook-range.ts new file mode 100644 index 0000000000000..4a9f5b3d75407 --- /dev/null +++ b/packages/notebook/src/common/notebook-range.ts @@ -0,0 +1,30 @@ +// ***************************************************************************** +// Copyright (C) 2023 Typefox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +/** + * [start, end] + */ +export interface CellRange { + /** + * zero based index + */ + start: number; + + /** + * zero based index + */ + end: number; +} diff --git a/packages/notebook/tsconfig.json b/packages/notebook/tsconfig.json new file mode 100644 index 0000000000000..8f53c0fe2dd53 --- /dev/null +++ b/packages/notebook/tsconfig.json @@ -0,0 +1,25 @@ +{ + "extends": "../../configs/base.tsconfig", + "compilerOptions": { + "composite": true, + "rootDir": "src", + "outDir": "lib" + }, + "include": [ + "src" + ], + "references": [ + { + "path": "../core" + }, + { + "path": "../editor" + }, + { + "path": "../filesystem" + }, + { + "path": "../monaco" + } + ] +} diff --git a/packages/plugin-ext/package.json b/packages/plugin-ext/package.json index f2e7160f14885..4c207f83842f9 100644 --- a/packages/plugin-ext/package.json +++ b/packages/plugin-ext/package.json @@ -19,6 +19,7 @@ "@theia/monaco": "1.40.0", "@theia/monaco-editor-core": "1.72.3", "@theia/navigator": "1.40.0", + "@theia/notebook": "1.40.0", "@theia/output": "1.40.0", "@theia/plugin": "1.40.0", "@theia/preferences": "1.40.0", @@ -33,6 +34,7 @@ "@types/mime": "^2.0.1", "@vscode/debugprotocol": "^1.51.0", "@vscode/proxy-agent": "^0.13.2", + "async-mutex": "^0.4.0", "decompress": "^4.2.1", "escape-html": "^1.0.3", "filenamify": "^4.1.0", diff --git a/packages/plugin-ext/src/common/collections.ts b/packages/plugin-ext/src/common/collections.ts index 96a90b74dda62..59c4bd84032e9 100644 --- a/packages/plugin-ext/src/common/collections.ts +++ b/packages/plugin-ext/src/common/collections.ts @@ -35,3 +35,20 @@ export function diffSets(before: Set, after: Set): { removed: T[]; adde } return { removed, added }; } + +export function diffMaps(before: Map, after: Map): { removed: V[]; added: V[] } { + const removed: V[] = []; + const added: V[] = []; + for (const [index, value] of before) { + if (!after.has(index)) { + removed.push(value); + } + } + for (const [index, value] of after) { + if (!before.has(index)) { + added.push(value); + } + } + return { removed, added }; +} + diff --git a/packages/plugin-ext/src/common/plugin-api-rpc.ts b/packages/plugin-ext/src/common/plugin-api-rpc.ts index f6273b5eddc58..bce8f9dfde8c5 100644 --- a/packages/plugin-ext/src/common/plugin-api-rpc.ts +++ b/packages/plugin-ext/src/common/plugin-api-rpc.ts @@ -29,6 +29,7 @@ import { FileOperationOptions, TextDocumentChangeReason, IndentAction, + NotebookRendererScript, } from '../plugin/types-impl'; import { UriComponents } from './uri-components'; import { @@ -117,6 +118,8 @@ import { Disposable } from '@theia/core/lib/common/disposable'; import { isString, isObject, PickOptions, QuickInputButtonHandle } from '@theia/core/lib/common'; import { Severity } from '@theia/core/lib/common/severity'; import { DebugConfiguration, DebugSessionOptions } from '@theia/debug/lib/common/debug-configuration'; +import * as notebookCommon from '@theia/notebook/lib/common'; +import { CellExecutionUpdateType, CellRange, NotebookCellExecutionState } from '@theia/notebook/lib/common'; import { LanguagePackBundle } from './language-pack-service'; import { AccessibilityInformation } from '@theia/core/lib/common/accessibility'; @@ -1283,6 +1286,7 @@ export interface ModelAddedData { uri: UriComponents; versionId: number; lines: string[]; + languageId?: string; EOL: string; modeId: string; isDirty: boolean; @@ -1483,8 +1487,37 @@ export interface WorkspaceEditMetadataDto { isRefactoring?: boolean; } +export type CellEditOperationDto = + { + editType: notebookCommon.CellEditType.Metadata; + index: number; + metadata: Record; + } | + { + editType: notebookCommon.CellEditType.DocumentMetadata; + metadata: Record; + } | + { + editType: notebookCommon.CellEditType.Replace; + index: number; + count: number; + cells: NotebookCellDataDto[]; + }; + +export interface NotebookWorkspaceEditMetadataDto { + needsConfirmation: boolean; + label: string; + description?: string; +} + +export interface WorkspaceNotebookCellEditDto { + metadata?: NotebookWorkspaceEditMetadataDto; + resource: UriComponents; + cellEdit: CellEditOperationDto; +} + export interface WorkspaceEditDto { - edits: Array; + edits: Array; } export interface CommandProperties { @@ -2118,6 +2151,12 @@ export const PLUGIN_RPC_CONTEXT = { MESSAGE_REGISTRY_MAIN: >createProxyIdentifier('MessageRegistryMain'), TEXT_EDITORS_MAIN: createProxyIdentifier('TextEditorsMain'), DOCUMENTS_MAIN: createProxyIdentifier('DocumentsMain'), + NOTEBOOKS_MAIN: createProxyIdentifier('NotebooksMain'), + NOTEBOOK_DOCUMENTS_MAIN: createProxyIdentifier('NotebookDocumentsMain'), + NOTEBOOK_EDITORS_MAIN: createProxyIdentifier('NotebookEditorsMain'), + NOTEBOOK_DOCUMENTS_AND_EDITORS_MAIN: createProxyIdentifier('NotebooksAndEditorsMain'), + NOTEBOOK_RENDERERS_MAIN: createProxyIdentifier('NotebookRenderersMain'), + NOTEBOOK_KERNELS_MAIN: createProxyIdentifier('NotebookKernelsMain'), STATUS_BAR_MESSAGE_REGISTRY_MAIN: >createProxyIdentifier('StatusBarMessageRegistryMain'), ENV_MAIN: createProxyIdentifier('EnvMain'), NOTIFICATION_MAIN: createProxyIdentifier('NotificationMain'), @@ -2159,6 +2198,11 @@ export const MAIN_RPC_CONTEXT = { TEXT_EDITORS_EXT: createProxyIdentifier('TextEditorsExt'), EDITORS_AND_DOCUMENTS_EXT: createProxyIdentifier('EditorsAndDocumentsExt'), DOCUMENTS_EXT: createProxyIdentifier('DocumentsExt'), + NOTEBOOKS_EXT: createProxyIdentifier('NotebooksExt'), + NOTEBOOK_DOCUMENTS_EXT: createProxyIdentifier('NotebookDocumentsExt'), + NOTEBOOK_EDITORS_EXT: createProxyIdentifier('NotebookEditorsExt'), + NOTEBOOK_RENDERERS_EXT: createProxyIdentifier('NotebooksExt'), + NOTEBOOK_KERNELS_EXT: createProxyIdentifier('NotebookKernelsExt'), TERMINAL_EXT: createProxyIdentifier('TerminalServiceExt'), OUTPUT_CHANNEL_REGISTRY_EXT: createProxyIdentifier('OutputChannelRegistryExt'), TREE_VIEWS_EXT: createProxyIdentifier('TreeViewsExt'), @@ -2219,6 +2263,286 @@ export interface AuthenticationMain { options: theia.AuthenticationGetSessionOptions): Promise; } +export interface NotebookOutputItemDto { + readonly mime: string; + readonly valueBytes: BinaryBuffer; +} + +export interface NotebookOutputDto { + outputId: string; + items: NotebookOutputItemDto[]; + metadata?: Record; +} + +export interface NotebookCellDataDto { + source: string; + language: string; + cellKind: notebookCommon.CellKind; + outputs: NotebookOutputDto[]; + metadata?: notebookCommon.NotebookCellMetadata; + internalMetadata?: notebookCommon.NotebookCellInternalMetadata; +} + +export interface NotebookDataDto { + readonly cells: NotebookCellDataDto[]; + readonly metadata: notebookCommon.NotebookDocumentMetadata; +} + +export interface NotebookCellDto { + handle: number; + uri: UriComponents; + eol: string; + source: string[]; + language: string; + mime?: string; + cellKind: notebookCommon.CellKind; + outputs: NotebookOutputDto[]; + metadata?: notebookCommon.NotebookCellMetadata; + internalMetadata?: notebookCommon.NotebookCellInternalMetadata; +} + +export interface NotebookModelAddedData { + uri: UriComponents; + versionId: number; + cells: NotebookCellDto[]; + viewType: string; + metadata?: notebookCommon.NotebookDocumentMetadata; +} + +export interface NotebookEditorAddData { + id: string; + documentUri: UriComponents; + selections: CellRange[]; + visibleRanges: CellRange[]; + viewColumn?: number; +} + +export interface NotebookDocumentsAndEditorsDelta { + removedDocuments?: UriComponents[]; + addedDocuments?: NotebookModelAddedData[]; + removedEditors?: string[]; + addedEditors?: NotebookEditorAddData[]; + newActiveEditor?: string | null; + visibleEditors?: string[]; +} + +export type NotebookCellStatusBarEntryDto = notebookCommon.NotebookCellStatusBarItem; + +export interface NotebookCellStatusBarListDto { + items: NotebookCellStatusBarEntryDto[]; + cacheId: number; +} + +export type NotebookRawContentEventDto = + // notebookCommon.NotebookCellsInitializeEvent + | { + + readonly kind: notebookCommon.NotebookCellsChangeType.ModelChange; + readonly changes: notebookCommon.NotebookCellTextModelSplice[]; + } + | { + readonly kind: notebookCommon.NotebookCellsChangeType.Move; + readonly index: number; + readonly length: number; + readonly newIdx: number; + } + | { + readonly kind: notebookCommon.NotebookCellsChangeType.Output; + readonly index: number; + readonly outputs: NotebookOutputDto[]; + } + | { + readonly kind: notebookCommon.NotebookCellsChangeType.OutputItem; + readonly index: number; + readonly outputId: string; + readonly outputItems: NotebookOutputItemDto[]; + readonly append: boolean; + } + | notebookCommon.NotebookCellsChangeLanguageEvent + | notebookCommon.NotebookCellsChangeMetadataEvent + | notebookCommon.NotebookCellsChangeInternalMetadataEvent + | notebookCommon.NotebookCellContentChangeEvent + ; + +export interface NotebookCellsChangedEventDto { + readonly rawEvents: NotebookRawContentEventDto[]; + readonly versionId: number; +}; + +export interface NotebookSelectionChangeEvent { + selections: CellRange[]; +} + +export interface NotebookVisibleRangesEvent { + ranges: CellRange[]; +} + +export interface NotebookEditorPropertiesChangeData { + visibleRanges?: NotebookVisibleRangesEvent; + selections?: NotebookSelectionChangeEvent; +} + +export enum NotebookEditorRevealType { + Default = 0, + InCenter = 1, + InCenterIfOutsideViewport = 2, + AtTop = 3 +} + +export interface NotebookDocumentShowOptions { + position?: EditorGroupColumn; + preserveFocus?: boolean; + pinned?: boolean; + selections?: CellRange[]; +} + +export interface NotebookKernelDto { + id: string; + notebookType: string; + extensionId: string; + // extensionLocation: UriComponents; + label: string; + detail?: string; + description?: string; + supportedLanguages?: string[]; + supportsInterrupt?: boolean; + supportsExecutionOrder?: boolean; + preloads?: { uri: UriComponents; provides: readonly string[] }[]; + rendererScripts?: NotebookRendererScript[]; +} + +export type CellExecuteUpdateDto = CellExecuteOutputEditDto | CellExecuteOutputItemEditDto | CellExecutionStateUpdateDto; + +export interface CellExecuteOutputEditDto { + editType: CellExecutionUpdateType.Output; + cellHandle: number; + append?: boolean; + outputs: NotebookOutputDto[]; +} + +export interface CellExecuteOutputItemEditDto { + editType: CellExecutionUpdateType.OutputItems; + append?: boolean; + items: NotebookOutputItemDto[]; +} + +export interface CellExecutionStateUpdateDto { + editType: CellExecutionUpdateType.ExecutionState; + executionOrder?: number; + runStartTime?: number; + didPause?: boolean; + isPaused?: boolean; +} + +export interface CellExecutionCompleteDto { + runEndTime?: number; + lastRunSuccess?: boolean; +} + +export interface NotebookKernelSourceActionDto { + readonly label: string; + readonly description?: string; + readonly detail?: string; + readonly command?: string | Command; + readonly documentation?: UriComponents | string; +} + +export interface NotebookEditorAddData { + id: string; + documentUri: UriComponents; + selections: CellRange[]; + visibleRanges: CellRange[]; + viewColumn?: number; +} + +export interface NotebooksExt extends NotebookDocumentsAndEditorsExt { + $provideNotebookCellStatusBarItems(handle: number, uri: UriComponents, index: number, token: CancellationToken): Promise; + $releaseNotebookCellStatusBarItems(id: number): void; + + $dataToNotebook(handle: number, data: BinaryBuffer, token: CancellationToken): Promise; + $notebookToData(handle: number, data: NotebookDataDto, token: CancellationToken): Promise; +} + +export interface NotebooksMain extends Disposable { + $registerNotebookSerializer(handle: number, extension: notebookCommon.NotebookExtensionDescription, viewType: string, options: notebookCommon.TransientOptions): void; + $unregisterNotebookSerializer(handle: number): void; + + $registerNotebookCellStatusBarItemProvider(handle: number, eventHandle: number | undefined, viewType: string): Promise; + $unregisterNotebookCellStatusBarItemProvider(handle: number, eventHandle: number | undefined): Promise; + $emitCellStatusBarEvent(eventHandle: number): void; +} + +export interface NotebookKernelsExt { + $acceptNotebookAssociation(handle: number, uri: UriComponents, value: boolean): void; + $executeCells(handle: number, uri: UriComponents, handles: number[]): Promise; + $cancelCells(handle: number, uri: UriComponents, handles: number[]): Promise; + $acceptKernelMessageFromRenderer(handle: number, editorId: string, message: any): void; + $cellExecutionChanged(uri: UriComponents, cellHandle: number, state: NotebookCellExecutionState | undefined): void; + $provideKernelSourceActions(handle: number, token: CancellationToken): Promise; +} + +export interface NotebookKernelsMain extends Disposable { + $postMessage(handle: number, editorId: string | undefined, message: any): Promise; + $addKernel(handle: number, data: NotebookKernelDto): Promise; + $updateKernel(handle: number, data: Partial): void; + $removeKernel(handle: number): void; + $updateNotebookPriority(handle: number, uri: UriComponents, value: number | undefined): void; + + $createExecution(handle: number, controllerId: string, uri: UriComponents, cellHandle: number): void; + $updateExecution(handle: number, data: CellExecuteUpdateDto[]): void; + $completeExecution(handle: number, data: CellExecutionCompleteDto): void; + + $createNotebookExecution(handle: number, controllerId: string, uri: UriComponents): void; + $beginNotebookExecution(handle: number): void; + $completeNotebookExecution(handle: number): void; + + $addKernelDetectionTask(handle: number, notebookType: string): Promise; + $removeKernelDetectionTask(handle: number): void; + + $addKernelSourceActionProvider(handle: number, eventHandle: number, notebookType: string): Promise; + $removeKernelSourceActionProvider(handle: number, eventHandle: number): void; + $emitNotebookKernelSourceActionsChangeEvent(eventHandle: number): void; +} + +export interface NotebookDocumentsMain extends Disposable { + $tryCreateNotebook(options: { viewType: string; content?: NotebookDataDto }): Promise; + $tryOpenNotebook(uriComponents: UriComponents): Promise; + $trySaveNotebook(uri: UriComponents): Promise; +} + +export interface NotebookDocumentsExt { + $acceptModelChanged(uriComponents: UriComponents, event: NotebookCellsChangedEventDto, isDirty: boolean, newMetadata?: notebookCommon.NotebookDocumentMetadata): void; + $acceptDirtyStateChanged(uriComponents: UriComponents, isDirty: boolean): void; + $acceptModelSaved(uriComponents: UriComponents): void; +} + +export interface NotebookDocumentsAndEditorsExt { + $acceptDocumentsAndEditorsDelta(delta: NotebookDocumentsAndEditorsDelta): Promise; +} + +export interface NotebookDocumentsAndEditorsMain extends Disposable { +} + +export type NotebookEditorViewColumnInfo = Record; + +export interface NotebookEditorsExt { + $acceptEditorPropertiesChanged(id: string, data: NotebookEditorPropertiesChangeData): void; + $acceptEditorViewColumns(data: NotebookEditorViewColumnInfo): void; +} + +export interface NotebookEditorsMain extends Disposable { + $tryShowNotebookDocument(uriComponents: UriComponents, viewType: string, options: NotebookDocumentShowOptions): Promise; + $tryRevealRange(id: string, range: CellRange, revealType: NotebookEditorRevealType): Promise; + $trySetSelections(id: string, range: CellRange[]): void; +} +export interface NotebookRenderersExt { + $postRendererMessage(editorId: string, rendererId: string, message: unknown): void; +} + +export interface NotebookRenderersMain extends Disposable { + $postMessage(editorId: string | undefined, rendererId: string, message: unknown): Promise; +} + export interface RawColorInfo { color: [number, number, number, number]; range: Range; diff --git a/packages/plugin-ext/src/common/plugin-protocol.ts b/packages/plugin-ext/src/common/plugin-protocol.ts index ca1900bc8a6f7..a662207022d1e 100644 --- a/packages/plugin-ext/src/common/plugin-protocol.ts +++ b/packages/plugin-ext/src/common/plugin-protocol.ts @@ -99,6 +99,7 @@ export interface PluginPackageContribution { localizations?: PluginPackageLocalization[]; terminal?: PluginPackageTerminal; notebooks?: PluginPackageNotebook[]; + notebookRenderer?: PluginNotebookRendererContribution[]; } export interface PluginPackageNotebook { @@ -108,6 +109,14 @@ export interface PluginPackageNotebook { priority?: string; } +export interface PluginNotebookRendererContribution { + readonly id: string; + readonly displayName: string; + readonly mimeTypes: string[]; + readonly entrypoint: string | { readonly extends: string; readonly path: string }; + readonly requiresMessaging?: 'always' | 'optional' | 'never' +} + export interface PluginPackageAuthenticationProvider { id: string; label: string; @@ -585,6 +594,7 @@ export interface PluginContribution { localizations?: Localization[]; terminalProfiles?: TerminalProfile[]; notebooks?: NotebookContribution[]; + notebookRenderer?: NotebookRendererContribution[]; } export interface NotebookContribution { @@ -594,6 +604,14 @@ export interface NotebookContribution { priority?: string; } +export interface NotebookRendererContribution { + readonly id: string; + readonly displayName: string; + readonly mimeTypes: string[]; + readonly entrypoint: string | { readonly extends: string; readonly path: string }; + readonly requiresMessaging?: 'always' | 'optional' | 'never' +} + export interface AuthenticationProviderInformation { id: string; label: string; diff --git a/packages/plugin-ext/src/hosted/browser/hosted-plugin.ts b/packages/plugin-ext/src/hosted/browser/hosted-plugin.ts index 500d6f4b8d611..1c3f281337c69 100644 --- a/packages/plugin-ext/src/hosted/browser/hosted-plugin.ts +++ b/packages/plugin-ext/src/hosted/browser/hosted-plugin.ts @@ -69,6 +69,7 @@ import { LanguageService } from '@theia/monaco-editor-core/esm/vs/editor/common/ import { Measurement, Stopwatch } from '@theia/core/lib/common'; import { Uint8ArrayReadBuffer, Uint8ArrayWriteBuffer } from '@theia/core/lib/common/message-rpc/uint8-array-message-buffer'; import { BasicChannel } from '@theia/core/lib/common/message-rpc/channel'; +import { NotebookTypeRegistry, NotebookService } from '@theia/notebook/lib/browser'; export type PluginHost = 'frontend' | string; export type DebugActivationEvent = 'onDebugResolve' | 'onDebugInitialConfigurations' | 'onDebugAdapterProtocolTracker' | 'onDebugDynamicConfigurations'; @@ -114,6 +115,9 @@ export class HostedPluginSupport { @inject(WorkspaceService) protected readonly workspaceService: WorkspaceService; + @inject(NotebookService) + protected readonly notebookService: NotebookService; + @inject(CommandRegistry) protected readonly commands: CommandRegistry; @@ -132,6 +136,9 @@ export class HostedPluginSupport { @inject(FrontendApplicationStateService) protected readonly appState: FrontendApplicationStateService; + @inject(NotebookTypeRegistry) + protected readonly notebookTypeRegistry: NotebookTypeRegistry; + @inject(PluginViewRegistry) protected readonly viewRegistry: PluginViewRegistry; @@ -216,6 +223,7 @@ export class HostedPluginSupport { this.taskResolverRegistry.onWillProvideTaskResolver(event => this.ensureTaskActivation(event)); this.fileService.onWillActivateFileSystemProvider(event => this.ensureFileSystemActivation(event)); this.customEditorRegistry.onWillOpenCustomEditor(event => this.activateByCustomEditor(event)); + this.notebookService.onWillOpenNotebook(async event => this.activateByNotebook(event)); this.widgets.onDidCreateWidget(({ factoryId, widget }) => { if ((factoryId === WebviewWidget.FACTORY_ID || factoryId === CustomEditorWidget.FACTORY_ID) && widget instanceof WebviewWidget) { @@ -621,6 +629,10 @@ export class HostedPluginSupport { await this.activateByEvent(`onCustomEditor:${viewType}`); } + async activateByNotebook(viewType: string): Promise { + await this.activateByEvent(`onNotebook:${viewType}`); + } + activateByFileSystem(event: FileSystemProviderActivationEvent): Promise { return this.activateByEvent(`onFileSystem:${event.scheme}`); } diff --git a/packages/plugin-ext/src/hosted/node/scanners/scanner-theia.ts b/packages/plugin-ext/src/hosted/node/scanners/scanner-theia.ts index d1b2c24f29115..0624526dff6fb 100644 --- a/packages/plugin-ext/src/hosted/node/scanners/scanner-theia.ts +++ b/packages/plugin-ext/src/hosted/node/scanners/scanner-theia.ts @@ -313,6 +313,12 @@ export class TheiaPluginScanner implements PluginScanner { console.error(`Could not read '${rawPlugin.name}' contribution 'notebooks'.`, rawPlugin.contributes.authentication, err); } + try { + contributions.notebookRenderer = rawPlugin.contributes.notebookRenderer; + } catch (err) { + console.error(`Could not read '${rawPlugin.name}' contribution 'notebooks'.`, rawPlugin.contributes.authentication, err); + } + try { contributions.snippets = this.readSnippets(rawPlugin); } catch (err) { diff --git a/packages/plugin-ext/src/main/browser/custom-editors/custom-editor-widget.ts b/packages/plugin-ext/src/main/browser/custom-editors/custom-editor-widget.ts index 5ca290804bf0a..cee4ee0fc9416 100644 --- a/packages/plugin-ext/src/main/browser/custom-editors/custom-editor-widget.ts +++ b/packages/plugin-ext/src/main/browser/custom-editors/custom-editor-widget.ts @@ -21,7 +21,7 @@ import { ApplicationShell, NavigatableWidget, Saveable, SaveableSource, SaveOpti import { SaveResourceService } from '@theia/core/lib/browser/save-resource-service'; import { Reference } from '@theia/core/lib/common/reference'; import { WebviewWidget } from '../webview/webview'; -import { UndoRedoService } from './undo-redo-service'; +import { UndoRedoService } from '@theia/editor/lib/browser/undo-redo-service'; import { CustomEditorModel } from './custom-editors-main'; @injectable() diff --git a/packages/plugin-ext/src/main/browser/custom-editors/custom-editors-main.ts b/packages/plugin-ext/src/main/browser/custom-editors/custom-editors-main.ts index 16dfe775d7bd2..ba9a5850654ed 100644 --- a/packages/plugin-ext/src/main/browser/custom-editors/custom-editors-main.ts +++ b/packages/plugin-ext/src/main/browser/custom-editors/custom-editors-main.ts @@ -36,7 +36,7 @@ import { MonacoEditorModel } from '@theia/monaco/lib/browser/monaco-editor-model import { EditorModelService } from '../text-editor-model-service'; import { CustomEditorService } from './custom-editor-service'; import { FileService } from '@theia/filesystem/lib/browser/file-service'; -import { UndoRedoService } from './undo-redo-service'; +import { UndoRedoService } from '@theia/editor/lib/browser/undo-redo-service'; import { WebviewsMainImpl } from '../webviews-main'; import { WidgetManager } from '@theia/core/lib/browser/widget-manager'; import { ApplicationShell, DefaultUriLabelProviderContribution, Saveable, SaveOptions, WidgetOpenerOptions } from '@theia/core/lib/browser'; diff --git a/packages/plugin-ext/src/main/browser/editors-and-documents-main.ts b/packages/plugin-ext/src/main/browser/editors-and-documents-main.ts index c4875fca5ea23..125cfad683fa6 100644 --- a/packages/plugin-ext/src/main/browser/editors-and-documents-main.ts +++ b/packages/plugin-ext/src/main/browser/editors-and-documents-main.ts @@ -139,6 +139,7 @@ export class EditorsAndDocumentsMain implements Disposable { uri: model.textEditorModel.uri, versionId: model.textEditorModel.getVersionId(), lines: model.textEditorModel.getLinesContent(), + languageId: model.getLanguageId(), EOL: model.textEditorModel.getEOL(), modeId: model.languageId, isDirty: model.dirty diff --git a/packages/plugin-ext/src/main/browser/languages-main.ts b/packages/plugin-ext/src/main/browser/languages-main.ts index 6f348a7cf2570..0b9e9120fd9ce 100644 --- a/packages/plugin-ext/src/main/browser/languages-main.ts +++ b/packages/plugin-ext/src/main/browser/languages-main.ts @@ -32,6 +32,7 @@ import { LanguagesExt, WorkspaceEditDto, WorkspaceTextEditDto, + WorkspaceFileEditDto, PluginInfo, LanguageStatus as LanguageStatusDTO, InlayHintDto, @@ -1418,13 +1419,15 @@ export function toMonacoWorkspaceEdit(data: WorkspaceEditDto | undefined): monac metadata: edit.metadata }; } else { + const fileEdit = edit as WorkspaceFileEditDto; return { - newResource: monaco.Uri.revive(edit.newResource), - oldResource: monaco.Uri.revive(edit.oldResource), - options: edit.options, - metadata: edit.metadata + newResource: monaco.Uri.revive(fileEdit.newResource), + oldResource: monaco.Uri.revive(fileEdit.oldResource), + options: fileEdit.options, + metadata: fileEdit.metadata }; } + // TODO implement WorkspaceNotebookCellEditDto }) }; } diff --git a/packages/plugin-ext/src/main/browser/main-context.ts b/packages/plugin-ext/src/main/browser/main-context.ts index 7b05139454b25..6ea25d5c0e2d6 100644 --- a/packages/plugin-ext/src/main/browser/main-context.ts +++ b/packages/plugin-ext/src/main/browser/main-context.ts @@ -59,7 +59,15 @@ import { MonacoLanguages } from '@theia/monaco/lib/browser/monaco-languages'; import { UntitledResourceResolver } from '@theia/core/lib/common/resource'; import { ThemeService } from '@theia/core/lib/browser/theming'; import { TabsMainImpl } from './tabs/tabs-main'; +import { NotebooksMainImpl } from './notebooks/notebooks-main'; +import { NotebookService } from '@theia/notebook/lib/browser'; import { LocalizationMainImpl } from './localization-main'; +import { NotebookRenderersMainImpl } from './notebooks/notebook-renderers-main'; +import { HostedPluginSupport } from '../../hosted/browser/hosted-plugin'; +import { NotebookEditorsMainImpl } from './notebooks/notebook-editors-main'; +import { NotebookDocumentsMainImpl } from './notebooks/notebook-documents-main'; +import { NotebookKernelsMainImpl } from './notebooks/notebook-kernels-main'; +import { NotebooksAndEditorsMain } from './notebooks/notebook-documents-and-editors-main'; export function setUpPluginApi(rpc: RPCProtocol, container: interfaces.Container): void { const authenticationMain = new AuthenticationMainImpl(rpc, container); @@ -94,6 +102,17 @@ export function setUpPluginApi(rpc: RPCProtocol, container: interfaces.Container const documentsMain = new DocumentsMainImpl(editorsAndDocuments, modelService, rpc, editorManager, openerService, shell, untitledResourceResolver, languageService); rpc.set(PLUGIN_RPC_CONTEXT.DOCUMENTS_MAIN, documentsMain); + const notebookService = container.get(NotebookService); + const pluginSupport = container.get(HostedPluginSupport); + rpc.set(PLUGIN_RPC_CONTEXT.NOTEBOOKS_MAIN, new NotebooksMainImpl(rpc, notebookService, pluginSupport)); + rpc.set(PLUGIN_RPC_CONTEXT.NOTEBOOK_RENDERERS_MAIN, new NotebookRenderersMainImpl(rpc, container)); + const notebookEditorsMain = new NotebookEditorsMainImpl(rpc, container); + rpc.set(PLUGIN_RPC_CONTEXT.NOTEBOOK_EDITORS_MAIN, notebookEditorsMain); + const notebookDocumentsMain = new NotebookDocumentsMainImpl(rpc, container); + rpc.set(PLUGIN_RPC_CONTEXT.NOTEBOOK_DOCUMENTS_MAIN, notebookDocumentsMain); + rpc.set(PLUGIN_RPC_CONTEXT.NOTEBOOK_DOCUMENTS_AND_EDITORS_MAIN, new NotebooksAndEditorsMain(rpc, container, notebookDocumentsMain, notebookEditorsMain)); + rpc.set(PLUGIN_RPC_CONTEXT.NOTEBOOK_KERNELS_MAIN, new NotebookKernelsMainImpl(rpc, container)); + const bulkEditService = container.get(MonacoBulkEditService); const monacoEditorService = container.get(MonacoEditorService); const editorsMain = new TextEditorsMainImpl(editorsAndDocuments, documentsMain, rpc, bulkEditService, monacoEditorService); diff --git a/packages/plugin-ext/src/main/browser/notebooks/notebook-documents-and-editors-main.ts b/packages/plugin-ext/src/main/browser/notebooks/notebook-documents-and-editors-main.ts new file mode 100644 index 0000000000000..3e20545e201aa --- /dev/null +++ b/packages/plugin-ext/src/main/browser/notebooks/notebook-documents-and-editors-main.ts @@ -0,0 +1,238 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Disposable, DisposableCollection } from '@theia/core'; +import { interfaces } from '@theia/core/shared/inversify'; +import { UriComponents } from '@theia/core/lib/common/uri'; +import { NotebookEditorWidget, NotebookService, NotebookEditorWidgetService } from '@theia/notebook/lib/browser'; +import { NotebookModel } from '@theia/notebook/lib/browser/view-model/notebook-model'; +import { MAIN_RPC_CONTEXT, NotebookDocumentsAndEditorsDelta, NotebookDocumentsAndEditorsMain, NotebookModelAddedData, NotebooksExt } from '../../../common'; +import { RPCProtocol } from '../../../common/rpc-protocol'; +import { NotebookDto } from './notebook-dto'; +import { WidgetManager } from '@theia/core/lib/browser'; +import { NotebookEditorsMainImpl } from './notebook-editors-main'; +import { NotebookDocumentsMainImpl } from './notebook-documents-main'; +import { diffMaps, diffSets } from '../../../common/collections'; +import { Mutex } from 'async-mutex'; + +interface NotebookAndEditorDelta { + removedDocuments: UriComponents[]; + addedDocuments: NotebookModel[]; + removedEditors: string[]; + addedEditors: NotebookEditorWidget[]; + newActiveEditor?: string | null; + visibleEditors?: string[]; +} + +class NotebookAndEditorState { + static delta(before: NotebookAndEditorState | undefined, after: NotebookAndEditorState): NotebookAndEditorDelta { + if (!before) { + return { + addedDocuments: [...after.documents], + removedDocuments: [], + addedEditors: [...after.textEditors.values()], + removedEditors: [], + visibleEditors: [...after.visibleEditors].map(editor => editor[0]) + }; + } + const documentDelta = diffSets(before.documents, after.documents); + const editorDelta = diffMaps(before.textEditors, after.textEditors); + + const newActiveEditor = before.activeEditor !== after.activeEditor ? after.activeEditor : undefined; + const visibleEditorDelta = diffMaps(before.visibleEditors, after.visibleEditors); + + return { + addedDocuments: documentDelta.added, + removedDocuments: documentDelta.removed.map(e => e.uri.toComponents()), + addedEditors: editorDelta.added, + removedEditors: editorDelta.removed.map(removed => removed.id), + newActiveEditor: newActiveEditor, + visibleEditors: visibleEditorDelta.added.length === 0 && visibleEditorDelta.removed.length === 0 + ? undefined + : [...after.visibleEditors].map(editor => editor[0]) + }; + } + + constructor( + readonly documents: Set, + readonly textEditors: Map, + readonly activeEditor: string | null | undefined, + readonly visibleEditors: Map + ) { + // + } +} + +export class NotebooksAndEditorsMain implements NotebookDocumentsAndEditorsMain { + + protected readonly proxy: NotebooksExt; + protected readonly disposables = new DisposableCollection(); + + protected readonly editorListeners = new Map(); + + protected currentState?: NotebookAndEditorState; + protected readonly updateMutex = new Mutex(); + + protected readonly notebookService: NotebookService; + protected readonly notebookEditorService: NotebookEditorWidgetService; + protected readonly WidgetManager: WidgetManager; + + constructor( + rpc: RPCProtocol, + container: interfaces.Container, + protected readonly notebookDocumentsMain: NotebookDocumentsMainImpl, + protected readonly notebookEditorsMain: NotebookEditorsMainImpl + ) { + this.proxy = rpc.getProxy(MAIN_RPC_CONTEXT.NOTEBOOKS_EXT); + + this.notebookService = container.get(NotebookService); + this.notebookEditorService = container.get(NotebookEditorWidgetService); + this.WidgetManager = container.get(WidgetManager); + + this.notebookService.onDidAddNotebookDocument(async () => this.updateState(), this, this.disposables); + this.notebookService.onDidRemoveNotebookDocument(async () => this.updateState(), this, this.disposables); + // this.WidgetManager.onActiveEditorChanged(() => this.updateState(), this, this.disposables); + this.notebookEditorService.onDidAddNotebookEditor(async editor => this.handleEditorAdd(editor), this, this.disposables); + this.notebookEditorService.onDidRemoveNotebookEditor(async editor => this.handleEditorRemove(editor), this, this.disposables); + this.notebookEditorService.onFocusedEditorChanged(async editor => this.updateState(editor), this, this.disposables); + } + + dispose(): void { + this.notebookDocumentsMain.dispose(); + this.notebookEditorsMain.dispose(); + this.disposables.dispose(); + this.editorListeners.forEach(listeners => listeners.forEach(listener => listener.dispose())); + } + + private async handleEditorAdd(editor: NotebookEditorWidget): Promise { + const listeners = this.editorListeners.get(editor.id); + const disposable = editor.onDidChangeModel(() => this.updateState()); + if (listeners) { + listeners.push(disposable); + } else { + this.editorListeners.set(editor.id, [disposable]); + } + await this.updateState(); + } + + private handleEditorRemove(editor: NotebookEditorWidget): void { + const listeners = this.editorListeners.get(editor.id); + listeners?.forEach(listener => listener.dispose()); + this.editorListeners.delete(editor.id); + this.updateState(); + } + + private async updateState(focusedEditor?: NotebookEditorWidget): Promise { + await this.updateMutex.runExclusive(async () => this.doUpdateState(focusedEditor)); + } + + private async doUpdateState(focusedEditor?: NotebookEditorWidget): Promise { + + const editors = new Map(); + const visibleEditorsMap = new Map(); + + for (const editor of this.notebookEditorService.listNotebookEditors()) { + if (editor.model) { + editors.set(editor.id, editor); + } + } + + const activeNotebookEditor = this.notebookEditorService.currentFocusedEditor; + let activeEditor: string | null = null; + if (activeNotebookEditor) { + activeEditor = activeNotebookEditor.id; + } else if (focusedEditor?.model) { + activeEditor = focusedEditor.id; + } + if (activeEditor && !editors.has(activeEditor)) { + activeEditor = null; + } + + const notebookEditors = this.WidgetManager.getWidgets(NotebookEditorWidget.ID) as NotebookEditorWidget[]; + for (const notebookEditor of notebookEditors) { + if (notebookEditor?.model && editors.has(notebookEditor.id) && notebookEditor.isVisible) { + visibleEditorsMap.set(notebookEditor.id, notebookEditor); + } + } + + const newState = new NotebookAndEditorState( + new Set(this.notebookService.listNotebookDocuments()), + editors, + activeEditor, visibleEditorsMap); + await this.onDelta(NotebookAndEditorState.delta(this.currentState, newState)); + this.currentState = newState; + } + + private async onDelta(delta: NotebookAndEditorDelta): Promise { + if (NotebooksAndEditorsMain._isDeltaEmpty(delta)) { + return; + } + + const dto: NotebookDocumentsAndEditorsDelta = { + removedDocuments: delta.removedDocuments, + removedEditors: delta.removedEditors, + newActiveEditor: delta.newActiveEditor, + visibleEditors: delta.visibleEditors, + addedDocuments: delta.addedDocuments.map(NotebooksAndEditorsMain.asModelAddData), + // addedEditors: delta.addedEditors.map(this.asEditorAddData, this), + }; + + // send to extension FIRST + await this.proxy.$acceptDocumentsAndEditorsDelta(dto); + + // handle internally + this.notebookEditorsMain.handleEditorsRemoved(delta.removedEditors); + this.notebookDocumentsMain.handleNotebooksRemoved(delta.removedDocuments); + this.notebookDocumentsMain.handleNotebooksAdded(delta.addedDocuments); + this.notebookEditorsMain.handleEditorsAdded(delta.addedEditors); + } + + private static _isDeltaEmpty(delta: NotebookAndEditorDelta): boolean { + if (delta.addedDocuments !== undefined && delta.addedDocuments.length > 0) { + return false; + } + if (delta.removedDocuments !== undefined && delta.removedDocuments.length > 0) { + return false; + } + if (delta.addedEditors !== undefined && delta.addedEditors.length > 0) { + return false; + } + if (delta.removedEditors !== undefined && delta.removedEditors.length > 0) { + return false; + } + if (delta.visibleEditors !== undefined && delta.visibleEditors.length > 0) { + return false; + } + if (delta.newActiveEditor !== undefined) { + return false; + } + return true; + } + + private static asModelAddData(e: NotebookModel): NotebookModelAddedData { + return { + viewType: e.viewType, + uri: e.uri.toComponents(), + metadata: e.metadata, + versionId: 1, // TODO implement versionID support + cells: e.cells.map(NotebookDto.toNotebookCellDto) + }; + } +} diff --git a/packages/plugin-ext/src/main/browser/notebooks/notebook-documents-main.ts b/packages/plugin-ext/src/main/browser/notebooks/notebook-documents-main.ts new file mode 100644 index 0000000000000..16012ddc0798a --- /dev/null +++ b/packages/plugin-ext/src/main/browser/notebooks/notebook-documents-main.ts @@ -0,0 +1,166 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { DisposableCollection } from '@theia/core'; +import { URI, UriComponents } from '@theia/core/lib/common/uri'; +import { interfaces } from '@theia/core/shared/inversify'; +import { NotebookModelResolverService } from '@theia/notebook/lib/browser'; +import { NotebookModel } from '@theia/notebook/lib/browser/view-model/notebook-model'; +import { NotebookCellsChangeType } from '@theia/notebook/lib/common'; +import { MAIN_RPC_CONTEXT, NotebookCellDto, NotebookCellsChangedEventDto, NotebookDataDto, NotebookDocumentsExt, NotebookDocumentsMain } from '../../../common'; +import { RPCProtocol } from '../../../common/rpc-protocol'; +import { NotebookDto } from './notebook-dto'; + +export class NotebookDocumentsMainImpl implements NotebookDocumentsMain { + + private readonly disposables = new DisposableCollection(); + + private readonly proxy: NotebookDocumentsExt; + private readonly documentEventListenersMapping = new Map(); + + private readonly notebookModelResolverService: NotebookModelResolverService; + + constructor( + rpc: RPCProtocol, + container: interfaces.Container + ) { + this.proxy = rpc.getProxy(MAIN_RPC_CONTEXT.NOTEBOOK_DOCUMENTS_EXT); + this.notebookModelResolverService = container.get(NotebookModelResolverService); + + // forward dirty and save events + this.disposables.push(this.notebookModelResolverService.onDidChangeDirty(model => this.proxy.$acceptDirtyStateChanged(model.uri.toComponents(), model.isDirty()))); + this.disposables.push(this.notebookModelResolverService.onDidSaveNotebook(e => this.proxy.$acceptModelSaved(e))); + + } + + dispose(): void { + this.disposables.dispose(); + // this.modelReferenceCollection.dispose(); + this.documentEventListenersMapping.forEach(value => value.dispose()); + } + + handleNotebooksAdded(notebooks: readonly NotebookModel[]): void { + + for (const textModel of notebooks) { + const disposableStore = new DisposableCollection(); + disposableStore.push(textModel.onDidChangeContent(event => { + + const eventDto: NotebookCellsChangedEventDto = { + versionId: 1, // TODO implement version ID support + rawEvents: [] + }; + + for (const e of event.rawEvents) { + + switch (e.kind) { + case NotebookCellsChangeType.ModelChange: + eventDto.rawEvents.push({ + kind: e.kind, + changes: e.changes.map(diff => + [diff[0], diff[1], diff[2].map(NotebookDto.toNotebookCellDto)] as [number, number, NotebookCellDto[]]) + }); + break; + case NotebookCellsChangeType.Move: + eventDto.rawEvents.push({ + kind: e.kind, + index: e.index, + length: e.length, + newIdx: e.newIdx, + }); + break; + case NotebookCellsChangeType.Output: + eventDto.rawEvents.push({ + kind: e.kind, + index: e.index, + outputs: e.outputs.map(NotebookDto.toNotebookOutputDto) + }); + break; + case NotebookCellsChangeType.OutputItem: + eventDto.rawEvents.push({ + kind: e.kind, + index: e.index, + outputId: e.outputId, + outputItems: e.outputItems.map(NotebookDto.toNotebookOutputItemDto), + append: e.append + }); + break; + case NotebookCellsChangeType.ChangeCellLanguage: + case NotebookCellsChangeType.ChangeCellContent: + case NotebookCellsChangeType.ChangeCellMetadata: + case NotebookCellsChangeType.ChangeCellInternalMetadata: + eventDto.rawEvents.push(e); + break; + } + } + + const hasDocumentMetadataChangeEvent = event.rawEvents.find(e => e.kind === NotebookCellsChangeType.ChangeDocumentMetadata); + + // using the model resolver service to know if the model is dirty or not. + // assuming this is the first listener it can mean that at first the model + // is marked as dirty and that another event is fired + this.proxy.$acceptModelChanged( + textModel.uri.toComponents(), + eventDto, + textModel.isDirty(), + hasDocumentMetadataChangeEvent ? textModel.metadata : undefined + ); + })); + + this.documentEventListenersMapping.set(textModel.uri.toString(), disposableStore); + } + } + + handleNotebooksRemoved(uris: UriComponents[]): void { + for (const uri of uris) { + this.documentEventListenersMapping.get(uri.toString())?.dispose(); + this.documentEventListenersMapping.delete(uri.toString()); + } + } + + async $tryCreateNotebook(options: { viewType: string; content?: NotebookDataDto }): Promise { + const ref = await this.notebookModelResolverService.resolve({ untitledResource: undefined }, options.viewType); + + // untitled notebooks are disposed when they get saved. we should not hold a reference + // to such a disposed notebook and therefore dispose the reference as well + // ref.onWillDispose(() => { + // ref.dispose(); + // }); + + // untitled notebooks are dirty by default + this.proxy.$acceptDirtyStateChanged(ref.uri.toComponents(), true); + + // apply content changes... slightly HACKY -> this triggers a change event + // if (options.content) { + // const data = NotebookDto.fromNotebookDataDto(options.content); + // ref.notebook.reset(data.cells, data.metadata, ref.object.notebook.transientOptions); + // } + return ref.uri.toComponents(); + } + + async $tryOpenNotebook(uriComponents: UriComponents): Promise { + const uri = URI.fromComponents(uriComponents); + return uri.toComponents(); + } + + async $trySaveNotebook(uriComponents: UriComponents): Promise { + const uri = URI.fromComponents(uriComponents); + + const ref = await this.notebookModelResolverService.resolve(uri); + await ref.save({}); + ref.dispose(); + return true; + } +} diff --git a/packages/plugin-ext/src/main/browser/notebooks/notebook-dto.ts b/packages/plugin-ext/src/main/browser/notebooks/notebook-dto.ts new file mode 100644 index 0000000000000..3b3f0c0014e61 --- /dev/null +++ b/packages/plugin-ext/src/main/browser/notebooks/notebook-dto.ts @@ -0,0 +1,141 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { OS } from '@theia/core'; +import * as notebookCommon from '@theia/notebook/lib/common'; +import { NotebookCellModel } from '@theia/notebook/lib/browser/view-model/notebook-cell-model'; +import * as rpc from '../../../common'; + +export namespace NotebookDto { + + export function toNotebookOutputItemDto(item: notebookCommon.CellOutputItem): rpc.NotebookOutputItemDto { + return { + mime: item.mime, + valueBytes: item.data + }; + } + + export function toNotebookOutputDto(output: notebookCommon.CellOutput): rpc.NotebookOutputDto { + return { + outputId: output.outputId, + metadata: output.metadata, + items: output.outputs.map(toNotebookOutputItemDto) + }; + } + + export function toNotebookCellDataDto(cell: notebookCommon.CellData): rpc.NotebookCellDataDto { + return { + cellKind: cell.cellKind, + language: cell.language, + source: cell.source, + internalMetadata: cell.internalMetadata, + metadata: cell.metadata, + outputs: cell.outputs.map(toNotebookOutputDto) + }; + } + + export function toNotebookDataDto(data: notebookCommon.NotebookData): rpc.NotebookDataDto { + return { + metadata: data.metadata, + cells: data.cells.map(toNotebookCellDataDto) + }; + } + + export function fromNotebookOutputItemDto(item: rpc.NotebookOutputItemDto): notebookCommon.CellOutputItem { + return { + mime: item.mime, + data: item.valueBytes + }; + } + + export function fromNotebookOutputDto(output: rpc.NotebookOutputDto): notebookCommon.CellOutput { + return { + outputId: output.outputId, + metadata: output.metadata, + outputs: output.items.map(fromNotebookOutputItemDto) + }; + } + + export function fromNotebookCellDataDto(cell: rpc.NotebookCellDataDto): notebookCommon.CellData { + return { + cellKind: cell.cellKind, + language: cell.language, + source: cell.source, + outputs: cell.outputs.map(fromNotebookOutputDto), + metadata: cell.metadata, + internalMetadata: cell.internalMetadata + }; + } + + export function fromNotebookDataDto(data: rpc.NotebookDataDto): notebookCommon.NotebookData { + return { + metadata: data.metadata, + cells: data.cells.map(fromNotebookCellDataDto) + }; + } + + export function toNotebookCellDto(cell: NotebookCellModel): rpc.NotebookCellDto { + const eol = OS.backend.isWindows ? '\r\n' : '\n'; + return { + handle: cell.handle, + uri: cell.uri.toComponents(), + source: cell.textBuffer.split(eol), + eol, + language: cell.language, + cellKind: cell.cellKind, + outputs: cell.outputs.map(toNotebookOutputDto), + metadata: cell.metadata, + internalMetadata: cell.internalMetadata, + }; + } + + // export function fromCellExecuteUpdateDto(data: extHostProtocol.ICellExecuteUpdateDto): ICellExecuteUpdate { + // if (data.editType === CellExecutionUpdateType.Output) { + // return { + // editType: data.editType, + // cellHandle: data.cellHandle, + // append: data.append, + // outputs: data.outputs.map(fromNotebookOutputDto) + // }; + // } else if (data.editType === CellExecutionUpdateType.OutputItems) { + // return { + // editType: data.editType, + // append: data.append, + // outputId: data.outputId, + // items: data.items.map(fromNotebookOutputItemDto) + // }; + // } else { + // return data; + // } + // } + + // export function fromCellExecuteCompleteDto(data: extHostProtocol.ICellExecutionCompleteDto): ICellExecutionComplete { + // return data; + // } + + // export function fromCellEditOperationDto(edit: extHostProtocol.ICellEditOperationDto): notebookCommon.ICellEditOperation { + // if (edit.editType === notebookCommon.CellEditType.Replace) { + // return { + // editType: edit.editType, + // index: edit.index, + // count: edit.count, + // cells: edit.cells.map(fromNotebookCellDataDto) + // }; + // } else { + // return edit; + // } + // } +} diff --git a/packages/plugin-ext/src/main/browser/notebooks/notebook-editors-main.ts b/packages/plugin-ext/src/main/browser/notebooks/notebook-editors-main.ts new file mode 100644 index 0000000000000..3a9a50208a6b9 --- /dev/null +++ b/packages/plugin-ext/src/main/browser/notebooks/notebook-editors-main.ts @@ -0,0 +1,70 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { UriComponents, URI } from '@theia/core/lib/common/uri'; +import { CellRange } from '@theia/notebook/lib/common'; +import { NotebookEditorWidget } from '@theia/notebook/lib/browser'; +import { MAIN_RPC_CONTEXT, NotebookDocumentShowOptions, NotebookEditorRevealType, NotebookEditorsExt, NotebookEditorsMain } from '../../../common'; +import { RPCProtocol } from '../../../common/rpc-protocol'; +import { interfaces } from '@theia/core/shared/inversify'; +import { open, OpenerService } from '@theia/core/lib/browser'; + +export class NotebookEditorsMainImpl implements NotebookEditorsMain { + + protected readonly proxy: NotebookEditorsExt; + protected readonly openerService: OpenerService; + + protected readonly mainThreadEditors = new Map(); + + constructor( + rpc: RPCProtocol, + container: interfaces.Container + ) { + this.proxy = rpc.getProxy(MAIN_RPC_CONTEXT.NOTEBOOK_EDITORS_EXT); + this.openerService = container.get(OpenerService); + } + + async $tryShowNotebookDocument(uriComponents: UriComponents, viewType: string, options: NotebookDocumentShowOptions): Promise { + const editor = await open(this.openerService, URI.fromComponents(uriComponents), {}); + return (editor as NotebookEditorWidget).id; + } + $tryRevealRange(id: string, range: CellRange, revealType: NotebookEditorRevealType): Promise { + throw new Error('Method not implemented.'); + } + $trySetSelections(id: string, range: CellRange[]): void { + throw new Error('Method not implemented.'); + } + + handleEditorsAdded(editors: readonly NotebookEditorWidget[]): void { + for (const editor of editors) { + this.mainThreadEditors.set(editor.id, editor); + } + } + + handleEditorsRemoved(editorIds: readonly string[]): void { + for (const id of editorIds) { + this.mainThreadEditors.get(id)?.dispose(); + this.mainThreadEditors.delete(id); + } + } + + dispose(): void { + } +} diff --git a/packages/plugin-ext/src/main/browser/notebooks/notebook-kernels-main.ts b/packages/plugin-ext/src/main/browser/notebooks/notebook-kernels-main.ts new file mode 100644 index 0000000000000..9f12589bb0237 --- /dev/null +++ b/packages/plugin-ext/src/main/browser/notebooks/notebook-kernels-main.ts @@ -0,0 +1,291 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { CancellationToken, Disposable, Emitter, Event, URI } from '@theia/core'; +import { UriComponents } from '@theia/core/lib/common/uri'; +import { LanguageService } from '@theia/core/lib/browser/language-service'; +import { CellExecuteUpdateDto, CellExecutionCompleteDto, MAIN_RPC_CONTEXT, NotebookKernelDto, NotebookKernelsExt, NotebookKernelsMain } from '../../../common'; +import { RPCProtocol } from '../../../common/rpc-protocol'; +import { CellExecution, NotebookExecutionStateService, NotebookKernelChangeEvent, NotebookKernelService, NotebookService } from '@theia/notebook/lib/browser'; +import { combinedDisposable } from '@theia/monaco-editor-core/esm/vs/base/common/lifecycle'; +import { interfaces } from '@theia/core/shared/inversify'; +import { NotebookKernelSourceAction } from '@theia/notebook/lib/common'; +import { NotebookDto } from '../../../plugin/type-converters'; + +abstract class NotebookKernel { + private readonly onDidChangeEmitter = new Emitter(); + private readonly preloads: { uri: URI; provides: readonly string[] }[]; + readonly onDidChange: Event = this.onDidChangeEmitter.event; + + readonly id: string; + readonly viewType: string; + readonly extension: string; + + implementsInterrupt: boolean; + label: string; + description?: string; + detail?: string; + supportedLanguages: string[]; + implementsExecutionOrder: boolean; + localResourceRoot: URI; + + public get preloadUris(): URI[] { + return this.preloads.map(p => p.uri); + } + + public get preloadProvides(): string[] { + return this.preloads.map(p => p.provides).flat(); + } + + constructor(data: NotebookKernelDto, private languageService: LanguageService) { + this.id = data.id; + this.viewType = data.notebookType; + this.extension = data.extensionId; + + this.implementsInterrupt = data.supportsInterrupt ?? false; + this.label = data.label; + this.description = data.description; + this.detail = data.detail; + this.supportedLanguages = (data.supportedLanguages && data.supportedLanguages.length > 0) ? data.supportedLanguages : languageService.languages.map(lang => lang.id); + this.implementsExecutionOrder = data.supportsExecutionOrder ?? false; + this.preloads = data.preloads?.map(u => ({ uri: URI.fromComponents(u.uri), provides: u.provides })) ?? []; + } + + update(data: Partial): void { + + const event: NotebookKernelChangeEvent = Object.create(null); + if (data.label !== undefined) { + this.label = data.label; + event.label = true; + } + if (data.description !== undefined) { + this.description = data.description; + event.description = true; + } + if (data.detail !== undefined) { + this.detail = data.detail; + event.detail = true; + } + if (data.supportedLanguages !== undefined) { + this.supportedLanguages = (data.supportedLanguages && data.supportedLanguages.length > 0) ? + data.supportedLanguages : + this.languageService.languages.map(lang => lang.id); + event.supportedLanguages = true; + } + if (data.supportsExecutionOrder !== undefined) { + this.implementsExecutionOrder = data.supportsExecutionOrder; + event.hasExecutionOrder = true; + } + if (data.supportsInterrupt !== undefined) { + this.implementsInterrupt = data.supportsInterrupt; + event.hasInterruptHandler = true; + } + this.onDidChangeEmitter.fire(event); + } + + abstract executeNotebookCellsRequest(uri: URI, cellHandles: number[]): Promise; + abstract cancelNotebookCellExecution(uri: URI, cellHandles: number[]): Promise; +} + +class KernelDetectionTask { + constructor(readonly notebookType: string) { } +} + +export interface KernelSourceActionProvider { + readonly viewType: string; + onDidChangeSourceActions?: Event; + provideKernelSourceActions(): Promise; +} + +export class NotebookKernelsMainImpl implements NotebookKernelsMain { + + private readonly proxy: NotebookKernelsExt; + + private readonly kernels = new Map(); + + private readonly kernelDetectionTasks = new Map(); + + private readonly kernelSourceActionProviders = new Map(); + private readonly kernelSourceActionProvidersEventRegistrations = new Map(); + + private notebookKernelService: NotebookKernelService; + private notebookService: NotebookService; + private languageService: LanguageService; + private notebookExecutionStateService: NotebookExecutionStateService; + + private readonly executions = new Map(); + + constructor( + rpc: RPCProtocol, + container: interfaces.Container, + ) { + this.proxy = rpc.getProxy(MAIN_RPC_CONTEXT.NOTEBOOK_KERNELS_EXT); + + this.notebookKernelService = container.get(NotebookKernelService); + this.notebookExecutionStateService = container.get(NotebookExecutionStateService); + this.notebookService = container.get(NotebookService); + this.languageService = container.get(LanguageService); + } + + $postMessage(handle: number, editorId: string | undefined, message: unknown): Promise { + throw new Error('Method not implemented.'); + } + + async $addKernel(handle: number, data: NotebookKernelDto): Promise { + const that = this; + const kernel = new class extends NotebookKernel { + async executeNotebookCellsRequest(uri: URI, handles: number[]): Promise { + await that.proxy.$executeCells(handle, uri.toComponents(), handles); + } + async cancelNotebookCellExecution(uri: URI, handles: number[]): Promise { + await that.proxy.$cancelCells(handle, uri.toComponents(), handles); + } + }(data, this.languageService); + + const listener = this.notebookKernelService.onDidChangeSelectedKernel(e => { + if (e.oldKernel === kernel.id) { + this.proxy.$acceptNotebookAssociation(handle, e.notebook.toComponents(), false); + } else if (e.newKernel === kernel.id) { + this.proxy.$acceptNotebookAssociation(handle, e.notebook.toComponents(), true); + } + }); + + const registration = this.notebookKernelService.registerKernel(kernel); + this.kernels.set(handle, [kernel, combinedDisposable(listener, registration)]); + + } + + $updateKernel(handle: number, data: Partial): void { + const tuple = this.kernels.get(handle); + if (tuple) { + tuple[0].update(data); + } + } + + $removeKernel(handle: number): void { + const tuple = this.kernels.get(handle); + if (tuple) { + tuple[1].dispose(); + this.kernels.delete(handle); + } + } + + $updateNotebookPriority(handle: number, uri: UriComponents, value: number | undefined): void { + throw new Error('Method not implemented.'); + } + + $createExecution(handle: number, controllerId: string, uriComponents: UriComponents, cellHandle: number): void { + const uri = URI.fromComponents(uriComponents); + const notebook = this.notebookService.getNotebookEditorModel(uri); + if (!notebook) { + throw new Error(`Notebook not found: ${uri.toString()}`); + } + + const kernel = this.notebookKernelService.getMatchingKernel(notebook); + if (!kernel.selected || kernel.selected.id !== controllerId) { + throw new Error(`Kernel is not selected: ${kernel.selected?.id} !== ${controllerId}`); + } + const execution = this.notebookExecutionStateService.createCellExecution(uri, cellHandle); + execution.confirm(); + this.executions.set(handle, execution); + } + + $updateExecution(handle: number, updates: CellExecuteUpdateDto[]): void { + const execution = this.executions.get(handle); + execution?.update(updates.map(NotebookDto.fromCellExecuteUpdateDto)); + + } + $completeExecution(handle: number, data: CellExecutionCompleteDto): void { + try { + const execution = this.executions.get(handle); + execution?.complete(NotebookDto.fromCellExecuteCompleteDto(data)); + } finally { + this.executions.delete(handle); + } + + } + + // TODO implement notebook execution (special api for executing full notebook instead of just cells) + $createNotebookExecution(handle: number, controllerId: string, uri: UriComponents): void { + throw new Error('Method not implemented.'); + } + $beginNotebookExecution(handle: number): void { + throw new Error('Method not implemented.'); + } + $completeNotebookExecution(handle: number): void { + throw new Error('Method not implemented.'); + } + + async $addKernelDetectionTask(handle: number, notebookType: string): Promise { + const kernelDetectionTask = new KernelDetectionTask(notebookType); + const registration = this.notebookKernelService.registerNotebookKernelDetectionTask(kernelDetectionTask); + this.kernelDetectionTasks.set(handle, [kernelDetectionTask, registration]); + } + $removeKernelDetectionTask(handle: number): void { + const tuple = this.kernelDetectionTasks.get(handle); + if (tuple) { + tuple[1].dispose(); + this.kernelDetectionTasks.delete(handle); + } + } + async $addKernelSourceActionProvider(handle: number, eventHandle: number, notebookType: string): Promise { + const kernelSourceActionProvider: KernelSourceActionProvider = { + viewType: notebookType, + provideKernelSourceActions: async () => { + const actions = await this.proxy.$provideKernelSourceActions(handle, CancellationToken.None); + + return actions.map(action => ({ + label: action.label, + command: action.command, + description: action.description, + detail: action.detail, + documentation: action.documentation, + })); + } + }; + + if (typeof eventHandle === 'number') { + const emitter = new Emitter(); + this.kernelSourceActionProvidersEventRegistrations.set(eventHandle, emitter); + kernelSourceActionProvider.onDidChangeSourceActions = emitter.event; + } + + const registration = this.notebookKernelService.registerKernelSourceActionProvider(notebookType, kernelSourceActionProvider); + this.kernelSourceActionProviders.set(handle, [kernelSourceActionProvider, registration]); + } + + $removeKernelSourceActionProvider(handle: number, eventHandle: number): void { + const tuple = this.kernelSourceActionProviders.get(handle); + if (tuple) { + tuple[1].dispose(); + this.kernelSourceActionProviders.delete(handle); + } + if (typeof eventHandle === 'number') { + this.kernelSourceActionProvidersEventRegistrations.delete(eventHandle); + } + } + $emitNotebookKernelSourceActionsChangeEvent(eventHandle: number): void { + } + + dispose(): void { + this.kernels.forEach(kernel => kernel[1].dispose()); + } + +} diff --git a/packages/plugin-ext/src/main/browser/notebooks/notebook-renderers-main.ts b/packages/plugin-ext/src/main/browser/notebooks/notebook-renderers-main.ts new file mode 100644 index 0000000000000..867f6fa14faa3 --- /dev/null +++ b/packages/plugin-ext/src/main/browser/notebooks/notebook-renderers-main.ts @@ -0,0 +1,47 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { DisposableCollection } from '@theia/core'; +import { interfaces } from '@theia/core/shared/inversify'; +import { NotebookRendererMessagingService } from '@theia/notebook/lib/browser'; +import { MAIN_RPC_CONTEXT, NotebookRenderersExt, NotebookRenderersMain } from '../../../common'; +import { RPCProtocol } from '../../../common/rpc-protocol'; + +export class NotebookRenderersMainImpl implements NotebookRenderersMain { + private readonly proxy: NotebookRenderersExt; + private readonly rendererMessagingService: NotebookRendererMessagingService; + + private readonly disposables = new DisposableCollection(); + + constructor( + rpc: RPCProtocol, + container: interfaces.Container + ) { + this.proxy = rpc.getProxy(MAIN_RPC_CONTEXT.NOTEBOOK_RENDERERS_EXT); + this.rendererMessagingService = container.get(NotebookRendererMessagingService); + this.rendererMessagingService.onShouldPostMessage(e => { + this.proxy.$postRendererMessage(e.editorId, e.rendererId, e.message); + }); + } + + $postMessage(editorId: string | undefined, rendererId: string, message: unknown): Promise { + return this.rendererMessagingService.receiveMessage(editorId, rendererId, message); + } + + dispose(): void { + this.disposables.dispose(); + } +} diff --git a/packages/plugin-ext/src/main/browser/notebooks/notebooks-main.ts b/packages/plugin-ext/src/main/browser/notebooks/notebooks-main.ts new file mode 100644 index 0000000000000..f31816ea8656e --- /dev/null +++ b/packages/plugin-ext/src/main/browser/notebooks/notebooks-main.ts @@ -0,0 +1,124 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { CancellationToken, DisposableCollection, Emitter } from '@theia/core'; +import { BinaryBuffer } from '@theia/core/lib/common/buffer'; +import { NotebookCellStatusBarItemList, NotebookCellStatusBarItemProvider, NotebookData, NotebookExtensionDescription, TransientOptions } from '@theia/notebook/lib/common'; +import { NotebookService } from '@theia/notebook/lib/browser'; +import { Disposable } from '@theia/plugin'; +import { MAIN_RPC_CONTEXT, NotebooksExt, NotebooksMain } from '../../../common'; +import { RPCProtocol } from '../../../common/rpc-protocol'; +import { NotebookDto } from './notebook-dto'; +import { UriComponents } from '@theia/core/lib/common/uri'; +import { HostedPluginSupport } from '../../../hosted/browser/hosted-plugin'; + +export class NotebooksMainImpl implements NotebooksMain { + + private readonly disposables = new DisposableCollection(); + + private readonly proxy: NotebooksExt; + private readonly notebookSerializer = new Map(); + private readonly notebookCellStatusBarRegistrations = new Map(); + + constructor( + rpc: RPCProtocol, + private notebookService: NotebookService, + plugins: HostedPluginSupport + ) { + this.proxy = rpc.getProxy(MAIN_RPC_CONTEXT.NOTEBOOKS_EXT); + notebookService.onNotebookSerializer(async event => plugins.activateByEvent(event)); + notebookService.markReady(); + } + + dispose(): void { + this.disposables.dispose(); + for (const disposable of this.notebookSerializer.values()) { + disposable.dispose(); + } + } + + $registerNotebookSerializer(handle: number, extension: NotebookExtensionDescription, viewType: string, options: TransientOptions): void { + const disposables = new DisposableCollection(); + + disposables.push(this.notebookService.registerNotebookSerializer(viewType, extension, { + options, + dataToNotebook: async (data: BinaryBuffer): Promise => { + const dto = await this.proxy.$dataToNotebook(handle, data, CancellationToken.None); + return NotebookDto.fromNotebookDataDto(dto); + }, + notebookToData: (data: NotebookData): Promise => + this.proxy.$notebookToData(handle, NotebookDto.toNotebookDataDto(data), CancellationToken.None) + + })); + + this.notebookSerializer.set(handle, disposables); + } + + $unregisterNotebookSerializer(handle: number): void { + this.notebookSerializer.get(handle)?.dispose(); + this.notebookSerializer.delete(handle); + } + + $emitCellStatusBarEvent(eventHandle: number): void { + const emitter = this.notebookCellStatusBarRegistrations.get(eventHandle); + if (emitter instanceof Emitter) { + emitter.fire(undefined); + } + } + + async $registerNotebookCellStatusBarItemProvider(handle: number, eventHandle: number | undefined, viewType: string): Promise { + const that = this; + const provider: NotebookCellStatusBarItemProvider = { + async provideCellStatusBarItems(uri: UriComponents, index: number, token: CancellationToken): Promise { + const result = await that.proxy.$provideNotebookCellStatusBarItems(handle, uri, index, token); + return { + items: result?.items ?? [], + dispose(): void { + if (result) { + that.proxy.$releaseNotebookCellStatusBarItems(result.cacheId); + } + } + }; + }, + viewType + }; + + if (typeof eventHandle === 'number') { + const emitter = new Emitter(); + this.notebookCellStatusBarRegistrations.set(eventHandle, emitter); + provider.onDidChangeStatusBarItems = emitter.event; + } + + // const disposable = this._cellStatusBarService.registerCellStatusBarItemProvider(provider); + // this.notebookCellStatusBarRegistrations.set(handle, disposable); + } + + async $unregisterNotebookCellStatusBarItemProvider(handle: number, eventHandle: number | undefined): Promise { + // eslint-disable-next-line @typescript-eslint/no-shadow + const unregisterThing = (statusBarHandle: number) => { + const entry = this.notebookCellStatusBarRegistrations.get(statusBarHandle); + if (entry) { + this.notebookCellStatusBarRegistrations.get(statusBarHandle)?.dispose(); + this.notebookCellStatusBarRegistrations.delete(statusBarHandle); + } + }; + unregisterThing(handle); + if (typeof eventHandle === 'number') { + unregisterThing(eventHandle); + } + } +} + diff --git a/packages/plugin-ext/src/main/browser/notebooks/renderers/cell-output-webview.tsx b/packages/plugin-ext/src/main/browser/notebooks/renderers/cell-output-webview.tsx new file mode 100644 index 0000000000000..2568749ea440f --- /dev/null +++ b/packages/plugin-ext/src/main/browser/notebooks/renderers/cell-output-webview.tsx @@ -0,0 +1,198 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as React from '@theia/core/shared/react'; +import { inject, injectable, interfaces, postConstruct } from '@theia/core/shared/inversify'; +import { NotebookRendererMessagingService, CellOutputWebview, NotebookRendererRegistry, NotebookEditorWidgetService } from '@theia/notebook/lib/browser'; +import { v4 } from 'uuid'; +import { NotebookCellModel } from '@theia/notebook/lib/browser/view-model/notebook-cell-model'; +import { WebviewWidget } from '../../webview/webview'; +import { Message, WidgetManager } from '@theia/core/lib/browser'; +import { outputWebviewPreload, PreloadContext } from './output-webview-internal'; +import { WorkspaceTrustService } from '@theia/workspace/lib/browser'; +import { ChangePreferredMimetypeMessage, FromWebviewMessage, OutputChangedMessage } from './webview-communication'; +import { CellUri, NotebookCellOutputsSplice } from '@theia/notebook/lib/common'; +import { Disposable, DisposableCollection, nls, QuickPickService } from '@theia/core'; +import { NotebookCellOutputModel } from '@theia/notebook/lib/browser/view-model/notebook-cell-output-model'; + +const CellModel = Symbol('CellModel'); + +export function createCellOutputWebviewContainer(ctx: interfaces.Container, cell: NotebookCellModel): interfaces.Container { + const child = ctx.createChild(); + child.bind(CellModel).toConstantValue(cell); + child.bind(CellOutputWebviewImpl).toSelf().inSingletonScope(); + return child; +} + +@injectable() +export class CellOutputWebviewImpl implements CellOutputWebview, Disposable { + + @inject(NotebookRendererMessagingService) + protected readonly messagingService: NotebookRendererMessagingService; + + @inject(CellModel) + protected readonly cell: NotebookCellModel; + + @inject(WidgetManager) + protected readonly widgetManager: WidgetManager; + + @inject(WorkspaceTrustService) + protected readonly workspaceTrustService: WorkspaceTrustService; + + @inject(NotebookRendererRegistry) + protected readonly notebookRendererRegistry: NotebookRendererRegistry; + + @inject(NotebookEditorWidgetService) + protected readonly notebookEditorWidgetService: NotebookEditorWidgetService; + + @inject(QuickPickService) + protected readonly quickPickService: QuickPickService; + + readonly id = v4(); + + protected readonly elementRef = React.createRef(); + protected outputPresentationListeners: DisposableCollection = new DisposableCollection(); + + protected webviewWidget: WebviewWidget; + + @postConstruct() + protected async init(): Promise { + this.cell.onDidChangeOutputs(outputChange => this.updateOutput(outputChange)); + + this.webviewWidget = await this.widgetManager.getOrCreateWidget(WebviewWidget.FACTORY_ID, { id: this.id }); + this.webviewWidget.setContentOptions({ allowScripts: true }); + this.webviewWidget.setHTML(await this.createWebviewContent()); + + this.webviewWidget.onMessage((message: FromWebviewMessage) => { + this.handleWebviewMessage(message); + }); + } + + render(): React.JSX.Element { + return
    ; + } + + attachWebview(): void { + if (this.elementRef.current) { + this.webviewWidget.processMessage(new Message('before-attach')); + this.elementRef.current.appendChild(this.webviewWidget.node); + this.webviewWidget.processMessage(new Message('after-attach')); + this.webviewWidget.setIframeHeight(0); + } + } + + isAttached(): boolean { + return this.elementRef.current?.contains(this.webviewWidget.node) ?? false; + } + + updateOutput(update: NotebookCellOutputsSplice): void { + if (this.cell.outputs.length > 0) { + if (this.webviewWidget.isHidden) { + this.webviewWidget.show(); + } + + this.outputPresentationListeners.dispose(); + this.outputPresentationListeners = new DisposableCollection(); + for (const output of this.cell.outputs) { + this.outputPresentationListeners.push(output.onRequestOutputPresentationChange(() => this.requestOutputPresentationUpdate(output))); + } + + const updateOutputMessage: OutputChangedMessage = { + type: 'outputChanged', + newOutputs: update.newOutputs.map(output => ({ + id: output.outputId, + items: output.outputs.map(item => ({ mime: item.mime, data: item.data.buffer })), + metadata: output.metadata + })), + deletedOutputIds: this.cell.outputs.slice(update.start, update.start + update.deleteCount).map(output => output.outputId) + }; + + this.webviewWidget.sendMessage(updateOutputMessage); + } + } + + private async requestOutputPresentationUpdate(output: NotebookCellOutputModel): Promise { + const selectedMime = await this.quickPickService.show( + output.outputs.map(item => ({label: item.mime})), + {description: nls.localizeByDefault('Select mimetype to render for current output' )}); + if (selectedMime) { + this.webviewWidget.sendMessage({ + type: 'changePreferredMimetype', + outputId: output.outputId, + mimeType: selectedMime.label + } as ChangePreferredMimetypeMessage); + } + } + + private handleWebviewMessage(message: FromWebviewMessage): void { + switch (message.type) { + case 'initialized': + this.updateOutput({newOutputs: this.cell.outputs, start: 0, deleteCount: 0}); + break; + case 'customRendererMessage': + this.messagingService.getScoped('').postMessage(message.rendererId, message.message); + break; + case 'didRenderOutput': + this.webviewWidget.setIframeHeight(message.contentHeight + 5); + break; + case 'did-scroll-wheel': + this.notebookEditorWidgetService.getNotebookEditor(`notebook:${CellUri.parse(this.cell.uri)?.notebook}`)?.node.scrollBy(message.deltaX, message.deltaY); + break; + } + } + + private async createWebviewContent(): Promise { + const isWorkspaceTrusted = await this.workspaceTrustService.getWorkspaceTrust(); + const preloads = this.preloadsScriptString(isWorkspaceTrusted); + const content = ` + + + + + + + + + `; + return content; + } + + private preloadsScriptString(isWorkspaceTrusted: boolean): string { + const ctx: PreloadContext = { + isWorkspaceTrusted, + rendererData: this.notebookRendererRegistry.notebookRenderers, + renderOptions: { // TODO these should be changeable in the settings + lineLimit: 30, + outputScrolling: false, + outputWordWrap: false, + } + }; + // TS will try compiling `import()` in webviewPreloads, so use a helper function instead + // of using `import(...)` directly + return ` + const __import = (x) => import(x); + (${outputWebviewPreload})(JSON.parse(decodeURIComponent("${encodeURIComponent(JSON.stringify(ctx))}")))`; + } + + dispose(): void { + this.outputPresentationListeners.dispose(); + this.webviewWidget.dispose(); + } +} diff --git a/packages/plugin-ext/src/main/browser/notebooks/renderers/output-webview-internal.ts b/packages/plugin-ext/src/main/browser/notebooks/renderers/output-webview-internal.ts new file mode 100644 index 0000000000000..17e18d2a48f17 --- /dev/null +++ b/packages/plugin-ext/src/main/browser/notebooks/renderers/output-webview-internal.ts @@ -0,0 +1,476 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +// only type imports are allowed here since this runs in an iframe. All other code is not accessible +import type * as webviewCommunication from './webview-communication'; +import type * as rendererApi from 'vscode-notebook-renderer'; +import type { Disposable, Event } from '@theia/core'; + +declare const acquireVsCodeApi: () => ({ + getState(): { [key: string]: unknown }; + setState(data: { [key: string]: unknown }): void; + postMessage: (msg: unknown) => void; +}); + +declare function __import(path: string): Promise; + +interface Listener { fn: (evt: T) => void; thisArg: unknown }; + +interface EmitterLike { + fire(data: T): void; + event: Event; +} + +interface RendererContext extends rendererApi.RendererContext { + readonly onDidChangeSettings: Event; + readonly settings: RenderOptions; +} + +interface NotebookRendererEntrypoint { + readonly path: string; + readonly extends?: string +}; + +export interface RenderOptions { + readonly lineLimit: number; + readonly outputScrolling: boolean; + readonly outputWordWrap: boolean; +} + +export interface PreloadContext { + readonly isWorkspaceTrusted: boolean; + readonly rendererData: readonly webviewCommunication.RendererMetadata[]; + readonly renderOptions: RenderOptions; +} + +export async function outputWebviewPreload(ctx: PreloadContext): Promise { + const theia = acquireVsCodeApi(); + const renderFallbackErrorName = 'vscode.fallbackToNextRenderer'; + + function createEmitter(listenerChange: (listeners: Set>) => void = () => undefined): EmitterLike { + const listeners = new Set>(); + return { + fire(data: T): void { + for (const listener of [...listeners]) { + listener.fn.call(listener.thisArg, data); + } + }, + event(fn, thisArg, disposables): Disposable { + const listenerObj = { fn, thisArg }; + const disposable: Disposable = { + dispose: () => { + listeners.delete(listenerObj); + listenerChange(listeners); + }, + }; + + listeners.add(listenerObj); + listenerChange(listeners); + + if (disposables) { + if ('push' in disposables) { + disposables.push(disposable); + } else { + disposables.add(disposable); + } + } + return disposable; + } + }; + }; + + const settingChange: EmitterLike = createEmitter(); + + class Output { + readonly outputId: string; + renderedItem?: rendererApi.OutputItem; + allItems: rendererApi.OutputItem[]; + + renderer: Renderer; + + element: HTMLElement; + + constructor(output: webviewCommunication.Output, items: rendererApi.OutputItem[]) { + this.element = document.createElement('div'); + // padding for scrollbars + this.element.style.paddingBottom = '10px'; + this.element.style.paddingRight = '10px'; + this.element.id = output.id; + document.body.appendChild(this.element); + + this.allItems = items; + } + + findItemToRender(preferredMimetype?: string): rendererApi.OutputItem { + if (preferredMimetype) { + const itemToRender = this.allItems.find(item => item.mime === preferredMimetype); + if (itemToRender) { + return itemToRender; + } + } + return this.renderedItem ?? this.allItems[0]; + } + + clear(): void { + this.renderer?.disposeOutputItem?.(this.renderedItem?.id); + this.element.innerHTML = ''; + } + } + + const outputs = new Map(); + + class Renderer { + + entrypoint: NotebookRendererEntrypoint; + + private rendererApi?: rendererApi.RendererApi; + + private onMessageEvent: EmitterLike = createEmitter(); + + constructor( + public readonly data: webviewCommunication.RendererMetadata + ) { } + + public receiveMessage(message: unknown): void { + this.onMessageEvent.fire(message); + } + + public disposeOutputItem(id?: string): void { + this.rendererApi?.disposeOutputItem?.(id); + } + + async getOrLoad(): Promise { + if (this.rendererApi) { + return this.rendererApi; + } + + const rendererModule = await __import(this.data.entrypoint.uri) as { activate: rendererApi.ActivationFunction }; + this.rendererApi = await rendererModule.activate(this.createRendererContext()); + return this.rendererApi; + } + + protected createRendererContext(): RendererContext { + const context: RendererContext = { + setState: newState => theia.setState({ ...theia.getState(), [this.data.id]: newState }), + getState: () => { + const state = theia.getState(); + return typeof state === 'object' && state ? state[this.data.id] as T : undefined; + }, + getRenderer: async (id: string) => { + const renderer = renderers.getRenderer(id); + if (!renderer) { + return undefined; + } + if (renderer.rendererApi) { + return renderer.rendererApi; + } + return renderer.getOrLoad(); + }, + workspace: { + get isTrusted(): boolean { return true; } // TODO use Workspace trust service + }, + settings: { + get lineLimit(): number { return ctx.renderOptions.lineLimit; }, + get outputScrolling(): boolean { return ctx.renderOptions.outputScrolling; }, + get outputWordWrap(): boolean { return ctx.renderOptions.outputWordWrap; }, + }, + get onDidChangeSettings(): Event { return settingChange.event; }, + }; + + if (this.data.requiresMessaging) { + context.onDidReceiveMessage = this.onMessageEvent.event; + context.postMessage = message => theia.postMessage({ type: 'customRendererMessage', rendererId: this.data.id, message }); + } + + return Object.freeze(context); + } + } + + const renderers = new class { + private readonly renderers = new Map(); + + constructor() { + for (const renderer of ctx.rendererData) { + this.addRenderer(renderer); + } + } + + public getRenderer(id: string): Renderer | undefined { + return this.renderers.get(id); + } + + private rendererEqual(a: webviewCommunication.RendererMetadata, b: webviewCommunication.RendererMetadata): boolean { + if (a.id !== b.id || a.entrypoint.uri !== b.entrypoint.uri || a.entrypoint.extends !== b.entrypoint.extends || a.requiresMessaging !== b.requiresMessaging) { + return false; + } + + if (a.mimeTypes.length !== b.mimeTypes.length) { + return false; + } + + for (let i = 0; i < a.mimeTypes.length; i++) { + if (a.mimeTypes[i] !== b.mimeTypes[i]) { + return false; + } + } + + return true; + } + + public updateRendererData(rendererData: readonly webviewCommunication.RendererMetadata[]): void { + const oldKeys = new Set(this.renderers.keys()); + const newKeys = new Set(rendererData.map(d => d.id)); + + for (const renderer of rendererData) { + const existing = this.renderers.get(renderer.id); + if (existing && this.rendererEqual(existing.data, renderer)) { + continue; + } + + this.addRenderer(renderer); + } + + for (const key of oldKeys) { + if (!newKeys.has(key)) { + this.renderers.delete(key); + } + } + } + + private addRenderer(renderer: webviewCommunication.RendererMetadata): void { + this.renderers.set(renderer.id, new Renderer(renderer)); + } + + public clearAll(): void { + for (const renderer of this.renderers.values()) { + renderer.disposeOutputItem(); + } + } + + public clearOutput(rendererId: string, outputId: string): void { + // outputRunner.cancelOutput(outputId); + this.renderers.get(rendererId)?.disposeOutputItem(outputId); + } + + public async render(output: Output, preferredMimeType: string | undefined, preferredRendererId: string | undefined, signal: AbortSignal): Promise { + const item = output.findItemToRender(preferredMimeType); + const primaryRenderer = this.findRenderer(preferredRendererId, item); + if (!primaryRenderer) { + this.showRenderError(item, output.element, 'No renderer found for output type.'); + return; + } + + // Try primary renderer first + if (!(await this.doRender(item, output.element, primaryRenderer, signal)).continue) { + output.renderer = primaryRenderer; + this.onRenderCompleted(); + return; + } + + // Primary renderer failed in an expected way. Fallback to render the next mime types + for (const additionalItem of output.allItems) { + if (additionalItem.mime === item.mime) { + continue; + } + + if (signal.aborted) { + return; + } + + if (additionalItem) { + const renderer = this.findRenderer(undefined, additionalItem); + if (renderer) { + if (!(await this.doRender(additionalItem, output.element, renderer, signal)).continue) { + output.renderer = renderer; + this.onRenderCompleted(); + return; // We rendered successfully + } + } + } + } + + // All renderers have failed and there is nothing left to fallback to + this.showRenderError(item, output.element, 'No fallback renderers found or all fallback renderers failed.'); + } + + private onRenderCompleted(): void { + // we need to check for all images are loaded. Otherwise we can't determine the correct height of the output + const images = Array.from(document.images); + if (images.length > 0) { + Promise.all(images.filter(img => !img.complete).map(img => new Promise(resolve => { img.onload = img.onerror = resolve; }))).then(() => + theia.postMessage({ type: 'didRenderOutput', contentHeight: document.body.clientHeight })); + } else { + theia.postMessage({ type: 'didRenderOutput', contentHeight: document.body.clientHeight }); + } + + } + + private async doRender(item: rendererApi.OutputItem, element: HTMLElement, renderer: Renderer, signal: AbortSignal): Promise<{ continue: boolean }> { + try { + (await renderer.getOrLoad())?.renderOutputItem(item, element, signal); + return { continue: false }; // We rendered successfully + } catch (e) { + if (signal.aborted) { + return { continue: false }; + } + + if (e instanceof Error && e.name === renderFallbackErrorName) { + return { continue: true }; + } else { + throw e; // Bail and let callers handle unknown errors + } + } + } + + private findRenderer(preferredRendererId: string | undefined, info: rendererApi.OutputItem): Renderer | undefined { + let foundRenderer: Renderer | undefined; + + if (typeof preferredRendererId === 'string') { + foundRenderer = Array.from(this.renderers.values()) + .find(renderer => renderer.data.id === preferredRendererId); + } else { + const rendererList = Array.from(this.renderers.values()) + .filter(renderer => renderer.data.mimeTypes.includes(info.mime) && !renderer.data.entrypoint.extends); + + if (rendererList.length) { + // De-prioritize built-in renderers + // rendererList.sort((a, b) => +a.data.isBuiltin - +b.data.isBuiltin); + + // Use first renderer we find in sorted list + foundRenderer = rendererList[0]; + } + } + return foundRenderer; + } + + private showRenderError(info: rendererApi.OutputItem, element: HTMLElement, errorMessage: string): void { + const errorContainer = document.createElement('div'); + + const error = document.createElement('div'); + error.className = 'no-renderer-error'; + error.innerText = errorMessage; + + const cellText = document.createElement('div'); + cellText.innerText = info.text(); + + errorContainer.appendChild(error); + errorContainer.appendChild(cellText); + + element.innerText = ''; + element.appendChild(errorContainer); + } + }(); + + function clearOutput(outputId: string): void { + outputs.get(outputId)?.clear(); + outputs.delete(outputId); + } + + function outputsChanged(changedEvent: webviewCommunication.OutputChangedMessage): void { + for (const outputId of changedEvent.deletedOutputIds ?? []) { + clearOutput(outputId); + } + + for (const outputData of changedEvent.newOutputs ?? []) { + const apiItems: rendererApi.OutputItem[] = outputData.items.map((item, index) => ({ + id: `${outputData.id}-${index}`, + mime: item.mime, + metadata: outputData.metadata, + data(): Uint8Array { + return item.data; + }, + text(): string { + return new TextDecoder().decode(this.data()); + }, + json(): unknown { + return JSON.parse(this.text()); + }, + blob(): Blob { + return new Blob([this.data()], { type: this.mime }); + }, + + })); + + const output = new Output(outputData, apiItems); + outputs.set(outputData.id, output); + + renderers.render(output, undefined, undefined, new AbortController().signal); + } + } + + function scrollParent(event: WheelEvent): boolean { + for (let node = event.target as Node | null; node; node = node.parentNode) { + if (!(node instanceof Element)) { + continue; + } + + // scroll up + if (event.deltaY < 0 && node.scrollTop > 0) { + // there is still some content to scroll + return false; + } + + // scroll down + if (event.deltaY > 0 && node.scrollTop + node.clientHeight < node.scrollHeight) { + // per https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight + // scrollTop is not rounded but scrollHeight and clientHeight are + // so we need to check if the difference is less than some threshold + if (node.scrollHeight - node.scrollTop - node.clientHeight > 2) { + return false; + } + } + } + + return true; + } + + const handleWheel = (event: WheelEvent & { wheelDeltaX?: number; wheelDeltaY?: number; wheelDelta?: number }) => { + if (scrollParent(event)) { + theia.postMessage({ + type: 'did-scroll-wheel', + deltaY: event.deltaY, + deltaX: event.deltaX, + }); + } + }; + + window.addEventListener('message', async rawEvent => { + const event = rawEvent as ({ data: webviewCommunication.ToWebviewMessage }); + + switch (event.data.type) { + case 'updateRenderers': + renderers.updateRendererData(event.data.rendererData); + break; + case 'outputChanged': + outputsChanged(event.data); + break; + case 'customRendererMessage': + renderers.getRenderer(event.data.rendererId)?.receiveMessage(event.data.message); + break; + case 'changePreferredMimetype': + clearOutput(event.data.outputId); + renderers.render(outputs.get(event.data.outputId)!, event.data.mimeType, undefined, new AbortController().signal); + break; + } + }); + window.addEventListener('wheel', handleWheel); + + theia.postMessage({ type: 'initialized' }); +} diff --git a/packages/plugin-ext/src/main/browser/notebooks/renderers/webview-communication.ts b/packages/plugin-ext/src/main/browser/notebooks/renderers/webview-communication.ts new file mode 100644 index 0000000000000..4fee027832c22 --- /dev/null +++ b/packages/plugin-ext/src/main/browser/notebooks/renderers/webview-communication.ts @@ -0,0 +1,79 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +export interface RendererMetadata { + readonly id: string; + readonly entrypoint: { readonly uri: string, readonly extends?: string; }; + readonly mimeTypes: readonly string[]; + readonly requiresMessaging: boolean; +} + +export interface CustomRendererMessage { + readonly type: 'customRendererMessage'; + readonly rendererId: string; + readonly message: unknown; +} + +export interface UpdateRenderersMessage { + readonly type: 'updateRenderers'; + readonly rendererData: readonly RendererMetadata[]; +} + +export interface OutputChangedMessage { + readonly type: 'outputChanged'; + readonly newOutputs?: Output[]; + readonly deletedOutputIds?: string[]; +} + +export interface ChangePreferredMimetypeMessage { + readonly type: 'changePreferredMimetype'; + readonly outputId: string; + readonly mimeType: string; +} + +export type ToWebviewMessage = UpdateRenderersMessage | OutputChangedMessage | ChangePreferredMimetypeMessage | CustomRendererMessage; + +export interface WebviewInitialized { + readonly type: 'initialized'; +} + +export interface OnDidRenderOutput { + readonly type: 'didRenderOutput'; + contentHeight: number; +} + +export interface WheelMessage { + readonly type: 'did-scroll-wheel'; + readonly deltaY: number; + readonly deltaX: number; +} + +export type FromWebviewMessage = WebviewInitialized | OnDidRenderOutput | WheelMessage | CustomRendererMessage; + +export interface Output { + id: string + metadata?: Record; + items: OutputItem[]; +} + +export interface OutputItem { + readonly mime: string; + readonly data: Uint8Array; +} diff --git a/packages/plugin-ext/src/main/browser/plugin-contribution-handler.ts b/packages/plugin-ext/src/main/browser/plugin-contribution-handler.ts index 50075206eb8dd..b96302b16ff7c 100644 --- a/packages/plugin-ext/src/main/browser/plugin-contribution-handler.ts +++ b/packages/plugin-ext/src/main/browser/plugin-contribution-handler.ts @@ -21,7 +21,10 @@ import { TextmateRegistry, getEncodedLanguageId, MonacoTextmateService, GrammarD import { MenusContributionPointHandler } from './menus/menus-contribution-handler'; import { PluginViewRegistry } from './view/plugin-view-registry'; import { PluginCustomEditorRegistry } from './custom-editors/plugin-custom-editor-registry'; -import { PluginContribution, IndentationRules, FoldingRules, ScopeMap, DeployedPlugin, GrammarsContribution, EnterAction, OnEnterRule, RegExpOptions } from '../../common'; +import { + PluginContribution, IndentationRules, FoldingRules, ScopeMap, DeployedPlugin, + GrammarsContribution, EnterAction, OnEnterRule, RegExpOptions, getPluginId +} from '../../common'; import { DefaultUriLabelProviderContribution, LabelProviderContribution, @@ -35,6 +38,7 @@ import { CommandRegistry, Command, CommandHandler } from '@theia/core/lib/common import { Disposable, DisposableCollection } from '@theia/core/lib/common/disposable'; import { Emitter } from '@theia/core/lib/common/event'; import { TaskDefinitionRegistry, ProblemMatcherRegistry, ProblemPatternRegistry } from '@theia/task/lib/browser'; +import { NotebookRendererRegistry, NotebookTypeRegistry } from '@theia/notebook/lib/browser'; import { PluginDebugService } from './debug/plugin-debug-service'; import { DebugSchemaUpdater } from '@theia/debug/lib/browser/debug-schema-updater'; import { MonacoThemingService } from '@theia/monaco/lib/browser/monaco-theming-service'; @@ -120,6 +124,12 @@ export class PluginContributionHandler { @inject(ContributedTerminalProfileStore) protected readonly contributedProfileStore: TerminalProfileStore; + @inject(NotebookTypeRegistry) + protected readonly notebookTypeRegistry: NotebookTypeRegistry; + + @inject(NotebookRendererRegistry) + protected readonly notebookRendererRegistry: NotebookRendererRegistry; + @inject(ContributionProvider) @named(LabelProviderContribution) protected readonly contributionProvider: ContributionProvider; @@ -395,6 +405,22 @@ export class PluginContributionHandler { } } + if (contributions.notebooks) { + for (const notebook of contributions.notebooks) { + pushContribution(`notebook.${notebook.type}`, + () => this.notebookTypeRegistry.registerNotebookType(notebook) + ); + } + } + + if (contributions.notebookRenderer) { + for (const renderer of contributions.notebookRenderer) { + pushContribution(`notebookRenderer.${renderer.id}`, + () => this.notebookRendererRegistry.registerNotebookRenderer(renderer, `/hostedPlugin/${getPluginId(plugin.metadata.model)}`) + ); + } + } + return toDispose; } diff --git a/packages/plugin-ext/src/main/browser/plugin-ext-frontend-module.ts b/packages/plugin-ext/src/main/browser/plugin-ext-frontend-module.ts index f737307a54961..b4268e6280e33 100644 --- a/packages/plugin-ext/src/main/browser/plugin-ext-frontend-module.ts +++ b/packages/plugin-ext/src/main/browser/plugin-ext-frontend-module.ts @@ -72,7 +72,6 @@ import { PluginCustomEditorRegistry } from './custom-editors/plugin-custom-edito import { CustomEditorWidgetFactory } from '../browser/custom-editors/custom-editor-widget-factory'; import { CustomEditorWidget } from './custom-editors/custom-editor-widget'; import { CustomEditorService } from './custom-editors/custom-editor-service'; -import { UndoRedoService } from './custom-editors/undo-redo-service'; import { WebviewFrontendSecurityWarnings } from './webview/webview-frontend-security-warnings'; import { PluginAuthenticationServiceImpl } from './plugin-authentication-service'; import { AuthenticationService } from '@theia/core/lib/browser/authentication-service'; @@ -85,6 +84,9 @@ import { DnDFileContentStore } from './view/dnd-file-content-store'; import { WebviewContextKeys } from './webview/webview-context-keys'; import { LanguagePackService, languagePackServicePath } from '../../common/language-pack-service'; import { TabBarToolbarContribution } from '@theia/core/lib/browser/shell/tab-bar-toolbar'; +import { CellOutputWebviewFactory } from '@theia/notebook/lib/browser'; +import { CellOutputWebviewImpl, createCellOutputWebviewContainer } from './notebooks/renderers/cell-output-webview'; +import { NotebookCellModel } from '@theia/notebook/lib/browser/view-model/notebook-cell-model'; export default new ContainerModule((bind, unbind, isBound, rebind) => { @@ -193,8 +195,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(CustomEditorWidgetFactory).toDynamicValue(ctx => new CustomEditorWidgetFactory(ctx.container)).inSingletonScope(); bind(WidgetFactory).toService(CustomEditorWidgetFactory); - bind(UndoRedoService).toSelf().inSingletonScope(); - bind(PluginViewWidget).toSelf(); bind(WidgetFactory).toDynamicValue(({ container }) => ({ id: PLUGIN_VIEW_FACTORY_ID, @@ -257,4 +257,8 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { const provider = ctx.container.get(WebSocketConnectionProvider); return provider.createProxy(languagePackServicePath); }).inSingletonScope(); + + bind(CellOutputWebviewFactory).toFactory(ctx => async (cell: NotebookCellModel) => + createCellOutputWebviewContainer(ctx.container, cell).getAsync(CellOutputWebviewImpl) + ); }); diff --git a/packages/plugin-ext/src/main/browser/webview/webview.ts b/packages/plugin-ext/src/main/browser/webview/webview.ts index 6a095a26a70b3..ac6f7310adee1 100644 --- a/packages/plugin-ext/src/main/browser/webview/webview.ts +++ b/packages/plugin-ext/src/main/browser/webview/webview.ts @@ -592,6 +592,12 @@ export class WebviewWidget extends BaseWidget implements StatefulWidget, Extract this._state = state; } + setIframeHeight(height: number): void { + if (this.element) { + this.element.style.height = `${height}px`; + } + } + protected async doSend(channel: string, data?: any): Promise { if (!this.element) { return; diff --git a/packages/plugin-ext/src/plugin/editors-and-documents.ts b/packages/plugin-ext/src/plugin/editors-and-documents.ts index cf299753269d2..4d3255e9f5507 100644 --- a/packages/plugin-ext/src/plugin/editors-and-documents.ts +++ b/packages/plugin-ext/src/plugin/editors-and-documents.ts @@ -43,7 +43,7 @@ export class EditorsAndDocumentsExtImpl implements EditorsAndDocumentsExt { constructor(private readonly rpc: RPCProtocol) { } - $acceptEditorsAndDocumentsDelta(delta: EditorsAndDocumentsDelta): void { + async $acceptEditorsAndDocumentsDelta(delta: EditorsAndDocumentsDelta): Promise { const removedDocuments = new Array(); const addedDocuments = new Array(); const removedEditors = new Array(); diff --git a/packages/plugin-ext/src/plugin/notebook/notebook-document.ts b/packages/plugin-ext/src/plugin/notebook/notebook-document.ts new file mode 100644 index 0000000000000..a49954a6fe125 --- /dev/null +++ b/packages/plugin-ext/src/plugin/notebook/notebook-document.ts @@ -0,0 +1,438 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as theia from '@theia/plugin'; +import * as rpc from '../../common'; +import { EditorsAndDocumentsExtImpl } from '../editors-and-documents'; +import * as notebookCommon from '@theia/notebook/lib/common'; +import { Disposable, URI } from '@theia/core'; +import * as typeConverters from '../type-converters'; +import { ModelAddedData, NotebookCellDto, NotebookCellsChangedEventDto, NotebookModelAddedData, NotebookOutputDto } from '../../common'; +import { NotebookRange } from '../types-impl'; +import { UriComponents } from '../../common/uri-components'; +import { DocumentsExtImpl } from '../documents'; + +class RawContentChangeEvent { + + constructor( + readonly start: number, + readonly deletedCount: number, + readonly deletedItems: theia.NotebookCell[], + readonly items: Cell[] + ) { } + + asApiEvent(): theia.NotebookDocumentContentChange { + return { + range: new NotebookRange(this.start, this.start + this.deletedCount), + addedCells: this.items.map(cell => cell.apiCell), + removedCells: this.deletedItems, + }; + } +} + +export class Cell { + + static asModelAddData(notebook: theia.NotebookDocument, cell: NotebookCellDto): ModelAddedData & { notebook: theia.NotebookDocument } { + return { + EOL: cell.eol, + lines: cell.source, + languageId: cell.language, + uri: cell.uri, + isDirty: false, + versionId: 1, + notebook, + modeId: '' + }; + } + + private cell: theia.NotebookCell | undefined; + + readonly handle: number; + readonly uri: URI; + readonly cellKind: notebookCommon.CellKind; + + private outputs: theia.NotebookCellOutput[]; + private metadata: Readonly; + private previousResult: Readonly; + + internalMetadata: notebookCommon.NotebookCellInternalMetadata; + + get language(): string { + return this.apiCell.document.languageId; + } + + constructor( + public readonly notebookDocument: NotebookDocument, + private readonly editorsAndDocuments: EditorsAndDocumentsExtImpl, + private readonly cellData: rpc.NotebookCellDto, + ) { + this.handle = cellData.handle; + this.uri = URI.fromComponents(cellData.uri); + this.cellKind = cellData.cellKind; + this.outputs = cellData.outputs.map(typeConverters.NotebookCellOutputConverter.to); + this.internalMetadata = cellData.internalMetadata ?? {}; + this.metadata = Object.freeze(cellData.metadata ?? {}); + this.previousResult = Object.freeze(typeConverters.NotebookCellExecutionSummary.to(cellData.internalMetadata ?? {})); + } + + get apiCell(): theia.NotebookCell { + if (!this.cell) { + const that = this; + const data = this.editorsAndDocuments.getDocument(this.uri.toString()); + if (!data) { + throw new Error(`MISSING extHostDocument for notebook cell: ${this.uri}`); + } + const apiCell: theia.NotebookCell = { + get index(): number { return that.notebookDocument.getCellIndex(that); }, + notebook: that.notebookDocument.apiNotebook, + kind: typeConverters.NotebookCellKind.to(this.cellData.cellKind), + document: data.document, + get outputs(): theia.NotebookCellOutput[] { return that.outputs.slice(0); }, + get metadata(): notebookCommon.NotebookCellMetadata { return that.metadata; }, + get executionSummary(): theia.NotebookCellExecutionSummary | undefined { return that.previousResult; } + }; + this.cell = Object.freeze(apiCell); + } + return this.cell; + } + + setOutputs(newOutputs: NotebookOutputDto[]): void { + this.outputs = newOutputs.map(typeConverters.NotebookCellOutputConverter.to); + } + + // setOutputItems(outputId: string, append: boolean, newOutputItems: NotebookOutputItemDto[]): void { + // const newItems = newOutputItems.map(typeConverters.NotebookCellOutputItem.to); + // const output = this.outputs.find(op => op.id === outputId); + // if (output) { + // if (!append) { + // output.items.length = 0; + // } + // output.items.push(...newItems); + + // // if (output.items.length > 1 && output.items.every(item => notebookCommon.isTextStreamMime(item.mime))) { + // // // Look for the mimes in the items, and keep track of their order. + // // // Merge the streams into one output item, per mime type. + // // const mimeOutputs = new Map(); + // // const mimeTypes: string[] = []; + // // output.items.forEach(item => { + // // let items: Uint8Array[]; + // // if (mimeOutputs.has(item.mime)) { + // // items = mimeOutputs.get(item.mime)!; + // // } else { + // // items = []; + // // mimeOutputs.set(item.mime, items); + // // mimeTypes.push(item.mime); + // // } + // // items.push(item.data); + // // }); + // // output.items.length = 0; + // // mimeTypes.forEach(mime => { + // // const compressed = notebookCommon.compressOutputItemStreams(mimeOutputs.get(mime)!); + // // output.items.push({ + // // mime, + // // data: compressed.buffer + // // }); + // // }); + // // } + // } + // } + + setMetadata(newMetadata: notebookCommon.NotebookCellMetadata): void { + this.metadata = Object.freeze(newMetadata); + } + + setInternalMetadata(newInternalMetadata: notebookCommon.NotebookCellInternalMetadata): void { + this.internalMetadata = newInternalMetadata; + this.previousResult = Object.freeze(typeConverters.NotebookCellExecutionSummary.to(newInternalMetadata)); + } + +} + +export class NotebookDocument implements Disposable { + + private readonly cells: Cell[]; + + private readonly notebookType: string; + + private notebook?: theia.NotebookDocument; + private metadata: Record; + private versionId: number = 0; + private isDirty: boolean = false; + private disposed: boolean = false; + + constructor( + private readonly proxy: rpc.NotebookDocumentsMain, + private readonly editorsAndDocuments: EditorsAndDocumentsExtImpl, + private readonly textDocuments: DocumentsExtImpl, + public readonly uri: theia.Uri, + notebookData: NotebookModelAddedData + ) { + this.notebookType = notebookData.viewType; + this.metadata = notebookData.metadata ?? {}; + this.versionId = notebookData.versionId; + this.cells = notebookData.cells.map(cell => new Cell(this, editorsAndDocuments, cell)); + } + + get apiNotebook(): theia.NotebookDocument { + if (!this.notebook) { + const that = this; + const apiObject: theia.NotebookDocument = { + get uri(): theia.Uri { return that.uri; }, + get version(): number { return that.versionId; }, + get notebookType(): string { return that.notebookType; }, + get isDirty(): boolean { return that.isDirty; }, + get isUntitled(): boolean { return that.uri.scheme === 'untitled'; }, + get isClosed(): boolean { return that.disposed; }, + get metadata(): Record { return that.metadata; }, + get cellCount(): number { return that.cells.length; }, + cellAt(index): theia.NotebookCell { + index = that.validateIndex(index); + return that.cells[index].apiCell; + }, + getCells(range): theia.NotebookCell[] { + const cells = range ? that.getCells(range) : that.cells; + return cells.map(cell => cell.apiCell); + }, + save(): Promise { + return that.save(); + } + }; + this.notebook = Object.freeze(apiObject); + } + return this.notebook; + } + + private validateIndex(index: number): number { + index = index | 0; + if (index < 0) { + return 0; + } else if (index >= this.cells.length) { + return this.cells.length - 1; + } else { + return index; + } + } + + private validateRange(range: theia.NotebookRange): theia.NotebookRange { + let start = range.start | 0; + let end = range.end | 0; + if (start < 0) { + start = 0; + } + if (end > this.cells.length) { + end = this.cells.length; + } + return range.with({ start, end }); + } + + private getCells(range: theia.NotebookRange): Cell[] { + range = this.validateRange(range); + const result: Cell[] = []; + for (let i = range.start; i < range.end; i++) { + result.push(this.cells[i]); + } + return result; + } + + private async save(): Promise { + if (this.disposed) { + return Promise.reject(new Error('Notebook has been closed')); + } + return this.proxy.$trySaveNotebook(this.uri); + } + + acceptDirty(isDirty: boolean): void { + this.isDirty = isDirty; + } + + acceptModelChanged(event: NotebookCellsChangedEventDto, isDirty: boolean, newMetadata: notebookCommon.NotebookDocumentMetadata | undefined): theia.NotebookDocumentChangeEvent { + this.versionId = event.versionId; + this.isDirty = isDirty; + // this.acceptDocumentPropertiesChanged({ metadata: newMetadata }); + + const result = { + notebook: this.apiNotebook, + metadata: newMetadata, + cellChanges: [], + contentChanges: [], + }; + + type RelaxedCellChange = Partial & { cell: theia.NotebookCell }; + const relaxedCellChanges: RelaxedCellChange[] = []; + + // -- apply change and populate content changes + + for (const rawEvent of event.rawEvents) { + if (rawEvent.kind === notebookCommon.NotebookCellsChangeType.ModelChange) { + this.spliceNotebookCells(rawEvent.changes, false, result.contentChanges); + } else if (rawEvent.kind === notebookCommon.NotebookCellsChangeType.Move) { + this.moveCells(rawEvent.index, rawEvent.length, rawEvent.newIdx, result.contentChanges); + } else if (rawEvent.kind === notebookCommon.NotebookCellsChangeType.Output) { + this.setCellOutputs(rawEvent.index, rawEvent.outputs); + relaxedCellChanges.push({ cell: this.cells[rawEvent.index].apiCell, outputs: this.cells[rawEvent.index].apiCell.outputs }); + + // } else if (rawEvent.kind === notebookCommon.NotebookCellsChangeType.OutputItem) { + // this._setCellOutputItems(rawEvent.index, rawEvent.outputId, rawEvent.append, rawEvent.outputItems); + // relaxedCellChanges.push({ cell: this.cells[rawEvent.index].apiCell, outputs: this.cells[rawEvent.index].apiCell.outputs }); + } else if (rawEvent.kind === notebookCommon.NotebookCellsChangeType.ChangeCellLanguage) { + this.changeCellLanguage(rawEvent.index, rawEvent.language); + relaxedCellChanges.push({ cell: this.cells[rawEvent.index].apiCell, document: this.cells[rawEvent.index].apiCell.document }); + } else if (rawEvent.kind === notebookCommon.NotebookCellsChangeType.ChangeCellContent) { + relaxedCellChanges.push({ cell: this.cells[rawEvent.index].apiCell, document: this.cells[rawEvent.index].apiCell.document }); + + // } else if (rawEvent.kind === notebookCommon.NotebookCellsChangeType.ChangeCellMime) { + // this._changeCellMime(rawEvent.index, rawEvent.mime); + } else if (rawEvent.kind === notebookCommon.NotebookCellsChangeType.ChangeCellMetadata) { + this.changeCellMetadata(rawEvent.index, rawEvent.metadata); + relaxedCellChanges.push({ cell: this.cells[rawEvent.index].apiCell, metadata: this.cells[rawEvent.index].apiCell.metadata }); + + } else if (rawEvent.kind === notebookCommon.NotebookCellsChangeType.ChangeCellInternalMetadata) { + this.changeCellInternalMetadata(rawEvent.index, rawEvent.internalMetadata); + relaxedCellChanges.push({ cell: this.cells[rawEvent.index].apiCell, executionSummary: this.cells[rawEvent.index].apiCell.executionSummary }); + } + } + + // -- compact cellChanges + + const map = new Map(); + for (let i = 0; i < relaxedCellChanges.length; i++) { + const relaxedCellChange = relaxedCellChanges[i]; + const existing = map.get(relaxedCellChange.cell); + if (existing === undefined) { + const newLen = result.cellChanges.push({ + document: undefined, + executionSummary: undefined, + metadata: undefined, + outputs: undefined, + ...relaxedCellChange, + }); + map.set(relaxedCellChange.cell, newLen - 1); + } else { + result.cellChanges[existing] = { + ...result.cellChanges[existing], + ...relaxedCellChange + }; + } + } + + // Freeze event properties so handlers cannot accidentally modify them + Object.freeze(result); + Object.freeze(result.cellChanges); + Object.freeze(result.contentChanges); + + return result; + } + + private spliceNotebookCells(splices: notebookCommon.NotebookCellTextModelSplice[], initialization: boolean, + bucket: theia.NotebookDocumentContentChange[] | undefined): void { + if (this.disposed) { + return; + } + + const contentChangeEvents: RawContentChangeEvent[] = []; + const addedCellDocuments: ModelAddedData[] = []; + const removedCellDocuments: UriComponents[] = []; + + splices.reverse().forEach(splice => { + const cellDtos = splice[2]; + const newCells = cellDtos.map((cell: NotebookCellDto) => { + + const extCell = new Cell(this, this.editorsAndDocuments, cell); + if (!initialization) { + addedCellDocuments.push(Cell.asModelAddData(this.apiNotebook, cell)); + } + return extCell; + }); + + const changeEvent = new RawContentChangeEvent(splice[0], splice[1], [], newCells); + const deletedItems = this.cells.splice(splice[0], splice[1], ...newCells); + for (const cell of deletedItems) { + removedCellDocuments.push(cell.uri.toComponents()); + changeEvent.deletedItems.push(cell.apiCell); + } + contentChangeEvents.push(changeEvent); + }); + + if (bucket) { + for (const changeEvent of contentChangeEvents) { + bucket.push(changeEvent.asApiEvent()); + } + } + } + + private moveCells(index: number, length: number, newIdx: number, bucket: theia.NotebookDocumentContentChange[]): void { + const cells = this.cells.splice(index, length); + this.cells.splice(newIdx, 0, ...cells); + const changes = [ + new RawContentChangeEvent(index, length, cells.map(c => c.apiCell), []), + new RawContentChangeEvent(newIdx, 0, [], cells) + ]; + for (const change of changes) { + bucket.push(change.asApiEvent()); + } + } + + private setCellOutputs(index: number, outputs: NotebookOutputDto[]): void { + const cell = this.cells[index]; + cell.setOutputs(outputs); + } + + // private _setCellOutputItems(index: number, outputId: string, append: boolean, outputItems: NotebookOutputItemDto[]): void { + // const cell = this.cells[index]; + // cell.setOutputItems(outputId, append, outputItems); + // } + + private changeCellLanguage(index: number, newLanguageId: string): void { + const cell = this.cells[index]; + if (cell.apiCell.document.languageId !== newLanguageId) { + this.textDocuments.$acceptModelModeChanged(cell.uri.toComponents(), cell.language, newLanguageId); + } + } + + private changeCellMetadata(index: number, newMetadata: notebookCommon.NotebookCellMetadata): void { + const cell = this.cells[index]; + cell.setMetadata(newMetadata); + } + + private changeCellInternalMetadata(index: number, newInternalMetadata: notebookCommon.NotebookCellInternalMetadata): void { + const cell = this.cells[index]; + cell.setInternalMetadata(newInternalMetadata); + } + + getCellFromApiCell(apiCell: theia.NotebookCell): Cell | undefined { + return this.cells.find(cell => cell.apiCell === apiCell); + } + + getCell(cellHandle: number): Cell | undefined { + return this.cells.find(cell => cell.handle === cellHandle); + } + + getCellFromIndex(index: number): Cell | undefined { + return this.cells[index]; + } + + getCellIndex(cell: Cell): number { + return this.cells.indexOf(cell); + } + + dispose(): void { + this.disposed = true; + } +} diff --git a/packages/plugin-ext/src/plugin/notebook/notebook-documents.ts b/packages/plugin-ext/src/plugin/notebook/notebook-documents.ts new file mode 100644 index 0000000000000..e638657320df6 --- /dev/null +++ b/packages/plugin-ext/src/plugin/notebook/notebook-documents.ts @@ -0,0 +1,58 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as theia from '@theia/plugin'; +import { Emitter } from '@theia/core'; +import { UriComponents } from '../../common/uri-components'; +import { NotebookCellsChangedEventDto, NotebookDocumentsExt } from '../../common'; +import { NotebooksExtImpl } from './notebooks'; +import { URI } from '../types-impl'; + +export type NotebookDocumentMetadata = Record; + +export class NotebookDocumentsExtImpl implements NotebookDocumentsExt { + + private readonly didSaveNotebookDocumentEmitter = new Emitter(); + readonly onDidSaveNotebookDocument = this.didSaveNotebookDocumentEmitter.event; + + private readonly didChangeNotebookDocumentEmitter = new Emitter(); + readonly onDidChangeNotebookDocument = this.didChangeNotebookDocumentEmitter.event; + + constructor( + private readonly notebooksAndEditors: NotebooksExtImpl, + ) { } + + $acceptModelChanged(uri: UriComponents, event: NotebookCellsChangedEventDto, + isDirty: boolean, newMetadata?: NotebookDocumentMetadata): void { + const document = this.notebooksAndEditors.getNotebookDocument(URI.from(uri)); + const e = document.acceptModelChanged(event, isDirty, newMetadata); + this.didChangeNotebookDocumentEmitter.fire(e); + } + + $acceptDirtyStateChanged(uri: UriComponents, isDirty: boolean): void { + const document = this.notebooksAndEditors.getNotebookDocument(URI.from(uri)); + document.acceptDirty(isDirty); + } + + $acceptModelSaved(uri: UriComponents): void { + const document = this.notebooksAndEditors.getNotebookDocument(URI.from(uri)); + this.didSaveNotebookDocumentEmitter.fire(document.apiNotebook); + } +} diff --git a/packages/plugin-ext/src/plugin/notebook/notebook-editor.ts b/packages/plugin-ext/src/plugin/notebook/notebook-editor.ts new file mode 100644 index 0000000000000..5bc65a14ff60c --- /dev/null +++ b/packages/plugin-ext/src/plugin/notebook/notebook-editor.ts @@ -0,0 +1,116 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as theia from '@theia/plugin'; +import { NotebookDocument } from './notebook-document'; + +export class NotebookEditor { + + public static readonly apiEditorsToExtHost = new WeakMap(); + + private selections: theia.NotebookRange[] = []; + private visibleRanges: theia.NotebookRange[] = []; + private viewColumn?: theia.ViewColumn; + + private internalVisible: boolean = false; + + private editor?: theia.NotebookEditor; + + constructor( + readonly id: string, + // private readonly _proxy: MainThreadNotebookEditorsShape, + readonly notebookData: NotebookDocument, + visibleRanges: theia.NotebookRange[], + selections: theia.NotebookRange[], + viewColumn: theia.ViewColumn | undefined + ) { + this.selections = selections; + this.visibleRanges = visibleRanges; + this.viewColumn = viewColumn; + } + + get apiEditor(): theia.NotebookEditor { + if (!this.editor) { + const that = this; + this.editor = { + get notebook(): theia.NotebookDocument { + return that.notebookData.apiNotebook; + }, + get selection(): theia.NotebookRange { + return that.selections[0]; + }, + set selection(selection: theia.NotebookRange) { + this.selections = [selection]; + }, + get selections(): theia.NotebookRange[] { + return that.selections; + }, + set selections(value: theia.NotebookRange[]) { + // if (!Array.isArray(value) || !value.every(extHostTypes.NotebookRange.isNotebookRange)) { + // throw illegalArgument('selections'); + // } + that.selections = value; + that.trySetSelections(value); + }, + get visibleRanges(): theia.NotebookRange[] { + return that.visibleRanges; + }, + revealRange(range, revealType): void { + // that._proxy.$tryRevealRange( + // that.id, + // extHostConverter.NotebookRange.from(range), + // revealType ?? extHostTypes.NotebookEditorRevealType.Default + // ); + }, + get viewColumn(): theia.ViewColumn | undefined { + return that.viewColumn; + }, + }; + + NotebookEditor.apiEditorsToExtHost.set(this.editor, this); + } + return this.editor; + } + + get visible(): boolean { + return this.internalVisible; + } + + acceptVisibility(value: boolean): void { + this.internalVisible = value; + } + + acceptVisibleRanges(value: theia.NotebookRange[]): void { + this.visibleRanges = value; + } + + acceptSelections(selections: theia.NotebookRange[]): void { + this.selections = selections; + } + + private trySetSelections(value: theia.NotebookRange[]): void { + // NB Unimplemented: implement "selections" + // this._proxy.$trySetSelections(this.id, value.map(extHostConverter.NotebookRange.from)); + } + + acceptViewColumn(value: theia.ViewColumn | undefined): void { + this.viewColumn = value; + } +} diff --git a/packages/plugin-ext/src/plugin/notebook/notebook-editors.ts b/packages/plugin-ext/src/plugin/notebook/notebook-editors.ts new file mode 100644 index 0000000000000..1d1ec3e4ae8a5 --- /dev/null +++ b/packages/plugin-ext/src/plugin/notebook/notebook-editors.ts @@ -0,0 +1,71 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Emitter } from '@theia/core'; +import { NotebookEditorPropertiesChangeData, NotebookEditorsExt, NotebookEditorViewColumnInfo } from '../../common'; +import * as typeConverters from '../type-converters'; +import * as theia from '@theia/plugin'; +import { NotebooksExtImpl } from './notebooks'; + +export class NotebookEditorsExtImpl implements NotebookEditorsExt { + + private readonly DidChangeNotebookEditorSelectionEmitter = new Emitter(); + private readonly DidChangeNotebookEditorVisibleRangesEmitter = new Emitter(); + + readonly onDidChangeNotebookEditorSelection = this.DidChangeNotebookEditorSelectionEmitter.event; + readonly onDidChangeNotebookEditorVisibleRanges = this.DidChangeNotebookEditorVisibleRangesEmitter.event; + + constructor( + private readonly notebooksAndEditors: NotebooksExtImpl, + ) { } + + $acceptEditorPropertiesChanged(id: string, data: NotebookEditorPropertiesChangeData): void { + const editor = this.notebooksAndEditors.getEditorById(id); + // ONE: make all state updates + if (data.visibleRanges) { + editor.acceptVisibleRanges(data.visibleRanges.ranges.map(typeConverters.NotebookRange.to)); + } + if (data.selections) { + editor.acceptSelections(data.selections.selections.map(typeConverters.NotebookRange.to)); + } + + // TWO: send all events after states have been updated + if (data.visibleRanges) { + this.DidChangeNotebookEditorVisibleRangesEmitter.fire({ + notebookEditor: editor.apiEditor, + visibleRanges: editor.apiEditor.visibleRanges + }); + } + if (data.selections) { + this.DidChangeNotebookEditorSelectionEmitter.fire(Object.freeze({ + notebookEditor: editor.apiEditor, + selections: editor.apiEditor.selections + })); + } + } + + $acceptEditorViewColumns(data: NotebookEditorViewColumnInfo): void { + // eslint-disable-next-line guard-for-in + for (const id in data) { + const editor = this.notebooksAndEditors.getEditorById(id); + editor.acceptViewColumn(typeConverters.ViewColumn.to(data[id])); + } + } +} diff --git a/packages/plugin-ext/src/plugin/notebook/notebook-kernels.ts b/packages/plugin-ext/src/plugin/notebook/notebook-kernels.ts new file mode 100644 index 0000000000000..4f0e2d78ab8ef --- /dev/null +++ b/packages/plugin-ext/src/plugin/notebook/notebook-kernels.ts @@ -0,0 +1,616 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { CancellationToken } from '@theia/plugin'; +import { + CellExecuteUpdateDto, NotebookKernelDto, NotebookKernelsExt, NotebookKernelsMain, NotebookKernelSourceActionDto, NotebookOutputDto, PLUGIN_RPC_CONTEXT +} from '../../common'; +import { RPCProtocol } from '../../common/rpc-protocol'; +import { UriComponents } from '../../common/uri-components'; +import * as theia from '@theia/plugin'; +import { CancellationTokenSource, Disposable, DisposableCollection, Emitter } from '@theia/core'; +import { Cell } from './notebook-document'; +import { NotebooksExtImpl } from './notebooks'; +import { NotebookCellOutputConverter, NotebookCellOutputItem, NotebookKernelSourceAction } from '../type-converters'; +import { timeout, Deferred } from '@theia/core/lib/common/promise-util'; +import { CellExecutionUpdateType, NotebookCellExecutionState } from '@theia/notebook/lib/common'; +import { CommandRegistryImpl } from '../command-registry'; +import { NotebookCellOutput, NotebookRendererScript, URI } from '../types-impl'; + +interface KernelData { + extensionId: string; + controller: theia.NotebookController; + onDidChangeSelection: Emitter<{ selected: boolean; notebook: theia.NotebookDocument }>; + onDidReceiveMessage: Emitter<{ editor: theia.NotebookEditor; message: unknown }>; + associatedNotebooks: Map; +} + +export class NotebookKernelsExtImpl implements NotebookKernelsExt { + + private readonly activeExecutions = new Map(); + + private readonly kernelData = new Map(); + + private readonly proxy: NotebookKernelsMain; + + private kernelDetectionTasks = new Map(); + private currentKernelDetectionTaskHandle = 0; + + private kernelSourceActionProviders = new Map(); + private currentSourceActionProviderHandle = 0; + + private readonly onDidChangeCellExecutionStateEmitter = new Emitter(); + readonly onDidChangeNotebookCellExecutionState = this.onDidChangeCellExecutionStateEmitter.event; + + constructor( + rpc: RPCProtocol, + private readonly notebooks: NotebooksExtImpl, + private readonly commands: CommandRegistryImpl + ) { + this.proxy = rpc.getProxy(PLUGIN_RPC_CONTEXT.NOTEBOOK_KERNELS_MAIN); + } + + private currentHandle = 0; + + createNotebookController(extensionId: string, id: string, viewType: string, label: string, handler?: (cells: theia.NotebookCell[], + notebook: theia.NotebookDocument, controller: theia.NotebookController) => void | Thenable, rendererScripts?: NotebookRendererScript[]): theia.NotebookController { + + for (const kernelData of this.kernelData.values()) { + if (kernelData.controller.id === id && extensionId === kernelData.extensionId) { + throw new Error(`notebook controller with id '${id}' ALREADY exist`); + } + } + + const handle = this.currentHandle++; + const that = this; + + console.debug(`NotebookController[${handle}], CREATED by ${extensionId}, ${id}`); + + const defaultExecuteHandler = () => console.warn(`NO execute handler from notebook controller '${data.id}' of extension: '${extensionId}'`); + + let isDisposed = false; + const commandDisposables = new DisposableCollection(); + + const onDidChangeSelection = new Emitter<{ selected: boolean; notebook: theia.NotebookDocument }>(); + const onDidReceiveMessage = new Emitter<{ editor: theia.NotebookEditor; message: unknown }>(); + + const data: NotebookKernelDto = { + id: createKernelId(extensionId, id), + notebookType: viewType, + extensionId: extensionId, + label: label || extensionId, + }; + + // + let executeHandler = handler ?? defaultExecuteHandler; + let interruptHandler: ((this: theia.NotebookController, notebook: theia.NotebookDocument) => void | Thenable) | undefined; + + this.proxy.$addKernel(handle, data).catch(err => { + // this can happen when a kernel with that ID is already registered + console.log(err); + isDisposed = true; + }); + + // update: all setters write directly into the dto object + // and trigger an update. the actual update will only happen + // once per event loop execution + let tokenPool = 0; + const update = () => { + if (isDisposed) { + return; + } + const myToken = ++tokenPool; + Promise.resolve().then(() => { + if (myToken === tokenPool) { + this.proxy.$updateKernel(handle, data); + } + }); + }; + + // notebook documents that are associated to this controller + const associatedNotebooks = new Map(); + + const controller: theia.NotebookController = { + get id(): string { return id; }, + get notebookType(): string { return data.notebookType; }, + onDidChangeSelectedNotebooks: onDidChangeSelection.event, + onDidReceiveMessage: onDidReceiveMessage.event, + get label(): string { + return data.label; + }, + set label(value) { + data.label = value ?? extensionId; + update(); + }, + get detail(): string { + return data.detail ?? ''; + }, + set detail(value) { + data.detail = value; + update(); + }, + get description(): string { + return data.description ?? ''; + }, + set description(value) { + data.description = value; + update(); + }, + get supportedLanguages(): string[] | undefined { + return data.supportedLanguages; + }, + set supportedLanguages(value) { + data.supportedLanguages = value; + update(); + }, + get supportsExecutionOrder(): boolean { + return data.supportsExecutionOrder ?? false; + }, + set supportsExecutionOrder(value) { + data.supportsExecutionOrder = value; + update(); + }, + get rendererScripts(): NotebookRendererScript[] { + return data.rendererScripts ?? []; + }, + set rendererScripts(value) { + data.rendererScripts = value; + update(); + }, + get executeHandler(): (cells: theia.NotebookCell[], notebook: theia.NotebookDocument, controller: theia.NotebookController) => void | Thenable { + return executeHandler; + }, + set executeHandler(value) { + executeHandler = value ?? defaultExecuteHandler; + }, + get interruptHandler(): ((this: theia.NotebookController, notebook: theia.NotebookDocument) => void | Thenable) | undefined { + return interruptHandler; + }, + set interruptHandler(value) { + interruptHandler = value; + data.supportsInterrupt = Boolean(value); + update(); + }, + createNotebookCellExecution(cell): theia.NotebookCellExecution { + if (isDisposed) { + throw new Error('notebook controller is DISPOSED'); + } + if (!associatedNotebooks.has(cell.notebook.uri.toString())) { + console.debug(`NotebookController[${handle}] NOT associated to notebook, associated to THESE notebooks:`, + Array.from(associatedNotebooks.keys()).map(u => u.toString())); + throw new Error(`notebook controller is NOT associated to notebook: ${cell.notebook.uri.toString()}`); + } + return that.createNotebookCellExecution(cell, createKernelId(extensionId, this.id)); + }, + dispose: () => { + if (!isDisposed) { + console.debug(`NotebookController[${handle}], DISPOSED`); + isDisposed = true; + this.kernelData.delete(handle); + commandDisposables.dispose(); + onDidChangeSelection.dispose(); + onDidReceiveMessage.dispose(); + this.proxy.$removeKernel(handle); + } + }, + updateNotebookAffinity(notebook, priority): void { + that.proxy.$updateNotebookPriority(handle, notebook.uri, priority); + }, + async postMessage(message: unknown, editor?: theia.NotebookEditor): Promise { + return Promise.resolve(true); // TODO needs implementation + }, + asWebviewUri(localResource: theia.Uri): theia.Uri { + throw new Error('Method not implemented.'); + } + }; + + this.kernelData.set(handle, { + extensionId: extensionId, + controller, + onDidReceiveMessage, + onDidChangeSelection, + associatedNotebooks + }); + return controller; + } + + createNotebookCellExecution(cell: theia.NotebookCell, controllerId: string): theia.NotebookCellExecution { + if (cell.index < 0) { + throw new Error('CANNOT execute cell that has been REMOVED from notebook'); + } + const notebook = this.notebooks.getNotebookDocument(URI.from(cell.notebook.uri)); + const cellObj = notebook.getCellFromApiCell(cell); + if (!cellObj) { + throw new Error('invalid cell'); + } + if (this.activeExecutions.has(cellObj.uri.toString())) { + throw new Error(`duplicate execution for ${cellObj.uri}`); + } + const execution = new NotebookCellExecutionTask(controllerId, cellObj, this.proxy); + this.activeExecutions.set(cellObj.uri.toString(), execution); + const listener = execution.onDidChangeState(() => { + if (execution.state === NotebookCellExecutionTaskState.Resolved) { + execution.dispose(); + listener.dispose(); + this.activeExecutions.delete(cellObj.uri.toString()); + } + }); + return execution.asApiObject(); + } + + createNotebookControllerDetectionTask(viewType: string): theia.NotebookControllerDetectionTask { + const handle = this.currentKernelDetectionTaskHandle++; + const that = this; + + this.proxy.$addKernelDetectionTask(handle, viewType); + + const detectionTask: theia.NotebookControllerDetectionTask = { + dispose: () => { + this.kernelDetectionTasks.delete(handle); + that.proxy.$removeKernelDetectionTask(handle); + } + }; + + this.kernelDetectionTasks.set(handle, detectionTask); + return detectionTask; + } + + registerKernelSourceActionProvider(viewType: string, provider: theia.NotebookKernelSourceActionProvider): Disposable { + const handle = this.currentSourceActionProviderHandle++; + const eventHandle = typeof provider.onDidChangeNotebookKernelSourceActions === 'function' ? handle : undefined; + const that = this; + + this.kernelSourceActionProviders.set(handle, provider); + this.proxy.$addKernelSourceActionProvider(handle, handle, viewType); + + let subscription: theia.Disposable | undefined; + if (eventHandle !== undefined) { + subscription = provider.onDidChangeNotebookKernelSourceActions!(_ => this.proxy.$emitNotebookKernelSourceActionsChangeEvent(eventHandle)); + } + + return { + dispose: () => { + this.kernelSourceActionProviders.delete(handle); + that.proxy.$removeKernelSourceActionProvider(handle, handle); + subscription?.dispose(); + } + }; + } + + $acceptNotebookAssociation(handle: number, uri: UriComponents, value: boolean): void { + const obj = this.kernelData.get(handle); + if (obj) { + // update data structure + const notebook = this.notebooks.getNotebookDocument(URI.from(uri))!; + if (value) { + obj.associatedNotebooks.set(notebook.uri.toString(), true); + } else { + obj.associatedNotebooks.delete(notebook.uri.toString()); + } + console.debug(`NotebookController[${handle}] ASSOCIATE notebook`, notebook.uri.toString(), value); + // send event + obj.onDidChangeSelection.fire({ + selected: value, + notebook: notebook.apiNotebook + }); + } + + } + + async $executeCells(handle: number, uri: UriComponents, handles: number[]): Promise { + const obj = this.kernelData.get(handle); + if (!obj) { + // extension can dispose kernels in the meantime + return Promise.resolve(); + } + const document = this.notebooks.getNotebookDocument(URI.from(uri)); + const cells: theia.NotebookCell[] = []; + for (const cellHandle of handles) { + const cell = document.getCell(cellHandle); + if (cell) { + cells.push(cell.apiCell); + } + } + + try { + console.debug(`NotebookController[${handle}] EXECUTE cells`, document.uri.toString(), cells.length); + await obj.controller.executeHandler.call(obj.controller, cells, document.apiNotebook, obj.controller); + } catch (err) { + console.error(`NotebookController[${handle}] execute cells FAILED`, err); + console.error(err); + } + + } + + async $cancelCells(handle: number, uri: UriComponents, handles: number[]): Promise { + const obj = this.kernelData.get(handle); + if (!obj) { + // extension can dispose kernels in the meantime + return Promise.resolve(); + } + + // cancel or interrupt depends on the controller. When an interrupt handler is used we + // don't trigger the cancelation token of executions.N + const document = this.notebooks.getNotebookDocument(URI.from(uri)); + if (obj.controller.interruptHandler) { + await obj.controller.interruptHandler.call(obj.controller, document.apiNotebook); + + } else { + for (const cellHandle of handles) { + const cell = document.getCell(cellHandle); + if (cell) { + this.activeExecutions.get(cell.uri.toString())?.cancel(); + } + } + } + } + + $acceptKernelMessageFromRenderer(handle: number, editorId: string, message: unknown): void { + const obj = this.kernelData.get(handle); + if (!obj) { + // extension can dispose kernels in the meantime + return; + } + + const editor = this.notebooks.getEditorById(editorId); + obj.onDidReceiveMessage.fire(Object.freeze({ editor: editor.apiEditor, message })); + } + + $cellExecutionChanged(uri: UriComponents, cellHandle: number, state: NotebookCellExecutionState | undefined): void { + // Proposed Api though seems needed by jupyter for telemetry + } + + async $provideKernelSourceActions(handle: number, token: CancellationToken): Promise { + const provider = this.kernelSourceActionProviders.get(handle); + if (provider) { + const disposables = new DisposableCollection(); + const ret = await provider.provideNotebookKernelSourceActions(token); + return (ret ?? []).map(item => NotebookKernelSourceAction.from(item, this.commands.converter, disposables)); + } + return []; + + } + +} + +enum NotebookCellExecutionTaskState { + Init, + Started, + Resolved +} + +class NotebookCellExecutionTask implements Disposable { + private static HANDLE = 0; + private _handle = NotebookCellExecutionTask.HANDLE++; + + private _onDidChangeState = new Emitter(); + readonly onDidChangeState = this._onDidChangeState.event; + + private _state = NotebookCellExecutionTaskState.Init; + get state(): NotebookCellExecutionTaskState { return this._state; } + + private readonly tokenSource = new CancellationTokenSource(); + + private readonly collector: TimeoutBasedCollector; + + private executionOrder: number | undefined; + + constructor( + controllerId: string, + private readonly cell: Cell, + private readonly proxy: NotebookKernelsMain + ) { + this.collector = new TimeoutBasedCollector(10, updates => this.update(updates)); + + this.executionOrder = cell.internalMetadata.executionOrder; + this.proxy.$createExecution(this._handle, controllerId, this.cell.notebookDocument.uri, this.cell.handle); + } + + cancel(): void { + this.tokenSource.cancel(); + } + + private async updateSoon(update: CellExecuteUpdateDto): Promise { + await this.collector.addItem(update); + } + + private async update(update: CellExecuteUpdateDto | CellExecuteUpdateDto[]): Promise { + const updates = Array.isArray(update) ? update : [update]; + return this.proxy.$updateExecution(this._handle, updates); + } + + private verifyStateForOutput(): void { + if (this._state === NotebookCellExecutionTaskState.Init) { + throw new Error('Must call start before modifying cell output'); + } + + if (this._state === NotebookCellExecutionTaskState.Resolved) { + throw new Error('Cannot modify cell output after calling resolve'); + } + } + + private cellIndexToHandle(cellOrCellIndex: theia.NotebookCell | undefined): number { + let cell: Cell | undefined = this.cell; + if (cellOrCellIndex) { + cell = this.cell.notebookDocument.getCellFromApiCell(cellOrCellIndex); + } + if (!cell) { + throw new Error('INVALID cell'); + } + return cell.handle; + } + + private validateAndConvertOutputs(items: NotebookCellOutput[]): NotebookOutputDto[] { + return items.map(output => { + const newOutput = NotebookCellOutputConverter.ensureUniqueMimeTypes(output.items, true); + if (newOutput === output.items) { + return NotebookCellOutputConverter.from(output); + } + return NotebookCellOutputConverter.from({ + items: newOutput, + outputId: output.outputId, + metadata: output.metadata + }); + }); + } + + private async updateOutputs(outputs: NotebookCellOutput | NotebookCellOutput[], cell: theia.NotebookCell | undefined, append: boolean): Promise { + const handle = this.cellIndexToHandle(cell); + const outputDtos = this.validateAndConvertOutputs(Array.isArray(outputs) ? outputs : [outputs]); + return this.updateSoon( + { + editType: CellExecutionUpdateType.Output, + cellHandle: handle, + append, + outputs: outputDtos + }); + } + + private async updateOutputItems(items: theia.NotebookCellOutputItem | theia.NotebookCellOutputItem[], output: theia.NotebookCellOutput, append: boolean): Promise { + items = NotebookCellOutputConverter.ensureUniqueMimeTypes(Array.isArray(items) ? items : [items], true); + return this.updateSoon({ + editType: CellExecutionUpdateType.OutputItems, + items: items.map(NotebookCellOutputItem.from), + append + }); + } + + asApiObject(): theia.NotebookCellExecution { + const that = this; + const result: theia.NotebookCellExecution = { + get token(): CancellationToken { return that.tokenSource.token; }, + get cell(): theia.NotebookCell { return that.cell.apiCell; }, + get executionOrder(): number | undefined { return that.executionOrder; }, + set executionOrder(v: number | undefined) { + that.executionOrder = v; + that.update([{ + editType: CellExecutionUpdateType.ExecutionState, + executionOrder: that.executionOrder + }]); + }, + + start(startTime?: number): void { + if (that._state === NotebookCellExecutionTaskState.Resolved || that._state === NotebookCellExecutionTaskState.Started) { + throw new Error('Cannot call start again'); + } + + that._state = NotebookCellExecutionTaskState.Started; + that._onDidChangeState.fire(); + + that.update({ + editType: CellExecutionUpdateType.ExecutionState, + runStartTime: startTime + }); + }, + + end(success: boolean | undefined, endTime?: number): void { + if (that._state === NotebookCellExecutionTaskState.Resolved) { + throw new Error('Cannot call resolve twice'); + } + + that._state = NotebookCellExecutionTaskState.Resolved; + that._onDidChangeState.fire(); + + // The last update needs to be ordered correctly and applied immediately, + // so we use updateSoon and immediately flush. + that.collector.flush(); + + that.proxy.$completeExecution(that._handle, { + runEndTime: endTime, + lastRunSuccess: success + }); + }, + + clearOutput(cell?: theia.NotebookCell): Thenable { + that.verifyStateForOutput(); + return that.updateOutputs([], cell, false); + }, + + appendOutput(outputs: NotebookCellOutput | NotebookCellOutput[], cell?: theia.NotebookCell): Promise { + that.verifyStateForOutput(); + return that.updateOutputs(outputs, cell, true); + }, + + replaceOutput(outputs: NotebookCellOutput | NotebookCellOutput[], cell?: theia.NotebookCell): Promise { + that.verifyStateForOutput(); + return that.updateOutputs(outputs, cell, false); + }, + + appendOutputItems(items: theia.NotebookCellOutputItem | theia.NotebookCellOutputItem[], output: theia.NotebookCellOutput): Promise { + that.verifyStateForOutput(); + return that.updateOutputItems(items, output, true); + }, + + replaceOutputItems(items: theia.NotebookCellOutputItem | theia.NotebookCellOutputItem[], output: theia.NotebookCellOutput): Promise { + that.verifyStateForOutput(); + return that.updateOutputItems(items, output, false); + } + }; + return Object.freeze(result); + } + + dispose(): void { + + } +} + +class TimeoutBasedCollector { + private batch: T[] = []; + private startedTimer = Date.now(); + private currentDeferred: Deferred | undefined; + + constructor( + private readonly delay: number, + private readonly callback: (items: T[]) => Promise) { } + + addItem(item: T): Promise { + this.batch.push(item); + if (!this.currentDeferred) { + this.currentDeferred = new Deferred(); + this.startedTimer = Date.now(); + timeout(this.delay).then(() => this.flush()); + } + + // This can be called by the extension repeatedly for a long time before the timeout is able to run. + // Force a flush after the delay. + if (Date.now() - this.startedTimer > this.delay) { + return this.flush(); + } + + return this.currentDeferred.promise; + } + + flush(): Promise { + if (this.batch.length === 0 || !this.currentDeferred) { + return Promise.resolve(); + } + + const deferred = this.currentDeferred; + this.currentDeferred = undefined; + const batch = this.batch; + this.batch = []; + return this.callback(batch) + .finally(() => deferred.resolve()); + } +} + +export function createKernelId(extensionIdentifier: string, id: string): string { + return `${extensionIdentifier}/${id}`; +} diff --git a/packages/plugin-ext/src/plugin/notebook/notebook-renderers.ts b/packages/plugin-ext/src/plugin/notebook/notebook-renderers.ts new file mode 100644 index 0000000000000..cbb66bb0e69f0 --- /dev/null +++ b/packages/plugin-ext/src/plugin/notebook/notebook-renderers.ts @@ -0,0 +1,72 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { NotebookRenderersExt, NotebookRenderersMain, PLUGIN_RPC_CONTEXT } from '../../common'; +import { RPCProtocol } from '../../common/rpc-protocol'; +import { NotebooksExtImpl } from './notebooks'; +import * as theia from '@theia/plugin'; +import { NotebookEditor } from './notebook-editor'; +import { Emitter } from '@theia/core'; + +export class NotebookRenderersExtImpl implements NotebookRenderersExt { + private readonly rendererMessageEmitters = new Map>(); + private readonly proxy: NotebookRenderersMain; + + constructor(rpc: RPCProtocol, private readonly notebooksExt: NotebooksExtImpl) { + this.proxy = rpc.getProxy(PLUGIN_RPC_CONTEXT.NOTEBOOK_RENDERERS_MAIN); + } + + public $postRendererMessage(editorId: string, rendererId: string, message: unknown): void { + const editor = this.notebooksExt.getEditorById(editorId); + this.rendererMessageEmitters.get(rendererId)?.fire({ editor: editor.apiEditor, message }); + } + + public createRendererMessaging(rendererId: string): theia.NotebookRendererMessaging { + + const messaging: theia.NotebookRendererMessaging = { + onDidReceiveMessage: (listener, thisArg, disposables) => this.getOrCreateEmitterFor(rendererId).event(listener, thisArg, disposables), + postMessage: (message, editorOrAlias) => { + + const extHostEditor = editorOrAlias && NotebookEditor.apiEditorsToExtHost.get(editorOrAlias); + return this.proxy.$postMessage(extHostEditor?.id, rendererId, message); + }, + }; + + return messaging; + } + + private getOrCreateEmitterFor(rendererId: string): Emitter<{ editor: theia.NotebookEditor, message: unknown }> { + let emitter = this.rendererMessageEmitters.get(rendererId); + if (emitter) { + return emitter; + } + + emitter = new Emitter({ + onLastListenerRemove: () => { + emitter?.dispose(); + this.rendererMessageEmitters.delete(rendererId); + } + }); + + this.rendererMessageEmitters.set(rendererId, emitter); + + return emitter; + } +} diff --git a/packages/plugin-ext/src/plugin/notebook/notebooks.ts b/packages/plugin-ext/src/plugin/notebook/notebooks.ts new file mode 100644 index 0000000000000..d27b3df60b36b --- /dev/null +++ b/packages/plugin-ext/src/plugin/notebook/notebooks.ts @@ -0,0 +1,385 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { CancellationToken, Disposable, DisposableCollection, Emitter, Event, URI } from '@theia/core'; +import { URI as TheiaURI } from '../types-impl'; +import * as theia from '@theia/plugin'; +import { + CommandRegistryExt, NotebookCellStatusBarListDto, NotebookDataDto, + NotebookDocumentsAndEditorsDelta, NotebookDocumentShowOptions, NotebookDocumentsMain, NotebookEditorAddData, NotebookEditorsMain, NotebooksExt, NotebooksMain, Plugin, + PLUGIN_RPC_CONTEXT +} from '../../common'; +import { Cache } from '../../common/cache'; +import { RPCProtocol } from '../../common/rpc-protocol'; +import { UriComponents } from '../../common/uri-components'; +import { CommandsConverter } from '../command-registry'; +import * as typeConverters from '../type-converters'; +import { BinaryBuffer } from '@theia/core/lib/common/buffer'; +import { NotebookDocument } from './notebook-document'; +import { NotebookEditor } from './notebook-editor'; +import { EditorsAndDocumentsExtImpl } from '../editors-and-documents'; +import { DocumentsExtImpl } from '../documents'; + +export class NotebooksExtImpl implements NotebooksExt { + + private readonly notebookStatusBarItemProviders = new Map(); + private readonly commandsConverter: CommandsConverter; + + private readonly onDidChangeActiveNotebookEditorEmitter = new Emitter(); + readonly onDidChangeActiveNotebookEditor = this.onDidChangeActiveNotebookEditorEmitter.event; + + private readonly onDidOpenNotebookDocumentEmitter = new Emitter(); + onDidOpenNotebookDocument: Event = this.onDidOpenNotebookDocumentEmitter.event; + private readonly onDidCloseNotebookDocumentEmitter = new Emitter(); + onDidCloseNotebookDocument: Event = this.onDidCloseNotebookDocumentEmitter.event; + + private readonly onDidChangeVisibleNotebookEditorsEmitter = new Emitter(); + onDidChangeVisibleNotebookEditors = this.onDidChangeVisibleNotebookEditorsEmitter.event; + + private activeNotebookEditor: NotebookEditor | undefined; + get activeApiNotebookEditor(): theia.NotebookEditor | undefined { + return this.activeNotebookEditor?.apiEditor; + } + + private visibleNotebookEditors: NotebookEditor[] = []; + get visibleApiNotebookEditors(): theia.NotebookEditor[] { + return this.visibleNotebookEditors.map(editor => editor.apiEditor); + } + + private readonly documents = new Map(); + private readonly editors = new Map(); + private statusBarRegistry = new Cache('NotebookCellStatusBarCache'); + + private notebookProxy: NotebooksMain; + private notebookDocumentsProxy: NotebookDocumentsMain; + private notebookEditors: NotebookEditorsMain; + + constructor( + rpc: RPCProtocol, + commands: CommandRegistryExt, + private textDocumentsAndEditors: EditorsAndDocumentsExtImpl, + private textDocuments: DocumentsExtImpl + ) { + this.notebookProxy = rpc.getProxy(PLUGIN_RPC_CONTEXT.NOTEBOOKS_MAIN); + this.notebookDocumentsProxy = rpc.getProxy(PLUGIN_RPC_CONTEXT.NOTEBOOK_DOCUMENTS_MAIN); + this.notebookEditors = rpc.getProxy(PLUGIN_RPC_CONTEXT.NOTEBOOK_EDITORS_MAIN); + + commands.registerArgumentProcessor({ + processArgument: (arg: { uri: URI }) => { + if (arg && arg.uri && this.documents.has(arg.uri.toString())) { + return this.documents.get(arg.uri.toString())?.apiNotebook; + } + return arg; + } + }); + } + + async $provideNotebookCellStatusBarItems(handle: number, uri: UriComponents, index: number, token: CancellationToken): Promise { + const provider = this.notebookStatusBarItemProviders.get(handle); + const revivedUri = URI.fromComponents(uri); + const document = this.documents.get(revivedUri.toString()); + if (!document || !provider) { + return; + } + + const cell = document.getCellFromIndex(index); + if (!cell) { + return; + } + + const result = await provider.provideCellStatusBarItems(cell.apiCell, token); + if (!result) { + return undefined; + } + + const disposables = new DisposableCollection(); + const cacheId = this.statusBarRegistry.add([disposables]); + const resultArr = Array.isArray(result) ? result : [result]; + const items = resultArr.map(item => typeConverters.NotebookStatusBarItem.from(item, this.commandsConverter, disposables)); + return { + cacheId, + items + }; + } + + $releaseNotebookCellStatusBarItems(cacheId: number): void { + this.statusBarRegistry.delete(cacheId); + } + + // --- serialize/deserialize + + private currentSerializerHandle = 0; + private readonly notebookSerializer = new Map(); + + registerNotebookSerializer(plugin: Plugin, viewType: string, serializer: theia.NotebookSerializer, + options?: theia.NotebookDocumentContentOptions): theia.Disposable { + if (!viewType || !viewType.trim()) { + throw new Error('viewType cannot be empty or just whitespace'); + } + const handle = this.currentSerializerHandle++; + this.notebookSerializer.set(handle, serializer); + this.notebookProxy.$registerNotebookSerializer( + handle, + { id: plugin.model.id, location: plugin.pluginUri }, + viewType, + typeConverters.NotebookDocumentContentOptions.from(options), + ); + return Disposable.create(() => { + this.notebookProxy.$unregisterNotebookSerializer(handle); + }); + } + + async $dataToNotebook(handle: number, bytes: BinaryBuffer, token: CancellationToken): Promise { + const serializer = this.notebookSerializer.get(handle); + if (!serializer) { + throw new Error('No serializer found'); + } + const data = await serializer.deserializeNotebook(bytes.buffer, token); + return typeConverters.NotebookData.from(data); + } + + async $notebookToData(handle: number, data: NotebookDataDto, token: CancellationToken): Promise { + const serializer = this.notebookSerializer.get(handle); + if (!serializer) { + throw new Error('No serializer found'); + } + const bytes = await serializer.serializeNotebook(typeConverters.NotebookData.to(data), token); + return BinaryBuffer.wrap(bytes); + } + + registerNotebookCellStatusBarItemProvider(notebookType: string, provider: theia.NotebookCellStatusBarItemProvider): theia.Disposable { + + const handle = this.currentSerializerHandle++; + const eventHandle = typeof provider.onDidChangeCellStatusBarItems === 'function' ? this.currentSerializerHandle++ : undefined; + + this.notebookStatusBarItemProviders.set(handle, provider); + this.notebookProxy.$registerNotebookCellStatusBarItemProvider(handle, eventHandle, notebookType); + + let subscription: theia.Disposable | undefined; + if (eventHandle !== undefined) { + subscription = provider.onDidChangeCellStatusBarItems!(_ => this.notebookProxy.$emitCellStatusBarEvent(eventHandle)); + } + + return Disposable.create(() => { + this.notebookStatusBarItemProviders.delete(handle); + this.notebookProxy.$unregisterNotebookCellStatusBarItemProvider(handle, eventHandle); + subscription?.dispose(); + }); + } + + getEditorById(editorId: string): NotebookEditor { + const editor = this.editors.get(editorId); + if (!editor) { + throw new Error(`unknown text editor: ${editorId}. known editors: ${[...this.editors.keys()]} `); + } + return editor; + } + + getAllApiDocuments(): theia.NotebookDocument[] { + return [...this.documents.values()].map(doc => doc.apiNotebook); + } + + async $acceptDocumentsAndEditorsDelta(delta: NotebookDocumentsAndEditorsDelta): Promise { + if (delta.removedDocuments) { + for (const uri of delta.removedDocuments) { + const revivedUri = URI.fromComponents(uri); + const document = this.documents.get(revivedUri.toString()); + + if (document) { + document.dispose(); + this.documents.delete(revivedUri.toString()); + this.onDidCloseNotebookDocumentEmitter.fire(document.apiNotebook); + } + + for (const editor of this.editors.values()) { + if (editor.notebookData.uri.toString() === revivedUri.toString()) { + this.editors.delete(editor.id); + } + } + } + } + + if (delta.addedDocuments) { + for (const modelData of delta.addedDocuments) { + const uri = TheiaURI.from(modelData.uri); + + if (this.documents.has(uri.toString())) { + throw new Error(`adding EXISTING notebook ${uri} `); + } + + const document = new NotebookDocument( + this.notebookDocumentsProxy, + this.textDocumentsAndEditors, + this.textDocuments, + uri, + modelData + ); + + this.documents.get(uri.toString())?.dispose(); + this.documents.set(uri.toString(), document); + + this.onDidOpenNotebookDocumentEmitter.fire(document.apiNotebook); + } + } + + if (delta.addedEditors) { + for (const editorModelData of delta.addedEditors) { + if (this.editors.has(editorModelData.id)) { + return; + } + + const revivedUri = URI.fromComponents(editorModelData.documentUri); + const document = this.documents.get(revivedUri.toString()); + + if (document) { + this.createExtHostEditor(document, editorModelData.id, editorModelData); + } + } + } + + const removedEditors: NotebookEditor[] = []; + + if (delta.removedEditors) { + for (const editorId of delta.removedEditors) { + const editor = this.editors.get(editorId); + + if (editor) { + this.editors.delete(editorId); + + if (this.activeNotebookEditor?.id === editor.id) { + this.activeNotebookEditor = undefined; + } + + removedEditors.push(editor); + } + } + } + + if (delta.visibleEditors) { + this.visibleNotebookEditors = delta.visibleEditors.map(id => this.editors.get(id)!).filter(editor => !!editor) as NotebookEditor[]; + const visibleEditorsSet = new Set(); + this.visibleNotebookEditors.forEach(editor => visibleEditorsSet.add(editor.id)); + + for (const editor of this.editors.values()) { + const newValue = visibleEditorsSet.has(editor.id); + editor.acceptVisibility(newValue); + } + + this.visibleNotebookEditors = [...this.editors.values()].map(e => e).filter(e => e.visible); + this.onDidChangeVisibleNotebookEditorsEmitter.fire(this.visibleApiNotebookEditors); + } + + if (delta.newActiveEditor === null) { + // clear active notebook as current active editor is non-notebook editor + this.activeNotebookEditor = undefined; + } else if (delta.newActiveEditor) { + const activeEditor = this.editors.get(delta.newActiveEditor); + if (!activeEditor) { + console.error(`FAILED to find active notebook editor ${delta.newActiveEditor}`); + } + this.activeNotebookEditor = this.editors.get(delta.newActiveEditor); + } + if (delta.newActiveEditor !== undefined) { + this.onDidChangeActiveNotebookEditorEmitter.fire(this.activeNotebookEditor?.apiEditor); + } + } + + getNotebookDocument(uri: TheiaURI, relaxed: true): NotebookDocument | undefined; + getNotebookDocument(uri: TheiaURI): NotebookDocument; + getNotebookDocument(uri: TheiaURI, relaxed?: true): NotebookDocument | undefined { + const result = this.documents.get(uri.toString()); + if (!result && !relaxed) { + throw new Error(`NO notebook document for '${uri}'`); + } + return result; + } + + private createExtHostEditor(document: NotebookDocument, editorId: string, data: NotebookEditorAddData): void { + + if (this.editors.has(editorId)) { + throw new Error(`editor with id ALREADY EXISTS: ${editorId}`); + } + + const editor = new NotebookEditor( + editorId, + document, + data.visibleRanges.map(typeConverters.NotebookRange.to), + data.selections.map(typeConverters.NotebookRange.to), + typeof data.viewColumn === 'number' ? typeConverters.ViewColumn.to(data.viewColumn) : undefined + ); + + this.editors.set(editorId, editor); + } + + async createNotebookDocument(options: { viewType: string; content?: theia.NotebookData }): Promise { + const canonicalUri = await this.notebookDocumentsProxy.$tryCreateNotebook({ + viewType: options.viewType, + content: options.content && typeConverters.NotebookData.from(options.content) + }); + return TheiaURI.from(canonicalUri); + } + + async openNotebookDocument(uri: TheiaURI): Promise { + const cached = this.documents.get(uri.toString()); + if (cached) { + return cached.apiNotebook; + } + const canonicalUri = await this.notebookDocumentsProxy.$tryOpenNotebook(uri); + const document = this.documents.get(URI.fromComponents(canonicalUri).toString()); + return document?.apiNotebook!; + } + + async showNotebookDocument(notebookOrUri: theia.NotebookDocument | TheiaURI, options?: theia.NotebookDocumentShowOptions): Promise { + + if (URI.isUri(notebookOrUri)) { + notebookOrUri = await this.openNotebookDocument(notebookOrUri as TheiaURI); + } + + const notebook = notebookOrUri as theia.NotebookDocument; + + let resolvedOptions: NotebookDocumentShowOptions; + if (typeof options === 'object') { + resolvedOptions = { + position: typeConverters.ViewColumn.from(options.viewColumn), + preserveFocus: options.preserveFocus, + selections: options.selections && options.selections.map(typeConverters.NotebookRange.from), + pinned: typeof options.preview === 'boolean' ? !options.preview : undefined + }; + } else { + resolvedOptions = { + preserveFocus: false + }; + } + + const editorId = await this.notebookEditors.$tryShowNotebookDocument(notebook.uri, notebook.notebookType, resolvedOptions); + const editor = editorId && this.editors.get(editorId)?.apiEditor; + + if (editor) { + return editor; + } + + if (editorId) { + throw new Error(`Could NOT open editor for "${notebook.uri.toString()}" because another editor opened in the meantime.`); + } else { + throw new Error(`Could NOT open editor for "${notebook.uri.toString()}".`); + } + } + +} diff --git a/packages/plugin-ext/src/plugin/plugin-context.ts b/packages/plugin-ext/src/plugin/plugin-context.ts index e29d624f91b79..0e73c0d34f9df 100644 --- a/packages/plugin-ext/src/plugin/plugin-context.ts +++ b/packages/plugin-ext/src/plugin/plugin-context.ts @@ -166,8 +166,8 @@ import { InlayHintKind, InlayHintLabelPart, TelemetryTrustedValue, - NotebookCell, NotebookCellKind, + NotebookCellExecutionState, NotebookCellStatusBarAlignment, NotebookEditorRevealType, NotebookControllerAffinity, @@ -175,10 +175,11 @@ import { NotebookCellOutput, NotebookCellOutputItem, NotebookData, - NotebookDocument, NotebookRange, NotebookCellStatusBarItem, NotebookEdit, + NotebookKernelSourceAction, + NotebookRendererScript, TestRunProfileKind, TestTag, TestRunRequest, @@ -243,7 +244,13 @@ import { Endpoint } from '@theia/core/lib/browser/endpoint'; import { FilePermission } from '@theia/filesystem/lib/common/files'; import { TabsExtImpl } from './tabs'; import { LocalizationExtImpl } from './localization-ext'; +import { NotebooksExtImpl } from './notebook/notebooks'; import { TelemetryExtImpl } from './telemetry-ext'; +import { NotebookDocument } from './notebook/notebook-document'; +import { NotebookRenderersExtImpl } from './notebook/notebook-renderers'; +import { NotebookKernelsExtImpl } from './notebook/notebook-kernels'; +import { NotebookDocumentsExtImpl } from './notebook/notebook-documents'; +import { NotebookEditorsExtImpl } from './notebook/notebook-editors'; export function createAPIFactory( rpc: RPCProtocol, @@ -267,6 +274,11 @@ export function createAPIFactory( const notificationExt = rpc.set(MAIN_RPC_CONTEXT.NOTIFICATION_EXT, new NotificationExtImpl(rpc)); const editors = rpc.set(MAIN_RPC_CONTEXT.TEXT_EDITORS_EXT, new TextEditorsExtImpl(rpc, editorsAndDocumentsExt)); const documents = rpc.set(MAIN_RPC_CONTEXT.DOCUMENTS_EXT, new DocumentsExtImpl(rpc, editorsAndDocumentsExt)); + const notebooksExt = rpc.set(MAIN_RPC_CONTEXT.NOTEBOOKS_EXT, new NotebooksExtImpl(rpc, commandRegistry, editorsAndDocumentsExt, documents)); + const notebookEditors = rpc.set(MAIN_RPC_CONTEXT.NOTEBOOK_EDITORS_EXT, new NotebookEditorsExtImpl(notebooksExt)); + const notebookRenderers = rpc.set(MAIN_RPC_CONTEXT.NOTEBOOK_RENDERERS_EXT, new NotebookRenderersExtImpl(rpc, notebooksExt)); + const notebookKernels = rpc.set(MAIN_RPC_CONTEXT.NOTEBOOK_KERNELS_EXT, new NotebookKernelsExtImpl(rpc, notebooksExt, commandRegistry)); + const notebookDocuments = rpc.set(MAIN_RPC_CONTEXT.NOTEBOOK_DOCUMENTS_EXT, new NotebookDocumentsExtImpl(notebooksExt)); const statusBarMessageRegistryExt = new StatusBarMessageRegistryExt(rpc); const terminalExt = rpc.set(MAIN_RPC_CONTEXT.TERMINAL_EXT, new TerminalServiceExtImpl(rpc)); const outputChannelRegistryExt = rpc.set(MAIN_RPC_CONTEXT.OUTPUT_CHANNEL_REGISTRY_EXT, new OutputChannelRegistryExtImpl(rpc)); @@ -428,24 +440,24 @@ export function createAPIFactory( } }, get visibleNotebookEditors(): theia.NotebookEditor[] { - return [] as theia.NotebookEditor[]; + return notebooksExt.visibleApiNotebookEditors; }, onDidChangeVisibleNotebookEditors(listener, thisArg?, disposables?) { - return Disposable.NULL; + return notebooksExt.onDidChangeVisibleNotebookEditors(listener, thisArg, disposables); }, get activeNotebookEditor(): theia.NotebookEditor | undefined { - return undefined; + return notebooksExt.activeApiNotebookEditor; }, onDidChangeActiveNotebookEditor(listener, thisArg?, disposables?) { - return Disposable.NULL; + return notebooksExt.onDidChangeActiveNotebookEditor(listener, thisArg, disposables); }, onDidChangeNotebookEditorSelection(listener, thisArg?, disposables?) { - return Disposable.NULL; + return notebookEditors.onDidChangeNotebookEditorSelection(listener, thisArg, disposables); }, onDidChangeNotebookEditorVisibleRanges(listener, thisArg?, disposables?) { - return Disposable.NULL; + return notebookEditors.onDidChangeNotebookEditorVisibleRanges(listener, thisArg, disposables); }, - showNotebookDocument(document: NotebookDocument, options?: theia.NotebookDocumentShowOptions) { - return Promise.resolve({} as theia.NotebookEditor); + showNotebookDocument(document: theia.NotebookDocument, options?: theia.NotebookDocumentShowOptions) { + return notebooksExt.showNotebookDocument(document, options); }, // eslint-disable-next-line @typescript-eslint/no-explicit-any showQuickPick(items: any, options?: theia.QuickPickOptions, token?: theia.CancellationToken): any { @@ -617,7 +629,7 @@ export function createAPIFactory( return workspaceExt.onDidChangeWorkspaceFolders(listener, thisArg, disposables); }, get notebookDocuments(): theia.NotebookDocument[] { - return [] as theia.NotebookDocument[]; + return notebooksExt.getAllApiDocuments(); }, get textDocuments(): theia.TextDocument[] { return documents.getAllDocumentData().map(data => data.document); @@ -629,19 +641,19 @@ export function createAPIFactory( return documents.onDidRemoveDocument(listener, thisArg, disposables); }, onDidOpenNotebookDocument(listener, thisArg?, disposables?) { - return Disposable.NULL; + return notebooksExt.onDidOpenNotebookDocument(listener, thisArg, disposables); }, onDidCloseNotebookDocument(listener, thisArg?, disposables?) { - return Disposable.NULL; - }, - onDidChangeNotebookDocument(listener, thisArg?, disposables?) { - return Disposable.NULL; + return notebooksExt.onDidCloseNotebookDocument(listener, thisArg, disposables); }, onWillSaveNotebookDocument(listener, thisArg?, disposables?) { return Disposable.NULL; }, - onDidSaveNotebookDocument(listener, thisArg?, disposables?) { - return Disposable.NULL; + onDidSaveNotebookDocument(listener, thisArg, disposables) { + return notebookDocuments.onDidSaveNotebookDocument(listener, thisArg, disposables); + }, + onDidChangeNotebookDocument(listener, thisArg, disposables) { + return notebookDocuments.onDidChangeNotebookDocument(listener, thisArg, disposables); }, onDidOpenTextDocument(listener, thisArg?, disposables?) { return documents.onDidAddDocument(listener, thisArg, disposables); @@ -687,8 +699,18 @@ export function createAPIFactory( const data = await documents.openDocument(uri); return data && data.document; }, - openNotebookDocument(uriOrString: theia.Uri | string, content?: NotebookData): Promise { - return Promise.reject(new Error('Notebook API is stubbed')); + async openNotebookDocument(uriOrType: theia.Uri | string, content?: NotebookData): Promise { + let uri: URI; + if (URI.isUri(uriOrType)) { + uri = uriOrType; + await notebooksExt.openNotebookDocument(uriOrType as URI); + } else if (typeof uriOrType === 'string') { + uri = URI.revive(await notebooksExt.createNotebookDocument({ viewType: uriOrType, content })); + } else { + throw new Error('Invalid arguments'); + } + return notebooksExt.getNotebookDocument(uri).apiNotebook; + }, createFileSystemWatcher: (pattern, ignoreCreate, ignoreChange, ignoreDelete): theia.FileSystemWatcher => extHostFileSystemEvent.createFileSystemWatcher(fromGlobPattern(pattern), ignoreCreate, ignoreChange, ignoreDelete), @@ -730,7 +752,7 @@ export function createAPIFactory( return timelineExt.registerTimelineProvider(plugin, scheme, provider); }, registerNotebookSerializer(notebookType: string, serializer: theia.NotebookSerializer, options?: theia.NotebookDocumentContentOptions): theia.Disposable { - return Disposable.NULL; + return notebooksExt.registerNotebookSerializer(plugin, notebookType, serializer, options); }, get isTrusted(): boolean { return workspaceExt.trusted; @@ -1157,54 +1179,27 @@ export function createAPIFactory( label, handler?: (cells: theia.NotebookCell[], notebook: theia.NotebookDocument, - controller: theia.NotebookController) => void | Thenable + controller: theia.NotebookController) => void | Thenable, + rendererScripts?: NotebookRendererScript[] ) { - return { - id, - notebookType, - label, - handler, - createNotebookCellExecution: (cell: NotebookCell) => ({ - cell, - token: CancellationToken.None, - executionOrder: undefined, - start: () => undefined, - end: () => undefined, - clearOutput: () => ({} as Thenable), - replaceOutput: () => ({} as Thenable), - appendOutput: () => ({} as Thenable), - replaceOutputItems: () => ({} as Thenable), - appendOutputItems: () => ({} as Thenable) - }), - executeHandler( - cells: theia.NotebookCell[], - notebook: theia.NotebookDocument, - controller: theia.NotebookController - ): (void | Thenable) { }, - onDidChangeSelectedNotebooks: () => Disposable.create(() => { }), - updateNotebookAffinity: (notebook: theia.NotebookDocument, affinity: theia.NotebookControllerAffinity) => undefined, - dispose: () => undefined, - }; - + return notebookKernels.createNotebookController(plugin.model.id, id, notebookType, label, handler, rendererScripts); }, - createRendererMessaging( - rendererId - ) { - return { - rendererId, - onDidReceiveMessage: () => Disposable.create(() => { }), - postMessage: () => Promise.resolve({}), - }; + createRendererMessaging(rendererId) { + return notebookRenderers.createRendererMessaging(rendererId); }, registerNotebookCellStatusBarItemProvider( notebookType, provider ) { - return { - notebookType, - provider, - dispose: () => undefined, - }; + return notebooksExt.registerNotebookCellStatusBarItemProvider(notebookType, provider); + }, + onDidChangeNotebookCellExecutionState: notebookKernels.onDidChangeNotebookCellExecutionState, + + createNotebookControllerDetectionTask(notebookType: string) { + return notebookKernels.createNotebookControllerDetectionTask(notebookType); + }, + registerKernelSourceActionProvider(notebookType: string, provider: theia.NotebookKernelSourceActionProvider) { + return notebookKernels.registerKernelSourceActionProvider(notebookType, provider); } }; @@ -1359,6 +1354,7 @@ export function createAPIFactory( InlayHintLabelPart, TelemetryTrustedValue, NotebookCellData, + NotebookCellExecutionState, NotebookCellKind, NotebookCellOutput, NotebookCellOutputItem, @@ -1370,6 +1366,8 @@ export function createAPIFactory( NotebookDocument, NotebookRange, NotebookEdit, + NotebookKernelSourceAction, + NotebookRendererScript, TestRunProfileKind, TestTag, TestRunRequest, @@ -1422,6 +1420,8 @@ export interface ExtensionPlugin extends theia.Plugin { } export class Plugin implements theia.Plugin { + #pluginManager: PluginManager; + id: string; pluginPath: string; pluginUri: theia.Uri; @@ -1429,7 +1429,9 @@ export class Plugin implements theia.Plugin { packageJSON: any; pluginType: theia.PluginType; - constructor(protected readonly pluginManager: PluginManager, plugin: InternalPlugin) { + constructor(pluginManager: PluginManager, plugin: InternalPlugin) { + this.#pluginManager = pluginManager; + this.id = plugin.model.id; this.pluginPath = plugin.pluginFolder; this.packageJSON = plugin.rawModel; @@ -1444,26 +1446,29 @@ export class Plugin implements theia.Plugin { } get isActive(): boolean { - return this.pluginManager.isActive(this.id); + return this.#pluginManager.isActive(this.id); } get exports(): T { - return this.pluginManager.getPluginExport(this.id); + return this.#pluginManager.getPluginExport(this.id); } activate(): PromiseLike { - return this.pluginManager.activatePlugin(this.id).then(() => this.exports); + return this.#pluginManager.activatePlugin(this.id).then(() => this.exports); } } export class PluginExt extends Plugin implements ExtensionPlugin { + #pluginManager: PluginManager; + extensionPath: string; extensionUri: theia.Uri; extensionKind: ExtensionKind; isFromDifferentExtensionHost: boolean; - constructor(protected override readonly pluginManager: PluginManager, plugin: InternalPlugin, isFromDifferentExtensionHost = false) { + constructor(pluginManager: PluginManager, plugin: InternalPlugin, isFromDifferentExtensionHost = false) { super(pluginManager, plugin); + this.#pluginManager = pluginManager; this.extensionPath = this.pluginPath; this.extensionUri = this.pluginUri; @@ -1472,14 +1477,14 @@ export class PluginExt extends Plugin implements ExtensionPlugin { } override get isActive(): boolean { - return this.pluginManager.isActive(this.id); + return this.#pluginManager.isActive(this.id); } override get exports(): T { - return this.pluginManager.getPluginExport(this.id); + return this.#pluginManager.getPluginExport(this.id); } override activate(): PromiseLike { - return this.pluginManager.activatePlugin(this.id).then(() => this.exports); + return this.#pluginManager.activatePlugin(this.id).then(() => this.exports); } } diff --git a/packages/plugin-ext/src/plugin/plugin-manager.ts b/packages/plugin-ext/src/plugin/plugin-manager.ts index 0fe8976a33568..3d3c5296bdc7a 100644 --- a/packages/plugin-ext/src/plugin/plugin-manager.ts +++ b/packages/plugin-ext/src/plugin/plugin-manager.ts @@ -43,6 +43,7 @@ import { WebviewsExtImpl } from './webviews'; import { URI as Uri } from './types-impl'; import { SecretsExtImpl, SecretStorageExt } from '../plugin/secrets-ext'; import { PluginExt } from './plugin-context'; +import { Deferred } from '@theia/core/lib/common/promise-util'; export interface PluginHost { @@ -96,7 +97,9 @@ export class PluginManagerExtImpl implements PluginManagerExt, PluginManager { 'onFileSystem', 'onCustomEditor', 'onStartupFinished', - 'onAuthenticationRequest' + 'onAuthenticationRequest', + 'onNotebook', + 'onNotebookSerializer' ]); private configStorage: ConfigStorage | undefined; @@ -115,6 +118,7 @@ export class PluginManagerExtImpl implements PluginManagerExt, PluginManager { } protected jsonValidation: PluginJsonValidationContribution[] = []; + protected ready = new Deferred(); constructor( private readonly host: PluginHost, @@ -230,6 +234,8 @@ export class PluginManagerExtImpl implements PluginManagerExt, PluginManager { this.registerPlugin(plugin); } + // ensure plugins are registered before running activation events + this.ready.resolve(); // run eager plugins await this.$activateByEvent('*'); for (const activationEvent of params.activationEvents) { @@ -333,6 +339,8 @@ export class PluginManagerExtImpl implements PluginManagerExt, PluginManager { } async $activateByEvent(activationEvent: string): Promise { + // Prevent the plugin manager from performing activations before plugins are registered + await this.ready.promise; if (activationEvent.endsWith(':*')) { const baseEvent = activationEvent.substring(0, activationEvent.length - 2); await this.activateByBaseEvent(baseEvent); diff --git a/packages/plugin-ext/src/plugin/type-converters.ts b/packages/plugin-ext/src/plugin/type-converters.ts index 797758b79c3cd..8dc7b11def8be 100644 --- a/packages/plugin-ext/src/plugin/type-converters.ts +++ b/packages/plugin-ext/src/plugin/type-converters.ts @@ -28,7 +28,12 @@ import * as types from './types-impl'; import { UriComponents } from '../common/uri-components'; import { isReadonlyArray } from '../common/arrays'; import { MarkdownString as MarkdownStringDTO } from '@theia/core/lib/common/markdown-rendering'; -import { isObject } from '@theia/core/lib/common'; +import { DisposableCollection, isEmptyObject, isObject } from '@theia/core/lib/common'; +import * as notebooks from '@theia/notebook/lib/common'; +import { CommandsConverter } from './command-registry'; +import { BinaryBuffer } from '@theia/core/lib/common/buffer'; +import { CellData, CellExecutionUpdateType, CellOutput, CellOutputItem, CellRange, isTextStreamMime } from '@theia/notebook/lib/common'; +import { CellExecuteUpdate, CellExecutionComplete } from '@theia/notebook/lib/browser'; const SIDE_GROUP = -2; const ACTIVE_GROUP = -1; @@ -581,26 +586,46 @@ export function fromWorkspaceEdit(value: theia.WorkspaceEdit, documents?: any): edits: [] }; for (const entry of (value as types.WorkspaceEdit)._allEntries()) { - const [uri, uriOrEdits] = entry; - if (Array.isArray(uriOrEdits)) { + if (entry?._type === types.FileEditType.Text) { // text edits - const doc = documents ? documents.getDocument(uri.toString()) : undefined; + const doc = documents ? documents.getDocument(entry.uri.toString()) : undefined; const workspaceTextEditDto: WorkspaceTextEditDto = { - resource: uri, + resource: entry.uri, modelVersionId: doc?.version, - textEdit: uriOrEdits.map(edit => (edit instanceof types.TextEdit) ? fromTextEdit(edit) : fromSnippetTextEdit(edit))[0], - metadata: entry[2] as types.WorkspaceEditMetadata + textEdit: (entry.edit instanceof types.TextEdit) ? fromTextEdit(entry.edit) : fromSnippetTextEdit(entry.edit), + metadata: entry.metadata }; result.edits.push(workspaceTextEditDto); - } else { + } else if (entry?._type === types.FileEditType.File) { // resource edits const workspaceFileEditDto: WorkspaceFileEditDto = { - oldResource: uri, - newResource: uriOrEdits, - options: entry[2] as types.FileOperationOptions, - metadata: entry[3] + oldResource: entry.from, + newResource: entry.to, + options: entry.options, + metadata: entry.metadata }; result.edits.push(workspaceFileEditDto); + } else if (entry?._type === types.FileEditType.Cell) { + // cell edit + if (entry.edit) { + result.edits.push({ + metadata: entry.metadata, + resource: entry.uri, + cellEdit: entry.edit, + }); + } + } else if (entry?._type === types.FileEditType.CellReplace) { + // cell replace + result.edits.push({ + metadata: entry.metadata, + resource: entry.uri, + cellEdit: { + editType: notebooks.CellEditType.Replace, + index: entry.index, + count: entry.count, + cells: entry.cells.map(NotebookCellData.from) + } + }); } } return result; @@ -1397,3 +1422,326 @@ export namespace DataTransfer { return dataTransfer; } } + +export namespace NotebookDocumentContentOptions { + export function from(options: theia.NotebookDocumentContentOptions | undefined): notebooks.TransientOptions { + return { + transientOutputs: options?.transientOutputs ?? false, + transientCellMetadata: options?.transientCellMetadata ?? {}, + transientDocumentMetadata: options?.transientDocumentMetadata ?? {}, + }; + } +} + +export namespace NotebookStatusBarItem { + export function from(item: theia.NotebookCellStatusBarItem, commandsConverter: CommandsConverter, disposables: DisposableCollection): notebooks.NotebookCellStatusBarItem { + const command = typeof item.command === 'string' ? { title: '', command: item.command } : item.command; + return { + alignment: item.alignment === types.NotebookCellStatusBarAlignment.Left ? notebooks.CellStatusbarAlignment.Left : notebooks.CellStatusbarAlignment.Right, + command: commandsConverter.toSafeCommand(command, disposables), + text: item.text, + tooltip: item.tooltip, + priority: item.priority + }; + } +} + +export namespace NotebookData { + + export function from(data: theia.NotebookData): rpc.NotebookDataDto { + const res: rpc.NotebookDataDto = { + metadata: data.metadata ?? Object.create(null), + cells: [], + }; + for (const cell of data.cells) { + // types.NotebookCellData.validate(cell); + res.cells.push(NotebookCellData.from(cell)); + } + return res; + } + + export function to(data: rpc.NotebookDataDto): theia.NotebookData { + const res = new types.NotebookData( + data.cells.map(NotebookCellData.to), + ); + if (!isEmptyObject(data.metadata)) { + res.metadata = data.metadata; + } + return res; + } +} + +export namespace NotebookCellData { + + export function from(data: theia.NotebookCellData): rpc.NotebookCellDataDto { + return { + cellKind: NotebookCellKind.from(data.kind), + language: data.languageId, + source: data.value, + // metadata: data.metadata, + // internalMetadata: NotebookCellExecutionSummary.from(data.executionSummary ?? {}), + outputs: data.outputs ? data.outputs.map(NotebookCellOutputConverter.from) : [] + }; + } + + export function to(data: rpc.NotebookCellDataDto): theia.NotebookCellData { + return new types.NotebookCellData( + NotebookCellKind.to(data.cellKind), + data.source, + data.language, + data.outputs ? data.outputs.map(NotebookCellOutput.to) : undefined, + data.metadata, + data.internalMetadata ? NotebookCellExecutionSummary.to(data.internalMetadata) : undefined + ); + } +} + +export namespace NotebookCellKind { + export function from(data: theia.NotebookCellKind): notebooks.CellKind { + switch (data) { + case types.NotebookCellKind.Markup: + return notebooks.CellKind.Markup; + case types.NotebookCellKind.Code: + default: + return notebooks.CellKind.Code; + } + } + + export function to(data: notebooks.CellKind): theia.NotebookCellKind { + switch (data) { + case notebooks.CellKind.Markup: + return types.NotebookCellKind.Markup; + case notebooks.CellKind.Code: + default: + return types.NotebookCellKind.Code; + } + } +} + +export namespace NotebookCellOutput { + export function from(output: theia.NotebookCellOutput & { outputId: string }): rpc.NotebookOutputDto { + return { + outputId: output.outputId, + items: output.items.map(NotebookCellOutputItem.from), + metadata: output.metadata + }; + } + + export function to(output: rpc.NotebookOutputDto): theia.NotebookCellOutput { + const items = output.items.map(NotebookCellOutputItem.to); + return new types.NotebookCellOutput(items, output.outputId, output.metadata); + } +} + +export namespace NotebookCellOutputItem { + export function from(item: types.NotebookCellOutputItem): rpc.NotebookOutputItemDto { + return { + mime: item.mime, + valueBytes: BinaryBuffer.wrap(item.data), + }; + } + + export function to(item: rpc.NotebookOutputItemDto): types.NotebookCellOutputItem { + return new types.NotebookCellOutputItem(item.valueBytes.buffer, item.mime); + } +} + +export namespace NotebookCellOutputConverter { + export function from(output: types.NotebookCellOutput): rpc.NotebookOutputDto { + return { + outputId: output.outputId, + items: output.items.map(NotebookCellOutputItem.from), + metadata: output.metadata + }; + } + + export function to(output: rpc.NotebookOutputDto): types.NotebookCellOutput { + const items = output.items.map(NotebookCellOutputItem.to); + return new types.NotebookCellOutput(items, output.outputId, output.metadata); + } + + export function ensureUniqueMimeTypes(items: types.NotebookCellOutputItem[], warn: boolean = false): types.NotebookCellOutputItem[] { + const seen = new Set(); + const removeIdx = new Set(); + for (let i = 0; i < items.length; i++) { + const item = items[i]; + // We can have multiple text stream mime types in the same output. + if (!seen.has(item.mime) || isTextStreamMime(item.mime)) { + seen.add(item.mime); + continue; + } + // duplicated mime types... first has won + removeIdx.add(i); + if (warn) { + console.warn(`DUPLICATED mime type '${item.mime}' will be dropped`); + } + } + if (removeIdx.size === 0) { + return items; + } + return items.filter((_, index) => !removeIdx.has(index)); + } +} + +export namespace NotebookCellExecutionSummary { + export function to(data: notebooks.NotebookCellInternalMetadata): theia.NotebookCellExecutionSummary { + return { + timing: typeof data.runStartTime === 'number' && typeof data.runEndTime === 'number' ? { startTime: data.runStartTime, endTime: data.runEndTime } : undefined, + executionOrder: data.executionOrder, + success: data.lastRunSuccess + }; + } + + export function from(data: theia.NotebookCellExecutionSummary): Partial { + return { + lastRunSuccess: data.success, + runStartTime: data.timing?.startTime, + runEndTime: data.timing?.endTime, + executionOrder: data.executionOrder + }; + } +} + +export namespace NotebookRange { + + export function from(range: theia.NotebookRange): CellRange { + return { start: range.start, end: range.end }; + } + + export function to(range: CellRange): types.NotebookRange { + return new types.NotebookRange(range.start, range.end); + } +} + +export namespace NotebookKernelSourceAction { + export function from(item: theia.NotebookKernelSourceAction, commandsConverter: CommandsConverter, disposables: DisposableCollection): rpc.NotebookKernelSourceActionDto { + const command = typeof item.command === 'string' ? { title: '', command: item.command } : item.command; + + return { + command: commandsConverter.toSafeCommand(command, disposables), + label: item.label, + description: item.description, + detail: item.detail, + documentation: item.documentation + }; + } +} + +export namespace NotebookDto { + + export function toNotebookOutputItemDto(item: CellOutputItem): rpc.NotebookOutputItemDto { + return { + mime: item.mime, + valueBytes: item.data + }; + } + + export function toNotebookOutputDto(output: CellOutput): rpc.NotebookOutputDto { + return { + outputId: output.outputId, + metadata: output.metadata, + items: output.outputs.map(toNotebookOutputItemDto) + }; + } + + export function toNotebookCellDataDto(cell: CellData): rpc.NotebookCellDataDto { + return { + cellKind: cell.cellKind, + language: cell.language, + source: cell.source, + internalMetadata: cell.internalMetadata, + metadata: cell.metadata, + outputs: cell.outputs.map(toNotebookOutputDto) + }; + } + + // export function toNotebookDataDto(data: NotebookData): rpc.NotebookDataDto { + // return { + // metadata: data.metadata, + // cells: data.cells.map(toNotebookCellDataDto) + // }; + // } + + export function fromNotebookOutputItemDto(item: rpc.NotebookOutputItemDto): CellOutputItem { + return { + mime: item.mime, + data: item.valueBytes + }; + } + + export function fromNotebookOutputDto(output: rpc.NotebookOutputDto): CellOutput { + return { + outputId: output.outputId, + metadata: output.metadata, + outputs: output.items.map(fromNotebookOutputItemDto) + }; + } + + export function fromNotebookCellDataDto(cell: rpc.NotebookCellDataDto): CellData { + return { + cellKind: cell.cellKind, + language: cell.language, + source: cell.source, + outputs: cell.outputs.map(fromNotebookOutputDto), + metadata: cell.metadata, + internalMetadata: cell.internalMetadata + }; + } + + // export function fromNotebookDataDto(data: rpc.NotebookDataDto): NotebookData { + // return { + // metadata: data.metadata, + // cells: data.cells.map(fromNotebookCellDataDto) + // }; + // } + + // export function toNotebookCellDto(cell: Cell): rpc.NotebookCellDto { + // return { + // handle: cell.handle, + // uri: cell.uri, + // source: cell.textBuffer.getLinesContent(), + // eol: cell.textBuffer.getEOL(), + // language: cell.language, + // cellKind: cell.cellKind, + // outputs: cell.outputs.map(toNotebookOutputDto), + // metadata: cell.metadata, + // internalMetadata: cell.internalMetadata, + // }; + // } + + export function fromCellExecuteUpdateDto(data: rpc.CellExecuteUpdateDto): CellExecuteUpdate { + if (data.editType === CellExecutionUpdateType.Output) { + return { + editType: data.editType, + cellHandle: data.cellHandle, + append: data.append, + outputs: data.outputs.map(fromNotebookOutputDto) + }; + } else if (data.editType === CellExecutionUpdateType.OutputItems) { + return { + editType: data.editType, + append: data.append, + items: data.items.map(fromNotebookOutputItemDto) + }; + } else { + return data; + } + } + + export function fromCellExecuteCompleteDto(data: rpc.CellExecutionCompleteDto): CellExecutionComplete { + return data; + } + + // export function fromCellEditOperationDto(edit: rpc.CellEditOperationDto): CellEditOperation { + // if (edit.editType === CellEditType.Replace) { + // return { + // editType: edit.editType, + // index: edit.index, + // count: edit.count, + // cells: edit.cells.map(fromNotebookCellDataDto) + // }; + // } else { + // return edit; + // } + // } +} diff --git a/packages/plugin-ext/src/plugin/types-impl.ts b/packages/plugin-ext/src/plugin/types-impl.ts index 18b15b374b8dc..99be4c26625a9 100644 --- a/packages/plugin-ext/src/plugin/types-impl.ts +++ b/packages/plugin-ext/src/plugin/types-impl.ts @@ -32,6 +32,7 @@ import { FileSystemProviderErrorCode, markAsFileSystemProviderError } from '@the import * as paths from 'path'; import { es5ClassCompat } from '../common/types'; import { isObject, isStringArray } from '@theia/core/lib/common'; +import { CellEditType, CellMetadataEdit, NotebookDocumentMetadataEdit } from '@theia/notebook/lib/common'; /** * This is an implementation of #theia.Uri based on vscode-uri. @@ -1130,6 +1131,31 @@ export enum NotebookEditorRevealType { InCenterIfOutsideViewport = 2, AtTop = 3 } + +export enum NotebookCellExecutionState { + /** + * The cell is idle. + */ + Idle = 1, + /** + * Execution for the cell is pending. + */ + Pending = 2, + /** + * The cell is currently executing. + */ + Executing = 3, +} + +export class NotebookKernelSourceAction { + description?: string; + detail?: string; + command?: theia.Command; + constructor( + public label: string + ) { } +} + @es5ClassCompat export class NotebookCellData implements theia.NotebookCellData { languageId: string; @@ -1140,23 +1166,34 @@ export class NotebookCellData implements theia.NotebookCellData { metadata?: { [key: string]: any }; executionSummary?: theia.NotebookCellExecutionSummary; - constructor(kind: NotebookCellKind, value: string, languageId: string) { + constructor(kind: NotebookCellKind, value: string, languageId: string, + outputs?: theia.NotebookCellOutput[], metadata?: Record, executionSummary?: theia.NotebookCellExecutionSummary) { this.kind = kind; this.value = value; this.languageId = languageId; + this.outputs = outputs ?? []; + this.metadata = metadata; + this.executionSummary = executionSummary; } } @es5ClassCompat export class NotebookCellOutput implements theia.NotebookCellOutput { + outputId: string; items: theia.NotebookCellOutputItem[]; // eslint-disable-next-line @typescript-eslint/no-explicit-any metadata?: { [key: string]: any }; // eslint-disable-next-line @typescript-eslint/no-explicit-any - constructor(items: theia.NotebookCellOutputItem[], metadata?: { [key: string]: any }) { + constructor(items: theia.NotebookCellOutputItem[], idOrMetadata?: string | Record, metadata?: { [key: string]: any }) { this.items = items; - this.metadata = metadata; + if (typeof idOrMetadata === 'string') { + this.outputId = idOrMetadata; + this.metadata = metadata; + } else { + this.outputId = UUID.uuid4(); + this.metadata = idOrMetadata ?? metadata; + } } } @@ -1227,41 +1264,18 @@ export class NotebookData implements theia.NotebookData { } } -export class NotebookDocument implements theia.NotebookDocument { - readonly uri: theia.Uri; - readonly notebookType: string; - readonly version: number; - readonly isDirty: boolean; - readonly isUntitled: boolean; - readonly isClosed: boolean; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - readonly metadata: { [key: string]: any }; - readonly cellCount: number; - - cellAt(index: number): theia.NotebookCell { - return {} as theia.NotebookCell; - } - save(): theia.Thenable { - return Promise.resolve(false); - } - - getCells(range?: theia.NotebookRange | undefined): theia.NotebookCell[] { - return [] as NotebookCell[]; +export class NotebookRange implements theia.NotebookRange { + static isNotebookRange(thing: unknown): thing is theia.NotebookRange { + if (thing instanceof NotebookRange) { + return true; + } + if (!thing) { + return false; + } + return typeof (thing).start === 'number' + && typeof (thing).end === 'number'; } -} -export class NotebookCell implements theia.NotebookCell { - readonly index: number; - readonly notebook: theia.NotebookDocument; - readonly kind: theia.NotebookCellKind; - readonly document: theia.TextDocument; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - readonly metadata: { readonly [key: string]: any; }; - readonly outputs: readonly theia.NotebookCellOutput[]; - readonly executionSummary: theia.NotebookCellExecutionSummary | undefined; - -} -export class NotebookRange implements theia.NotebookRange { readonly start: number; readonly end: number; readonly isEmpty: boolean; @@ -1322,27 +1336,58 @@ export class NotebookEdit implements theia.NotebookEdit { // eslint-disable-next-line @typescript-eslint/no-explicit-any newNotebookMetadata?: { [key: string]: any; } | undefined; + static isNotebookCellEdit(thing: unknown): thing is NotebookEdit { + if (thing instanceof NotebookEdit) { + return true; + } + if (!thing) { + return false; + } + return NotebookRange.isNotebookRange((thing)) + && Array.isArray((thing).newCells); + } + static replaceCells(range: NotebookRange, newCells: NotebookCellData[]): NotebookEdit { - return new NotebookEdit(); + return new NotebookEdit(range, newCells); } static insertCells(index: number, newCells: NotebookCellData[]): NotebookEdit { - return new NotebookEdit(); + return new NotebookEdit(new NotebookRange(index, index), newCells); } static deleteCells(range: NotebookRange): NotebookEdit { - return new NotebookEdit(); + return new NotebookEdit(range, []); } // eslint-disable-next-line @typescript-eslint/no-explicit-any static updateCellMetadata(index: number, newCellMetadata: { [key: string]: any }): NotebookEdit { - return new NotebookEdit(); + return new NotebookEdit(new NotebookRange(index, index), [], newCellMetadata); } // eslint-disable-next-line @typescript-eslint/no-explicit-any static updateNotebookMetadata(newNotebookMetadata: { [key: string]: any }): NotebookEdit { - return new NotebookEdit(); + return new NotebookEdit(new NotebookRange(0, 0), [], undefined, newNotebookMetadata); + } + + constructor(range: NotebookRange, newCells: NotebookCellData[], newCellMetadata?: { [key: string]: unknown }, newNotebookMetadata?: { [key: string]: unknown }) { + this.range = range; + this.newCells = newCells; + this.newCellMetadata = newCellMetadata; + this.newNotebookMetadata = newNotebookMetadata; } + +} + +export class NotebookRendererScript implements theia.NotebookRendererScript { + provides: readonly string[]; + + constructor( + public uri: theia.Uri, + provides?: string | readonly string[] + ) { + this.provides = Array.isArray(provides) ? provides : [provides]; + }; + } @es5ClassCompat @@ -1681,6 +1726,9 @@ export interface WorkspaceEditMetadata { export const enum FileEditType { File = 1, Text = 2, + // eslint-disable-next-line @typescript-eslint/no-shadow + Cell = 3, + CellReplace = 5, Snippet = 6, } @@ -1707,7 +1755,24 @@ export interface FileSnippetTextEdit { readonly metadata?: theia.WorkspaceEditEntryMetadata; } -type WorkspaceEditEntry = FileOperation | FileTextEdit | FileSnippetTextEdit | undefined; +export interface FileCellEdit { + readonly _type: FileEditType.Cell; + readonly uri: URI; + readonly edit?: CellMetadataEdit | NotebookDocumentMetadataEdit; + readonly notebookMetadata?: Record; + readonly metadata?: theia.WorkspaceEditEntryMetadata; +} + +export interface CellEdit { + readonly _type: FileEditType.CellReplace; + readonly metadata?: theia.WorkspaceEditEntryMetadata; + readonly uri: URI; + readonly index: number; + readonly count: number; + readonly cells: theia.NotebookCellData[]; +} + +type WorkspaceEditEntry = FileOperation | FileTextEdit | FileSnippetTextEdit | FileCellEdit | CellEdit | undefined; @es5ClassCompat export class WorkspaceEdit implements theia.WorkspaceEdit { @@ -1749,8 +1814,12 @@ export class WorkspaceEdit implements theia.WorkspaceEdit { set(uri: URI, edits: ReadonlyArray): void; set(uri: URI, edits: ReadonlyArray<[TextEdit | SnippetTextEdit, theia.WorkspaceEditEntryMetadata]>): void; + set(uri: URI, edits: ReadonlyArray): void; + set(uri: URI, edits: ReadonlyArray<[NotebookEdit, theia.WorkspaceEditEntryMetadata]>): void; - set(uri: URI, edits: ReadonlyArray): void { + set(uri: URI, edits: ReadonlyArray): void { if (!edits) { // remove all text edits for `uri` for (let i = 0; i < this._edits.length; i++) { @@ -1769,7 +1838,7 @@ export class WorkspaceEdit implements theia.WorkspaceEdit { continue; } - let edit: TextEdit | SnippetTextEdit; + let edit: TextEdit | SnippetTextEdit | NotebookEdit; let metadata: theia.WorkspaceEditEntryMetadata | undefined; if (Array.isArray(editOrTuple)) { edit = editOrTuple[0]; @@ -1778,7 +1847,27 @@ export class WorkspaceEdit implements theia.WorkspaceEdit { edit = editOrTuple; } - if (SnippetTextEdit.isSnippetTextEdit(edit)) { + if (NotebookEdit.isNotebookCellEdit(edit)) { + if (edit.newCellMetadata) { + this._edits.push({ + _type: FileEditType.Cell, metadata, uri, + edit: { editType: CellEditType.Metadata, index: edit.range.start, metadata: edit.newCellMetadata } + }); + } else if (edit.newNotebookMetadata) { + this._edits.push({ + _type: FileEditType.Cell, metadata, uri, + edit: { editType: CellEditType.DocumentMetadata, metadata: edit.newNotebookMetadata }, notebookMetadata: edit.newNotebookMetadata + }); + } else { + const start = edit.range.start; + const end = edit.range.end; + + if (start !== end || edit.newCells.length > 0) { + this._edits.push({ _type: FileEditType.CellReplace, uri, index: start, count: end - start, cells: edit.newCells, metadata }); + } + } + + } else if (SnippetTextEdit.isSnippetTextEdit(edit)) { this._edits.push({ _type: FileEditType.Snippet, uri, range: edit.range, edit, metadata }); } else { this._edits.push({ _type: FileEditType.Text, uri, edit }); @@ -1817,19 +1906,23 @@ export class WorkspaceEdit implements theia.WorkspaceEdit { return result; } - _allEntries(): ([URI, Array, theia.WorkspaceEditEntryMetadata] | [URI, URI, FileOperationOptions, WorkspaceEditMetadata])[] { - const res: ([URI, Array, theia.WorkspaceEditEntryMetadata] | [URI, URI, FileOperationOptions, WorkspaceEditMetadata])[] = []; - for (const edit of this._edits) { - if (!edit) { - continue; - } - if (edit._type === FileEditType.File) { - res.push([edit.from!, edit.to!, edit.options!, edit.metadata!]); - } else { - res.push([edit.uri, [edit.edit], edit.metadata!]); - } - } - return res; + // _allEntries(): ([URI, Array, theia.WorkspaceEditEntryMetadata] | [URI, URI, FileOperationOptions, WorkspaceEditMetadata])[] { + // const res: ([URI, Array, theia.WorkspaceEditEntryMetadata] | [URI, URI, FileOperationOptions, WorkspaceEditMetadata])[] = []; + // for (const edit of this._edits) { + // if (!edit) { + // continue; + // } + // if (edit._type === FileEditType.File) { + // res.push([edit.from!, edit.to!, edit.options!, edit.metadata!]); + // } else { + // res.push([edit.uri, [edit.edit], edit.metadata!]); + // } + // } + // return res; + // } + + _allEntries(): ReadonlyArray { + return this._edits; } get size(): number { diff --git a/packages/plugin-ext/tsconfig.json b/packages/plugin-ext/tsconfig.json index 91c36231e1784..86db68c9500f8 100644 --- a/packages/plugin-ext/tsconfig.json +++ b/packages/plugin-ext/tsconfig.json @@ -53,6 +53,9 @@ { "path": "../navigator" }, + { + "path": "../notebook" + }, { "path": "../output" }, diff --git a/packages/plugin/src/theia.d.ts b/packages/plugin/src/theia.d.ts index 6bb9ec8aa30ee..59c8d7374cdc4 100644 --- a/packages/plugin/src/theia.d.ts +++ b/packages/plugin/src/theia.d.ts @@ -30,6 +30,9 @@ import './theia.proposed.dropMetadata'; import './theia.proposed.editSessionIdentityProvider'; import './theia.proposed.extensionsAny'; import './theia.proposed.externalUriOpener'; +import './theia.proposed.notebookCellExecutionState'; +import './theia.proposed.notebookKernelSource'; +import './theia.proposed.notebookMessaging'; import './theia.proposed.findTextInFiles'; import './theia.proposed.fsChunks'; import './theia.proposed.profileContentHandlers'; @@ -4947,14 +4950,12 @@ export module '@theia/plugin' { /** * The currently visible {@link NotebookEditor notebook editors} or an empty array. - * @stubbed */ export const visibleNotebookEditors: readonly NotebookEditor[]; /** * An {@link Event} which fires when the {@link window.visibleNotebookEditors visible notebook editors} * has changed. - * @stubbed */ export const onDidChangeVisibleNotebookEditors: Event; @@ -4962,7 +4963,6 @@ export module '@theia/plugin' { * The currently active {@link NotebookEditor notebook editor} or `undefined`. The active editor is the one * that currently has focus or, when none has focus, the one that has changed * input most recently. - * @stubbed */ export const activeNotebookEditor: NotebookEditor | undefined; @@ -4970,21 +4970,18 @@ export module '@theia/plugin' { * An {@link Event} which fires when the {@link window.activeNotebookEditor active notebook editor} * has changed. *Note* that the event also fires when the active editor changes * to `undefined`. - * @stubbed */ export const onDidChangeActiveNotebookEditor: Event; /** * An {@link Event} which fires when the {@link NotebookEditor.selections notebook editor selections} * have changed. - * @stubbed */ export const onDidChangeNotebookEditorSelection: Event; /** * An {@link Event} which fires when the {@link NotebookEditor.visibleRanges notebook editor visible ranges} * have changed. - * @stubbed */ export const onDidChangeNotebookEditorVisibleRanges: Event; @@ -4995,7 +4992,6 @@ export module '@theia/plugin' { * @param options {@link NotebookDocumentShowOptions Editor options} to configure the behavior of showing the {@link NotebookEditor notebook editor}. * * @return A promise that resolves to an {@link NotebookEditor notebook editor}. - * @stubbed */ export function showNotebookDocument(document: NotebookDocument, options?: NotebookDocumentShowOptions): Thenable; @@ -7158,7 +7154,6 @@ export module '@theia/plugin' { * All notebook documents currently known to the editor. * * @readonly - * @stubbed */ export let notebookDocuments: readonly NotebookDocument[]; @@ -7175,7 +7170,6 @@ export module '@theia/plugin' { /** * An event that is emitted when a {@link NotebookDocument notebook} is opened. - * @stubbed */ export const onDidOpenNotebookDocument: Event; @@ -7185,13 +7179,11 @@ export module '@theia/plugin' { * Note 1: There is no guarantee that this event fires when an editor tab is closed. * * Note 2: A notebook can be open but not shown in an editor which means this event can fire for a notebook that has not been shown in an editor. - * @stubbed */ export const onDidCloseNotebookDocument: Event; /** * An event that is emitted when a {@link NotebookDocument notebook} is saved. - * @stubbed */ export const onDidSaveNotebookDocument: Event; @@ -7203,7 +7195,6 @@ export module '@theia/plugin' { * @param serializer a notebook serializer. * @param options Optional context options that define what parts of a notebook should be persisted * @return A {@link Disposable disposable} that unregisters this serializer when being disposed. - * @stubbed */ export function registerNotebookSerializer(notebookType: string, serializer: NotebookSerializer, options?: NotebookDocumentContentOptions): Disposable; @@ -7257,7 +7248,6 @@ export module '@theia/plugin' { /** * An event that is emitted when a {@link Notebook notebook} has changed. - * @stubbed */ export const onDidChangeNotebookDocument: Event; @@ -7396,7 +7386,6 @@ export module '@theia/plugin' { * * @param uri The resource to open. * @return A promise that resolves to a {@link NotebookDocument notebook}. - * @stubbed */ export function openNotebookDocument(uri: Uri): Thenable | undefined; @@ -7406,7 +7395,6 @@ export module '@theia/plugin' { * @param notebookType The notebook type that should be used. * @param content The initial contents of the notebook. * @return A promise that resolves to a {@link NotebookDocument notebook}. - * @stubbed */ export function openNotebookDocument(notebookType: string, content?: NotebookData): Thenable | undefined; @@ -10130,6 +10118,30 @@ export module '@theia/plugin' { */ set(uri: Uri, edits: ReadonlyArray<[TextEdit | SnippetTextEdit, WorkspaceEditEntryMetadata]>): void; + /** + * Set (and replace) text edits or snippet edits with metadata for a resource. + * + * @param uri A resource identifier. + * @param edits An array of edits. + */ + set(uri: Uri, edits: ReadonlyArray<[TextEdit | SnippetTextEdit, WorkspaceEditEntryMetadata]>): void; + + /** + * Set (and replace) notebook edits for a resource. + * + * @param uri A resource identifier. + * @param edits An array of edits. + */ + set(uri: Uri, edits: readonly NotebookEdit[]): void; + + /** + * Set (and replace) notebook edits with metadata for a resource. + * + * @param uri A resource identifier. + * @param edits An array of edits. + */ + set(uri: Uri, edits: ReadonlyArray<[NotebookEdit, WorkspaceEditEntryMetadata]>): void; + /** * Get the text edits for a resource. * @@ -14517,13 +14529,11 @@ export module '@theia/plugin' { /** * The {@link NotebookDocument notebook document} associated with this notebook editor. - * @stubbed */ readonly notebook: NotebookDocument; /** * The primary selection in this notebook editor. - * @stubbed */ selection: NotebookRange; @@ -14531,19 +14541,16 @@ export module '@theia/plugin' { * All selections in this notebook editor. * * The primary selection (or focused range) is `selections[0]`. When the document has no cells, the primary selection is empty `{ start: 0, end: 0 }`; - * @stubbed */ selections: readonly NotebookRange[]; /** * The current visible ranges in the editor (vertically). - * @stubbed */ readonly visibleRanges: readonly NotebookRange[]; /** * The column in which this editor shows. - * @stubbed */ readonly viewColumn?: ViewColumn; @@ -14563,7 +14570,6 @@ export module '@theia/plugin' { export interface NotebookRendererMessaging { /** * An event that fires when a message is received from a renderer. - * @stubbed */ readonly onDidReceiveMessage: Event<{ readonly editor: NotebookEditor; @@ -14578,7 +14584,6 @@ export module '@theia/plugin' { * message is sent to all renderers. * @returns a boolean indicating whether the message was successfully * delivered to any renderer. - * @stubbed */ postMessage(message: any, editor?: NotebookEditor): Thenable; } @@ -14612,7 +14617,6 @@ export module '@theia/plugin' { * The index of this cell in its {@link NotebookDocument.cellAt containing notebook}. The * index is updated when a cell is moved within its notebook. The index is `-1` * when the cell has been removed from its notebook. - * @stubbed */ readonly index: number; @@ -14623,31 +14627,26 @@ export module '@theia/plugin' { /** * The kind of this cell. - * @stubbed */ readonly kind: NotebookCellKind; /** * The {@link TextDocument text} of this cell, represented as text document. - * @stubbed */ readonly document: TextDocument; /** * The metadata of this cell. Can be anything but must be JSON-stringifyable. - * @stubbed */ readonly metadata: { readonly [key: string]: any }; /** * The outputs of this cell. - * @stubbed */ readonly outputs: readonly NotebookCellOutput[]; /** * The most recent {@link NotebookCellExecutionSummary execution summary} for this cell. - * @stubbed */ readonly executionSummary: NotebookCellExecutionSummary | undefined; } @@ -14663,7 +14662,6 @@ export module '@theia/plugin' { * * *Note* that most notebooks use the `file`-scheme, which means they are files on disk. However, **not** all notebooks are * saved on disk and therefore the `scheme` must be checked before trying to access the underlying file or siblings on disk. - * @stubbed * * @see {@link FileSystemProvider} */ @@ -14671,7 +14669,6 @@ export module '@theia/plugin' { /** * The type of notebook. - * @stubbed */ readonly notebookType: string; @@ -14699,13 +14696,11 @@ export module '@theia/plugin' { /** * Arbitrary metadata for this notebook. Can be anything but must be JSON-stringifyable. - * @stubbed */ readonly metadata: { [key: string]: any }; /** * The number of cells in the notebook. - * @stubbed */ readonly cellCount: number; @@ -14714,7 +14709,6 @@ export module '@theia/plugin' { * * @param index - The index of the cell to retrieve. * @return A {@link NotebookCell cell}. - * @stubbed */ cellAt(index: number): NotebookCell; @@ -14724,7 +14718,6 @@ export module '@theia/plugin' { * * @param range A notebook range. * @returns The cells contained by the range or all cells. - * @stubbed */ getCells(range?: NotebookRange): NotebookCell[]; @@ -14733,7 +14726,6 @@ export module '@theia/plugin' { * * @return A promise that will resolve to true when the document * has been saved. Will return false if the file was not dirty or when save failed. - * @stubbed */ save(): Thenable; } @@ -14747,7 +14739,6 @@ export module '@theia/plugin' { /** * The affected cell. - * @stubbed */ readonly cell: NotebookCell; @@ -14756,25 +14747,21 @@ export module '@theia/plugin' { * * *Note* that you should use the {@link workspace.onDidChangeTextDocument onDidChangeTextDocument}-event * for detailed change information, like what edits have been performed. - * @stubbed */ readonly document: TextDocument | undefined; /** * The new metadata of the cell or `undefined` when it did not change. - * @stubbed */ readonly metadata: { [key: string]: any } | undefined; /** * The new outputs of the cell or `undefined` when they did not change. - * @stubbed */ readonly outputs: readonly NotebookCellOutput[] | undefined; /** * The new execution summary of the cell or `undefined` when it did not change. - * @stubbed */ readonly executionSummary: NotebookCellExecutionSummary | undefined; } @@ -14791,19 +14778,16 @@ export module '@theia/plugin' { * * Note that no cells have been {@link NotebookDocumentContentChange.removedCells removed} * when this range is {@link NotebookRange.isEmpty empty}. - * @stubbed */ readonly range: NotebookRange; /** * Cells that have been added to the document. - * @stubbed */ readonly addedCells: readonly NotebookCell[]; /** * Cells that have been removed from the document. - * @stubbed */ readonly removedCells: readonly NotebookCell[]; } @@ -14815,25 +14799,21 @@ export module '@theia/plugin' { /** * The affected notebook. - * @stubbed */ readonly notebook: NotebookDocument; /** * The new metadata of the notebook or `undefined` when it did not change. - * @stubbed */ readonly metadata: { [key: string]: any } | undefined; /** * An array of content changes describing added or removed {@link NotebookCell cells}. - * @stubbed */ readonly contentChanges: readonly NotebookDocumentContentChange[]; /** * An array of {@link NotebookDocumentCellChange cell changes}. - * @stubbed */ readonly cellChanges: readonly NotebookDocumentCellChange[]; } @@ -14848,7 +14828,6 @@ export module '@theia/plugin' { export interface NotebookDocumentWillSaveEvent { /** * A cancellation token. - * @stubbed */ readonly token: CancellationToken; @@ -14905,19 +14884,16 @@ export module '@theia/plugin' { /** * The order in which the execution happened. - * @stubbed */ readonly executionOrder?: number; /** * If the execution finished successfully. - * @stubbed */ readonly success?: boolean; /** * The times at which execution started and ended, as unix timestamps - * @stubbed */ readonly timing?: { readonly startTime: number; readonly endTime: number }; } @@ -14930,19 +14906,16 @@ export module '@theia/plugin' { /** * The zero-based start index of this range. - * @stubbed */ readonly start: number; /** * The exclusive end index of this range (zero-based). - * @stubbed */ readonly end: number; /** * `true` if `start` and `end` are equal. - * @stubbed */ readonly isEmpty: boolean; @@ -14952,7 +14925,6 @@ export module '@theia/plugin' { * * @param start start index * @param end end index. - * @stubbed */ constructor(start: number, end: number); @@ -14962,7 +14934,6 @@ export module '@theia/plugin' { * @param change An object that describes a change to this range. * @return A range that reflects the given change. Will return `this` range if the change * is not changing anything. - * @stubbed */ with(change: { start?: number; end?: number }): NotebookRange; } @@ -15066,13 +15037,11 @@ export module '@theia/plugin' { * vscode.NotebookCellOutputItem.text('Hey', 'text/plain'), // INVALID: repeated type, editor will pick just one * ]) * ``` - * @stubbed */ items: NotebookCellOutputItem[]; /** * Arbitrary metadata for this cell output. Can be anything but must be JSON-stringifyable. - * @stubbed */ metadata?: { [key: string]: any }; @@ -15081,7 +15050,6 @@ export module '@theia/plugin' { * * @param items Notebook output items. * @param metadata Optional metadata. - * @stubbed */ constructor(items: NotebookCellOutputItem[], metadata?: { [key: string]: any }); } @@ -15093,26 +15061,22 @@ export module '@theia/plugin' { /** * The {@link NotebookCellKind kind} of this cell data. - * @stubbed */ kind: NotebookCellKind; /** * The source value of this cell data - either source code or formatted text. - * @stubbed */ value: string; /** * The language identifier of the source value of this cell data. Any value from * {@linkcode languages.getLanguages getLanguages} is possible. - * @stubbed */ languageId: string; /** * The outputs of this cell data. - * @stubbed */ outputs?: NotebookCellOutput[]; @@ -15123,7 +15087,6 @@ export module '@theia/plugin' { /** * The execution summary of this cell data. - * @stubbed */ executionSummary?: NotebookCellExecutionSummary; @@ -15134,7 +15097,6 @@ export module '@theia/plugin' { * @param kind The kind. * @param value The source value. * @param languageId The language identifier of the source value. - * @stubbed */ constructor(kind: NotebookCellKind, value: string, languageId: string); } @@ -15150,13 +15112,11 @@ export module '@theia/plugin' { export class NotebookData { /** * The cell data of this notebook data. - * @stubbed */ cells: NotebookCellData[]; /** * Arbitrary metadata of notebook data. - * @stubbed */ metadata?: { [key: string]: any }; @@ -15164,7 +15124,6 @@ export module '@theia/plugin' { * Create new notebook data. * * @param cells An array of cell data. - * @stubbed */ constructor(cells: NotebookCellData[]); } @@ -15185,7 +15144,6 @@ export module '@theia/plugin' { * @param content Contents of a notebook file. * @param token A cancellation token. * @return Notebook data or a thenable that resolves to such. - * @stubbed */ deserializeNotebook(content: Uint8Array, token: CancellationToken): NotebookData | Thenable; @@ -15195,7 +15153,6 @@ export module '@theia/plugin' { * @param data A notebook data structure. * @param token A cancellation token. * @returns An array of bytes or a thenable that resolves to such. - * @stubbed */ serializeNotebook(data: NotebookData, token: CancellationToken): Uint8Array | Thenable; } @@ -15211,7 +15168,6 @@ export module '@theia/plugin' { * Controls if output change events will trigger notebook document content change events and * if it will be used in the diff editor, defaults to false. If the content provider doesn't * persist the outputs in the file document, this should be set to true. - * @stubbed */ transientOutputs?: boolean; @@ -15220,7 +15176,6 @@ export module '@theia/plugin' { * change events and if it will be used in the diff editor, defaults to false. If the * content provider doesn't persist a metadata property in the file document, it should be * set to true. - * @stubbed */ transientCellMetadata?: { [key: string]: boolean | undefined }; @@ -15229,7 +15184,6 @@ export module '@theia/plugin' { * content change event and if it will be used in the diff editor, defaults to false. If the * content provider doesn't persist a metadata property in the file document, it should be * set to true. - * @stubbed */ transientDocumentMetadata?: { [key: string]: boolean | undefined }; } @@ -15244,13 +15198,11 @@ export module '@theia/plugin' { * will be created as needed up to the maximum of {@linkcode ViewColumn.Nine}. * Use {@linkcode ViewColumn.Beside} to open the editor to the side of the currently * active one. - * @stubbed */ readonly viewColumn?: ViewColumn; /** * An optional flag that when `true` will stop the {@link NotebookEditor notebook editor} from taking focus. - * @stubbed */ readonly preserveFocus?: boolean; @@ -15258,13 +15210,11 @@ export module '@theia/plugin' { * An optional flag that controls if an {@link NotebookEditor notebook editor}-tab shows as preview. Preview tabs will * be replaced and reused until set to stay - either explicitly or through editing. The default behaviour depends * on the `workbench.editor.enablePreview`-setting. - * @stubbed */ readonly preview?: boolean; /** * An optional selection to apply for the document in the {@link NotebookEditor notebook editor}. - * @stubbed */ readonly selections?: readonly NotebookRange[]; } @@ -15327,7 +15277,6 @@ export module '@theia/plugin' { * * @param range The range of cells to replace * @param newCells The new notebook cells. - * @stubbed */ static replaceCells(range: NotebookRange, newCells: NotebookCellData[]): NotebookEdit; @@ -15336,7 +15285,6 @@ export module '@theia/plugin' { * * @param index The index to insert cells at. * @param newCells The new notebook cells. - * @stubbed */ static insertCells(index: number, newCells: NotebookCellData[]): NotebookEdit; @@ -15344,7 +15292,6 @@ export module '@theia/plugin' { * Utility to create an edit that deletes cells in a notebook. * * @param range The range of cells to delete. - * @stubbed */ static deleteCells(range: NotebookRange): NotebookEdit; @@ -15353,7 +15300,6 @@ export module '@theia/plugin' { * * @param index The index of the cell to update. * @param newCellMetadata The new metadata for the cell. - * @stubbed */ static updateCellMetadata(index: number, newCellMetadata: { [key: string]: any }): NotebookEdit; @@ -15361,31 +15307,26 @@ export module '@theia/plugin' { * Utility to create an edit that updates the notebook's metadata. * * @param newNotebookMetadata The new metadata for the notebook. - * @stubbed */ static updateNotebookMetadata(newNotebookMetadata: { [key: string]: any }): NotebookEdit; /** * Range of the cells being edited. May be empty. - * @stubbed */ range: NotebookRange; /** * New cells being inserted. May be empty. - * @stubbed */ newCells: NotebookCellData[]; /** * Optional new metadata for the cells. - * @stubbed */ newCellMetadata?: { [key: string]: any }; /** * Optional new metadata for the notebook. - * @stubbed */ newNotebookMetadata?: { [key: string]: any }; @@ -15398,13 +15339,11 @@ export module '@theia/plugin' { export interface NotebookEditorSelectionChangeEvent { /** * The {@link NotebookEditor notebook editor} for which the selections have changed. - * @stubbed */ readonly notebookEditor: NotebookEditor; /** * The new value for the {@link NotebookEditor.selections notebook editor's selections}. - * @stubbed */ readonly selections: readonly NotebookRange[]; } @@ -15415,13 +15354,11 @@ export module '@theia/plugin' { export interface NotebookEditorVisibleRangesChangeEvent { /** * The {@link NotebookEditor notebook editor} for which the visible ranges have changed. - * @stubbed */ readonly notebookEditor: NotebookEditor; /** * The new value for the {@link NotebookEditor.visibleRanges notebook editor's visibleRanges}. - * @stubbed */ readonly visibleRanges: readonly NotebookRange[]; } @@ -15462,13 +15399,11 @@ export module '@theia/plugin' { * * _Note_ that controllers are remembered by their identifier and that extensions should use * stable identifiers across sessions. - * @stubbed */ readonly id: string; /** * The notebook type this controller is for. - * @stubbed */ readonly notebookType: string; @@ -15486,32 +15421,27 @@ export module '@theia/plugin' { * myController.supportedLanguages = undefined; // falsy * myController.supportedLanguages = []; // falsy * ``` - * @stubbed */ supportedLanguages?: string[]; /** * The human-readable label of this notebook controller. - * @stubbed */ label: string; /** * The human-readable description which is rendered less prominent. - * @stubbed */ description?: string; /** * The human-readable detail which is rendered less prominent. - * @stubbed */ detail?: string; /** * Whether this controller supports execution order so that the * editor can render placeholders for them. - * @stubbed */ supportsExecutionOrder?: boolean; @@ -15527,14 +15457,12 @@ export module '@theia/plugin' { * * @param cell The notebook cell for which to create the execution. * @returns A notebook cell execution. - * @stubbed */ createNotebookCellExecution(cell: NotebookCell): NotebookCellExecution; /** * The execute handler is invoked when the run gestures in the UI are selected, e.g Run Cell, Run All, * Run Selection etc. The execute handler is responsible for creating and managing {@link NotebookCellExecution execution}-objects. - * @stubbed */ executeHandler: (cells: NotebookCell[], notebook: NotebookDocument, controller: NotebookController) => void | Thenable; @@ -15549,7 +15477,6 @@ export module '@theia/plugin' { * * _Note_ that supporting {@link NotebookCellExecution.token cancellation tokens} is preferred and that interrupt handlers should * only be used when tokens cannot be supported. - * @stubbed */ interruptHandler?: (notebook: NotebookDocument) => void | Thenable; @@ -15562,7 +15489,6 @@ export module '@theia/plugin' { * * _Note_ that controller selection is persisted (by the controllers {@link NotebookController.id id}) and restored as soon as a * controller is re-created or as a notebook is {@link workspace.onDidOpenNotebookDocument opened}. - * @stubbed */ readonly onDidChangeSelectedNotebooks: Event<{ readonly notebook: NotebookDocument; readonly selected: boolean }>; @@ -15572,13 +15498,11 @@ export module '@theia/plugin' { * * @param notebook The notebook for which a priority is set. * @param affinity A controller affinity - * @stubbed */ updateNotebookAffinity(notebook: NotebookDocument, affinity: NotebookControllerAffinity): void; /** * Dispose and free associated resources. - * @stubbed */ dispose(): void; } @@ -15595,7 +15519,6 @@ export module '@theia/plugin' { /** * The {@link NotebookCell cell} for which this execution has been created. - * @stubbed */ readonly cell: NotebookCell; @@ -15605,13 +15528,11 @@ export module '@theia/plugin' { * * _Note_ that the cancellation token will not be triggered when the {@link NotebookController controller} * that created this execution uses an {@link NotebookController.interruptHandler interrupt-handler}. - * @stubbed */ readonly token: CancellationToken; /** * Set and unset the order of this cell execution. - * @stubbed */ executionOrder: number | undefined; @@ -15620,7 +15541,6 @@ export module '@theia/plugin' { * * @param startTime The time that execution began, in milliseconds in the Unix epoch. Used to drive the clock * that shows for how long a cell has been running. If not given, the clock won't be shown. - * @stubbed */ start(startTime?: number): void; @@ -15631,7 +15551,6 @@ export module '@theia/plugin' { * If false, a red X is shown. * If undefined, no check or X icon is shown. * @param endTime The time that execution finished, in milliseconds in the Unix epoch. - * @stubbed */ end(success: boolean | undefined, endTime?: number): void; @@ -15641,7 +15560,6 @@ export module '@theia/plugin' { * @param cell Cell for which output is cleared. Defaults to the {@link NotebookCellExecution.cell cell} of * this execution. * @return A thenable that resolves when the operation finished. - * @stubbed */ clearOutput(cell?: NotebookCell): Thenable; @@ -15652,7 +15570,6 @@ export module '@theia/plugin' { * @param cell Cell for which output is cleared. Defaults to the {@link NotebookCellExecution.cell cell} of * this execution. * @return A thenable that resolves when the operation finished. - * @stubbed */ replaceOutput(out: NotebookCellOutput | readonly NotebookCellOutput[], cell?: NotebookCell): Thenable; @@ -15663,7 +15580,6 @@ export module '@theia/plugin' { * @param cell Cell for which output is cleared. Defaults to the {@link NotebookCellExecution.cell cell} of * this execution. * @return A thenable that resolves when the operation finished. - * @stubbed */ appendOutput(out: NotebookCellOutput | readonly NotebookCellOutput[], cell?: NotebookCell): Thenable; @@ -15673,7 +15589,6 @@ export module '@theia/plugin' { * @param items Output items that replace the items of existing output. * @param output Output object that already exists. * @return A thenable that resolves when the operation finished. - * @stubbed */ replaceOutputItems(items: NotebookCellOutputItem | readonly NotebookCellOutputItem[], output: NotebookCellOutput): Thenable; @@ -15683,7 +15598,6 @@ export module '@theia/plugin' { * @param items Output items that are append to existing output. * @param output Output object that already exists. * @return A thenable that resolves when the operation finished. - * @stubbed */ appendOutputItems(items: NotebookCellOutputItem | readonly NotebookCellOutputItem[], output: NotebookCellOutput): Thenable; } @@ -15710,7 +15624,6 @@ export module '@theia/plugin' { export class NotebookCellStatusBarItem { /** * The text to show for the item. - * @stubbed */ text: string; @@ -15727,25 +15640,21 @@ export module '@theia/plugin' { * * Note that if this is a {@linkcode Command} object, only the {@linkcode Command.command command} and {@linkcode Command.arguments arguments} * are used by the editor. - * @stubbed */ command?: string | Command; /** * A tooltip to show when the item is hovered. - * @stubbed */ tooltip?: string; /** * The priority of the item. A higher value item will be shown more to the left. - * @stubbed */ priority?: number; /** * Accessibility information used when a screen reader interacts with this item. - * @stubbed */ accessibilityInformation?: AccessibilityInformation; @@ -15753,7 +15662,6 @@ export module '@theia/plugin' { * Creates a new NotebookCellStatusBarItem. * @param text The text to show for the item. * @param alignment Whether the item is aligned to the left or right. - * @stubbed */ constructor(text: string, alignment: NotebookCellStatusBarAlignment); } @@ -15764,7 +15672,6 @@ export module '@theia/plugin' { export interface NotebookCellStatusBarItemProvider { /** * An optional event to signal that statusbar items have changed. The provide method will be called again. - * @stubbed */ onDidChangeCellStatusBarItems?: Event; @@ -15773,7 +15680,6 @@ export module '@theia/plugin' { * @param cell The cell for which to return items. * @param token A token triggered if this request should be cancelled. * @return One or more {@link NotebookCellStatusBarItem cell statusbar items} - * @stubbed */ provideCellStatusBarItems(cell: NotebookCell, token: CancellationToken): ProviderResult; } @@ -15795,7 +15701,6 @@ export module '@theia/plugin' { * @param label The label of the controller. * @param handler The execute-handler of the controller. * @returns a new instance of {@link NotebookController} - * @stubbed */ export function createNotebookController( id: string, @@ -15811,7 +15716,6 @@ export module '@theia/plugin' { * - Note 2: A renderer only has access to messaging if requiresMessaging is set to always or optional in its notebookRenderer contribution. * @param rendererId The renderer ID to communicate with * @returns A new notebook renderer messaging object. - * @stubbed */ export function createRendererMessaging(rendererId: string): NotebookRendererMessaging; @@ -15820,630 +15724,629 @@ export module '@theia/plugin' { * @param notebookType The notebook type to register for. * @param provider A cell status bar provider. * @returns A Disposable that unregisters this provider when being disposed. - * @stubbed */ export function registerNotebookCellStatusBarItemProvider(notebookType: string, provider: NotebookCellStatusBarItemProvider): Disposable; } -} -/** - * Namespace for testing functionality. Tests are published by registering - * {@link TestController} instances, then adding {@link TestItem TestItems}. - * Controllers may also describe how to run tests by creating one or more - * {@link TestRunProfile} instances. - */ -export namespace tests { /** - * Creates a new test controller. - * - * @param id Identifier for the controller, must be globally unique. - * @param label A human-readable label for the controller. - * @returns An instance of the {@link TestController}. - * @stubbed + * Namespace for testing functionality. Tests are published by registering + * {@link TestController} instances, then adding {@link TestItem TestItems}. + * Controllers may also describe how to run tests by creating one or more + * {@link TestRunProfile} instances. */ - export function createTestController(id: string, label: string): TestController; -} - -/** - * The kind of executions that {@link TestRunProfile TestRunProfiles} control. - */ -export enum TestRunProfileKind { - Run = 1, - Debug = 2, - Coverage = 3, -} + export namespace tests { + /** + * Creates a new test controller. + * + * @param id Identifier for the controller, must be globally unique. + * @param label A human-readable label for the controller. + * @returns An instance of the {@link TestController}. + * @stubbed + */ + export function createTestController(id: string, label: string): TestController; + } -/** - * Tags can be associated with {@link TestItem TestItems} and - * {@link TestRunProfile TestRunProfiles}. A profile with a tag can only - * execute tests that include that tag in their {@link TestItem.tags} array. - */ -export class TestTag { /** - * ID of the test tag. `TestTag` instances with the same ID are considered - * to be identical. + * The kind of executions that {@link TestRunProfile TestRunProfiles} control. */ - readonly id: string; + export enum TestRunProfileKind { + Run = 1, + Debug = 2, + Coverage = 3, + } /** - * Creates a new TestTag instance. - * @param id ID of the test tag. + * Tags can be associated with {@link TestItem TestItems} and + * {@link TestRunProfile TestRunProfiles}. A profile with a tag can only + * execute tests that include that tag in their {@link TestItem.tags} array. */ - constructor(id: string); -} + export class TestTag { + /** + * ID of the test tag. `TestTag` instances with the same ID are considered + * to be identical. + */ + readonly id: string; -/** - * A TestRunProfile describes one way to execute tests in a {@link TestController}. - */ -export interface TestRunProfile { - /** - * Label shown to the user in the UI. - * - * Note that the label has some significance if the user requests that - * tests be re-run in a certain way. For example, if tests were run - * normally and the user requests to re-run them in debug mode, the editor - * will attempt use a configuration with the same label of the `Debug` - * kind. If there is no such configuration, the default will be used. - * @stubbed - */ - label: string; + /** + * Creates a new TestTag instance. + * @param id ID of the test tag. + */ + constructor(id: string); + } /** - * Configures what kind of execution this profile controls. If there - * are no profiles for a kind, it will not be available in the UI. - * @stubbed + * A TestRunProfile describes one way to execute tests in a {@link TestController}. */ - readonly kind: TestRunProfileKind; + export interface TestRunProfile { + /** + * Label shown to the user in the UI. + * + * Note that the label has some significance if the user requests that + * tests be re-run in a certain way. For example, if tests were run + * normally and the user requests to re-run them in debug mode, the editor + * will attempt use a configuration with the same label of the `Debug` + * kind. If there is no such configuration, the default will be used. + * @stubbed + */ + label: string; - /** - * Controls whether this profile is the default action that will - * be taken when its kind is actioned. For example, if the user clicks - * the generic "run all" button, then the default profile for - * {@link TestRunProfileKind.Run} will be executed, although the - * user can configure this. - * @stubbed - */ - isDefault: boolean; + /** + * Configures what kind of execution this profile controls. If there + * are no profiles for a kind, it will not be available in the UI. + * @stubbed + */ + readonly kind: TestRunProfileKind; - /** - * Whether this profile supports continuous running of requests. If so, - * then {@link TestRunRequest.continuous} may be set to `true`. Defaults - * to false. - * @stubbed - */ - supportsContinuousRun: boolean; + /** + * Controls whether this profile is the default action that will + * be taken when its kind is actioned. For example, if the user clicks + * the generic "run all" button, then the default profile for + * {@link TestRunProfileKind.Run} will be executed, although the + * user can configure this. + * @stubbed + */ + isDefault: boolean; - /** - * Associated tag for the profile. If this is set, only {@link TestItem} - * instances with the same tag will be eligible to execute in this profile. - * @stubbed - */ - tag: TestTag | undefined; + /** + * Whether this profile supports continuous running of requests. If so, + * then {@link TestRunRequest.continuous} may be set to `true`. Defaults + * to false. + * @stubbed + */ + supportsContinuousRun: boolean; - /** - * If this method is present, a configuration gear will be present in the - * UI, and this method will be invoked when it's clicked. When called, - * you can take other editor actions, such as showing a quick pick or - * opening a configuration file. - * @stubbed - */ - configureHandler: (() => void) | undefined; + /** + * Associated tag for the profile. If this is set, only {@link TestItem} + * instances with the same tag will be eligible to execute in this profile. + * @stubbed + */ + tag: TestTag | undefined; - /** - * Handler called to start a test run. When invoked, the function should call - * {@link TestController.createTestRun} at least once, and all test runs - * associated with the request should be created before the function returns - * or the returned promise is resolved. - * - * If {@link supportsContinuousRun} is set, then {@link TestRunRequest.continuous} - * may be `true`. In this case, the profile should observe changes to - * source code and create new test runs by calling {@link TestController.createTestRun}, - * until the cancellation is requested on the `token`. - * - * @param request Request information for the test run. - * @param cancellationToken Token that signals the used asked to abort the - * test run. If cancellation is requested on this token, all {@link TestRun} - * instances associated with the request will be - * automatically cancelled as well. - * @stubbed - */ - runHandler: (request: TestRunRequest, token: CancellationToken) => Thenable | void; + /** + * If this method is present, a configuration gear will be present in the + * UI, and this method will be invoked when it's clicked. When called, + * you can take other editor actions, such as showing a quick pick or + * opening a configuration file. + * @stubbed + */ + configureHandler: (() => void) | undefined; - /** - * Deletes the run profile. - * @stubbed - */ - dispose(): void; -} + /** + * Handler called to start a test run. When invoked, the function should call + * {@link TestController.createTestRun} at least once, and all test runs + * associated with the request should be created before the function returns + * or the returned promise is resolved. + * + * If {@link supportsContinuousRun} is set, then {@link TestRunRequest.continuous} + * may be `true`. In this case, the profile should observe changes to + * source code and create new test runs by calling {@link TestController.createTestRun}, + * until the cancellation is requested on the `token`. + * + * @param request Request information for the test run. + * @param cancellationToken Token that signals the used asked to abort the + * test run. If cancellation is requested on this token, all {@link TestRun} + * instances associated with the request will be + * automatically cancelled as well. + * @stubbed + */ + runHandler: (request: TestRunRequest, token: CancellationToken) => Thenable | void; -/** - * Entry point to discover and execute tests. It contains {@link TestController.items} which - * are used to populate the editor UI, and is associated with - * {@link TestController.createRunProfile run profiles} to allow - * for tests to be executed. - */ -export interface TestController { - /** - * The id of the controller passed in {@link vscode.tests.createTestController}. - * This must be globally unique. - * @stubbed - */ - readonly id: string; + /** + * Deletes the run profile. + * @stubbed + */ + dispose(): void; + } /** - * Human-readable label for the test controller. - * @stubbed + * Entry point to discover and execute tests. It contains {@link TestController.items} which + * are used to populate the editor UI, and is associated with + * {@link TestController.createRunProfile run profiles} to allow + * for tests to be executed. */ - label: string; + export interface TestController { + /** + * The id of the controller passed in {@link vscode.tests.createTestController}. + * This must be globally unique. + * @stubbed + */ + readonly id: string; - /** - * A collection of "top-level" {@link TestItem} instances, which can in - * turn have their own {@link TestItem.children children} to form the - * "test tree." - * - * The extension controls when to add tests. For example, extensions should - * add tests for a file when {@link vscode.workspace.onDidOpenTextDocument} - * fires in order for decorations for tests within a file to be visible. - * - * However, the editor may sometimes explicitly request children using the - * {@link resolveHandler} See the documentation on that method for more details. - * @stubbed - */ - readonly items: TestItemCollection; + /** + * Human-readable label for the test controller. + * @stubbed + */ + label: string; - /** - * Creates a profile used for running tests. Extensions must create - * at least one profile in order for tests to be run. - * @param label A human-readable label for this profile. - * @param kind Configures what kind of execution this profile manages. - * @param runHandler Function called to start a test run. - * @param isDefault Whether this is the default action for its kind. - * @param tag Profile test tag. - * @param supportsContinuousRun Whether the profile supports continuous running. - * @returns An instance of a {@link TestRunProfile}, which is automatically - * associated with this controller. - * @stubbed - */ - createRunProfile(label: string, kind: TestRunProfileKind, runHandler: (request: TestRunRequest, token: CancellationToken) => Thenable | void, isDefault?: boolean, tag?: TestTag, supportsContinuousRun?: boolean): TestRunProfile; + /** + * A collection of "top-level" {@link TestItem} instances, which can in + * turn have their own {@link TestItem.children children} to form the + * "test tree." + * + * The extension controls when to add tests. For example, extensions should + * add tests for a file when {@link vscode.workspace.onDidOpenTextDocument} + * fires in order for decorations for tests within a file to be visible. + * + * However, the editor may sometimes explicitly request children using the + * {@link resolveHandler} See the documentation on that method for more details. + * @stubbed + */ + readonly items: TestItemCollection; - /** - * A function provided by the extension that the editor may call to request - * children of a test item, if the {@link TestItem.canResolveChildren} is - * `true`. When called, the item should discover children and call - * {@link vscode.tests.createTestItem} as children are discovered. - * - * Generally the extension manages the lifecycle of test items, but under - * certain conditions the editor may request the children of a specific - * item to be loaded. For example, if the user requests to re-run tests - * after reloading the editor, the editor may need to call this method - * to resolve the previously-run tests. - * - * The item in the explorer will automatically be marked as "busy" until - * the function returns or the returned thenable resolves. - * - * @param item An unresolved test item for which children are being - * requested, or `undefined` to resolve the controller's initial {@link TestController.items items}. - * @stubbed - */ - resolveHandler?: (item: TestItem | undefined) => Thenable | void; + /** + * Creates a profile used for running tests. Extensions must create + * at least one profile in order for tests to be run. + * @param label A human-readable label for this profile. + * @param kind Configures what kind of execution this profile manages. + * @param runHandler Function called to start a test run. + * @param isDefault Whether this is the default action for its kind. + * @param tag Profile test tag. + * @param supportsContinuousRun Whether the profile supports continuous running. + * @returns An instance of a {@link TestRunProfile}, which is automatically + * associated with this controller. + * @stubbed + */ + createRunProfile(label: string, kind: TestRunProfileKind, runHandler: (request: TestRunRequest, token: CancellationToken) => Thenable | void, isDefault?: boolean, tag?: TestTag, supportsContinuousRun?: boolean): TestRunProfile; - /** - * If this method is present, a refresh button will be present in the - * UI, and this method will be invoked when it's clicked. When called, - * the extension should scan the workspace for any new, changed, or - * removed tests. - * - * It's recommended that extensions try to update tests in realtime, using - * a {@link FileSystemWatcher} for example, and use this method as a fallback. - * - * @returns A thenable that resolves when tests have been refreshed. - * @stubbed - */ - refreshHandler: ((token: CancellationToken) => Thenable | void) | undefined; + /** + * A function provided by the extension that the editor may call to request + * children of a test item, if the {@link TestItem.canResolveChildren} is + * `true`. When called, the item should discover children and call + * {@link vscode.tests.createTestItem} as children are discovered. + * + * Generally the extension manages the lifecycle of test items, but under + * certain conditions the editor may request the children of a specific + * item to be loaded. For example, if the user requests to re-run tests + * after reloading the editor, the editor may need to call this method + * to resolve the previously-run tests. + * + * The item in the explorer will automatically be marked as "busy" until + * the function returns or the returned thenable resolves. + * + * @param item An unresolved test item for which children are being + * requested, or `undefined` to resolve the controller's initial {@link TestController.items items}. + * @stubbed + */ + resolveHandler?: (item: TestItem | undefined) => Thenable | void; - /** - * Creates a {@link TestRun}. This should be called by the - * {@link TestRunProfile} when a request is made to execute tests, and may - * also be called if a test run is detected externally. Once created, tests - * that are included in the request will be moved into the queued state. - * - * All runs created using the same `request` instance will be grouped - * together. This is useful if, for example, a single suite of tests is - * run on multiple platforms. - * - * @param request Test run request. Only tests inside the `include` may be - * modified, and tests in its `exclude` are ignored. - * @param name The human-readable name of the run. This can be used to - * disambiguate multiple sets of results in a test run. It is useful if - * tests are run across multiple platforms, for example. - * @param persist Whether the results created by the run should be - * persisted in the editor. This may be false if the results are coming from - * a file already saved externally, such as a coverage information file. - * @returns An instance of the {@link TestRun}. It will be considered "running" - * from the moment this method is invoked until {@link TestRun.end} is called. - * @stubbed - */ - createTestRun(request: TestRunRequest, name?: string, persist?: boolean): TestRun; - - /** - * Creates a new managed {@link TestItem} instance. It can be added into - * the {@link TestItem.children} of an existing item, or into the - * {@link TestController.items}. - * - * @param id Identifier for the TestItem. The test item's ID must be unique - * in the {@link TestItemCollection} it's added to. - * @param label Human-readable label of the test item. - * @param uri URI this TestItem is associated with. May be a file or directory. - * @stubbed - */ - createTestItem(id: string, label: string, uri?: Uri): TestItem; + /** + * If this method is present, a refresh button will be present in the + * UI, and this method will be invoked when it's clicked. When called, + * the extension should scan the workspace for any new, changed, or + * removed tests. + * + * It's recommended that extensions try to update tests in realtime, using + * a {@link FileSystemWatcher} for example, and use this method as a fallback. + * + * @returns A thenable that resolves when tests have been refreshed. + * @stubbed + */ + refreshHandler: ((token: CancellationToken) => Thenable | void) | undefined; - /** - * Unregisters the test controller, disposing of its associated tests - * and unpersisted results. - * @stubbed - */ - dispose(): void; -} + /** + * Creates a {@link TestRun}. This should be called by the + * {@link TestRunProfile} when a request is made to execute tests, and may + * also be called if a test run is detected externally. Once created, tests + * that are included in the request will be moved into the queued state. + * + * All runs created using the same `request` instance will be grouped + * together. This is useful if, for example, a single suite of tests is + * run on multiple platforms. + * + * @param request Test run request. Only tests inside the `include` may be + * modified, and tests in its `exclude` are ignored. + * @param name The human-readable name of the run. This can be used to + * disambiguate multiple sets of results in a test run. It is useful if + * tests are run across multiple platforms, for example. + * @param persist Whether the results created by the run should be + * persisted in the editor. This may be false if the results are coming from + * a file already saved externally, such as a coverage information file. + * @returns An instance of the {@link TestRun}. It will be considered "running" + * from the moment this method is invoked until {@link TestRun.end} is called. + * @stubbed + */ + createTestRun(request: TestRunRequest, name?: string, persist?: boolean): TestRun; -/** - * A TestRunRequest is a precursor to a {@link TestRun}, which in turn is - * created by passing a request to {@link tests.runTests}. The TestRunRequest - * contains information about which tests should be run, which should not be - * run, and how they are run (via the {@link TestRunRequest.profile profile}). - * - * In general, TestRunRequests are created by the editor and pass to - * {@link TestRunProfile.runHandler}, however you can also create test - * requests and runs outside of the `runHandler`. - */ -export class TestRunRequest { - /** - * A filter for specific tests to run. If given, the extension should run - * all of the included tests and all their children, excluding any tests - * that appear in {@link TestRunRequest.exclude}. If this property is - * undefined, then the extension should simply run all tests. - * - * The process of running tests should resolve the children of any test - * items who have not yet been resolved. - */ - readonly include: readonly TestItem[] | undefined; + /** + * Creates a new managed {@link TestItem} instance. It can be added into + * the {@link TestItem.children} of an existing item, or into the + * {@link TestController.items}. + * + * @param id Identifier for the TestItem. The test item's ID must be unique + * in the {@link TestItemCollection} it's added to. + * @param label Human-readable label of the test item. + * @param uri URI this TestItem is associated with. May be a file or directory. + * @stubbed + */ + createTestItem(id: string, label: string, uri?: Uri): TestItem; + + /** + * Unregisters the test controller, disposing of its associated tests + * and unpersisted results. + * @stubbed + */ + dispose(): void; + } /** - * An array of tests the user has marked as excluded from the test included - * in this run; exclusions should apply after inclusions. + * A TestRunRequest is a precursor to a {@link TestRun}, which in turn is + * created by passing a request to {@link tests.runTests}. The TestRunRequest + * contains information about which tests should be run, which should not be + * run, and how they are run (via the {@link TestRunRequest.profile profile}). * - * May be omitted if no exclusions were requested. Test controllers should - * not run excluded tests or any children of excluded tests. + * In general, TestRunRequests are created by the editor and pass to + * {@link TestRunProfile.runHandler}, however you can also create test + * requests and runs outside of the `runHandler`. */ - readonly exclude: readonly TestItem[] | undefined; + export class TestRunRequest { + /** + * A filter for specific tests to run. If given, the extension should run + * all of the included tests and all their children, excluding any tests + * that appear in {@link TestRunRequest.exclude}. If this property is + * undefined, then the extension should simply run all tests. + * + * The process of running tests should resolve the children of any test + * items who have not yet been resolved. + */ + readonly include: readonly TestItem[] | undefined; - /** - * The profile used for this request. This will always be defined - * for requests issued from the editor UI, though extensions may - * programmatically create requests not associated with any profile. - */ - readonly profile: TestRunProfile | undefined; + /** + * An array of tests the user has marked as excluded from the test included + * in this run; exclusions should apply after inclusions. + * + * May be omitted if no exclusions were requested. Test controllers should + * not run excluded tests or any children of excluded tests. + */ + readonly exclude: readonly TestItem[] | undefined; - /** - * Whether the profile should run continuously as source code changes. Only - * relevant for profiles that set {@link TestRunProfile.supportsContinuousRun}. - */ - readonly continuous?: boolean; + /** + * The profile used for this request. This will always be defined + * for requests issued from the editor UI, though extensions may + * programmatically create requests not associated with any profile. + */ + readonly profile: TestRunProfile | undefined; - /** - * @param include Array of specific tests to run, or undefined to run all tests - * @param exclude An array of tests to exclude from the run. - * @param profile The run profile used for this request. - * @param continuous Whether to run tests continuously as source changes. - */ - constructor(include?: readonly TestItem[], exclude?: readonly TestItem[], profile?: TestRunProfile, continuous?: boolean); -} + /** + * Whether the profile should run continuously as source code changes. Only + * relevant for profiles that set {@link TestRunProfile.supportsContinuousRun}. + */ + readonly continuous?: boolean; -/** - * Options given to {@link TestController.runTests} - */ -export interface TestRun { - /** - * The human-readable name of the run. This can be used to - * disambiguate multiple sets of results in a test run. It is useful if - * tests are run across multiple platforms, for example. - * @stubbed - */ - readonly name: string | undefined; + /** + * @param include Array of specific tests to run, or undefined to run all tests + * @param exclude An array of tests to exclude from the run. + * @param profile The run profile used for this request. + * @param continuous Whether to run tests continuously as source changes. + */ + constructor(include?: readonly TestItem[], exclude?: readonly TestItem[], profile?: TestRunProfile, continuous?: boolean); + } /** - * A cancellation token which will be triggered when the test run is - * canceled from the UI. - * @stubbed + * Options given to {@link TestController.runTests} */ - readonly token: CancellationToken; + export interface TestRun { + /** + * The human-readable name of the run. This can be used to + * disambiguate multiple sets of results in a test run. It is useful if + * tests are run across multiple platforms, for example. + * @stubbed + */ + readonly name: string | undefined; - /** - * Whether the test run will be persisted across reloads by the editor. - * @stubbed - */ - readonly isPersisted: boolean; + /** + * A cancellation token which will be triggered when the test run is + * canceled from the UI. + * @stubbed + */ + readonly token: CancellationToken; - /** - * Indicates a test is queued for later execution. - * @param test Test item to update. - * @stubbed - */ - enqueued(test: TestItem): void; + /** + * Whether the test run will be persisted across reloads by the editor. + * @stubbed + */ + readonly isPersisted: boolean; - /** - * Indicates a test has started running. - * @param test Test item to update. - * @stubbed - */ - started(test: TestItem): void; + /** + * Indicates a test is queued for later execution. + * @param test Test item to update. + * @stubbed + */ + enqueued(test: TestItem): void; - /** - * Indicates a test has been skipped. - * @param test Test item to update. - * @stubbed - */ - skipped(test: TestItem): void; + /** + * Indicates a test has started running. + * @param test Test item to update. + * @stubbed + */ + started(test: TestItem): void; - /** - * Indicates a test has failed. You should pass one or more - * {@link TestMessage TestMessages} to describe the failure. - * @param test Test item to update. - * @param message Messages associated with the test failure. - * @param duration How long the test took to execute, in milliseconds. - * @stubbed - */ - failed(test: TestItem, message: TestMessage | readonly TestMessage[], duration?: number): void; + /** + * Indicates a test has been skipped. + * @param test Test item to update. + * @stubbed + */ + skipped(test: TestItem): void; - /** - * Indicates a test has errored. You should pass one or more - * {@link TestMessage TestMessages} to describe the failure. This differs - * from the "failed" state in that it indicates a test that couldn't be - * executed at all, from a compilation error for example. - * @param test Test item to update. - * @param message Messages associated with the test failure. - * @param duration How long the test took to execute, in milliseconds. - * @stubbed - */ - errored(test: TestItem, message: TestMessage | readonly TestMessage[], duration?: number): void; + /** + * Indicates a test has failed. You should pass one or more + * {@link TestMessage TestMessages} to describe the failure. + * @param test Test item to update. + * @param message Messages associated with the test failure. + * @param duration How long the test took to execute, in milliseconds. + * @stubbed + */ + failed(test: TestItem, message: TestMessage | readonly TestMessage[], duration?: number): void; - /** - * Indicates a test has passed. - * @param test Test item to update. - * @param duration How long the test took to execute, in milliseconds. - * @stubbed - */ - passed(test: TestItem, duration?: number): void; + /** + * Indicates a test has errored. You should pass one or more + * {@link TestMessage TestMessages} to describe the failure. This differs + * from the "failed" state in that it indicates a test that couldn't be + * executed at all, from a compilation error for example. + * @param test Test item to update. + * @param message Messages associated with the test failure. + * @param duration How long the test took to execute, in milliseconds. + * @stubbed + */ + errored(test: TestItem, message: TestMessage | readonly TestMessage[], duration?: number): void; - /** - * Appends raw output from the test runner. On the user's request, the - * output will be displayed in a terminal. ANSI escape sequences, - * such as colors and text styles, are supported. - * - * @param output Output text to append. - * @param location Indicate that the output was logged at the given - * location. - * @param test Test item to associate the output with. - * @stubbed - */ - appendOutput(output: string, location?: Location, test?: TestItem): void; + /** + * Indicates a test has passed. + * @param test Test item to update. + * @param duration How long the test took to execute, in milliseconds. + * @stubbed + */ + passed(test: TestItem, duration?: number): void; - /** - * Signals that the end of the test run. Any tests included in the run whose - * states have not been updated will have their state reset. - * @stubbed - */ - end(): void; -} + /** + * Appends raw output from the test runner. On the user's request, the + * output will be displayed in a terminal. ANSI escape sequences, + * such as colors and text styles, are supported. + * + * @param output Output text to append. + * @param location Indicate that the output was logged at the given + * location. + * @param test Test item to associate the output with. + * @stubbed + */ + appendOutput(output: string, location?: Location, test?: TestItem): void; -/** - * Collection of test items, found in {@link TestItem.children} and - * {@link TestController.items}. - */ -export interface TestItemCollection extends Iterable<[id: string, testItem: TestItem]> { - /** - * Gets the number of items in the collection. - * @stubbed - */ - readonly size: number; + /** + * Signals that the end of the test run. Any tests included in the run whose + * states have not been updated will have their state reset. + * @stubbed + */ + end(): void; + } /** - * Replaces the items stored by the collection. - * @param items Items to store. - * @stubbed + * Collection of test items, found in {@link TestItem.children} and + * {@link TestController.items}. */ - replace(items: readonly TestItem[]): void; + export interface TestItemCollection extends Iterable<[id: string, testItem: TestItem]> { + /** + * Gets the number of items in the collection. + * @stubbed + */ + readonly size: number; - /** - * Iterate over each entry in this collection. - * - * @param callback Function to execute for each entry. - * @param thisArg The `this` context used when invoking the handler function. - * @stubbed - */ - forEach(callback: (item: TestItem, collection: TestItemCollection) => unknown, thisArg?: any): void; + /** + * Replaces the items stored by the collection. + * @param items Items to store. + * @stubbed + */ + replace(items: readonly TestItem[]): void; - /** - * Adds the test item to the children. If an item with the same ID already - * exists, it'll be replaced. - * @param item Item to add. - * @stubbed - */ - add(item: TestItem): void; + /** + * Iterate over each entry in this collection. + * + * @param callback Function to execute for each entry. + * @param thisArg The `this` context used when invoking the handler function. + * @stubbed + */ + forEach(callback: (item: TestItem, collection: TestItemCollection) => unknown, thisArg?: any): void; - /** - * Removes a single test item from the collection. - * @param itemId Item ID to delete. - * @stubbed - */ - delete(itemId: string): void; + /** + * Adds the test item to the children. If an item with the same ID already + * exists, it'll be replaced. + * @param item Item to add. + * @stubbed + */ + add(item: TestItem): void; - /** - * Efficiently gets a test item by ID, if it exists, in the children. - * @param itemId Item ID to get. - * @returns The found item or undefined if it does not exist. - * @stubbed - */ - get(itemId: string): TestItem | undefined; -} + /** + * Removes a single test item from the collection. + * @param itemId Item ID to delete. + * @stubbed + */ + delete(itemId: string): void; -/** - * An item shown in the "test explorer" view. - * - * A `TestItem` can represent either a test suite or a test itself, since - * they both have similar capabilities. - */ -export interface TestItem { - /** - * Identifier for the `TestItem`. This is used to correlate - * test results and tests in the document with those in the workspace - * (test explorer). This cannot change for the lifetime of the `TestItem`, - * and must be unique among its parent's direct children. - * @stubbed - */ - readonly id: string; + /** + * Efficiently gets a test item by ID, if it exists, in the children. + * @param itemId Item ID to get. + * @returns The found item or undefined if it does not exist. + * @stubbed + */ + get(itemId: string): TestItem | undefined; + } /** - * URI this `TestItem` is associated with. May be a file or directory. - * @stubbed + * An item shown in the "test explorer" view. + * + * A `TestItem` can represent either a test suite or a test itself, since + * they both have similar capabilities. */ - readonly uri: Uri | undefined; + export interface TestItem { + /** + * Identifier for the `TestItem`. This is used to correlate + * test results and tests in the document with those in the workspace + * (test explorer). This cannot change for the lifetime of the `TestItem`, + * and must be unique among its parent's direct children. + * @stubbed + */ + readonly id: string; - /** - * The children of this test item. For a test suite, this may contain the - * individual test cases or nested suites. - * @stubbed - */ - readonly children: TestItemCollection; + /** + * URI this `TestItem` is associated with. May be a file or directory. + * @stubbed + */ + readonly uri: Uri | undefined; - /** - * The parent of this item. It's set automatically, and is undefined - * top-level items in the {@link TestController.items} and for items that - * aren't yet included in another item's {@link TestItem.children children}. - * @stubbed - */ - readonly parent: TestItem | undefined; + /** + * The children of this test item. For a test suite, this may contain the + * individual test cases or nested suites. + * @stubbed + */ + readonly children: TestItemCollection; - /** - * Tags associated with this test item. May be used in combination with - * {@link TestRunProfile.tags}, or simply as an organizational feature. - * @stubbed - */ - tags: readonly TestTag[]; + /** + * The parent of this item. It's set automatically, and is undefined + * top-level items in the {@link TestController.items} and for items that + * aren't yet included in another item's {@link TestItem.children children}. + * @stubbed + */ + readonly parent: TestItem | undefined; - /** - * Indicates whether this test item may have children discovered by resolving. - * - * If true, this item is shown as expandable in the Test Explorer view and - * expanding the item will cause {@link TestController.resolveHandler} - * to be invoked with the item. - * - * Default to `false`. - * @stubbed - */ - canResolveChildren: boolean; + /** + * Tags associated with this test item. May be used in combination with + * {@link TestRunProfile.tags}, or simply as an organizational feature. + * @stubbed + */ + tags: readonly TestTag[]; - /** - * Controls whether the item is shown as "busy" in the Test Explorer view. - * This is useful for showing status while discovering children. - * - * Defaults to `false`. - * @stubbed - */ - busy: boolean; + /** + * Indicates whether this test item may have children discovered by resolving. + * + * If true, this item is shown as expandable in the Test Explorer view and + * expanding the item will cause {@link TestController.resolveHandler} + * to be invoked with the item. + * + * Default to `false`. + * @stubbed + */ + canResolveChildren: boolean; - /** - * Display name describing the test case. - * @stubbed - */ - label: string; + /** + * Controls whether the item is shown as "busy" in the Test Explorer view. + * This is useful for showing status while discovering children. + * + * Defaults to `false`. + * @stubbed + */ + busy: boolean; - /** - * Optional description that appears next to the label. - * @stubbed - */ - description?: string; + /** + * Display name describing the test case. + * @stubbed + */ + label: string; - /** - * A string that should be used when comparing this item - * with other items. When `falsy` the {@link TestItem.label label} - * is used. - * @stubbed - */ - sortText?: string | undefined; + /** + * Optional description that appears next to the label. + * @stubbed + */ + description?: string; - /** - * Location of the test item in its {@link TestItem.uri uri}. - * - * This is only meaningful if the `uri` points to a file. - * @stubbed - */ - range: Range | undefined; + /** + * A string that should be used when comparing this item + * with other items. When `falsy` the {@link TestItem.label label} + * is used. + * @stubbed + */ + sortText?: string | undefined; - /** - * Optional error encountered while loading the test. - * - * Note that this is not a test result and should only be used to represent errors in - * test discovery, such as syntax errors. - * @stubbed - */ - error: string | MarkdownString | undefined; -} + /** + * Location of the test item in its {@link TestItem.uri uri}. + * + * This is only meaningful if the `uri` points to a file. + * @stubbed + */ + range: Range | undefined; -/** - * Message associated with the test state. Can be linked to a specific - * source range -- useful for assertion failures, for example. - */ -export class TestMessage { - /** - * Human-readable message text to display. - */ - message: string | MarkdownString; + /** + * Optional error encountered while loading the test. + * + * Note that this is not a test result and should only be used to represent errors in + * test discovery, such as syntax errors. + * @stubbed + */ + error: string | MarkdownString | undefined; + } /** - * Expected test output. If given with {@link TestMessage.actualOutput actualOutput }, a diff view will be shown. + * Message associated with the test state. Can be linked to a specific + * source range -- useful for assertion failures, for example. */ - expectedOutput?: string; + export class TestMessage { + /** + * Human-readable message text to display. + */ + message: string | MarkdownString; - /** - * Actual test output. If given with {@link TestMessage.expectedOutput expectedOutput }, a diff view will be shown. - */ - actualOutput?: string; + /** + * Expected test output. If given with {@link TestMessage.actualOutput actualOutput }, a diff view will be shown. + */ + expectedOutput?: string; - /** - * Associated file location. - */ - location?: Location; + /** + * Actual test output. If given with {@link TestMessage.expectedOutput expectedOutput }, a diff view will be shown. + */ + actualOutput?: string; - /** - * Creates a new TestMessage that will present as a diff in the editor. - * @param message Message to display to the user. - * @param expected Expected output. - * @param actual Actual output. - */ - static diff(message: string | MarkdownString, expected: string, actual: string): TestMessage; + /** + * Associated file location. + */ + location?: Location; + + /** + * Creates a new TestMessage that will present as a diff in the editor. + * @param message Message to display to the user. + * @param expected Expected output. + * @param actual Actual output. + */ + static diff(message: string | MarkdownString, expected: string, actual: string): TestMessage; + + /** + * Creates a new TestMessage instance. + * @param message The message to show to the user. + */ + constructor(message: string | MarkdownString); + } /** - * Creates a new TestMessage instance. - * @param message The message to show to the user. + * Thenable is a common denominator between ES6 promises, Q, jquery.Deferred, WinJS.Promise, + * and others. This API makes no assumption about what promise library is being used which + * enables reusing existing code without migrating to a specific promise implementation. Still, + * we recommend the use of native promises which are available in this editor. */ - constructor(message: string | MarkdownString); -} + interface Thenable { + /** + * Attaches callbacks for the resolution and/or rejection of the Promise. + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of which ever callback is executed. + */ + then(onfulfilled?: (value: T) => TResult | Thenable, onrejected?: (reason: any) => TResult | Thenable): Thenable; + then(onfulfilled?: (value: T) => TResult | Thenable, onrejected?: (reason: any) => void): Thenable; + } -/** - * Thenable is a common denominator between ES6 promises, Q, jquery.Deferred, WinJS.Promise, - * and others. This API makes no assumption about what promise library is being used which - * enables reusing existing code without migrating to a specific promise implementation. Still, - * we recommend the use of native promises which are available in this editor. - */ -interface Thenable { - /** - * Attaches callbacks for the resolution and/or rejection of the Promise. - * @param onfulfilled The callback to execute when the Promise is resolved. - * @param onrejected The callback to execute when the Promise is rejected. - * @returns A Promise for the completion of which ever callback is executed. - */ - then(onfulfilled?: (value: T) => TResult | Thenable, onrejected?: (reason: any) => TResult | Thenable): Thenable; - then(onfulfilled?: (value: T) => TResult | Thenable, onrejected?: (reason: any) => void): Thenable; } - diff --git a/packages/plugin/src/theia.proposed.notebookCellExecutionState.d.ts b/packages/plugin/src/theia.proposed.notebookCellExecutionState.d.ts new file mode 100644 index 0000000000000..ab8279581a8a8 --- /dev/null +++ b/packages/plugin/src/theia.proposed.notebookCellExecutionState.d.ts @@ -0,0 +1,68 @@ +// ***************************************************************************** +// Copyright (C) 2023 Typefox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +declare module '@theia/plugin' { + + // https://github.com/microsoft/vscode/issues/124970 + + /** + * The execution state of a notebook cell. + */ + export enum NotebookCellExecutionState { + /** + * The cell is idle. + */ + Idle = 1, + /** + * Execution for the cell is pending. + */ + Pending = 2, + /** + * The cell is currently executing. + */ + Executing = 3, + } + + /** + * An event describing a cell execution state change. + */ + export interface NotebookCellExecutionStateChangeEvent { + /** + * The {@link NotebookCell cell} for which the execution state has changed. + */ + readonly cell: NotebookCell; + + /** + * The new execution state of the cell. + */ + readonly state: NotebookCellExecutionState; + } + + export namespace notebooks { + + /** + * An {@link Event} which fires when the execution state of a cell has changed. + */ + // todo@API this is an event that is fired for a property that cells don't have and that makes me wonder + // how a correct consumer works, e.g the consumer could have been late and missed an event? + export const onDidChangeNotebookCellExecutionState: Event; + } +} diff --git a/packages/plugin/src/theia.proposed.notebookKernelSource.d.ts b/packages/plugin/src/theia.proposed.notebookKernelSource.d.ts new file mode 100644 index 0000000000000..5ef2fcd67e35f --- /dev/null +++ b/packages/plugin/src/theia.proposed.notebookKernelSource.d.ts @@ -0,0 +1,62 @@ +// ***************************************************************************** +// Copyright (C) 2023 Typefox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +declare module '@theia/plugin' { + export interface NotebookControllerDetectionTask { + /** + * Dispose and remove the detection task. + */ + dispose(): void; + } + + export class NotebookKernelSourceAction { + readonly label: string; + readonly description?: string; + readonly detail?: string; + readonly command: string | Command; + readonly documentation?: Uri; + + constructor(label: string); + } + + export interface NotebookKernelSourceActionProvider { + /** + * An optional event to signal that the kernel source actions have changed. + */ + onDidChangeNotebookKernelSourceActions?: Event; + /** + * Provide kernel source actions + */ + provideNotebookKernelSourceActions(token: CancellationToken): ProviderResult; + } + + export namespace notebooks { + /** + * Create notebook controller detection task + */ + export function createNotebookControllerDetectionTask(notebookType: string): NotebookControllerDetectionTask; + + /** + * Register a notebook kernel source action provider + */ + export function registerKernelSourceActionProvider(notebookType: string, provider: NotebookKernelSourceActionProvider): Disposable; + } +} diff --git a/packages/plugin/src/theia.proposed.notebookMessaging.d.ts b/packages/plugin/src/theia.proposed.notebookMessaging.d.ts new file mode 100644 index 0000000000000..c2f1ee0330acb --- /dev/null +++ b/packages/plugin/src/theia.proposed.notebookMessaging.d.ts @@ -0,0 +1,84 @@ +// ***************************************************************************** +// Copyright (C) 2023 Typefox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +declare module '@theia/plugin' { + + // https://github.com/microsoft/vscode/issues/123601 + + /** + * Represents a script that is loaded into the notebook renderer before rendering output. This allows + * to provide and share functionality for notebook markup and notebook output renderers. + */ + export class NotebookRendererScript { + + /** + * APIs that the preload provides to the renderer. These are matched + * against the `dependencies` and `optionalDependencies` arrays in the + * notebook renderer contribution point. + */ + provides: readonly string[]; + + /** + * URI of the JavaScript module to preload. + * + * This module must export an `activate` function that takes a context object that contains the notebook API. + */ + uri: Uri; + + /** + * @param uri URI of the JavaScript module to preload + * @param provides Value for the `provides` property + */ + constructor(uri: Uri, provides?: string | readonly string[]); + } + + export interface NotebookController { + + // todo@API allow add, not remove + readonly rendererScripts: NotebookRendererScript[]; + + /** + * An event that fires when a {@link NotebookController.rendererScripts renderer script} has send a message to + * the controller. + */ + readonly onDidReceiveMessage: Event<{ readonly editor: NotebookEditor; readonly message: unknown }>; + + /** + * Send a message to the renderer of notebook editors. + * + * Note that only editors showing documents that are bound to this controller + * are receiving the message. + * + * @param message The message to send. + * @param editor A specific editor to send the message to. When `undefined` all applicable editors are receiving the message. + * @returns A promise that resolves to a boolean indicating if the message has been send or not. + */ + postMessage(message: unknown, editor?: NotebookEditor): Thenable; + + asWebviewUri(localResource: Uri): Uri; + } + + export namespace notebooks { + + export function createNotebookController(id: string, viewType: string, label: string, handler?: (cells: NotebookCell[], notebook: NotebookDocument, + controller: NotebookController) => void | Thenable, rendererScripts?: NotebookRendererScript[]): NotebookController; + } +} diff --git a/tsconfig.json b/tsconfig.json index b1a72fda40d8b..c007028138e43 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -108,6 +108,9 @@ { "path": "packages/navigator" }, + { + "path": "packages/notebook" + }, { "path": "packages/outline-view" }, diff --git a/yarn.lock b/yarn.lock index ee3f8d062c298..a460decdf8a92 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2197,6 +2197,11 @@ resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-7.0.5.tgz#b1d2f772142a301538fae9bdf9cf15b9f2573a29" integrity sha512-hKB88y3YHL8oPOs/CNlaXtjWn93+Bs48sDQR37ZUqG2tLeCS7EA1cmnkKsuQsub9OKEB/y/Rw9zqJqqNSbqVlQ== +"@types/vscode-notebook-renderer@^1.72.0": + version "1.72.0" + resolved "https://registry.yarnpkg.com/@types/vscode-notebook-renderer/-/vscode-notebook-renderer-1.72.0.tgz#8943dc3cef0ced2dfb1e04c0a933bd289e7d5199" + integrity sha512-5iTjb39DpLn03ULUwrDR3L2Dy59RV4blSUHy0oLdQuIY11PhgWO4mXIcoFS0VxY1GZQ4IcjSf3ooT2Jrrcahnw== + "@types/vscode@^1.50.0": version "1.80.0" resolved "https://registry.yarnpkg.com/@types/vscode/-/vscode-1.80.0.tgz#e004dd6cde74dafdb7fab64a6e1754bf8165b981" From 704996dccb5ac26c28c9f3f615e6018a6aad30da Mon Sep 17 00:00:00 2001 From: Vlad Arama <86936229+vladarama@users.noreply.github.com> Date: Thu, 31 Aug 2023 09:02:44 -0400 Subject: [PATCH 41/79] getting-started: implement startup editor preference (#12813) * implement workbench: startup editor preference This commit introduces 5 new startup editor preferences: - `none`: no editor will be shown on startup - `welcomePage`: the default welcome page will be shown on startup - `readme`: it will open the folder's readme in preview mode - `newUntitledFile`: opens an untitled file on startup - `welcomePageInEmptyWorkbench`: only opens the welcome page when opening empty workbench Signed-Off-By: Vlad Arama --- CHANGELOG.md | 4 ++ packages/getting-started/package.json | 3 + .../browser/getting-started-contribution.ts | 71 +++++++++++++++---- .../browser/getting-started-preferences.ts | 23 ++++-- .../src/browser/getting-started-widget.tsx | 18 ++--- packages/getting-started/tsconfig.json | 9 +++ 6 files changed, 100 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9aa2b61c9c882..ed3000f2c6cb7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,10 @@ - [deps] Bumped supported Node.js version from 16.x to >=18, you may need to update your environments. +[Breaking Changes:](#breaking_changes_1.41.0) + +- [preferences] removed the `welcome.alwaysShowWelcomePage` preference in favor of `workbench.startupEditor`: [#12813](https://github.com/eclipse-theia/theia/pull/12813) + ## v1.40.0 - 07/27/2023 - [application-package] bumped the default supported VS Code API from `1.78.0` to `1.79.0` [#12764](https://github.com/eclipse-theia/theia/pull/12764) - Contributed on behalf of STMicroelectronics. diff --git a/packages/getting-started/package.json b/packages/getting-started/package.json index 89c48b9f8f318..b568750714cdc 100644 --- a/packages/getting-started/package.json +++ b/packages/getting-started/package.json @@ -4,7 +4,10 @@ "description": "Theia - GettingStarted Extension", "dependencies": { "@theia/core": "1.40.0", + "@theia/editor": "1.40.0", + "@theia/filesystem": "1.40.0", "@theia/keymaps": "1.40.0", + "@theia/preview": "1.40.0", "@theia/workspace": "1.40.0" }, "publishConfig": { diff --git a/packages/getting-started/src/browser/getting-started-contribution.ts b/packages/getting-started/src/browser/getting-started-contribution.ts index 6f3d70cf1eb4f..b31de3b3bc2c6 100644 --- a/packages/getting-started/src/browser/getting-started-contribution.ts +++ b/packages/getting-started/src/browser/getting-started-contribution.ts @@ -15,10 +15,13 @@ // ***************************************************************************** import { injectable, inject } from '@theia/core/shared/inversify'; -import { CommandRegistry, MenuModelRegistry } from '@theia/core/lib/common'; -import { CommonMenus, AbstractViewContribution, FrontendApplicationContribution, FrontendApplication, NavigatableWidget, PreferenceService } from '@theia/core/lib/browser'; +import { ArrayUtils, CommandRegistry, MenuModelRegistry } from '@theia/core/lib/common'; +import { CommonCommands, CommonMenus, AbstractViewContribution, FrontendApplicationContribution, FrontendApplication, PreferenceService } from '@theia/core/lib/browser'; +import { EditorManager } from '@theia/editor/lib/browser/editor-manager'; import { GettingStartedWidget } from './getting-started-widget'; +import { FileService } from '@theia/filesystem/lib/browser/file-service'; import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; +import { PreviewContribution } from '@theia/preview/lib/browser/preview-contribution'; import { WorkspaceService } from '@theia/workspace/lib/browser'; /** @@ -32,15 +35,27 @@ export const GettingStartedCommand = { @injectable() export class GettingStartedContribution extends AbstractViewContribution implements FrontendApplicationContribution { + @inject(CommandRegistry) + protected readonly commandRegistry: CommandRegistry; + + @inject(EditorManager) + protected readonly editorManager: EditorManager; + + @inject(FileService) + protected readonly fileService: FileService; + + @inject(PreferenceService) + protected readonly preferenceService: PreferenceService; + + @inject(PreviewContribution) + protected readonly previewContribution: PreviewContribution; + @inject(FrontendApplicationStateService) protected readonly stateService: FrontendApplicationStateService; @inject(WorkspaceService) protected readonly workspaceService: WorkspaceService; - @inject(PreferenceService) - protected readonly preferenceService: PreferenceService; - constructor() { super({ widgetId: GettingStartedWidget.ID, @@ -52,19 +67,49 @@ export class GettingStartedContribution extends AbstractViewContribution { - this.stateService.reachedState('ready').then(() => { - const editors = this.shell.widgets.filter((widget): widget is NavigatableWidget => NavigatableWidget.is(widget)); - if (editors.length === 0) { - this.preferenceService.ready.then(() => { - const showWelcomePage: boolean = this.preferenceService.get('welcome.alwaysShowWelcomePage', true); - if (showWelcomePage) { + this.stateService.reachedState('ready').then(async () => { + if (this.editorManager.all.length === 0) { + await this.preferenceService.ready; + const startupEditor = this.preferenceService.get('workbench.startupEditor'); + switch (startupEditor) { + case 'welcomePage': this.openView({ reveal: true, activate: true }); - } - }); + break; + case 'welcomePageInEmptyWorkbench': + if (!this.workspaceService.opened) { + this.openView({ reveal: true, activate: true }); + } + break; + case 'newUntitledFile': + this.commandRegistry.executeCommand(CommonCommands.NEW_UNTITLED_TEXT_FILE.id); + break; + case 'readme': + await this.openReadme(); + break; + } } }); } + protected async openReadme(): Promise { + const roots = await this.workspaceService.roots; + const readmes = await Promise.all(roots.map(async folder => { + const folderStat = await this.fileService.resolve(folder.resource); + const fileArr = folderStat?.children?.sort((a, b) => a.name.localeCompare(b.name)) || []; + const filePath = fileArr.find(file => file.name.toLowerCase() === 'readme.md') || fileArr.find(file => file.name.toLowerCase().startsWith('readme')); + return filePath?.resource; + })); + const validReadmes = ArrayUtils.coalesce(readmes); + if (validReadmes.length) { + for (const readme of validReadmes) { + await this.previewContribution.open(readme); + } + } else { + // If no readme is found, show the welcome page. + this.openView({ reveal: true, activate: true }); + } + } + override registerCommands(registry: CommandRegistry): void { registry.registerCommand(GettingStartedCommand, { execute: () => this.openView({ reveal: true, activate: true }), diff --git a/packages/getting-started/src/browser/getting-started-preferences.ts b/packages/getting-started/src/browser/getting-started-preferences.ts index 18d1cc64e2cc3..2621402d1756f 100644 --- a/packages/getting-started/src/browser/getting-started-preferences.ts +++ b/packages/getting-started/src/browser/getting-started-preferences.ts @@ -22,21 +22,32 @@ import { PreferenceSchema, PreferenceContribution } from '@theia/core/lib/browser/preferences'; +import { FrontendApplicationConfigProvider } from '@theia/core/lib/browser/frontend-application-config-provider'; import { nls } from '@theia/core/lib/common/nls'; export const GettingStartedPreferenceSchema: PreferenceSchema = { 'type': 'object', properties: { - 'welcome.alwaysShowWelcomePage': { - type: 'boolean', - description: nls.localizeByDefault('Show welcome page on startup'), - default: true - } + 'workbench.startupEditor': { + type: 'string', + enum: ['none', 'welcomePage', 'readme', 'newUntitledFile', 'welcomePageInEmptyWorkbench'], + enumDescriptions: [ + nls.localizeByDefault('Start without an editor.'), + nls.localize('theia/getting-started/startup-editor/welcomePage', 'Open the Welcome page, with content to aid in getting started with {0} and extensions.', + FrontendApplicationConfigProvider.get().applicationName), + nls.localizeByDefault(`Open the README when opening a folder that contains one, fallback to \'welcomePage\' otherwise. + Note: This is only observed as a global configuration, it will be ignored if set in a workspace or folder configuration.`), + nls.localizeByDefault('Open a new untitled text file (only applies when opening an empty window).'), + nls.localizeByDefault('Open the Welcome page when opening an empty workbench.'), + ], + default: 'welcomePage', + description: nls.localizeByDefault('Controls which editor is shown at startup, if none are restored from the previous session.') + }, } }; export interface GettingStartedConfiguration { - 'welcome.alwaysShowWelcomePage': boolean; + 'workbench.startupEditor': string; } export const GettingStartedPreferenceContribution = Symbol('GettingStartedPreferenceContribution'); diff --git a/packages/getting-started/src/browser/getting-started-widget.tsx b/packages/getting-started/src/browser/getting-started-widget.tsx index 4da274562f0e8..72053273f2fd9 100644 --- a/packages/getting-started/src/browser/getting-started-widget.tsx +++ b/packages/getting-started/src/browser/getting-started-widget.tsx @@ -496,32 +496,32 @@ export interface PreferencesProps { } function WelcomePreferences(props: PreferencesProps): JSX.Element { - const [alwaysShowWelcomePage, setAlwaysShowWelcomePage] = React.useState( - props.preferenceService.get('welcome.alwaysShowWelcomePage', true) + const [startupEditor, setStartupEditor] = React.useState( + props.preferenceService.get('workbench.startupEditor', 'welcomePage') ); React.useEffect(() => { const prefListener = props.preferenceService.onPreferenceChanged(change => { - if (change.preferenceName === 'welcome.alwaysShowWelcomePage') { + if (change.preferenceName === 'workbench.startupEditor') { const prefValue = change.newValue; - setAlwaysShowWelcomePage(prefValue); + setStartupEditor(prefValue); } }); return () => prefListener.dispose(); }, [props.preferenceService]); const handleChange = (e: React.ChangeEvent) => { - const newChecked = e.target.checked; - props.preferenceService.updateValue('welcome.alwaysShowWelcomePage', newChecked); + const newValue = e.target.checked ? 'welcomePage' : 'none'; + props.preferenceService.updateValue('workbench.startupEditor', newValue); }; return (
    -
    diff --git a/packages/getting-started/tsconfig.json b/packages/getting-started/tsconfig.json index ba31f57815a43..26df745bdd0c6 100644 --- a/packages/getting-started/tsconfig.json +++ b/packages/getting-started/tsconfig.json @@ -12,9 +12,18 @@ { "path": "../core" }, + { + "path": "../editor" + }, + { + "path": "../filesystem" + }, { "path": "../keymaps" }, + { + "path": "../preview" + }, { "path": "../workspace" } From dc8b08c05bcf54b5f89814b0193049ceb3785731 Mon Sep 17 00:00:00 2001 From: sophia <46455728+sophiali23@users.noreply.github.com> Date: Thu, 31 Aug 2023 09:53:26 -0400 Subject: [PATCH 42/79] debug: fix edit watch expressions when no debug session is present The commit fixes an issue where the edit watch expressions was not updated properly if there was no debug session present. Signed-off-by: Sophia Li --- packages/debug/src/browser/view/debug-watch-expression.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/debug/src/browser/view/debug-watch-expression.tsx b/packages/debug/src/browser/view/debug-watch-expression.tsx index 1d4bf58d5ac39..c3477ef5f7965 100644 --- a/packages/debug/src/browser/view/debug-watch-expression.tsx +++ b/packages/debug/src/browser/view/debug-watch-expression.tsx @@ -42,11 +42,10 @@ export class DebugWatchExpression extends ExpressionItem { } protected override setResult(body?: DebugProtocol.EvaluateResponse['body'], error?: string): void { - if (!this.options.session()) { - return; + if (this.options.session()) { + super.setResult(body, error); + this.isError = !!error; } - super.setResult(body, error); - this.isError = !!error; this.options.onDidChange(); } From d7061cad747ee97da59b3fd0770ce0a889ae9ab5 Mon Sep 17 00:00:00 2001 From: Vlad Arama <86936229+vladarama@users.noreply.github.com> Date: Thu, 31 Aug 2023 11:46:15 -0400 Subject: [PATCH 43/79] workspace: fix saving of untitled text files (#12577) The commit fixes the untitled file-saving issue by making sure that the untitled files are saved correctly before closing the workspace / closing the application. Signed-off-by: Vlad Arama --- .../browser/common-frontend-contribution.ts | 44 ++++++++++++++----- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/packages/core/src/browser/common-frontend-contribution.ts b/packages/core/src/browser/common-frontend-contribution.ts index 2e95ea0a8eaa9..7df314fd08cb5 100644 --- a/packages/core/src/browser/common-frontend-contribution.ts +++ b/packages/core/src/browser/common-frontend-contribution.ts @@ -36,7 +36,7 @@ import { OS, isOSX, isWindows, EOL } from '../common/os'; import { ResourceContextKey } from './resource-context-key'; import { UriSelection } from '../common/selection'; import { StorageService } from './storage-service'; -import { Navigatable } from './navigatable'; +import { Navigatable, NavigatableWidget } from './navigatable'; import { QuickViewService } from './quick-input/quick-view-service'; import { environment } from '@theia/application-package/lib/environment'; import { IconTheme, IconThemeService } from './icon-theme-service'; @@ -63,7 +63,7 @@ import { DecorationStyle } from './decoration-style'; import { isPinned, Title, togglePinned, Widget } from './widgets'; import { SaveResourceService } from './save-resource-service'; import { UserWorkingDirectoryProvider } from './user-working-directory-provider'; -import { UntitledResourceResolver } from '../common'; +import { UNTITLED_SCHEME, UntitledResourceResolver } from '../common'; import { LanguageQuickPickService } from './i18n/language-quick-pick-service'; export namespace CommonMenus { @@ -1171,14 +1171,26 @@ export class CommonFrontendContribution implements FrontendApplicationContributi } onWillStop(): OnWillStopAction | undefined { - try { - if (this.shouldPreventClose || this.shell.canSaveAll()) { - const captionsToSave = this.unsavedTabsCaptions(); + if (this.shouldPreventClose || this.shell.canSaveAll()) { + return { + reason: 'Dirty editors present', + action: async () => { + const captionsToSave = this.unsavedTabsCaptions(); + const untitledCaptionsToSave = this.unsavedUntitledTabsCaptions(); + const result = await confirmExitWithOrWithoutSaving(captionsToSave, async () => { + await this.saveDirty(untitledCaptionsToSave); + await this.shell.saveAll(); + }); + if (this.shell.canSaveAll()) { + this.shouldPreventClose = true; + return false; + } else { + this.shouldPreventClose = false; + return result; + } - return { reason: 'Dirty editors present', action: async () => confirmExitWithOrWithoutSaving(captionsToSave, async () => this.shell.saveAll()) }; - } - } finally { - this.shouldPreventClose = false; + } + }; } } protected unsavedTabsCaptions(): string[] { @@ -1186,6 +1198,11 @@ export class CommonFrontendContribution implements FrontendApplicationContributi .filter(widget => this.saveResourceService.canSave(widget)) .map(widget => widget.title.label); } + protected unsavedUntitledTabsCaptions(): Widget[] { + return this.shell.widgets.filter(widget => + NavigatableWidget.getUri(widget)?.scheme === UNTITLED_SCHEME && this.saveResourceService.canSaveAs(widget) + ); + } protected async configureDisplayLanguage(): Promise { const languageInfo = await this.languageQuickPickService.pickDisplayLanguage(); if (languageInfo && !nls.isSelectedLocale(languageInfo.languageId) && await this.confirmRestart( @@ -1196,7 +1213,14 @@ export class CommonFrontendContribution implements FrontendApplicationContributi this.windowService.reload(); } } - + protected async saveDirty(toSave: Widget[]): Promise { + for (const widget of toSave) { + const saveable = Saveable.get(widget); + if (saveable?.dirty) { + await this.saveResourceService.save(widget); + } + } + } protected toggleBreadcrumbs(): void { const value: boolean | undefined = this.preferenceService.get('breadcrumbs.enabled'); this.preferenceService.set('breadcrumbs.enabled', !value, PreferenceScope.User); From 103326dcac9357c3dffe772a459e9ba4ae81dc1f Mon Sep 17 00:00:00 2001 From: Vincent Fugnitto Date: Thu, 31 Aug 2023 12:54:41 -0400 Subject: [PATCH 44/79] getting-started: fixed `open folder` link (#12857) The commit updates the `open folder` link when no recent workspaces are present to prompt users to open a folder instead of a workspace file. Signed-off-by: vince-fugnitto --- .../getting-started/src/browser/getting-started-widget.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/getting-started/src/browser/getting-started-widget.tsx b/packages/getting-started/src/browser/getting-started-widget.tsx index 72053273f2fd9..22fa83fe8d769 100644 --- a/packages/getting-started/src/browser/getting-started-widget.tsx +++ b/packages/getting-started/src/browser/getting-started-widget.tsx @@ -270,8 +270,8 @@ export class GettingStartedWidget extends ReactWidget { + onClick={this.doOpenFolder} + onKeyDown={this.doOpenFolderEnter}> {nls.localizeByDefault('open a folder')} {' ' + nls.localizeByDefault('to start.')} From 32ab2cb133ec334fc3c16f77a5fc96eb345aa7b8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 31 Aug 2023 13:27:03 -0400 Subject: [PATCH 45/79] Translation update for version 1.41.0 (#12881) --- packages/core/i18n/nls.cs.json | 6 +++++- packages/core/i18n/nls.de.json | 6 +++++- packages/core/i18n/nls.es.json | 6 +++++- packages/core/i18n/nls.fr.json | 6 +++++- packages/core/i18n/nls.hu.json | 6 +++++- packages/core/i18n/nls.it.json | 6 +++++- packages/core/i18n/nls.ja.json | 6 +++++- packages/core/i18n/nls.json | 6 +++++- packages/core/i18n/nls.pl.json | 6 +++++- packages/core/i18n/nls.pt-br.json | 6 +++++- packages/core/i18n/nls.pt-pt.json | 6 +++++- packages/core/i18n/nls.ru.json | 6 +++++- packages/core/i18n/nls.zh-cn.json | 6 +++++- 13 files changed, 65 insertions(+), 13 deletions(-) diff --git a/packages/core/i18n/nls.cs.json b/packages/core/i18n/nls.cs.json index 92b30d2359cb6..e0d8b2b52153f 100644 --- a/packages/core/i18n/nls.cs.json +++ b/packages/core/i18n/nls.cs.json @@ -113,6 +113,7 @@ } }, "filesystem": { + "copiedToClipboard": "Zkopírujte odkaz ke stažení do schránky.", "copyDownloadLink": "Kopírovat odkaz ke stažení", "dialog": { "initialLocation": "Přejít na počáteční umístění", @@ -142,7 +143,10 @@ "getting-started": { "apiComparator": "{0} Kompatibilita API", "newExtension": "Budování nového rozšíření", - "newPlugin": "Vytvoření nového pluginu" + "newPlugin": "Vytvoření nového pluginu", + "startup-editor": { + "welcomePage": "Otevřete úvodní stránku s obsahem, který vám pomůže začít pracovat s webem {0} a rozšířeními." + } }, "git": { "aFewSecondsAgo": "před několika sekundami", diff --git a/packages/core/i18n/nls.de.json b/packages/core/i18n/nls.de.json index ec2c40c006ed8..34d5a7362f35f 100644 --- a/packages/core/i18n/nls.de.json +++ b/packages/core/i18n/nls.de.json @@ -113,6 +113,7 @@ } }, "filesystem": { + "copiedToClipboard": "Kopieren Sie den Download-Link in die Zwischenablage.", "copyDownloadLink": "Download-Link kopieren", "dialog": { "initialLocation": "Zum Ausgangsort gehen", @@ -142,7 +143,10 @@ "getting-started": { "apiComparator": "{0} API-Kompatibilität", "newExtension": "Bau einer neuen Erweiterung", - "newPlugin": "Ein neues Plugin erstellen" + "newPlugin": "Ein neues Plugin erstellen", + "startup-editor": { + "welcomePage": "Öffnen Sie die Willkommensseite mit Inhalten, die Ihnen den Einstieg in die Arbeit mit {0} und den Erweiterungen erleichtern." + } }, "git": { "aFewSecondsAgo": "vor ein paar Sekunden", diff --git a/packages/core/i18n/nls.es.json b/packages/core/i18n/nls.es.json index 814d359e315bb..65d859b89606a 100644 --- a/packages/core/i18n/nls.es.json +++ b/packages/core/i18n/nls.es.json @@ -113,6 +113,7 @@ } }, "filesystem": { + "copiedToClipboard": "Copiado el enlace de descarga en el portapapeles.", "copyDownloadLink": "Copiar el enlace de descarga", "dialog": { "initialLocation": "Ir a la ubicación inicial", @@ -142,7 +143,10 @@ "getting-started": { "apiComparator": "{0} Compatibilidad con la API", "newExtension": "Construir una nueva extensión", - "newPlugin": "Creación de un nuevo plugin" + "newPlugin": "Creación de un nuevo plugin", + "startup-editor": { + "welcomePage": "Abra la página de bienvenida, con contenidos que le ayudarán a empezar a utilizar {0} y las extensiones." + } }, "git": { "aFewSecondsAgo": "hace unos segundos", diff --git a/packages/core/i18n/nls.fr.json b/packages/core/i18n/nls.fr.json index 42c1f22c098f7..b413bee55a210 100644 --- a/packages/core/i18n/nls.fr.json +++ b/packages/core/i18n/nls.fr.json @@ -113,6 +113,7 @@ } }, "filesystem": { + "copiedToClipboard": "Copie du lien de téléchargement dans le presse-papiers.", "copyDownloadLink": "Copier le lien de téléchargement", "dialog": { "initialLocation": "Aller à l'emplacement initial", @@ -142,7 +143,10 @@ "getting-started": { "apiComparator": "{0} Compatibilité avec l'API", "newExtension": "Construire une nouvelle extension", - "newPlugin": "Créer un nouveau plugin" + "newPlugin": "Créer un nouveau plugin", + "startup-editor": { + "welcomePage": "Ouvrez la page d'accueil, dont le contenu vous aidera à démarrer avec {0} et les extensions." + } }, "git": { "aFewSecondsAgo": "il y a quelques secondes", diff --git a/packages/core/i18n/nls.hu.json b/packages/core/i18n/nls.hu.json index 44ef7f9b4244e..8ba8f8f86b7ad 100644 --- a/packages/core/i18n/nls.hu.json +++ b/packages/core/i18n/nls.hu.json @@ -113,6 +113,7 @@ } }, "filesystem": { + "copiedToClipboard": "A letöltési linket a vágólapra másolta.", "copyDownloadLink": "Letöltési link másolása", "dialog": { "initialLocation": "Menj a kezdeti helyszínre", @@ -142,7 +143,10 @@ "getting-started": { "apiComparator": "{0} API kompatibilitás", "newExtension": "Új bővítmény építése", - "newPlugin": "Egy új plugin építése" + "newPlugin": "Egy új plugin építése", + "startup-editor": { + "welcomePage": "Nyissa meg az Üdvözlő oldalt, amelynek tartalma segíti a {0} és a bővítmények használatának megkezdését." + } }, "git": { "aFewSecondsAgo": "néhány másodperccel ezelőtt", diff --git a/packages/core/i18n/nls.it.json b/packages/core/i18n/nls.it.json index 67bc1a3693b2b..aa2675385919b 100644 --- a/packages/core/i18n/nls.it.json +++ b/packages/core/i18n/nls.it.json @@ -113,6 +113,7 @@ } }, "filesystem": { + "copiedToClipboard": "Ho copiato il link per il download negli appunti.", "copyDownloadLink": "Copiare il link per il download", "dialog": { "initialLocation": "Vai alla posizione iniziale", @@ -142,7 +143,10 @@ "getting-started": { "apiComparator": "{0} Compatibilità API", "newExtension": "Costruire una nuova estensione", - "newPlugin": "Costruire un nuovo plugin" + "newPlugin": "Costruire un nuovo plugin", + "startup-editor": { + "welcomePage": "Aprire la pagina di benvenuto, con contenuti che aiutano a iniziare a usare {0} e le estensioni." + } }, "git": { "aFewSecondsAgo": "pochi secondi fa", diff --git a/packages/core/i18n/nls.ja.json b/packages/core/i18n/nls.ja.json index d5476874f22c9..116d64ac3e773 100644 --- a/packages/core/i18n/nls.ja.json +++ b/packages/core/i18n/nls.ja.json @@ -113,6 +113,7 @@ } }, "filesystem": { + "copiedToClipboard": "ダウンロードリンクをクリップボードにコピー。", "copyDownloadLink": "コピー・ダウンロード・リンク", "dialog": { "initialLocation": "初期位置へ移動", @@ -142,7 +143,10 @@ "getting-started": { "apiComparator": "{0} API互換性", "newExtension": "新しいエクステンションの構築", - "newPlugin": "新しいプラグインの構築" + "newPlugin": "新しいプラグインの構築", + "startup-editor": { + "welcomePage": "{0} とエクステンションを使い始めるのに役立つコンテンツを含む、ようこそページを開きます。" + } }, "git": { "aFewSecondsAgo": "さきほど", diff --git a/packages/core/i18n/nls.json b/packages/core/i18n/nls.json index eee4268b071ba..95ae993bae157 100644 --- a/packages/core/i18n/nls.json +++ b/packages/core/i18n/nls.json @@ -113,6 +113,7 @@ } }, "filesystem": { + "copiedToClipboard": "Copied the download link to the clipboard.", "copyDownloadLink": "Copy Download Link", "dialog": { "initialLocation": "Go To Initial Location", @@ -142,7 +143,10 @@ "getting-started": { "apiComparator": "{0} API Compatibility", "newExtension": "Building a New Extension", - "newPlugin": "Building a New Plugin" + "newPlugin": "Building a New Plugin", + "startup-editor": { + "welcomePage": "Open the Welcome page, with content to aid in getting started with {0} and extensions." + } }, "git": { "aFewSecondsAgo": "a few seconds ago", diff --git a/packages/core/i18n/nls.pl.json b/packages/core/i18n/nls.pl.json index 3dfde81ff8e24..640659eca3e00 100644 --- a/packages/core/i18n/nls.pl.json +++ b/packages/core/i18n/nls.pl.json @@ -113,6 +113,7 @@ } }, "filesystem": { + "copiedToClipboard": "Skopiowałem link do pobrania do schowka.", "copyDownloadLink": "Kopiuj Link do pobrania", "dialog": { "initialLocation": "Przejdź do lokalizacji początkowej", @@ -142,7 +143,10 @@ "getting-started": { "apiComparator": "{0} Zgodność z API", "newExtension": "Budowanie nowego rozszerzenia", - "newPlugin": "Tworzenie nowego pluginu" + "newPlugin": "Tworzenie nowego pluginu", + "startup-editor": { + "welcomePage": "Otwórz stronę powitalną, zawierającą treści ułatwiające rozpoczęcie korzystania z witryny {0} i rozszerzeń." + } }, "git": { "aFewSecondsAgo": "kilka sekund temu", diff --git a/packages/core/i18n/nls.pt-br.json b/packages/core/i18n/nls.pt-br.json index 8488ade57aa6f..a40cf7e360bef 100644 --- a/packages/core/i18n/nls.pt-br.json +++ b/packages/core/i18n/nls.pt-br.json @@ -113,6 +113,7 @@ } }, "filesystem": { + "copiedToClipboard": "Copiou o link de download para a área de transferência.", "copyDownloadLink": "Link para download de cópias", "dialog": { "initialLocation": "Ir para o local inicial", @@ -142,7 +143,10 @@ "getting-started": { "apiComparator": "{0} Compatibilidade API", "newExtension": "Construindo uma nova extensão", - "newPlugin": "Construindo um Novo Plugin" + "newPlugin": "Construindo um Novo Plugin", + "startup-editor": { + "welcomePage": "Abra a página de boas-vindas, com conteúdo para ajudar a começar a usar o {0} e as extensões." + } }, "git": { "aFewSecondsAgo": "alguns segundos atrás", diff --git a/packages/core/i18n/nls.pt-pt.json b/packages/core/i18n/nls.pt-pt.json index fe740b7b85c61..fe68dffcec6da 100644 --- a/packages/core/i18n/nls.pt-pt.json +++ b/packages/core/i18n/nls.pt-pt.json @@ -113,6 +113,7 @@ } }, "filesystem": { + "copiedToClipboard": "Copiou a ligação de transferência para a área de transferência.", "copyDownloadLink": "Link para download de cópias", "dialog": { "initialLocation": "Ir para o local inicial", @@ -142,7 +143,10 @@ "getting-started": { "apiComparator": "{0} Compatibilidade API", "newExtension": "Construir uma nova extensão", - "newPlugin": "Construir um Novo Plugin" + "newPlugin": "Construir um Novo Plugin", + "startup-editor": { + "welcomePage": "Abra a página de boas-vindas, com conteúdo para ajudar a começar a utilizar {0} e as extensões." + } }, "git": { "aFewSecondsAgo": "há alguns segundos", diff --git a/packages/core/i18n/nls.ru.json b/packages/core/i18n/nls.ru.json index b74e4ba91b7ae..a5481326708a5 100644 --- a/packages/core/i18n/nls.ru.json +++ b/packages/core/i18n/nls.ru.json @@ -113,6 +113,7 @@ } }, "filesystem": { + "copiedToClipboard": "Скопировал ссылку на скачивание в буфер обмена.", "copyDownloadLink": "Скопировать ссылку для скачивания", "dialog": { "initialLocation": "Перейти к начальному местоположению", @@ -142,7 +143,10 @@ "getting-started": { "apiComparator": "{0} Совместимость API", "newExtension": "Построение нового расширения", - "newPlugin": "Создание нового плагина" + "newPlugin": "Создание нового плагина", + "startup-editor": { + "welcomePage": "Откройте страницу приветствия, содержащую материалы, помогающие начать работу с {0} и расширениями." + } }, "git": { "aFewSecondsAgo": "несколько секунд назад", diff --git a/packages/core/i18n/nls.zh-cn.json b/packages/core/i18n/nls.zh-cn.json index 6c4470ccf11ad..270301cf676b8 100644 --- a/packages/core/i18n/nls.zh-cn.json +++ b/packages/core/i18n/nls.zh-cn.json @@ -113,6 +113,7 @@ } }, "filesystem": { + "copiedToClipboard": "将下载链接复制到剪贴板。", "copyDownloadLink": "复制下载链接", "dialog": { "initialLocation": "转到初始位置", @@ -142,7 +143,10 @@ "getting-started": { "apiComparator": "{0} API兼容性", "newExtension": "构建一个新的扩展", - "newPlugin": "构建一个新的插件" + "newPlugin": "构建一个新的插件", + "startup-editor": { + "welcomePage": "打开欢迎页面,其中包含帮助开始使用{0} 和扩展程序的内容。" + } }, "git": { "aFewSecondsAgo": "几秒钟前", From 180103ad086fc0a5e4e5fc01b5fcb43f06019eb1 Mon Sep 17 00:00:00 2001 From: Vincent Fugnitto Date: Thu, 31 Aug 2023 14:15:27 -0400 Subject: [PATCH 46/79] docs: update changelog for `1.41.0` (#12886) The commit updates the changelog for `v1.41.0` including notable features, bug fixes and any potential breaking changes. Signed-off-by: vince-fugnitto --- CHANGELOG.md | 52 +++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ed3000f2c6cb7..a4bb0c145048b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,19 +4,53 @@ - [Previous Changelogs](https://github.com/eclipse-theia/theia/tree/master/doc/changelogs/) -## v1.41.0 - -- [application-package] Quit Electron app when back end fails to start [#12778](https://github.com/eclipse-theia/theia/pull/12778) - Contributed on behalf of STMicroelectronics. +## v1.41.0 - 08/31/2023 + +- [application-package] added handling to quit the electron app when the backend fails to start [#12778](https://github.com/eclipse-theia/theia/pull/12778) - Contributed on behalf of STMicroelectronics. +- [core] added `--dnsDefaultResultOrder ` CLI argument where `value` is one of `ipv4first`, `verbatim` or `nodeDefault`. It controls how domain names are resolved [#12711](https://github.com/eclipse-theia/theia/pull/12711) +- [core] added functionality to capture stopwatch results [#12812](https://github.com/eclipse-theia/theia/pull/12812) +- [core] added support for `file/newFile` menu path [#12819](https://github.com/eclipse-theia/theia/pull/12819) +- [core] added support for icon-less tabbar items [#12804](https://github.com/eclipse-theia/theia/pull/12804) +- [core] added support for independent items in the `editor/title/run` menu [#12799](https://github.com/eclipse-theia/theia/pull/12799) +- [core] fixed submenu contributions to `editor/title` and `view/title` [#12706](https://github.com/eclipse-theia/theia/pull/12706) +- [core] improved middle-click behavior for tree nodes [#12783](https://github.com/eclipse-theia/theia/pull/12783) +- [core] improved rendering of the close icon when hovering tabs [#12806](https://github.com/eclipse-theia/theia/pull/12806) +- [core] updated `nls.metadata.json` for `1.80.0` [#12875](https://github.com/eclipse-theia/theia/pull/12875) +- [debug] fixed issue where edit watch expressions were not updated without a session [#12627](https://github.com/eclipse-theia/theia/pull/12627) +- [dev-packages] bumped the default supported API version from `1.79.0` to `1.89.0` [#12866](https://github.com/eclipse-theia/theia/pull/12866) +- [editor] fixed context-menu behavior for the editor gutter [#12794](https://github.com/eclipse-theia/theia/pull/12794) +- [filesystem] added missing localization for the copied download link to clipboard notification [#12873](https://github.com/eclipse-theia/theia/pull/12873) +- [getting-started] added checkbox to the welcome page to toggle visibility on startup [#12750](https://github.com/eclipse-theia/theia/pull/12750) +- [getting-started] added support for the `workbench.startupEditor` preference [#12813](https://github.com/eclipse-theia/theia/pull/12813) +- [getting-started] fixed `open folder` link on the welcome page [#12857](https://github.com/eclipse-theia/theia/pull/12857) +- [getting-started] improved rendering of the welcome page for smaller viewports [#12825](https://github.com/eclipse-theia/theia/pull/12825) +- [git] fixed unhandled promise rejection during git operations [#12433](https://github.com/eclipse-theia/theia/pull/12433) +- [markers] improved problems widget rendering, and problem matching [#12802](https://github.com/eclipse-theia/theia/pull/12802) +- [monaco] improved extensibility of `MonacoEditorCommandHandlers` [#12785](https://github.com/eclipse-theia/theia/pull/12785) +- [native-webpack-plugin] added `trash` dependency helpers bundling to the backend [#12797](https://github.com/eclipse-theia/theia/pull/12797) +- [navigator] added missing localizations when no roots are present in a multi-root workspace [#12795](https://github.com/eclipse-theia/theia/pull/12795) +- [notebook] added initial support for `notebook` editors [#12442](https://github.com/eclipse-theia/theia/pull/12442) +- [playwright] upgraded to the latest version and added new page objects [#12843](https://github.com/eclipse-theia/theia/pull/12843) +- [plugin] added support for the `EnvironmentVariableCollection#description` VS Code API [#12838](https://github.com/eclipse-theia/theia/pull/12838) +- [plugin] fixed `configurationDefault` support from VS Code plugins [#12758](https://github.com/eclipse-theia/theia/pull/12758) +- [plugin] fixed `view/title` menu behavior for builtin views [#12763](https://github.com/eclipse-theia/theia/pull/12763) +- [plugin] fixed an issue where the `WebviewPanelSerializer` would not serialize successfully [#12584](https://github.com/eclipse-theia/theia/pull/12584) +- [plugin] fixed plugin menu icon background when hovering [#12827](https://github.com/eclipse-theia/theia/pull/12827) +- [plugin] fixed the default `folderExpanded` icon for themes [#12776](https://github.com/eclipse-theia/theia/pull/12776) +- [plugin] fixed web plugin express endpoint [#12787](https://github.com/eclipse-theia/theia/pull/12787) +- [preferences] improved memory consumption by re-using the markdown renderer instance [#12790](https://github.com/eclipse-theia/theia/pull/12790) +- [process] fixed `.exe` compatibility for shell commands similarly to VS Code [#12761](https://github.com/eclipse-theia/theia/pull/12761) +- [repo] bumped builtin plugins to `1.79.0` [#12807](https://github.com/eclipse-theia/theia/pull/12807) +- [scm-extra] fixed an issue with scm history after performing a commit [#12837](https://github.com/eclipse-theia/theia/pull/12837) +- [task] added handling to ensure contributed problem matchers are successfully discovered [#12805](https://github.com/eclipse-theia/theia/pull/12805) +- [task] fixed error thrown for custom task execution [#12770](https://github.com/eclipse-theia/theia/pull/12770) - [vscode] added support for tree checkbox api [#12836](https://github.com/eclipse-theia/theia/pull/12836) - Contributed on behalf of STMicroelectronics -- [core] Add `--dnsDefaultResultOrder ` CLI argument where `value` is one of `ipv4first`, `verbatim` or `nodeDefault`. It controls how domain names are resolved. - -[Breaking Changes:](#breaking_changes_1.41.0) - -- [deps] Bumped supported Node.js version from 16.x to >=18, you may need to update your environments. +- [workspace] fixed saving of untitled text editors when closing a workspace or closing the application [#12577](https://github.com/eclipse-theia/theia/pull/12577) [Breaking Changes:](#breaking_changes_1.41.0) -- [preferences] removed the `welcome.alwaysShowWelcomePage` preference in favor of `workbench.startupEditor`: [#12813](https://github.com/eclipse-theia/theia/pull/12813) +- [deps] bumped supported Node.js version from 16.x to >=18, you may need to update your environments [#12711](https://github.com/eclipse-theia/theia/pull/12711) +- [preferences] removed the `welcome.alwaysShowWelcomePage` preference in favor of `workbench.startupEditor` [#12813](https://github.com/eclipse-theia/theia/pull/12813) ## v1.40.0 - 07/27/2023 From 6f229e0fa1a1e9b62fb50646adf731f5cdaa8edf Mon Sep 17 00:00:00 2001 From: vince-fugnitto Date: Thu, 31 Aug 2023 14:37:40 -0400 Subject: [PATCH 47/79] v1.41.0 Signed-off-by: vince-fugnitto --- dev-packages/application-manager/package.json | 10 +- dev-packages/application-package/package.json | 6 +- dev-packages/cli/package.json | 14 +-- dev-packages/ffmpeg/package.json | 2 +- .../localization-manager/package.json | 4 +- .../native-webpack-plugin/package.json | 2 +- dev-packages/ovsx-client/package.json | 4 +- .../private-eslint-plugin/package.json | 8 +- dev-packages/private-ext-scripts/package.json | 2 +- dev-packages/private-re-exports/package.json | 2 +- dev-packages/request/package.json | 2 +- examples/api-samples/package.json | 24 ++--- examples/api-tests/package.json | 4 +- examples/browser/package.json | 92 +++++++++---------- examples/electron/package.json | 92 +++++++++---------- examples/playwright/package.json | 2 +- lerna.json | 2 +- packages/bulk-edit/package.json | 14 +-- packages/callhierarchy/package.json | 8 +- packages/console/package.json | 8 +- packages/core/package.json | 10 +- packages/debug/package.json | 28 +++--- packages/editor-preview/package.json | 10 +- packages/editor/package.json | 8 +- packages/electron/package.json | 6 +- packages/external-terminal/package.json | 10 +- packages/file-search/package.json | 14 +-- packages/filesystem/package.json | 6 +- packages/getting-started/package.json | 16 ++-- packages/git/package.json | 18 ++-- packages/keymaps/package.json | 12 +-- packages/markers/package.json | 10 +- packages/memory-inspector/package.json | 6 +- packages/messages/package.json | 6 +- packages/metrics/package.json | 6 +- packages/mini-browser/package.json | 8 +- packages/monaco/package.json | 14 +-- packages/navigator/package.json | 10 +- packages/notebook/package.json | 12 +-- packages/outline-view/package.json | 6 +- packages/output/package.json | 10 +- packages/plugin-dev/package.json | 16 ++-- packages/plugin-ext-vscode/package.json | 28 +++--- packages/plugin-ext/package.json | 54 +++++------ packages/plugin-metrics/package.json | 12 +-- packages/plugin/package.json | 4 +- packages/preferences/package.json | 16 ++-- packages/preview/package.json | 12 +-- packages/process/package.json | 6 +- packages/property-view/package.json | 8 +- packages/scm-extra/package.json | 14 +-- packages/scm/package.json | 10 +- packages/search-in-workspace/package.json | 16 ++-- packages/secondary-window/package.json | 6 +- packages/task/package.json | 24 ++--- packages/terminal/package.json | 16 ++-- packages/timeline/package.json | 8 +- packages/toolbar/package.json | 18 ++-- packages/typehierarchy/package.json | 8 +- packages/userstorage/package.json | 8 +- packages/variable-resolver/package.json | 6 +- packages/vsx-registry/package.json | 18 ++-- packages/workspace/package.json | 10 +- .../sample-namespace/plugin-a/package.json | 2 +- .../sample-namespace/plugin-b/package.json | 2 +- 65 files changed, 425 insertions(+), 425 deletions(-) diff --git a/dev-packages/application-manager/package.json b/dev-packages/application-manager/package.json index a59e9fe6a0483..77047ec8db909 100644 --- a/dev-packages/application-manager/package.json +++ b/dev-packages/application-manager/package.json @@ -1,6 +1,6 @@ { "name": "@theia/application-manager", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia application manager API.", "publishConfig": { "access": "public" @@ -33,9 +33,9 @@ "@babel/plugin-transform-classes": "^7.10.0", "@babel/plugin-transform-runtime": "^7.10.0", "@babel/preset-env": "^7.10.0", - "@theia/application-package": "1.40.0", - "@theia/ffmpeg": "1.40.0", - "@theia/native-webpack-plugin": "1.40.0", + "@theia/application-package": "1.41.0", + "@theia/ffmpeg": "1.41.0", + "@theia/native-webpack-plugin": "1.41.0", "@types/fs-extra": "^4.0.2", "@types/semver": "^7.5.0", "babel-loader": "^8.2.2", @@ -73,7 +73,7 @@ } }, "devDependencies": { - "@theia/ext-scripts": "1.40.0", + "@theia/ext-scripts": "1.41.0", "@types/node-abi": "*" }, "nyc": { diff --git a/dev-packages/application-package/package.json b/dev-packages/application-package/package.json index 5d59b586e58cc..3399da385ed23 100644 --- a/dev-packages/application-package/package.json +++ b/dev-packages/application-package/package.json @@ -1,6 +1,6 @@ { "name": "@theia/application-package", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia application package API.", "publishConfig": { "access": "public" @@ -29,7 +29,7 @@ "watch": "theiaext watch" }, "dependencies": { - "@theia/request": "1.40.0", + "@theia/request": "1.41.0", "@types/fs-extra": "^4.0.2", "@types/semver": "^7.5.0", "@types/write-json-file": "^2.2.1", @@ -42,7 +42,7 @@ "write-json-file": "^2.2.0" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/dev-packages/cli/package.json b/dev-packages/cli/package.json index 4860fb380d8a0..a14ea3ccae310 100644 --- a/dev-packages/cli/package.json +++ b/dev-packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@theia/cli", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia CLI.", "publishConfig": { "access": "public" @@ -30,12 +30,12 @@ "clean": "theiaext clean" }, "dependencies": { - "@theia/application-manager": "1.40.0", - "@theia/application-package": "1.40.0", - "@theia/ffmpeg": "1.40.0", - "@theia/localization-manager": "1.40.0", - "@theia/ovsx-client": "1.40.0", - "@theia/request": "1.40.0", + "@theia/application-manager": "1.41.0", + "@theia/application-package": "1.41.0", + "@theia/ffmpeg": "1.41.0", + "@theia/localization-manager": "1.41.0", + "@theia/ovsx-client": "1.41.0", + "@theia/request": "1.41.0", "@types/chai": "^4.2.7", "@types/mocha": "^10.0.0", "@types/node-fetch": "^2.5.7", diff --git a/dev-packages/ffmpeg/package.json b/dev-packages/ffmpeg/package.json index c20cfceb30c03..c0a8f03607d6a 100644 --- a/dev-packages/ffmpeg/package.json +++ b/dev-packages/ffmpeg/package.json @@ -1,6 +1,6 @@ { "name": "@theia/ffmpeg", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia FFMPEG reader utility.", "publishConfig": { "access": "public" diff --git a/dev-packages/localization-manager/package.json b/dev-packages/localization-manager/package.json index d32433572e50c..3a2abf11da7ca 100644 --- a/dev-packages/localization-manager/package.json +++ b/dev-packages/localization-manager/package.json @@ -1,6 +1,6 @@ { "name": "@theia/localization-manager", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia localization manager API.", "publishConfig": { "access": "public" @@ -39,7 +39,7 @@ "typescript": "~4.5.5" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/dev-packages/native-webpack-plugin/package.json b/dev-packages/native-webpack-plugin/package.json index db21e5f3d3da8..fcc877e50732d 100644 --- a/dev-packages/native-webpack-plugin/package.json +++ b/dev-packages/native-webpack-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@theia/native-webpack-plugin", - "version": "1.40.0", + "version": "1.41.0", "description": "Webpack Plugin for native dependencies of Theia.", "publishConfig": { "access": "public" diff --git a/dev-packages/ovsx-client/package.json b/dev-packages/ovsx-client/package.json index 48f53aa6b32a7..d2e08c2176a74 100644 --- a/dev-packages/ovsx-client/package.json +++ b/dev-packages/ovsx-client/package.json @@ -1,6 +1,6 @@ { "name": "@theia/ovsx-client", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia Open-VSX Client", "publishConfig": { "access": "public" @@ -29,7 +29,7 @@ "watch": "theiaext watch" }, "dependencies": { - "@theia/request": "1.40.0", + "@theia/request": "1.41.0", "semver": "^7.5.4" } } diff --git a/dev-packages/private-eslint-plugin/package.json b/dev-packages/private-eslint-plugin/package.json index 7e9ed91011d99..ad21605572265 100644 --- a/dev-packages/private-eslint-plugin/package.json +++ b/dev-packages/private-eslint-plugin/package.json @@ -1,16 +1,16 @@ { "private": true, "name": "@theia/eslint-plugin", - "version": "1.40.0", + "version": "1.41.0", "description": "Custom ESLint rules for developing Theia extensions and applications", "main": "index.js", "scripts": { "prepare": "tsc -b" }, "dependencies": { - "@theia/core": "1.40.0", - "@theia/ext-scripts": "1.40.0", - "@theia/re-exports": "1.40.0", + "@theia/core": "1.41.0", + "@theia/ext-scripts": "1.41.0", + "@theia/re-exports": "1.41.0", "js-levenshtein": "^1.1.6" } } diff --git a/dev-packages/private-ext-scripts/package.json b/dev-packages/private-ext-scripts/package.json index 015216520d17f..f24c849c012bf 100644 --- a/dev-packages/private-ext-scripts/package.json +++ b/dev-packages/private-ext-scripts/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "@theia/ext-scripts", - "version": "1.40.0", + "version": "1.41.0", "license": "EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0", "description": "NPM scripts for Theia packages.", "bin": { diff --git a/dev-packages/private-re-exports/package.json b/dev-packages/private-re-exports/package.json index 41e72b8470a72..eedbd4110d20f 100644 --- a/dev-packages/private-re-exports/package.json +++ b/dev-packages/private-re-exports/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "@theia/re-exports", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia re-export helper functions and scripts.", "main": "lib/index.js", "engines": { diff --git a/dev-packages/request/package.json b/dev-packages/request/package.json index 91c5cdc96f129..1e1cfd301927a 100644 --- a/dev-packages/request/package.json +++ b/dev-packages/request/package.json @@ -1,6 +1,6 @@ { "name": "@theia/request", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia Proxy-Aware Request Service", "publishConfig": { "access": "public" diff --git a/examples/api-samples/package.json b/examples/api-samples/package.json index b3c0ba3d7fd73..8a832638ab2c7 100644 --- a/examples/api-samples/package.json +++ b/examples/api-samples/package.json @@ -1,20 +1,20 @@ { "private": true, "name": "@theia/api-samples", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Example code to demonstrate Theia API", "dependencies": { - "@theia/core": "1.40.0", - "@theia/file-search": "1.40.0", - "@theia/filesystem": "1.40.0", - "@theia/monaco": "1.40.0", + "@theia/core": "1.41.0", + "@theia/file-search": "1.41.0", + "@theia/filesystem": "1.41.0", + "@theia/monaco": "1.41.0", "@theia/monaco-editor-core": "1.72.3", - "@theia/output": "1.40.0", - "@theia/ovsx-client": "1.40.0", - "@theia/search-in-workspace": "1.40.0", - "@theia/toolbar": "1.40.0", - "@theia/vsx-registry": "1.40.0", - "@theia/workspace": "1.40.0" + "@theia/output": "1.41.0", + "@theia/ovsx-client": "1.41.0", + "@theia/search-in-workspace": "1.41.0", + "@theia/toolbar": "1.41.0", + "@theia/vsx-registry": "1.41.0", + "@theia/workspace": "1.41.0" }, "theiaExtensions": [ { @@ -53,6 +53,6 @@ "clean": "theiaext clean" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" } } diff --git a/examples/api-tests/package.json b/examples/api-tests/package.json index 647a2a74db8b4..f8ee941c97dff 100644 --- a/examples/api-tests/package.json +++ b/examples/api-tests/package.json @@ -1,9 +1,9 @@ { "name": "@theia/api-tests", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia API tests", "dependencies": { - "@theia/core": "1.40.0" + "@theia/core": "1.41.0" }, "license": "EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0", "repository": { diff --git a/examples/browser/package.json b/examples/browser/package.json index 00bad2b4b44b9..72bf5bc5f3be4 100644 --- a/examples/browser/package.json +++ b/examples/browser/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "@theia/example-browser", - "version": "1.40.0", + "version": "1.41.0", "license": "EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0", "theia": { "frontend": { @@ -14,50 +14,50 @@ } }, "dependencies": { - "@theia/api-samples": "1.40.0", - "@theia/bulk-edit": "1.40.0", - "@theia/callhierarchy": "1.40.0", - "@theia/console": "1.40.0", - "@theia/core": "1.40.0", - "@theia/debug": "1.40.0", - "@theia/editor": "1.40.0", - "@theia/editor-preview": "1.40.0", - "@theia/file-search": "1.40.0", - "@theia/filesystem": "1.40.0", - "@theia/getting-started": "1.40.0", - "@theia/git": "1.40.0", - "@theia/keymaps": "1.40.0", - "@theia/markers": "1.40.0", - "@theia/memory-inspector": "1.40.0", - "@theia/messages": "1.40.0", - "@theia/metrics": "1.40.0", - "@theia/mini-browser": "1.40.0", - "@theia/monaco": "1.40.0", - "@theia/navigator": "1.40.0", - "@theia/notebook": "1.40.0", - "@theia/outline-view": "1.40.0", - "@theia/output": "1.40.0", - "@theia/plugin-dev": "1.40.0", - "@theia/plugin-ext": "1.40.0", - "@theia/plugin-ext-vscode": "1.40.0", - "@theia/plugin-metrics": "1.40.0", - "@theia/preferences": "1.40.0", - "@theia/preview": "1.40.0", - "@theia/process": "1.40.0", - "@theia/property-view": "1.40.0", - "@theia/scm": "1.40.0", - "@theia/scm-extra": "1.40.0", - "@theia/search-in-workspace": "1.40.0", - "@theia/secondary-window": "1.40.0", - "@theia/task": "1.40.0", - "@theia/terminal": "1.40.0", - "@theia/timeline": "1.40.0", - "@theia/toolbar": "1.40.0", - "@theia/typehierarchy": "1.40.0", - "@theia/userstorage": "1.40.0", - "@theia/variable-resolver": "1.40.0", - "@theia/vsx-registry": "1.40.0", - "@theia/workspace": "1.40.0" + "@theia/api-samples": "1.41.0", + "@theia/bulk-edit": "1.41.0", + "@theia/callhierarchy": "1.41.0", + "@theia/console": "1.41.0", + "@theia/core": "1.41.0", + "@theia/debug": "1.41.0", + "@theia/editor": "1.41.0", + "@theia/editor-preview": "1.41.0", + "@theia/file-search": "1.41.0", + "@theia/filesystem": "1.41.0", + "@theia/getting-started": "1.41.0", + "@theia/git": "1.41.0", + "@theia/keymaps": "1.41.0", + "@theia/markers": "1.41.0", + "@theia/memory-inspector": "1.41.0", + "@theia/messages": "1.41.0", + "@theia/metrics": "1.41.0", + "@theia/mini-browser": "1.41.0", + "@theia/monaco": "1.41.0", + "@theia/navigator": "1.41.0", + "@theia/notebook": "1.41.0", + "@theia/outline-view": "1.41.0", + "@theia/output": "1.41.0", + "@theia/plugin-dev": "1.41.0", + "@theia/plugin-ext": "1.41.0", + "@theia/plugin-ext-vscode": "1.41.0", + "@theia/plugin-metrics": "1.41.0", + "@theia/preferences": "1.41.0", + "@theia/preview": "1.41.0", + "@theia/process": "1.41.0", + "@theia/property-view": "1.41.0", + "@theia/scm": "1.41.0", + "@theia/scm-extra": "1.41.0", + "@theia/search-in-workspace": "1.41.0", + "@theia/secondary-window": "1.41.0", + "@theia/task": "1.41.0", + "@theia/terminal": "1.41.0", + "@theia/timeline": "1.41.0", + "@theia/toolbar": "1.41.0", + "@theia/typehierarchy": "1.41.0", + "@theia/userstorage": "1.41.0", + "@theia/variable-resolver": "1.41.0", + "@theia/vsx-registry": "1.41.0", + "@theia/workspace": "1.41.0" }, "scripts": { "clean": "theia clean", @@ -78,6 +78,6 @@ "watch:compile": "tsc -b -w" }, "devDependencies": { - "@theia/cli": "1.40.0" + "@theia/cli": "1.41.0" } } diff --git a/examples/electron/package.json b/examples/electron/package.json index 133d463fad7e6..5a0dd1c27d76a 100644 --- a/examples/electron/package.json +++ b/examples/electron/package.json @@ -2,7 +2,7 @@ "private": true, "name": "@theia/example-electron", "productName": "Theia Electron Example", - "version": "1.40.0", + "version": "1.41.0", "main": "lib/backend/electron-main.js", "license": "EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0", "theia": { @@ -14,50 +14,50 @@ } }, "dependencies": { - "@theia/api-samples": "1.40.0", - "@theia/bulk-edit": "1.40.0", - "@theia/callhierarchy": "1.40.0", - "@theia/console": "1.40.0", - "@theia/core": "1.40.0", - "@theia/debug": "1.40.0", - "@theia/editor": "1.40.0", - "@theia/editor-preview": "1.40.0", - "@theia/electron": "1.40.0", - "@theia/external-terminal": "1.40.0", - "@theia/file-search": "1.40.0", - "@theia/filesystem": "1.40.0", - "@theia/getting-started": "1.40.0", - "@theia/git": "1.40.0", - "@theia/keymaps": "1.40.0", - "@theia/markers": "1.40.0", - "@theia/memory-inspector": "1.40.0", - "@theia/messages": "1.40.0", - "@theia/metrics": "1.40.0", - "@theia/mini-browser": "1.40.0", - "@theia/monaco": "1.40.0", - "@theia/navigator": "1.40.0", - "@theia/outline-view": "1.40.0", - "@theia/output": "1.40.0", - "@theia/plugin-dev": "1.40.0", - "@theia/plugin-ext": "1.40.0", - "@theia/plugin-ext-vscode": "1.40.0", - "@theia/preferences": "1.40.0", - "@theia/preview": "1.40.0", - "@theia/process": "1.40.0", - "@theia/property-view": "1.40.0", - "@theia/scm": "1.40.0", - "@theia/scm-extra": "1.40.0", - "@theia/search-in-workspace": "1.40.0", - "@theia/secondary-window": "1.40.0", - "@theia/task": "1.40.0", - "@theia/terminal": "1.40.0", - "@theia/timeline": "1.40.0", - "@theia/toolbar": "1.40.0", - "@theia/typehierarchy": "1.40.0", - "@theia/userstorage": "1.40.0", - "@theia/variable-resolver": "1.40.0", - "@theia/vsx-registry": "1.40.0", - "@theia/workspace": "1.40.0" + "@theia/api-samples": "1.41.0", + "@theia/bulk-edit": "1.41.0", + "@theia/callhierarchy": "1.41.0", + "@theia/console": "1.41.0", + "@theia/core": "1.41.0", + "@theia/debug": "1.41.0", + "@theia/editor": "1.41.0", + "@theia/editor-preview": "1.41.0", + "@theia/electron": "1.41.0", + "@theia/external-terminal": "1.41.0", + "@theia/file-search": "1.41.0", + "@theia/filesystem": "1.41.0", + "@theia/getting-started": "1.41.0", + "@theia/git": "1.41.0", + "@theia/keymaps": "1.41.0", + "@theia/markers": "1.41.0", + "@theia/memory-inspector": "1.41.0", + "@theia/messages": "1.41.0", + "@theia/metrics": "1.41.0", + "@theia/mini-browser": "1.41.0", + "@theia/monaco": "1.41.0", + "@theia/navigator": "1.41.0", + "@theia/outline-view": "1.41.0", + "@theia/output": "1.41.0", + "@theia/plugin-dev": "1.41.0", + "@theia/plugin-ext": "1.41.0", + "@theia/plugin-ext-vscode": "1.41.0", + "@theia/preferences": "1.41.0", + "@theia/preview": "1.41.0", + "@theia/process": "1.41.0", + "@theia/property-view": "1.41.0", + "@theia/scm": "1.41.0", + "@theia/scm-extra": "1.41.0", + "@theia/search-in-workspace": "1.41.0", + "@theia/secondary-window": "1.41.0", + "@theia/task": "1.41.0", + "@theia/terminal": "1.41.0", + "@theia/timeline": "1.41.0", + "@theia/toolbar": "1.41.0", + "@theia/typehierarchy": "1.41.0", + "@theia/userstorage": "1.41.0", + "@theia/variable-resolver": "1.41.0", + "@theia/vsx-registry": "1.41.0", + "@theia/workspace": "1.41.0" }, "scripts": { "build": "yarn -s compile && yarn -s bundle", @@ -75,7 +75,7 @@ "watch:compile": "tsc -b -w" }, "devDependencies": { - "@theia/cli": "1.40.0", + "@theia/cli": "1.41.0", "electron": "^23.2.4" } } diff --git a/examples/playwright/package.json b/examples/playwright/package.json index 190afc368a583..9e8c0d76c28c7 100644 --- a/examples/playwright/package.json +++ b/examples/playwright/package.json @@ -1,6 +1,6 @@ { "name": "@theia/playwright", - "version": "1.40.0", + "version": "1.41.0", "description": "System tests for Theia", "license": "EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0", "repository": { diff --git a/lerna.json b/lerna.json index 186d5552f5f19..3143eb58b7c7c 100644 --- a/lerna.json +++ b/lerna.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/lerna.json", "npmClient": "yarn", - "version": "1.40.0", + "version": "1.41.0", "command": { "run": { "stream": true diff --git a/packages/bulk-edit/package.json b/packages/bulk-edit/package.json index 03fbd002c2dfa..1bc551d5a6bd2 100644 --- a/packages/bulk-edit/package.json +++ b/packages/bulk-edit/package.json @@ -1,14 +1,14 @@ { "name": "@theia/bulk-edit", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Bulk Edit Extension", "dependencies": { - "@theia/core": "1.40.0", - "@theia/editor": "1.40.0", - "@theia/filesystem": "1.40.0", - "@theia/monaco": "1.40.0", + "@theia/core": "1.41.0", + "@theia/editor": "1.41.0", + "@theia/filesystem": "1.41.0", + "@theia/monaco": "1.41.0", "@theia/monaco-editor-core": "1.72.3", - "@theia/workspace": "1.40.0" + "@theia/workspace": "1.41.0" }, "publishConfig": { "access": "public" @@ -43,7 +43,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/callhierarchy/package.json b/packages/callhierarchy/package.json index 16fac4c219a5c..825bde0e0a7ac 100644 --- a/packages/callhierarchy/package.json +++ b/packages/callhierarchy/package.json @@ -1,10 +1,10 @@ { "name": "@theia/callhierarchy", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Call Hierarchy Extension", "dependencies": { - "@theia/core": "1.40.0", - "@theia/editor": "1.40.0", + "@theia/core": "1.41.0", + "@theia/editor": "1.41.0", "ts-md5": "^1.2.2" }, "publishConfig": { @@ -40,7 +40,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/console/package.json b/packages/console/package.json index ec36e1e156f38..8d1510693b36e 100644 --- a/packages/console/package.json +++ b/packages/console/package.json @@ -1,10 +1,10 @@ { "name": "@theia/console", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Console Extension", "dependencies": { - "@theia/core": "1.40.0", - "@theia/monaco": "1.40.0", + "@theia/core": "1.41.0", + "@theia/monaco": "1.41.0", "@theia/monaco-editor-core": "1.72.3", "anser": "^2.0.1" }, @@ -41,7 +41,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/core/package.json b/packages/core/package.json index b271d30e0b901..b140844f0865e 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@theia/core", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia is a cloud & desktop IDE framework implemented in TypeScript.", "main": "lib/common/index.js", "typings": "lib/common/index.d.ts", @@ -16,8 +16,8 @@ "@phosphor/signaling": "1", "@phosphor/virtualdom": "1", "@phosphor/widgets": "1", - "@theia/application-package": "1.40.0", - "@theia/request": "1.40.0", + "@theia/application-package": "1.41.0", + "@theia/request": "1.41.0", "@types/body-parser": "^1.16.4", "@types/cookie": "^0.3.3", "@types/dompurify": "^2.2.2", @@ -199,8 +199,8 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0", - "@theia/re-exports": "1.40.0", + "@theia/ext-scripts": "1.41.0", + "@theia/re-exports": "1.41.0", "minimist": "^1.2.0" }, "nyc": { diff --git a/packages/debug/package.json b/packages/debug/package.json index 7409bae47978f..7e22a95fb8ca0 100644 --- a/packages/debug/package.json +++ b/packages/debug/package.json @@ -1,21 +1,21 @@ { "name": "@theia/debug", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Debug Extension", "dependencies": { - "@theia/console": "1.40.0", - "@theia/core": "1.40.0", - "@theia/editor": "1.40.0", - "@theia/filesystem": "1.40.0", - "@theia/markers": "1.40.0", - "@theia/monaco": "1.40.0", + "@theia/console": "1.41.0", + "@theia/core": "1.41.0", + "@theia/editor": "1.41.0", + "@theia/filesystem": "1.41.0", + "@theia/markers": "1.41.0", + "@theia/monaco": "1.41.0", "@theia/monaco-editor-core": "1.72.3", - "@theia/output": "1.40.0", - "@theia/process": "1.40.0", - "@theia/task": "1.40.0", - "@theia/terminal": "1.40.0", - "@theia/variable-resolver": "1.40.0", - "@theia/workspace": "1.40.0", + "@theia/output": "1.41.0", + "@theia/process": "1.41.0", + "@theia/task": "1.41.0", + "@theia/terminal": "1.41.0", + "@theia/variable-resolver": "1.41.0", + "@theia/workspace": "1.41.0", "@vscode/debugprotocol": "^1.51.0", "fast-deep-equal": "^3.1.3", "jsonc-parser": "^2.2.0", @@ -56,7 +56,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/editor-preview/package.json b/packages/editor-preview/package.json index 0ab6a4be1ab46..0c4af3164bddb 100644 --- a/packages/editor-preview/package.json +++ b/packages/editor-preview/package.json @@ -1,11 +1,11 @@ { "name": "@theia/editor-preview", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Editor Preview Extension", "dependencies": { - "@theia/core": "1.40.0", - "@theia/editor": "1.40.0", - "@theia/navigator": "1.40.0" + "@theia/core": "1.41.0", + "@theia/editor": "1.41.0", + "@theia/navigator": "1.41.0" }, "publishConfig": { "access": "public" @@ -40,7 +40,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/editor/package.json b/packages/editor/package.json index 89da6ecb30307..dc369512e41c5 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -1,10 +1,10 @@ { "name": "@theia/editor", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Editor Extension", "dependencies": { - "@theia/core": "1.40.0", - "@theia/variable-resolver": "1.40.0" + "@theia/core": "1.41.0", + "@theia/variable-resolver": "1.41.0" }, "publishConfig": { "access": "public" @@ -39,7 +39,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/electron/package.json b/packages/electron/package.json index e9a80211172c9..fa429d7f5558d 100644 --- a/packages/electron/package.json +++ b/packages/electron/package.json @@ -1,6 +1,6 @@ { "name": "@theia/electron", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Electron utility package", "dependencies": { "electron-store": "^8.0.0", @@ -8,8 +8,8 @@ "native-keymap": "^2.2.1" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0", - "@theia/re-exports": "1.40.0" + "@theia/ext-scripts": "1.41.0", + "@theia/re-exports": "1.41.0" }, "peerDependencies": { "electron": "^23.2.4" diff --git a/packages/external-terminal/package.json b/packages/external-terminal/package.json index 9320eb56336cc..1b3c75691792d 100644 --- a/packages/external-terminal/package.json +++ b/packages/external-terminal/package.json @@ -1,11 +1,11 @@ { "name": "@theia/external-terminal", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - External Terminal Extension", "dependencies": { - "@theia/core": "1.40.0", - "@theia/editor": "1.40.0", - "@theia/workspace": "1.40.0" + "@theia/core": "1.41.0", + "@theia/editor": "1.41.0", + "@theia/workspace": "1.41.0" }, "publishConfig": { "access": "public" @@ -41,7 +41,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/file-search/package.json b/packages/file-search/package.json index 1dcaaafab1675..13603a6927181 100644 --- a/packages/file-search/package.json +++ b/packages/file-search/package.json @@ -1,13 +1,13 @@ { "name": "@theia/file-search", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - File Search Extension", "dependencies": { - "@theia/core": "1.40.0", - "@theia/editor": "1.40.0", - "@theia/filesystem": "1.40.0", - "@theia/process": "1.40.0", - "@theia/workspace": "1.40.0", + "@theia/core": "1.41.0", + "@theia/editor": "1.41.0", + "@theia/filesystem": "1.41.0", + "@theia/process": "1.41.0", + "@theia/workspace": "1.41.0", "@vscode/ripgrep": "^1.14.2" }, "publishConfig": { @@ -44,7 +44,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/filesystem/package.json b/packages/filesystem/package.json index 095a9b9a2421b..09a5d76cb76d6 100644 --- a/packages/filesystem/package.json +++ b/packages/filesystem/package.json @@ -1,9 +1,9 @@ { "name": "@theia/filesystem", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - FileSystem Extension", "dependencies": { - "@theia/core": "1.40.0", + "@theia/core": "1.41.0", "@types/body-parser": "^1.17.0", "@types/multer": "^1.4.7", "@types/rimraf": "^2.0.2", @@ -68,7 +68,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/getting-started/package.json b/packages/getting-started/package.json index b568750714cdc..99fa988732cc0 100644 --- a/packages/getting-started/package.json +++ b/packages/getting-started/package.json @@ -1,14 +1,14 @@ { "name": "@theia/getting-started", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - GettingStarted Extension", "dependencies": { - "@theia/core": "1.40.0", - "@theia/editor": "1.40.0", - "@theia/filesystem": "1.40.0", - "@theia/keymaps": "1.40.0", - "@theia/preview": "1.40.0", - "@theia/workspace": "1.40.0" + "@theia/core": "1.41.0", + "@theia/editor": "1.41.0", + "@theia/filesystem": "1.41.0", + "@theia/keymaps": "1.41.0", + "@theia/preview": "1.41.0", + "@theia/workspace": "1.41.0" }, "publishConfig": { "access": "public" @@ -44,7 +44,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/git/package.json b/packages/git/package.json index eddb6574bb9b8..eb1d43075f3e7 100644 --- a/packages/git/package.json +++ b/packages/git/package.json @@ -1,16 +1,16 @@ { "name": "@theia/git", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Git Integration", "dependencies": { - "@theia/core": "1.40.0", - "@theia/editor": "1.40.0", - "@theia/filesystem": "1.40.0", + "@theia/core": "1.41.0", + "@theia/editor": "1.41.0", + "@theia/filesystem": "1.41.0", "@theia/monaco-editor-core": "1.72.3", - "@theia/navigator": "1.40.0", - "@theia/scm": "1.40.0", - "@theia/scm-extra": "1.40.0", - "@theia/workspace": "1.40.0", + "@theia/navigator": "1.41.0", + "@theia/scm": "1.41.0", + "@theia/scm-extra": "1.41.0", + "@theia/workspace": "1.41.0", "@types/diff": "^3.2.2", "@types/p-queue": "^2.3.1", "diff": "^3.4.0", @@ -66,7 +66,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0", + "@theia/ext-scripts": "1.41.0", "@types/luxon": "^2.3.2", "upath": "^1.0.2" }, diff --git a/packages/keymaps/package.json b/packages/keymaps/package.json index fba38a6df3017..ce5ed10f7f912 100644 --- a/packages/keymaps/package.json +++ b/packages/keymaps/package.json @@ -1,17 +1,17 @@ { "name": "@theia/keymaps", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Custom Keymaps Extension", "dependencies": { - "@theia/core": "1.40.0", - "@theia/monaco": "1.40.0", + "@theia/core": "1.41.0", + "@theia/monaco": "1.41.0", "@theia/monaco-editor-core": "1.72.3", - "@theia/preferences": "1.40.0", - "@theia/userstorage": "1.40.0", + "@theia/preferences": "1.41.0", + "@theia/userstorage": "1.41.0", "jsonc-parser": "^2.2.0" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "publishConfig": { "access": "public" diff --git a/packages/markers/package.json b/packages/markers/package.json index 083102b88e31e..b7ae02ca85806 100644 --- a/packages/markers/package.json +++ b/packages/markers/package.json @@ -1,11 +1,11 @@ { "name": "@theia/markers", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Markers Extension", "dependencies": { - "@theia/core": "1.40.0", - "@theia/filesystem": "1.40.0", - "@theia/workspace": "1.40.0" + "@theia/core": "1.41.0", + "@theia/filesystem": "1.41.0", + "@theia/workspace": "1.41.0" }, "publishConfig": { "access": "public" @@ -40,7 +40,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/memory-inspector/package.json b/packages/memory-inspector/package.json index 0a203b6c24a28..34243a7618662 100644 --- a/packages/memory-inspector/package.json +++ b/packages/memory-inspector/package.json @@ -1,6 +1,6 @@ { "name": "@theia/memory-inspector", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Memory Inspector", "keywords": [ "theia-extension" @@ -27,8 +27,8 @@ "watch": "theiaext watch" }, "dependencies": { - "@theia/core": "1.40.0", - "@theia/debug": "1.40.0", + "@theia/core": "1.41.0", + "@theia/debug": "1.41.0", "@vscode/debugprotocol": "^1.51.0", "long": "^4.0.0" }, diff --git a/packages/messages/package.json b/packages/messages/package.json index 7f004b70353e5..89e18bb33d394 100644 --- a/packages/messages/package.json +++ b/packages/messages/package.json @@ -1,9 +1,9 @@ { "name": "@theia/messages", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Messages Extension", "dependencies": { - "@theia/core": "1.40.0", + "@theia/core": "1.41.0", "react-perfect-scrollbar": "^1.5.3", "ts-md5": "^1.2.2" }, @@ -40,7 +40,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/metrics/package.json b/packages/metrics/package.json index 4a833c1492295..1df9745f8e4c2 100644 --- a/packages/metrics/package.json +++ b/packages/metrics/package.json @@ -1,9 +1,9 @@ { "name": "@theia/metrics", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Metrics Extension", "dependencies": { - "@theia/core": "1.40.0", + "@theia/core": "1.41.0", "prom-client": "^10.2.0" }, "publishConfig": { @@ -40,7 +40,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/mini-browser/package.json b/packages/mini-browser/package.json index bcf81b254a2c3..71350d9ef65ee 100644 --- a/packages/mini-browser/package.json +++ b/packages/mini-browser/package.json @@ -1,10 +1,10 @@ { "name": "@theia/mini-browser", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Mini-Browser Extension", "dependencies": { - "@theia/core": "1.40.0", - "@theia/filesystem": "1.40.0", + "@theia/core": "1.41.0", + "@theia/filesystem": "1.41.0", "@types/mime-types": "^2.1.0", "mime-types": "^2.1.18", "pdfobject": "^2.0.201604172", @@ -49,7 +49,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/monaco/package.json b/packages/monaco/package.json index e87f021f1954f..ff6c0edb7b663 100644 --- a/packages/monaco/package.json +++ b/packages/monaco/package.json @@ -1,14 +1,14 @@ { "name": "@theia/monaco", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Monaco Extension", "dependencies": { - "@theia/core": "1.40.0", - "@theia/editor": "1.40.0", - "@theia/filesystem": "1.40.0", - "@theia/markers": "1.40.0", + "@theia/core": "1.41.0", + "@theia/editor": "1.41.0", + "@theia/filesystem": "1.41.0", + "@theia/markers": "1.41.0", "@theia/monaco-editor-core": "1.72.3", - "@theia/outline-view": "1.40.0", + "@theia/outline-view": "1.41.0", "fast-plist": "^0.1.2", "idb": "^4.0.5", "jsonc-parser": "^2.2.0", @@ -49,7 +49,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/navigator/package.json b/packages/navigator/package.json index ee04252dca0af..6ba90ed29a2bd 100644 --- a/packages/navigator/package.json +++ b/packages/navigator/package.json @@ -1,11 +1,11 @@ { "name": "@theia/navigator", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Navigator Extension", "dependencies": { - "@theia/core": "1.40.0", - "@theia/filesystem": "1.40.0", - "@theia/workspace": "1.40.0", + "@theia/core": "1.41.0", + "@theia/filesystem": "1.41.0", + "@theia/workspace": "1.41.0", "minimatch": "^5.1.0" }, "publishConfig": { @@ -44,7 +44,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/notebook/package.json b/packages/notebook/package.json index 34cc9629e9bbd..b8c3ef9d21f6c 100644 --- a/packages/notebook/package.json +++ b/packages/notebook/package.json @@ -1,12 +1,12 @@ { "name": "@theia/notebook", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Notebook Extension", "dependencies": { - "@theia/core": "1.40.0", - "@theia/editor": "1.40.0", - "@theia/filesystem": "1.40.0", - "@theia/monaco": "1.40.0", + "@theia/core": "1.41.0", + "@theia/editor": "1.41.0", + "@theia/filesystem": "1.41.0", + "@theia/monaco": "1.41.0", "uuid": "^8.3.2" }, "publishConfig": { @@ -42,7 +42,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0", + "@theia/ext-scripts": "1.41.0", "@types/vscode-notebook-renderer": "^1.72.0" }, "nyc": { diff --git a/packages/outline-view/package.json b/packages/outline-view/package.json index bcc2008ac7d51..dcf9876c1bb51 100644 --- a/packages/outline-view/package.json +++ b/packages/outline-view/package.json @@ -1,9 +1,9 @@ { "name": "@theia/outline-view", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Outline View Extension", "dependencies": { - "@theia/core": "1.40.0" + "@theia/core": "1.41.0" }, "publishConfig": { "access": "public" @@ -38,7 +38,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/output/package.json b/packages/output/package.json index 3e58c1de935ea..285a0f7a965c6 100644 --- a/packages/output/package.json +++ b/packages/output/package.json @@ -1,11 +1,11 @@ { "name": "@theia/output", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Output Extension", "dependencies": { - "@theia/core": "1.40.0", - "@theia/editor": "1.40.0", - "@theia/monaco": "1.40.0", + "@theia/core": "1.41.0", + "@theia/editor": "1.41.0", + "@theia/monaco": "1.41.0", "@theia/monaco-editor-core": "1.72.3", "@types/p-queue": "^2.3.1", "p-queue": "^2.4.2" @@ -43,7 +43,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/plugin-dev/package.json b/packages/plugin-dev/package.json index 37036bd6156a0..cb53fd3f248c6 100644 --- a/packages/plugin-dev/package.json +++ b/packages/plugin-dev/package.json @@ -1,16 +1,16 @@ { "name": "@theia/plugin-dev", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Plugin Development Extension", "main": "lib/common/index.js", "typings": "lib/common/index.d.ts", "dependencies": { - "@theia/core": "1.40.0", - "@theia/debug": "1.40.0", - "@theia/filesystem": "1.40.0", - "@theia/output": "1.40.0", - "@theia/plugin-ext": "1.40.0", - "@theia/workspace": "1.40.0", + "@theia/core": "1.41.0", + "@theia/debug": "1.41.0", + "@theia/filesystem": "1.41.0", + "@theia/output": "1.41.0", + "@theia/plugin-ext": "1.41.0", + "@theia/workspace": "1.41.0", "ps-tree": "^1.2.0" }, "publishConfig": { @@ -48,7 +48,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/plugin-ext-vscode/package.json b/packages/plugin-ext-vscode/package.json index cc6f186c25ed0..c9d08a06cff44 100644 --- a/packages/plugin-ext-vscode/package.json +++ b/packages/plugin-ext-vscode/package.json @@ -1,21 +1,21 @@ { "name": "@theia/plugin-ext-vscode", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Plugin Extension for VsCode", "dependencies": { - "@theia/callhierarchy": "1.40.0", - "@theia/core": "1.40.0", - "@theia/editor": "1.40.0", - "@theia/filesystem": "1.40.0", - "@theia/monaco": "1.40.0", + "@theia/callhierarchy": "1.41.0", + "@theia/core": "1.41.0", + "@theia/editor": "1.41.0", + "@theia/filesystem": "1.41.0", + "@theia/monaco": "1.41.0", "@theia/monaco-editor-core": "1.72.3", - "@theia/navigator": "1.40.0", - "@theia/plugin": "1.40.0", - "@theia/plugin-ext": "1.40.0", - "@theia/terminal": "1.40.0", - "@theia/typehierarchy": "1.40.0", - "@theia/userstorage": "1.40.0", - "@theia/workspace": "1.40.0", + "@theia/navigator": "1.41.0", + "@theia/plugin": "1.41.0", + "@theia/plugin-ext": "1.41.0", + "@theia/terminal": "1.41.0", + "@theia/typehierarchy": "1.41.0", + "@theia/userstorage": "1.41.0", + "@theia/workspace": "1.41.0", "filenamify": "^4.1.0" }, "publishConfig": { @@ -52,7 +52,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/plugin-ext/package.json b/packages/plugin-ext/package.json index 4c207f83842f9..951091e0da1e3 100644 --- a/packages/plugin-ext/package.json +++ b/packages/plugin-ext/package.json @@ -1,36 +1,36 @@ { "name": "@theia/plugin-ext", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Plugin Extension", "main": "lib/common/index.js", "typings": "lib/common/index.d.ts", "dependencies": { - "@theia/bulk-edit": "1.40.0", - "@theia/callhierarchy": "1.40.0", - "@theia/console": "1.40.0", - "@theia/core": "1.40.0", - "@theia/debug": "1.40.0", - "@theia/editor": "1.40.0", - "@theia/editor-preview": "1.40.0", - "@theia/file-search": "1.40.0", - "@theia/filesystem": "1.40.0", - "@theia/markers": "1.40.0", - "@theia/messages": "1.40.0", - "@theia/monaco": "1.40.0", + "@theia/bulk-edit": "1.41.0", + "@theia/callhierarchy": "1.41.0", + "@theia/console": "1.41.0", + "@theia/core": "1.41.0", + "@theia/debug": "1.41.0", + "@theia/editor": "1.41.0", + "@theia/editor-preview": "1.41.0", + "@theia/file-search": "1.41.0", + "@theia/filesystem": "1.41.0", + "@theia/markers": "1.41.0", + "@theia/messages": "1.41.0", + "@theia/monaco": "1.41.0", "@theia/monaco-editor-core": "1.72.3", - "@theia/navigator": "1.40.0", - "@theia/notebook": "1.40.0", - "@theia/output": "1.40.0", - "@theia/plugin": "1.40.0", - "@theia/preferences": "1.40.0", - "@theia/scm": "1.40.0", - "@theia/search-in-workspace": "1.40.0", - "@theia/task": "1.40.0", - "@theia/terminal": "1.40.0", - "@theia/timeline": "1.40.0", - "@theia/typehierarchy": "1.40.0", - "@theia/variable-resolver": "1.40.0", - "@theia/workspace": "1.40.0", + "@theia/navigator": "1.41.0", + "@theia/notebook": "1.41.0", + "@theia/output": "1.41.0", + "@theia/plugin": "1.41.0", + "@theia/preferences": "1.41.0", + "@theia/scm": "1.41.0", + "@theia/search-in-workspace": "1.41.0", + "@theia/task": "1.41.0", + "@theia/terminal": "1.41.0", + "@theia/timeline": "1.41.0", + "@theia/typehierarchy": "1.41.0", + "@theia/variable-resolver": "1.41.0", + "@theia/workspace": "1.41.0", "@types/mime": "^2.0.1", "@vscode/debugprotocol": "^1.51.0", "@vscode/proxy-agent": "^0.13.2", @@ -87,7 +87,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0", + "@theia/ext-scripts": "1.41.0", "@types/decompress": "^4.2.2", "@types/escape-html": "^0.0.20", "@types/lodash.clonedeep": "^4.5.3", diff --git a/packages/plugin-metrics/package.json b/packages/plugin-metrics/package.json index 0e042a805c9f8..49a39b251e7c8 100644 --- a/packages/plugin-metrics/package.json +++ b/packages/plugin-metrics/package.json @@ -1,13 +1,13 @@ { "name": "@theia/plugin-metrics", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Plugin Metrics", "dependencies": { - "@theia/core": "1.40.0", - "@theia/metrics": "1.40.0", + "@theia/core": "1.41.0", + "@theia/metrics": "1.41.0", "@theia/monaco-editor-core": "1.72.3", - "@theia/plugin": "1.40.0", - "@theia/plugin-ext": "1.40.0" + "@theia/plugin": "1.41.0", + "@theia/plugin-ext": "1.41.0" }, "publishConfig": { "access": "public" @@ -43,7 +43,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/plugin/package.json b/packages/plugin/package.json index 0320bc6836998..e54c52f5d9591 100644 --- a/packages/plugin/package.json +++ b/packages/plugin/package.json @@ -1,6 +1,6 @@ { "name": "@theia/plugin", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Plugin API", "types": "./src/theia.d.ts", "publishConfig": { @@ -27,7 +27,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/preferences/package.json b/packages/preferences/package.json index 4884c569b0a1c..6677ab4d69268 100644 --- a/packages/preferences/package.json +++ b/packages/preferences/package.json @@ -1,15 +1,15 @@ { "name": "@theia/preferences", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Preferences Extension", "dependencies": { - "@theia/core": "1.40.0", - "@theia/editor": "1.40.0", - "@theia/filesystem": "1.40.0", - "@theia/monaco": "1.40.0", + "@theia/core": "1.41.0", + "@theia/editor": "1.41.0", + "@theia/filesystem": "1.41.0", + "@theia/monaco": "1.41.0", "@theia/monaco-editor-core": "1.72.3", - "@theia/userstorage": "1.40.0", - "@theia/workspace": "1.40.0", + "@theia/userstorage": "1.41.0", + "@theia/workspace": "1.41.0", "async-mutex": "^0.3.1", "fast-deep-equal": "^3.1.3", "jsonc-parser": "^2.2.0", @@ -48,7 +48,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/preview/package.json b/packages/preview/package.json index 5881a1ef08147..40c3c500dedf0 100644 --- a/packages/preview/package.json +++ b/packages/preview/package.json @@ -1,12 +1,12 @@ { "name": "@theia/preview", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Preview Extension", "dependencies": { - "@theia/core": "1.40.0", - "@theia/editor": "1.40.0", - "@theia/mini-browser": "1.40.0", - "@theia/monaco": "1.40.0", + "@theia/core": "1.41.0", + "@theia/editor": "1.41.0", + "@theia/mini-browser": "1.41.0", + "@theia/monaco": "1.41.0", "@types/highlight.js": "^10.1.0", "@types/markdown-it-anchor": "^4.0.1", "highlight.js": "10.4.1", @@ -45,7 +45,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/process/package.json b/packages/process/package.json index bb90f4bc74987..af23ff866f193 100644 --- a/packages/process/package.json +++ b/packages/process/package.json @@ -1,9 +1,9 @@ { "name": "@theia/process", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia process support.", "dependencies": { - "@theia/core": "1.40.0", + "@theia/core": "1.41.0", "node-pty": "0.11.0-beta17", "string-argv": "^0.1.1" }, @@ -44,7 +44,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/property-view/package.json b/packages/property-view/package.json index 8c459af778092..9569c2bcac5f2 100644 --- a/packages/property-view/package.json +++ b/packages/property-view/package.json @@ -1,10 +1,10 @@ { "name": "@theia/property-view", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Property View Extension", "dependencies": { - "@theia/core": "1.40.0", - "@theia/filesystem": "1.40.0" + "@theia/core": "1.41.0", + "@theia/filesystem": "1.41.0" }, "publishConfig": { "access": "public" @@ -39,7 +39,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/scm-extra/package.json b/packages/scm-extra/package.json index 271bdaf97c801..7b3c0dc641f92 100644 --- a/packages/scm-extra/package.json +++ b/packages/scm-extra/package.json @@ -1,13 +1,13 @@ { "name": "@theia/scm-extra", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Source control extras Extension", "dependencies": { - "@theia/core": "1.40.0", - "@theia/editor": "1.40.0", - "@theia/filesystem": "1.40.0", - "@theia/navigator": "1.40.0", - "@theia/scm": "1.40.0" + "@theia/core": "1.41.0", + "@theia/editor": "1.41.0", + "@theia/filesystem": "1.41.0", + "@theia/navigator": "1.41.0", + "@theia/scm": "1.41.0" }, "publishConfig": { "access": "public" @@ -42,7 +42,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/scm/package.json b/packages/scm/package.json index bf417759de6a0..29d1393540911 100644 --- a/packages/scm/package.json +++ b/packages/scm/package.json @@ -1,11 +1,11 @@ { "name": "@theia/scm", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Source control Extension", "dependencies": { - "@theia/core": "1.40.0", - "@theia/editor": "1.40.0", - "@theia/filesystem": "1.40.0", + "@theia/core": "1.41.0", + "@theia/editor": "1.41.0", + "@theia/filesystem": "1.41.0", "@types/diff": "^3.2.2", "diff": "^3.4.0", "p-debounce": "^2.1.0", @@ -45,7 +45,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/search-in-workspace/package.json b/packages/search-in-workspace/package.json index 99a0290fd8ecc..355b7ecf7c405 100644 --- a/packages/search-in-workspace/package.json +++ b/packages/search-in-workspace/package.json @@ -1,14 +1,14 @@ { "name": "@theia/search-in-workspace", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Search in workspace", "dependencies": { - "@theia/core": "1.40.0", - "@theia/editor": "1.40.0", - "@theia/filesystem": "1.40.0", - "@theia/navigator": "1.40.0", - "@theia/process": "1.40.0", - "@theia/workspace": "1.40.0", + "@theia/core": "1.41.0", + "@theia/editor": "1.41.0", + "@theia/filesystem": "1.41.0", + "@theia/navigator": "1.41.0", + "@theia/process": "1.41.0", + "@theia/workspace": "1.41.0", "@vscode/ripgrep": "^1.14.2", "minimatch": "^5.1.0" }, @@ -46,6 +46,6 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" } } diff --git a/packages/secondary-window/package.json b/packages/secondary-window/package.json index 6ec9140af4302..46db72ace00c2 100644 --- a/packages/secondary-window/package.json +++ b/packages/secondary-window/package.json @@ -1,9 +1,9 @@ { "name": "@theia/secondary-window", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Secondary Window Extension", "dependencies": { - "@theia/core": "1.40.0" + "@theia/core": "1.41.0" }, "publishConfig": { "access": "public" @@ -38,6 +38,6 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" } } diff --git a/packages/task/package.json b/packages/task/package.json index 40c228d2baea8..78b6ee0512420 100644 --- a/packages/task/package.json +++ b/packages/task/package.json @@ -1,19 +1,19 @@ { "name": "@theia/task", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Task extension. This extension adds support for executing raw or terminal processes in the backend.", "dependencies": { - "@theia/core": "1.40.0", - "@theia/editor": "1.40.0", - "@theia/filesystem": "1.40.0", - "@theia/markers": "1.40.0", - "@theia/monaco": "1.40.0", + "@theia/core": "1.41.0", + "@theia/editor": "1.41.0", + "@theia/filesystem": "1.41.0", + "@theia/markers": "1.41.0", + "@theia/monaco": "1.41.0", "@theia/monaco-editor-core": "1.72.3", - "@theia/process": "1.40.0", - "@theia/terminal": "1.40.0", - "@theia/userstorage": "1.40.0", - "@theia/variable-resolver": "1.40.0", - "@theia/workspace": "1.40.0", + "@theia/process": "1.41.0", + "@theia/terminal": "1.41.0", + "@theia/userstorage": "1.41.0", + "@theia/variable-resolver": "1.41.0", + "@theia/workspace": "1.41.0", "async-mutex": "^0.3.1", "jsonc-parser": "^2.2.0", "p-debounce": "^2.1.0" @@ -52,7 +52,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/terminal/package.json b/packages/terminal/package.json index 593630a6aa78d..7589f52eb3f8f 100644 --- a/packages/terminal/package.json +++ b/packages/terminal/package.json @@ -1,14 +1,14 @@ { "name": "@theia/terminal", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Terminal Extension", "dependencies": { - "@theia/core": "1.40.0", - "@theia/editor": "1.40.0", - "@theia/filesystem": "1.40.0", - "@theia/process": "1.40.0", - "@theia/variable-resolver": "1.40.0", - "@theia/workspace": "1.40.0", + "@theia/core": "1.41.0", + "@theia/editor": "1.41.0", + "@theia/filesystem": "1.41.0", + "@theia/process": "1.41.0", + "@theia/variable-resolver": "1.41.0", + "@theia/workspace": "1.41.0", "xterm": "^4.16.0", "xterm-addon-fit": "^0.5.0", "xterm-addon-search": "^0.8.2" @@ -48,7 +48,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/timeline/package.json b/packages/timeline/package.json index fda302655561c..58d898a5546b1 100644 --- a/packages/timeline/package.json +++ b/packages/timeline/package.json @@ -1,10 +1,10 @@ { "name": "@theia/timeline", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Timeline Extension", "dependencies": { - "@theia/core": "1.40.0", - "@theia/navigator": "1.40.0" + "@theia/core": "1.41.0", + "@theia/navigator": "1.41.0" }, "publishConfig": { "access": "public" @@ -39,7 +39,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/toolbar/package.json b/packages/toolbar/package.json index 2d5e7685dab7a..9e326bac17d3a 100644 --- a/packages/toolbar/package.json +++ b/packages/toolbar/package.json @@ -1,6 +1,6 @@ { "name": "@theia/toolbar", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Toolbar", "keywords": [ "theia-extension" @@ -27,15 +27,15 @@ "watch": "theiaext watch" }, "dependencies": { - "@theia/core": "1.40.0", - "@theia/editor": "1.40.0", - "@theia/file-search": "1.40.0", - "@theia/filesystem": "1.40.0", - "@theia/monaco": "1.40.0", + "@theia/core": "1.41.0", + "@theia/editor": "1.41.0", + "@theia/file-search": "1.41.0", + "@theia/filesystem": "1.41.0", + "@theia/monaco": "1.41.0", "@theia/monaco-editor-core": "1.72.3", - "@theia/search-in-workspace": "1.40.0", - "@theia/userstorage": "1.40.0", - "@theia/workspace": "1.40.0", + "@theia/search-in-workspace": "1.41.0", + "@theia/userstorage": "1.41.0", + "@theia/workspace": "1.41.0", "ajv": "^6.5.3", "jsonc-parser": "^2.2.0", "perfect-scrollbar": "^1.3.0" diff --git a/packages/typehierarchy/package.json b/packages/typehierarchy/package.json index 85e7b56d0211c..91ec9dfea66fd 100644 --- a/packages/typehierarchy/package.json +++ b/packages/typehierarchy/package.json @@ -1,10 +1,10 @@ { "name": "@theia/typehierarchy", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Type Hierarchy Extension", "dependencies": { - "@theia/core": "1.40.0", - "@theia/editor": "1.40.0", + "@theia/core": "1.41.0", + "@theia/editor": "1.41.0", "@types/uuid": "^7.0.3", "uuid": "^8.0.0" }, @@ -41,7 +41,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/userstorage/package.json b/packages/userstorage/package.json index 94b60d393b62b..e3220348460ee 100644 --- a/packages/userstorage/package.json +++ b/packages/userstorage/package.json @@ -1,10 +1,10 @@ { "name": "@theia/userstorage", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - User Storage Extension", "dependencies": { - "@theia/core": "1.40.0", - "@theia/filesystem": "1.40.0" + "@theia/core": "1.41.0", + "@theia/filesystem": "1.41.0" }, "publishConfig": { "access": "public" @@ -39,7 +39,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/variable-resolver/package.json b/packages/variable-resolver/package.json index d82088a3f37fe..b913566c99ac8 100644 --- a/packages/variable-resolver/package.json +++ b/packages/variable-resolver/package.json @@ -1,9 +1,9 @@ { "name": "@theia/variable-resolver", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Variable Resolver Extension", "dependencies": { - "@theia/core": "1.40.0" + "@theia/core": "1.41.0" }, "publishConfig": { "access": "public" @@ -44,7 +44,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/vsx-registry/package.json b/packages/vsx-registry/package.json index fde2d00fa52b8..27709557b0e6c 100644 --- a/packages/vsx-registry/package.json +++ b/packages/vsx-registry/package.json @@ -1,15 +1,15 @@ { "name": "@theia/vsx-registry", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - VSX Registry", "dependencies": { - "@theia/core": "1.40.0", - "@theia/filesystem": "1.40.0", - "@theia/ovsx-client": "1.40.0", - "@theia/plugin-ext": "1.40.0", - "@theia/plugin-ext-vscode": "1.40.0", - "@theia/preferences": "1.40.0", - "@theia/workspace": "1.40.0", + "@theia/core": "1.41.0", + "@theia/filesystem": "1.41.0", + "@theia/ovsx-client": "1.41.0", + "@theia/plugin-ext": "1.41.0", + "@theia/plugin-ext-vscode": "1.41.0", + "@theia/preferences": "1.41.0", + "@theia/workspace": "1.41.0", "luxon": "^2.4.0", "p-debounce": "^2.1.0", "semver": "^7.5.4", @@ -53,7 +53,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0", + "@theia/ext-scripts": "1.41.0", "@types/luxon": "^2.3.2" }, "nyc": { diff --git a/packages/workspace/package.json b/packages/workspace/package.json index 21d2ba7363884..1dc21c5db50e1 100644 --- a/packages/workspace/package.json +++ b/packages/workspace/package.json @@ -1,12 +1,12 @@ { "name": "@theia/workspace", - "version": "1.40.0", + "version": "1.41.0", "description": "Theia - Workspace Extension", "dependencies": { - "@theia/core": "1.40.0", - "@theia/filesystem": "1.40.0", + "@theia/core": "1.41.0", + "@theia/filesystem": "1.41.0", "@theia/monaco-editor-core": "1.72.3", - "@theia/variable-resolver": "1.40.0", + "@theia/variable-resolver": "1.41.0", "jsonc-parser": "^2.2.0", "valid-filename": "^2.0.1" }, @@ -44,7 +44,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.40.0" + "@theia/ext-scripts": "1.41.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/sample-plugins/sample-namespace/plugin-a/package.json b/sample-plugins/sample-namespace/plugin-a/package.json index 5ffa6849787e5..032dcd7ab2f32 100644 --- a/sample-plugins/sample-namespace/plugin-a/package.json +++ b/sample-plugins/sample-namespace/plugin-a/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "plugin-a", - "version": "1.40.0", + "version": "1.41.0", "main": "extension.js", "license": "EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0", "repository": { diff --git a/sample-plugins/sample-namespace/plugin-b/package.json b/sample-plugins/sample-namespace/plugin-b/package.json index ec561817776e5..27b378da57a89 100644 --- a/sample-plugins/sample-namespace/plugin-b/package.json +++ b/sample-plugins/sample-namespace/plugin-b/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "plugin-b", - "version": "1.40.0", + "version": "1.41.0", "main": "extension.js", "license": "EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0", "repository": { From cb426569d1d5fe42567f5ec5d35b3c77a92f3295 Mon Sep 17 00:00:00 2001 From: vince-fugnitto Date: Thu, 31 Aug 2023 14:38:17 -0400 Subject: [PATCH 48/79] core: update re-exports for 1.41.0 Signed-off-by: vince-fugnitto --- packages/core/README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/core/README.md b/packages/core/README.md index 85515dda2f4e7..abbfd686508ee 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -84,12 +84,12 @@ export class SomeClass { - `@phosphor/signaling` (from [`@phosphor/signaling@1`](https://www.npmjs.com/package/@phosphor/signaling)) - `@phosphor/virtualdom` (from [`@phosphor/virtualdom@1`](https://www.npmjs.com/package/@phosphor/virtualdom)) - `@phosphor/widgets` (from [`@phosphor/widgets@1`](https://www.npmjs.com/package/@phosphor/widgets)) - - `@theia/application-package` (from [`@theia/application-package@1.40.0`](https://www.npmjs.com/package/@theia/application-package/v/1.40.0)) - - `@theia/application-package/lib/api` (from [`@theia/application-package@1.40.0`](https://www.npmjs.com/package/@theia/application-package/v/1.40.0)) - - `@theia/application-package/lib/environment` (from [`@theia/application-package@1.40.0`](https://www.npmjs.com/package/@theia/application-package/v/1.40.0)) - - `@theia/request` (from [`@theia/request@1.40.0`](https://www.npmjs.com/package/@theia/request/v/1.40.0)) - - `@theia/request/lib/proxy` (from [`@theia/request@1.40.0`](https://www.npmjs.com/package/@theia/request/v/1.40.0)) - - `@theia/request/lib/node-request-service` (from [`@theia/request@1.40.0`](https://www.npmjs.com/package/@theia/request/v/1.40.0)) + - `@theia/application-package` (from [`@theia/application-package@1.41.0`](https://www.npmjs.com/package/@theia/application-package/v/1.41.0)) + - `@theia/application-package/lib/api` (from [`@theia/application-package@1.41.0`](https://www.npmjs.com/package/@theia/application-package/v/1.41.0)) + - `@theia/application-package/lib/environment` (from [`@theia/application-package@1.41.0`](https://www.npmjs.com/package/@theia/application-package/v/1.41.0)) + - `@theia/request` (from [`@theia/request@1.41.0`](https://www.npmjs.com/package/@theia/request/v/1.41.0)) + - `@theia/request/lib/proxy` (from [`@theia/request@1.41.0`](https://www.npmjs.com/package/@theia/request/v/1.41.0)) + - `@theia/request/lib/node-request-service` (from [`@theia/request@1.41.0`](https://www.npmjs.com/package/@theia/request/v/1.41.0)) - `fs-extra` (from [`fs-extra@^4.0.2`](https://www.npmjs.com/package/fs-extra)) - `fuzzy` (from [`fuzzy@^0.1.3`](https://www.npmjs.com/package/fuzzy)) - `inversify` (from [`inversify@^6.0.1`](https://www.npmjs.com/package/inversify)) From 684388039ef991ba7bcafdd9d0a609588aa25657 Mon Sep 17 00:00:00 2001 From: vatsal-uppal-1997 Date: Tue, 12 Sep 2023 15:31:58 +0530 Subject: [PATCH 49/79] Fix erroneous inline breakpoint appearing (#12832) --- packages/debug/src/browser/editor/debug-editor-model.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/debug/src/browser/editor/debug-editor-model.ts b/packages/debug/src/browser/editor/debug-editor-model.ts index 395598e6bfbf9..fd04ef9c95105 100644 --- a/packages/debug/src/browser/editor/debug-editor-model.ts +++ b/packages/debug/src/browser/editor/debug-editor-model.ts @@ -341,7 +341,9 @@ export class DebugEditorModel implements Disposable { const line = range.startLineNumber; const column = range.startColumn; const oldBreakpoint = this.breakpointRanges.get(decoration)?.[1]; - const breakpoint = SourceBreakpoint.create(uri, { line, column }, oldBreakpoint); + const isLineBreakpoint = oldBreakpoint?.raw.line !== undefined && oldBreakpoint?.raw.column === undefined; + const change = isLineBreakpoint ? { line } : { line, column }; + const breakpoint = SourceBreakpoint.create(uri, change, oldBreakpoint); breakpoints.push(breakpoint); lines.add(line); } From 35865a9c8ba51c0fbd8cf6b9e44f38c6ec882b16 Mon Sep 17 00:00:00 2001 From: Mark Sujew Date: Thu, 14 Sep 2023 00:09:36 +0200 Subject: [PATCH 50/79] Add inversify lifecycle to frontend preload script (#12590) --- .../src/generator/abstract-generator.ts | 31 +------ .../src/generator/backend-generator.ts | 85 ++++++++++-------- .../src/generator/frontend-generator.ts | 88 ++++++++++--------- .../src/application-package.ts | 40 +++------ .../src/extension-package.ts | 1 + packages/core/package.json | 1 + .../preload/i18n-preload-contribution.ts | 50 +++++++++++ .../preload/os-preload-contribution.ts | 37 ++++++++ .../src/browser/preload/preload-module.ts | 45 ++++++++++ .../core/src/browser/preload/preloader.ts | 37 ++++++++ .../preload/theme-preload-contribution.ts | 32 +++++++ packages/core/src/browser/preloader.ts | 76 ---------------- .../src/common/i18n/localization-server.ts | 25 ++++++ packages/core/src/common/os.ts | 8 ++ .../src/node/backend-application-module.ts | 11 ++- .../core/src/node/i18n/i18n-backend-module.ts | 13 ++- ...contribution.ts => localization-server.ts} | 19 ++-- ...contribution.ts => os-backend-provider.ts} | 13 +-- .../main/node/plugin-ext-backend-module.ts | 6 +- ...ution.ts => plugin-localization-server.ts} | 4 +- 20 files changed, 374 insertions(+), 248 deletions(-) create mode 100644 packages/core/src/browser/preload/i18n-preload-contribution.ts create mode 100644 packages/core/src/browser/preload/os-preload-contribution.ts create mode 100644 packages/core/src/browser/preload/preload-module.ts create mode 100644 packages/core/src/browser/preload/preloader.ts create mode 100644 packages/core/src/browser/preload/theme-preload-contribution.ts delete mode 100644 packages/core/src/browser/preloader.ts create mode 100644 packages/core/src/common/i18n/localization-server.ts rename packages/core/src/node/i18n/{localization-backend-contribution.ts => localization-server.ts} (72%) rename packages/core/src/node/{os-backend-application-contribution.ts => os-backend-provider.ts} (70%) rename packages/plugin-ext/src/main/node/{plugin-localization-backend-contribution.ts => plugin-localization-server.ts} (88%) diff --git a/dev-packages/application-manager/src/generator/abstract-generator.ts b/dev-packages/application-manager/src/generator/abstract-generator.ts index c5c3de9f33a1f..2ff52527ef3ec 100644 --- a/dev-packages/application-manager/src/generator/abstract-generator.ts +++ b/dev-packages/application-manager/src/generator/abstract-generator.ts @@ -14,7 +14,6 @@ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 // ***************************************************************************** -import * as os from 'os'; import * as fs from 'fs-extra'; import { ApplicationPackage } from '@theia/application-package'; @@ -30,33 +29,6 @@ export abstract class AbstractGenerator { protected options: GeneratorOptions = {} ) { } - protected compileFrontendModuleImports(modules: Map): string { - const splitFrontend = this.options.splitFrontend ?? this.options.mode !== 'production'; - return this.compileModuleImports(modules, splitFrontend ? 'import' : 'require'); - } - - protected compileBackendModuleImports(modules: Map): string { - return this.compileModuleImports(modules, 'require'); - } - - protected compileElectronMainModuleImports(modules?: Map): string { - return modules && this.compileModuleImports(modules, 'require') || ''; - } - - protected compileModuleImports(modules: Map, fn: 'import' | 'require'): string { - if (modules.size === 0) { - return ''; - } - const lines = Array.from(modules.keys()).map(moduleName => { - const invocation = `${fn}('${modules.get(moduleName)}')`; - if (fn === 'require') { - return `Promise.resolve(${invocation})`; - } - return invocation; - }).map(statement => ` .then(function () { return ${statement}.then(load) })`); - return os.EOL + lines.join(os.EOL); - } - protected ifBrowser(value: string, defaultValue: string = ''): string { return this.pck.ifBrowser(value, defaultValue); } @@ -87,8 +59,7 @@ export abstract class AbstractGenerator { } protected prettyStringify(object: object): string { - // eslint-disable-next-line no-null/no-null - return JSON.stringify(object, null, 4); + return JSON.stringify(object, undefined, 4); } } diff --git a/dev-packages/application-manager/src/generator/backend-generator.ts b/dev-packages/application-manager/src/generator/backend-generator.ts index 0a4a9f36edd17..9d49438d88a3d 100644 --- a/dev-packages/application-manager/src/generator/backend-generator.ts +++ b/dev-packages/application-manager/src/generator/backend-generator.ts @@ -14,6 +14,7 @@ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 // ***************************************************************************** +import { EOL } from 'os'; import { AbstractGenerator } from './abstract-generator'; export class BackendGenerator extends AbstractGenerator { @@ -53,45 +54,47 @@ const { Container } = require('inversify'); const { resolve } = require('path'); const { app } = require('electron'); -// Fix the window reloading issue, see: https://github.com/electron/electron/issues/22119 -app.allowRendererProcessReuse = false; - const config = ${this.prettyStringify(this.pck.props.frontend.config)}; const isSingleInstance = ${this.pck.props.backend.config.singleInstance === true ? 'true' : 'false'}; -if (isSingleInstance && !app.requestSingleInstanceLock()) { - // There is another instance running, exit now. The other instance will request focus. - app.quit(); - return; -} - -const container = new Container(); -container.load(electronMainApplicationModule); -container.bind(ElectronMainApplicationGlobals).toConstantValue({ - THEIA_APP_PROJECT_PATH: resolve(__dirname, '..', '..'), - THEIA_BACKEND_MAIN_PATH: resolve(__dirname, 'main.js'), - THEIA_FRONTEND_HTML_PATH: resolve(__dirname, '..', '..', 'lib', 'frontend', 'index.html'), -}); - -function load(raw) { - return Promise.resolve(raw.default).then(module => - container.load(module) - ); -} - -async function start() { - const application = container.get(ElectronMainApplication); - await application.start(config); -} +(async () => { + if (isSingleInstance && !app.requestSingleInstanceLock()) { + // There is another instance running, exit now. The other instance will request focus. + app.quit(); + return; + } + + const container = new Container(); + container.load(electronMainApplicationModule); + container.bind(ElectronMainApplicationGlobals).toConstantValue({ + THEIA_APP_PROJECT_PATH: resolve(__dirname, '..', '..'), + THEIA_BACKEND_MAIN_PATH: resolve(__dirname, 'main.js'), + THEIA_FRONTEND_HTML_PATH: resolve(__dirname, '..', '..', 'lib', 'frontend', 'index.html'), + }); + + function load(raw) { + return Promise.resolve(raw.default).then(module => + container.load(module) + ); + } + + async function start() { + const application = container.get(ElectronMainApplication); + await application.start(config); + } -module.exports = Promise.resolve()${this.compileElectronMainModuleImports(electronMainModules)} - .then(start).catch(reason => { + try { +${Array.from(electronMainModules?.values() ?? [], jsModulePath => `\ + await load(require('${jsModulePath}'));`).join(EOL)} + await start(); + } catch (reason) { console.error('Failed to start the electron application.'); if (reason) { console.error(reason); } app.quit(); - }); + }; +})(); `; } @@ -127,27 +130,31 @@ function defaultServeStatic(app) { } function load(raw) { - return Promise.resolve(raw.default).then( - module => container.load(module) + return Promise.resolve(raw).then( + module => container.load(module.default) ); } -function start(port, host, argv = process.argv) { +async function start(port, host, argv = process.argv) { if (!container.isBound(BackendApplicationServer)) { container.bind(BackendApplicationServer).toConstantValue({ configure: defaultServeStatic }); } - return container.get(CliManager).initializeCli(argv).then(() => { - return container.get(BackendApplication).start(port, host); - }); + await container.get(CliManager).initializeCli(argv); + return container.get(BackendApplication).start(port, host); } -module.exports = (port, host, argv) => Promise.resolve()${this.compileBackendModuleImports(backendModules)} - .then(() => start(port, host, argv)).catch(error => { +module.exports = async (port, host, argv) => { + try { +${Array.from(backendModules.values(), jsModulePath => `\ + await load(require('${jsModulePath}'));`).join(EOL)} + return await start(port, host, argv); + } catch (error) { console.error('Failed to start the backend application:'); console.error(error); process.exitCode = 1; throw error; - }); + } +} `; } diff --git a/dev-packages/application-manager/src/generator/frontend-generator.ts b/dev-packages/application-manager/src/generator/frontend-generator.ts index 08498802e4ece..59cccab6e37b7 100644 --- a/dev-packages/application-manager/src/generator/frontend-generator.ts +++ b/dev-packages/application-manager/src/generator/frontend-generator.ts @@ -16,6 +16,7 @@ /* eslint-disable @typescript-eslint/indent */ +import { EOL } from 'os'; import { AbstractGenerator, GeneratorOptions } from './abstract-generator'; import { existsSync, readFileSync } from 'fs'; @@ -23,7 +24,7 @@ export class FrontendGenerator extends AbstractGenerator { async generate(options?: GeneratorOptions): Promise { await this.write(this.pck.frontend('index.html'), this.compileIndexHtml(this.pck.targetFrontendModules)); - await this.write(this.pck.frontend('index.js'), this.compileIndexJs(this.pck.targetFrontendModules)); + await this.write(this.pck.frontend('index.js'), this.compileIndexJs(this.pck.targetFrontendModules, this.pck.frontendPreloadModules)); await this.write(this.pck.frontend('secondary-window.html'), this.compileSecondaryWindowHtml()); await this.write(this.pck.frontend('secondary-index.js'), this.compileSecondaryIndexJs(this.pck.secondaryWindowModules)); if (this.pck.isElectron()) { @@ -68,10 +69,7 @@ export class FrontendGenerator extends AbstractGenerator { ${this.pck.props.frontend.config.applicationName}`; } - protected compileIndexJs(frontendModules: Map): string { - const compiledModuleImports = this.compileFrontendModuleImports(frontendModules) - // fix the generated indentation - .replace(/^ /g, ' '); + protected compileIndexJs(frontendModules: Map, frontendPreloadModules: Map): string { return `\ // @ts-check ${this.ifBrowser("require('es6-promise/auto');")} @@ -89,40 +87,58 @@ self.MonacoEnvironment = { } }`)} -const preloader = require('@theia/core/lib/browser/preloader'); +function load(container, jsModule) { + return Promise.resolve(jsModule) + .then(containerModule => container.load(containerModule.default)); +} -// We need to fetch some data from the backend before the frontend starts (nls, os) -module.exports = preloader.preload().then(() => { - const { FrontendApplication } = require('@theia/core/lib/browser'); - const { frontendApplicationModule } = require('@theia/core/lib/browser/frontend-application-module'); +async function preload(parent) { + const container = new Container(); + container.parent = parent; + try { +${Array.from(frontendPreloadModules.values(), jsModulePath => `\ + await load(container, import('${jsModulePath}'));`).join(EOL)} + const { Preloader } = require('@theia/core/lib/browser/preload/preloader'); + const preloader = container.get(Preloader); + await preloader.initialize(); + } catch (reason) { + console.error('Failed to run preload scripts.'); + if (reason) { + console.error(reason); + } + } +} + +module.exports = (async () => { const { messagingFrontendModule } = require('@theia/core/lib/${this.pck.isBrowser() - ? 'browser/messaging/messaging-frontend-module' - : 'electron-browser/messaging/electron-messaging-frontend-module'}'); + ? 'browser/messaging/messaging-frontend-module' + : 'electron-browser/messaging/electron-messaging-frontend-module'}'); + const container = new Container(); + container.load(messagingFrontendModule); + await preload(container); + const { FrontendApplication } = require('@theia/core/lib/browser'); + const { frontendApplicationModule } = require('@theia/core/lib/browser/frontend-application-module'); const { loggerFrontendModule } = require('@theia/core/lib/browser/logger-frontend-module'); - const container = new Container(); container.load(frontendApplicationModule); - container.load(messagingFrontendModule); container.load(loggerFrontendModule); - return Promise.resolve()${compiledModuleImports} - .then(start).catch(reason => { - console.error('Failed to start the frontend application.'); - if (reason) { - console.error(reason); - } - }); - - function load(jsModule) { - return Promise.resolve(jsModule.default) - .then(containerModule => container.load(containerModule)); + try { +${Array.from(frontendModules.values(), jsModulePath => `\ + await load(container, import('${jsModulePath}'));`).join(EOL)} + await start(); + } catch (reason) { + console.error('Failed to start the frontend application.'); + if (reason) { + console.error(reason); + } } function start() { (window['theia'] = window['theia'] || {}).container = container; return container.get(FrontendApplication).start(); } -}); +})(); `; } @@ -172,40 +188,26 @@ module.exports = preloader.preload().then(() => { `; } - protected compileSecondaryModuleImports(secondaryWindowModules: Map): string { - const lines = Array.from(secondaryWindowModules.entries()) - .map(([moduleName, path]) => ` container.load(require('${path}').default);`); - return '\n' + lines.join('\n'); - } - protected compileSecondaryIndexJs(secondaryWindowModules: Map): string { - const compiledModuleImports = this.compileSecondaryModuleImports(secondaryWindowModules) - // fix the generated indentation - .replace(/^ /g, ' '); return `\ // @ts-check require('reflect-metadata'); const { Container } = require('inversify'); -const preloader = require('@theia/core/lib/browser/preloader'); - module.exports = Promise.resolve().then(() => { const { frontendApplicationModule } = require('@theia/core/lib/browser/frontend-application-module'); const container = new Container(); container.load(frontendApplicationModule); - ${compiledModuleImports} +${Array.from(secondaryWindowModules.values(), jsModulePath => `\ + container.load(require('${jsModulePath}').default);`).join(EOL)} }); `; } compilePreloadJs(): string { - const lines = Array.from(this.pck.preloadModules) - .map(([moduleName, path]) => `require('${path}').preload();`); - const imports = '\n' + lines.join('\n'); - return `\ // @ts-check -${imports} +${Array.from(this.pck.preloadModules.values(), path => `require('${path}').preload();`).join(EOL)} `; } } diff --git a/dev-packages/application-package/src/application-package.ts b/dev-packages/application-package/src/application-package.ts index 0281a1965bece..68b5cb896c6ec 100644 --- a/dev-packages/application-package/src/application-package.ts +++ b/dev-packages/application-package/src/application-package.ts @@ -91,6 +91,7 @@ export class ApplicationPackage { } protected _frontendModules: Map | undefined; + protected _frontendPreloadModules: Map | undefined; protected _frontendElectronModules: Map | undefined; protected _secondaryWindowModules: Map | undefined; protected _backendModules: Map | undefined; @@ -135,53 +136,36 @@ export class ApplicationPackage { return new ExtensionPackage(raw, this.registry, options); } + get frontendPreloadModules(): Map { + return this._frontendPreloadModules ??= this.computeModules('frontendPreload'); + } + get frontendModules(): Map { - if (!this._frontendModules) { - this._frontendModules = this.computeModules('frontend'); - } - return this._frontendModules; + return this._frontendModules ??= this.computeModules('frontend'); } get frontendElectronModules(): Map { - if (!this._frontendElectronModules) { - this._frontendElectronModules = this.computeModules('frontendElectron', 'frontend'); - } - return this._frontendElectronModules; + return this._frontendElectronModules ??= this.computeModules('frontendElectron', 'frontend'); } get secondaryWindowModules(): Map { - if (!this._secondaryWindowModules) { - this._secondaryWindowModules = this.computeModules('secondaryWindow'); - } - return this._secondaryWindowModules; + return this._secondaryWindowModules ??= this.computeModules('secondaryWindow'); } get backendModules(): Map { - if (!this._backendModules) { - this._backendModules = this.computeModules('backend'); - } - return this._backendModules; + return this._backendModules ??= this.computeModules('backend'); } get backendElectronModules(): Map { - if (!this._backendElectronModules) { - this._backendElectronModules = this.computeModules('backendElectron', 'backend'); - } - return this._backendElectronModules; + return this._backendElectronModules ??= this.computeModules('backendElectron', 'backend'); } get electronMainModules(): Map { - if (!this._electronMainModules) { - this._electronMainModules = this.computeModules('electronMain'); - } - return this._electronMainModules; + return this._electronMainModules ??= this.computeModules('electronMain'); } get preloadModules(): Map { - if (!this._preloadModules) { - this._preloadModules = this.computeModules('preload'); - } - return this._preloadModules; + return this._preloadModules ??= this.computeModules('preload'); } protected computeModules

    (primary: P, secondary?: S): Map { diff --git a/dev-packages/application-package/src/extension-package.ts b/dev-packages/application-package/src/extension-package.ts index acf2335435cae..8ccd8d661513a 100644 --- a/dev-packages/application-package/src/extension-package.ts +++ b/dev-packages/application-package/src/extension-package.ts @@ -20,6 +20,7 @@ import * as semver from 'semver'; import { NpmRegistry, PublishedNodePackage, NodePackage } from './npm-registry'; export interface Extension { + frontendPreload?: string; frontend?: string; frontendElectron?: string; secondaryWindow?: string; diff --git a/packages/core/package.json b/packages/core/package.json index b140844f0865e..6fe319fd61508 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -131,6 +131,7 @@ }, "theiaExtensions": [ { + "frontendPreload": "lib/browser/preload/preload-module", "preload": "lib/electron-browser/preload" }, { diff --git a/packages/core/src/browser/preload/i18n-preload-contribution.ts b/packages/core/src/browser/preload/i18n-preload-contribution.ts new file mode 100644 index 0000000000000..309c8df5f9436 --- /dev/null +++ b/packages/core/src/browser/preload/i18n-preload-contribution.ts @@ -0,0 +1,50 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { PreloadContribution } from './preloader'; +import { FrontendApplicationConfigProvider } from '../frontend-application-config-provider'; +import { nls } from '../../common/nls'; +import { inject, injectable } from 'inversify'; +import { LocalizationServer } from '../../common/i18n/localization-server'; + +@injectable() +export class I18nPreloadContribution implements PreloadContribution { + + @inject(LocalizationServer) + protected readonly localizationServer: LocalizationServer; + + async initialize(): Promise { + const defaultLocale = FrontendApplicationConfigProvider.get().defaultLocale; + if (defaultLocale && !nls.locale) { + Object.assign(nls, { + locale: defaultLocale + }); + } + if (nls.locale) { + const localization = await this.localizationServer.loadLocalization(nls.locale); + if (localization.languagePack) { + nls.localization = localization; + } else { + // In case the localization that we've loaded doesn't localize Theia completely (languagePack is false) + // We simply reset the locale to the default again + Object.assign(nls, { + locale: defaultLocale || undefined + }); + } + } + } + +} diff --git a/packages/core/src/browser/preload/os-preload-contribution.ts b/packages/core/src/browser/preload/os-preload-contribution.ts new file mode 100644 index 0000000000000..6724b11cb8bfc --- /dev/null +++ b/packages/core/src/browser/preload/os-preload-contribution.ts @@ -0,0 +1,37 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { inject, injectable } from 'inversify'; +import { OS, OSBackendProvider } from '../../common'; +import { PreloadContribution } from './preloader'; + +@injectable() +export class OSPreloadContribution implements PreloadContribution { + + @inject(OSBackendProvider) + protected readonly osBackendProvider: OSBackendProvider; + + async initialize(): Promise { + const osType = await this.osBackendProvider.getBackendOS(); + const isWindows = osType === 'Windows'; + const isOSX = osType === 'OSX'; + OS.backend.isOSX = isOSX; + OS.backend.isWindows = isWindows; + OS.backend.type = () => osType; + OS.backend.EOL = isWindows ? '\r\n' : '\n'; + } + +} diff --git a/packages/core/src/browser/preload/preload-module.ts b/packages/core/src/browser/preload/preload-module.ts new file mode 100644 index 0000000000000..a6dcadcc28a26 --- /dev/null +++ b/packages/core/src/browser/preload/preload-module.ts @@ -0,0 +1,45 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { ContainerModule } from 'inversify'; +import { PreloadContribution, Preloader } from './preloader'; +import { bindContributionProvider } from '../../common/contribution-provider'; +import { I18nPreloadContribution } from './i18n-preload-contribution'; +import { OSPreloadContribution } from './os-preload-contribution'; +import { ThemePreloadContribution } from './theme-preload-contribution'; +import { LocalizationServer, LocalizationServerPath } from '../../common/i18n/localization-server'; +import { WebSocketConnectionProvider } from '../messaging/ws-connection-provider'; +import { OSBackendProvider, OSBackendProviderPath } from '../../common/os'; + +export default new ContainerModule(bind => { + bind(Preloader).toSelf().inSingletonScope(); + bindContributionProvider(bind, PreloadContribution); + + bind(LocalizationServer).toDynamicValue(ctx => + WebSocketConnectionProvider.createProxy(ctx.container, LocalizationServerPath) + ).inSingletonScope(); + + bind(OSBackendProvider).toDynamicValue(ctx => + WebSocketConnectionProvider.createProxy(ctx.container, OSBackendProviderPath) + ).inSingletonScope(); + + bind(I18nPreloadContribution).toSelf().inSingletonScope(); + bind(PreloadContribution).toService(I18nPreloadContribution); + bind(OSPreloadContribution).toSelf().inSingletonScope(); + bind(PreloadContribution).toService(OSPreloadContribution); + bind(ThemePreloadContribution).toSelf().inSingletonScope(); + bind(PreloadContribution).toService(ThemePreloadContribution); +}); diff --git a/packages/core/src/browser/preload/preloader.ts b/packages/core/src/browser/preload/preloader.ts new file mode 100644 index 0000000000000..907bb03860af9 --- /dev/null +++ b/packages/core/src/browser/preload/preloader.ts @@ -0,0 +1,37 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { MaybePromise } from '../../common/types'; +import { inject, injectable, interfaces, named } from 'inversify'; +import { ContributionProvider } from '../../common/contribution-provider'; + +export const PreloadContribution = Symbol('PreloadContribution') as symbol & interfaces.Abstract; + +export interface PreloadContribution { + initialize(): MaybePromise; +} + +@injectable() +export class Preloader { + + @inject(ContributionProvider) @named(PreloadContribution) + protected readonly contributions: ContributionProvider; + + async initialize(): Promise { + await Promise.allSettled(this.contributions.getContributions().map(contrib => contrib.initialize())); + } + +} diff --git a/packages/core/src/browser/preload/theme-preload-contribution.ts b/packages/core/src/browser/preload/theme-preload-contribution.ts new file mode 100644 index 0000000000000..d6a99e18dc949 --- /dev/null +++ b/packages/core/src/browser/preload/theme-preload-contribution.ts @@ -0,0 +1,32 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { PreloadContribution } from './preloader'; +import { DEFAULT_BACKGROUND_COLOR_STORAGE_KEY } from '../frontend-application-config-provider'; +import { injectable } from 'inversify'; + +@injectable() +export class ThemePreloadContribution implements PreloadContribution { + + initialize(): void { + // The default light background color is based on the `colors#editor.background` value from + // `packages/monaco/data/monaco-themes/vscode/dark_vs.json` and the dark background comes from the `light_vs.json`. + const dark = window.matchMedia?.('(prefers-color-scheme: dark)').matches; + const value = window.localStorage.getItem(DEFAULT_BACKGROUND_COLOR_STORAGE_KEY) || (dark ? '#1E1E1E' : '#FFFFFF'); + document.documentElement.style.setProperty('--theia-editor-background', value); + } + +} diff --git a/packages/core/src/browser/preloader.ts b/packages/core/src/browser/preloader.ts deleted file mode 100644 index 5cff49270219f..0000000000000 --- a/packages/core/src/browser/preloader.ts +++ /dev/null @@ -1,76 +0,0 @@ -// ***************************************************************************** -// Copyright (C) 2022 TypeFox and others. -// -// This program and the accompanying materials are made available under the -// terms of the Eclipse Public License v. 2.0 which is available at -// http://www.eclipse.org/legal/epl-2.0. -// -// This Source Code may also be made available under the following Secondary -// Licenses when the conditions for such availability set forth in the Eclipse -// Public License v. 2.0 are satisfied: GNU General Public License, version 2 -// with the GNU Classpath Exception which is available at -// https://www.gnu.org/software/classpath/license.html. -// -// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 -// ***************************************************************************** - -import { nls } from '../common/nls'; -import { Endpoint } from './endpoint'; -import { OS } from '../common/os'; -import { DEFAULT_BACKGROUND_COLOR_STORAGE_KEY, FrontendApplicationConfigProvider } from './frontend-application-config-provider'; -import { Localization } from '../common/i18n/localization'; - -function fetchFrom(path: string): Promise { - const endpoint = new Endpoint({ path }).getRestUrl().toString(); - return fetch(endpoint); -} - -async function loadTranslations(): Promise { - const defaultLocale = FrontendApplicationConfigProvider.get().defaultLocale; - if (defaultLocale && !nls.locale) { - Object.assign(nls, { - locale: defaultLocale - }); - } - if (nls.locale) { - const response = await fetchFrom(`/i18n/${nls.locale}`); - const localization = await response.json() as Localization; - if (localization.languagePack) { - nls.localization = localization; - } else { - // In case the localization that we've loaded doesn't localize Theia completely (languagePack is false) - // We simply reset the locale to the default again - Object.assign(nls, { - locale: defaultLocale || undefined - }); - } - } -} - -async function loadBackendOS(): Promise { - const response = await fetchFrom('/os'); - const osType = await response.text() as OS.Type; - const isWindows = osType === 'Windows'; - const isOSX = osType === 'OSX'; - OS.backend.isOSX = isOSX; - OS.backend.isWindows = isWindows; - OS.backend.type = () => osType; - OS.backend.EOL = isWindows ? '\r\n' : '\n'; -} - -function initBackground(): void { - // The default light background color is based on the `colors#editor.background` value from - // `packages/monaco/data/monaco-themes/vscode/dark_vs.json` and the dark background comes from the `light_vs.json`. - const dark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches; - const value = window.localStorage.getItem(DEFAULT_BACKGROUND_COLOR_STORAGE_KEY) || (dark ? '#1E1E1E' : '#FFFFFF'); - const documentElement = document.documentElement; - documentElement.style.setProperty('--theia-editor-background', value); -} - -export async function preload(): Promise { - await Promise.allSettled([ - loadTranslations(), - loadBackendOS(), - initBackground(), - ]); -} diff --git a/packages/core/src/common/i18n/localization-server.ts b/packages/core/src/common/i18n/localization-server.ts new file mode 100644 index 0000000000000..dcddb8191e4fe --- /dev/null +++ b/packages/core/src/common/i18n/localization-server.ts @@ -0,0 +1,25 @@ +// ***************************************************************************** +// Copyright (C) 2023 TypeFox and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { Localization } from './localization'; + +export const LocalizationServerPath = '/localization-server'; + +export const LocalizationServer = Symbol('LocalizationServer'); + +export interface LocalizationServer { + loadLocalization(languageId: string): Promise; +} diff --git a/packages/core/src/common/os.ts b/packages/core/src/common/os.ts index 8b8529cd7b1be..b8a1f3f8a43bf 100644 --- a/packages/core/src/common/os.ts +++ b/packages/core/src/common/os.ts @@ -72,3 +72,11 @@ export namespace OS { }; } + +export const OSBackendProviderPath = '/os'; + +export const OSBackendProvider = Symbol('OSBackendProvider'); + +export interface OSBackendProvider { + getBackendOS(): Promise; +} diff --git a/packages/core/src/node/backend-application-module.ts b/packages/core/src/node/backend-application-module.ts index 080afa203ba58..95ed52c1eee87 100644 --- a/packages/core/src/node/backend-application-module.ts +++ b/packages/core/src/node/backend-application-module.ts @@ -19,7 +19,7 @@ import { ApplicationPackage } from '@theia/application-package'; import { REQUEST_SERVICE_PATH } from '@theia/request'; import { bindContributionProvider, MessageService, MessageClient, ConnectionHandler, RpcConnectionHandler, - CommandService, commandServicePath, messageServicePath + CommandService, commandServicePath, messageServicePath, OSBackendProvider, OSBackendProviderPath } from '../common'; import { BackendApplication, BackendApplicationContribution, BackendApplicationCliContribution, BackendApplicationServer } from './backend-application'; import { CliManager, CliContribution } from './cli'; @@ -38,7 +38,7 @@ import { EnvironmentUtils } from './environment-utils'; import { ProcessUtils } from './process-utils'; import { ProxyCliContribution } from './request/proxy-cli-contribution'; import { bindNodeStopwatch, bindBackendStopwatchServer } from './performance'; -import { OSBackendApplicationContribution } from './os-backend-application-contribution'; +import { OSBackendProviderImpl } from './os-backend-provider'; import { BackendRequestFacade } from './request/backend-request-facade'; import { FileSystemLocking, FileSystemLockingImpl } from './filesystem-locking'; @@ -116,8 +116,11 @@ export const backendApplicationModule = new ContainerModule(bind => { bind(EnvironmentUtils).toSelf().inSingletonScope(); bind(ProcessUtils).toSelf().inSingletonScope(); - bind(OSBackendApplicationContribution).toSelf().inSingletonScope(); - bind(BackendApplicationContribution).toService(OSBackendApplicationContribution); + bind(OSBackendProviderImpl).toSelf().inSingletonScope(); + bind(OSBackendProvider).toService(OSBackendProviderImpl); + bind(ConnectionHandler).toDynamicValue( + ctx => new RpcConnectionHandler(OSBackendProviderPath, () => ctx.container.get(OSBackendProvider)) + ).inSingletonScope(); bind(ProxyCliContribution).toSelf().inSingletonScope(); bind(CliContribution).toService(ProxyCliContribution); diff --git a/packages/core/src/node/i18n/i18n-backend-module.ts b/packages/core/src/node/i18n/i18n-backend-module.ts index c378a10fca65d..91da614f8fe83 100644 --- a/packages/core/src/node/i18n/i18n-backend-module.ts +++ b/packages/core/src/node/i18n/i18n-backend-module.ts @@ -19,9 +19,10 @@ import { localizationPath } from '../../common/i18n/localization'; import { LocalizationProvider } from './localization-provider'; import { ConnectionHandler, RpcConnectionHandler, bindContributionProvider } from '../../common'; import { LocalizationRegistry, LocalizationContribution } from './localization-contribution'; -import { LocalizationBackendContribution } from './localization-backend-contribution'; -import { BackendApplicationContribution } from '../backend-application'; +import { LocalizationServerImpl } from './localization-server'; import { TheiaLocalizationContribution } from './theia-localization-contribution'; +import { LocalizationServer, LocalizationServerPath } from '../../common/i18n/localization-server'; +import { BackendApplicationContribution } from '../backend-application'; export default new ContainerModule(bind => { bind(LocalizationProvider).toSelf().inSingletonScope(); @@ -30,8 +31,12 @@ export default new ContainerModule(bind => { ).inSingletonScope(); bind(LocalizationRegistry).toSelf().inSingletonScope(); bindContributionProvider(bind, LocalizationContribution); - bind(LocalizationBackendContribution).toSelf().inSingletonScope(); - bind(BackendApplicationContribution).toService(LocalizationBackendContribution); + bind(LocalizationServerImpl).toSelf().inSingletonScope(); + bind(LocalizationServer).toService(LocalizationServerImpl); + bind(BackendApplicationContribution).toService(LocalizationServerImpl); + bind(ConnectionHandler).toDynamicValue(ctx => + new RpcConnectionHandler(LocalizationServerPath, () => ctx.container.get(LocalizationServer)) + ).inSingletonScope(); bind(TheiaLocalizationContribution).toSelf().inSingletonScope(); bind(LocalizationContribution).toService(TheiaLocalizationContribution); }); diff --git a/packages/core/src/node/i18n/localization-backend-contribution.ts b/packages/core/src/node/i18n/localization-server.ts similarity index 72% rename from packages/core/src/node/i18n/localization-backend-contribution.ts rename to packages/core/src/node/i18n/localization-server.ts index e7744560336f9..539617ca6075e 100644 --- a/packages/core/src/node/i18n/localization-backend-contribution.ts +++ b/packages/core/src/node/i18n/localization-server.ts @@ -14,8 +14,9 @@ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 // ***************************************************************************** -import * as express from 'express'; import { inject, injectable } from 'inversify'; +import { Localization } from 'src/common/i18n/localization'; +import { LocalizationServer } from '../../common/i18n/localization-server'; import { nls } from '../../common/nls'; import { Deferred } from '../../common/promise-util'; import { BackendApplicationContribution } from '../backend-application'; @@ -23,7 +24,8 @@ import { LocalizationRegistry } from './localization-contribution'; import { LocalizationProvider } from './localization-provider'; @injectable() -export class LocalizationBackendContribution implements BackendApplicationContribution { +export class LocalizationServerImpl implements LocalizationServer, BackendApplicationContribution { + protected readonly initialized = new Deferred(); @inject(LocalizationRegistry) @@ -41,13 +43,10 @@ export class LocalizationBackendContribution implements BackendApplicationContri return this.initialized.promise; } - configure(app: express.Application): void { - app.get('/i18n/:locale', async (req, res) => { - await this.waitForInitialization(); - let locale = req.params.locale; - locale = this.localizationProvider.getAvailableLanguages().some(e => e.languageId === locale) ? locale : nls.defaultLocale; - this.localizationProvider.setCurrentLanguage(locale); - res.send(this.localizationProvider.loadLocalization(locale)); - }); + async loadLocalization(languageId: string): Promise { + await this.waitForInitialization(); + languageId = this.localizationProvider.getAvailableLanguages().some(e => e.languageId === languageId) ? languageId : nls.defaultLocale; + this.localizationProvider.setCurrentLanguage(languageId); + return this.localizationProvider.loadLocalization(languageId); } } diff --git a/packages/core/src/node/os-backend-application-contribution.ts b/packages/core/src/node/os-backend-provider.ts similarity index 70% rename from packages/core/src/node/os-backend-application-contribution.ts rename to packages/core/src/node/os-backend-provider.ts index 0c979e4559517..53c56e8cbee8c 100644 --- a/packages/core/src/node/os-backend-application-contribution.ts +++ b/packages/core/src/node/os-backend-provider.ts @@ -14,17 +14,12 @@ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 // ***************************************************************************** -import * as express from 'express'; import { injectable } from 'inversify'; -import { BackendApplicationContribution } from './backend-application'; -import { OS } from '../common/os'; +import { OS, OSBackendProvider } from '../common/os'; @injectable() -export class OSBackendApplicationContribution implements BackendApplicationContribution { - - configure(app: express.Application): void { - app.get('/os', (_, res) => { - res.send(OS.type()); - }); +export class OSBackendProviderImpl implements OSBackendProvider { + getBackendOS(): Promise { + return Promise.resolve(OS.type()); } } diff --git a/packages/plugin-ext/src/main/node/plugin-ext-backend-module.ts b/packages/plugin-ext/src/main/node/plugin-ext-backend-module.ts index f065137f69f30..de29f8d417ab4 100644 --- a/packages/plugin-ext/src/main/node/plugin-ext-backend-module.ts +++ b/packages/plugin-ext/src/main/node/plugin-ext-backend-module.ts @@ -39,8 +39,8 @@ import { PluginTheiaEnvironment } from '../common/plugin-theia-environment'; import { PluginTheiaDeployerParticipant } from './plugin-theia-deployer-participant'; import { WebviewBackendSecurityWarnings } from './webview-backend-security-warnings'; import { PluginUninstallationManager } from './plugin-uninstallation-manager'; -import { LocalizationBackendContribution } from '@theia/core/lib/node/i18n/localization-backend-contribution'; -import { PluginLocalizationBackendContribution } from './plugin-localization-backend-contribution'; +import { LocalizationServerImpl } from '@theia/core/lib/node/i18n/localization-server'; +import { PluginLocalizationServer } from './plugin-localization-server'; export function bindMainBackend(bind: interfaces.Bind, unbind: interfaces.Unbind, isBound: interfaces.IsBound, rebind: interfaces.Rebind): void { bind(PluginApiContribution).toSelf().inSingletonScope(); @@ -88,6 +88,6 @@ export function bindMainBackend(bind: interfaces.Bind, unbind: interfaces.Unbind bind(WebviewBackendSecurityWarnings).toSelf().inSingletonScope(); bind(BackendApplicationContribution).toService(WebviewBackendSecurityWarnings); - rebind(LocalizationBackendContribution).to(PluginLocalizationBackendContribution).inSingletonScope(); + rebind(LocalizationServerImpl).to(PluginLocalizationServer).inSingletonScope(); } diff --git a/packages/plugin-ext/src/main/node/plugin-localization-backend-contribution.ts b/packages/plugin-ext/src/main/node/plugin-localization-server.ts similarity index 88% rename from packages/plugin-ext/src/main/node/plugin-localization-backend-contribution.ts rename to packages/plugin-ext/src/main/node/plugin-localization-server.ts index c6d286e5b3d5c..d033e4cfc4b8c 100644 --- a/packages/plugin-ext/src/main/node/plugin-localization-backend-contribution.ts +++ b/packages/plugin-ext/src/main/node/plugin-localization-server.ts @@ -15,13 +15,13 @@ // ***************************************************************************** import { inject, injectable } from '@theia/core/shared/inversify'; -import { LocalizationBackendContribution } from '@theia/core/lib/node/i18n/localization-backend-contribution'; import { PluginDeployer } from '../../common/plugin-protocol'; import { PluginDeployerImpl } from './plugin-deployer-impl'; import { Deferred } from '@theia/core/lib/common/promise-util'; +import { LocalizationServerImpl } from '@theia/core/lib/node/i18n/localization-server'; @injectable() -export class PluginLocalizationBackendContribution extends LocalizationBackendContribution { +export class PluginLocalizationServer extends LocalizationServerImpl { @inject(PluginDeployer) protected readonly pluginDeployer: PluginDeployerImpl; protected readonly pluginsDeployed = new Deferred(); From c4eeb2caad88b3004bae6d7928ac6b8a53c71839 Mon Sep 17 00:00:00 2001 From: Jonas Helming Date: Mon, 18 Sep 2023 16:30:53 +0200 Subject: [PATCH 51/79] Add follow-up section to PR template (#12901) * Add follow-up section to PR template fixed #12900 Signed-off-by: Jonas Helming --- .github/PULL_REQUEST_TEMPLATE.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 61d10d0b5dfe1..6f7d691b60110 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -10,11 +10,17 @@ vulnerabilities. --> #### What it does + #### How to test + +#### Follow-ups + + + #### Review checklist - [ ] As an author, I have thoroughly tested my changes and carefully followed [the review guidelines](https://github.com/theia-ide/theia/blob/master/doc/pull-requests.md#requesting-a-review) From a4d864bbcef86c1b5d774343d82d382b697952e8 Mon Sep 17 00:00:00 2001 From: Chris Radke Date: Tue, 19 Sep 2023 15:28:28 +0200 Subject: [PATCH 52/79] Create new untitled file on main area or tabbar double click (#12867) Signed-off-by: Christian Radke --- packages/core/src/browser/shell/application-shell.ts | 11 +++++++++++ packages/editor/src/browser/editor-manager.ts | 8 ++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/packages/core/src/browser/shell/application-shell.ts b/packages/core/src/browser/shell/application-shell.ts index 5e9449ef5f2d7..16fbf1663f114 100644 --- a/packages/core/src/browser/shell/application-shell.ts +++ b/packages/core/src/browser/shell/application-shell.ts @@ -246,6 +246,9 @@ export class ApplicationShell extends Widget { protected readonly onDidChangeCurrentWidgetEmitter = new Emitter>(); readonly onDidChangeCurrentWidget = this.onDidChangeCurrentWidgetEmitter.event; + protected readonly onDidDoubleClickMainAreaEmitter = new Emitter(); + readonly onDidDoubleClickMainArea = this.onDidDoubleClickMainAreaEmitter.event; + @inject(TheiaDockPanel.Factory) protected readonly dockPanelFactory: TheiaDockPanel.Factory; @@ -578,6 +581,14 @@ export class ApplicationShell extends Widget { } } }); + + dockPanel.node.addEventListener('dblclick', event => { + const el = event.target as Element; + if (el.id === MAIN_AREA_ID || el.classList.contains('p-TabBar-content')) { + this.onDidDoubleClickMainAreaEmitter.fire(); + } + }); + const handler = (e: DragEvent) => { if (e.dataTransfer) { e.dataTransfer.dropEffect = 'link'; diff --git a/packages/editor/src/browser/editor-manager.ts b/packages/editor/src/browser/editor-manager.ts index fd99c3b44be36..6b1b2bd8ad7d7 100644 --- a/packages/editor/src/browser/editor-manager.ts +++ b/packages/editor/src/browser/editor-manager.ts @@ -16,8 +16,8 @@ import { injectable, postConstruct, inject } from '@theia/core/shared/inversify'; import URI from '@theia/core/lib/common/uri'; -import { RecursivePartial, Emitter, Event, MaybePromise } from '@theia/core/lib/common'; -import { WidgetOpenerOptions, NavigatableWidgetOpenHandler, NavigatableWidgetOptions, Widget, PreferenceService } from '@theia/core/lib/browser'; +import { RecursivePartial, Emitter, Event, MaybePromise, CommandService } from '@theia/core/lib/common'; +import { WidgetOpenerOptions, NavigatableWidgetOpenHandler, NavigatableWidgetOptions, Widget, PreferenceService, CommonCommands } from '@theia/core/lib/browser'; import { EditorWidget } from './editor-widget'; import { Range, Position, Location, TextEditor } from './editor'; import { EditorWidgetFactory } from './editor-widget-factory'; @@ -54,6 +54,7 @@ export class EditorManager extends NavigatableWidgetOpenHandler { */ readonly onCurrentEditorChanged: Event = this.onCurrentEditorChangedEmitter.event; + @inject(CommandService) protected readonly commands: CommandService; @inject(PreferenceService) protected readonly preferenceService: PreferenceService; @postConstruct() @@ -61,6 +62,9 @@ export class EditorManager extends NavigatableWidgetOpenHandler { super.init(); this.shell.onDidChangeActiveWidget(() => this.updateActiveEditor()); this.shell.onDidChangeCurrentWidget(() => this.updateCurrentEditor()); + this.shell.onDidDoubleClickMainArea(() => + this.commands.executeCommand(CommonCommands.NEW_UNTITLED_TEXT_FILE.id) + ); this.onCreated(widget => { widget.onDidChangeVisibility(() => { if (widget.isVisible) { From 62994147fbf8e4af0dae70f3f67ba7a09dba524c Mon Sep 17 00:00:00 2001 From: FernandoAscencio <48699277+FernandoAscencio@users.noreply.github.com> Date: Tue, 19 Sep 2023 09:29:43 -0400 Subject: [PATCH 53/79] Retire `context` keyword from keybindings (#12830) Retiring the use of `context` in keybindings - `Blame Keybinding context` deletion - `Terminal Keybinding context` deletion - `Console Keybinding Context` deletion - `Debug Keybinding Context` deletion - `Editor Keybinding Context` deletion - `Notification Keybinding Contribution` deletion - `Navigator Keybinding Context` deletion Signed-off-by: Fernando Ascencio --- .../src/browser/console-contribution.ts | 9 +- .../src/browser/console-frontend-module.ts | 7 +- .../browser/console-keybinding-contexts.ts | 107 ------------------ .../console/src/browser/console-widget.ts | 24 +++- ...debug-frontend-application-contribution.ts | 25 ++-- .../src/browser/debug-frontend-module.ts | 6 +- .../src/browser/debug-keybinding-contexts.ts | 75 ------------ .../editor/debug-breakpoint-widget.tsx | 3 + .../src/browser/editor-frontend-module.ts | 7 +- .../src/browser/editor-keybinding-contexts.ts | 87 -------------- packages/editor/src/browser/index.ts | 1 - .../src/browser/blame/blame-contribution.ts | 54 +++++---- .../git/src/browser/blame/blame-module.ts | 6 +- .../src/browser/messages-frontend-module.ts | 6 +- .../src/browser/notifications-contribution.ts | 21 +--- .../src/browser/notifications-manager.ts | 5 +- .../src/browser/monaco-frontend-module.ts | 3 - .../src/browser/monaco-keybinding-contexts.ts | 43 ------- .../src/browser/navigator-contribution.ts | 7 +- .../src/browser/navigator-frontend-module.ts | 5 +- .../browser/navigator-keybinding-context.ts | 36 ------ .../browser/terminal-frontend-contribution.ts | 17 ++- .../src/browser/terminal-frontend-module.ts | 5 +- .../browser/terminal-keybinding-contexts.ts | 52 --------- 24 files changed, 104 insertions(+), 507 deletions(-) delete mode 100644 packages/console/src/browser/console-keybinding-contexts.ts delete mode 100644 packages/debug/src/browser/debug-keybinding-contexts.ts delete mode 100644 packages/editor/src/browser/editor-keybinding-contexts.ts delete mode 100644 packages/monaco/src/browser/monaco-keybinding-contexts.ts delete mode 100644 packages/navigator/src/browser/navigator-keybinding-context.ts delete mode 100644 packages/terminal/src/browser/terminal-keybinding-contexts.ts diff --git a/packages/console/src/browser/console-contribution.ts b/packages/console/src/browser/console-contribution.ts index bc68cec19ce40..163d87bb84a84 100644 --- a/packages/console/src/browser/console-contribution.ts +++ b/packages/console/src/browser/console-contribution.ts @@ -18,7 +18,6 @@ import { injectable, inject } from '@theia/core/shared/inversify'; import { Command, CommandContribution, CommandRegistry, MenuContribution, MenuModelRegistry, CommandHandler } from '@theia/core'; import { FrontendApplicationContribution, KeybindingContribution, KeybindingRegistry, CommonCommands } from '@theia/core/lib/browser'; import { ConsoleManager } from './console-manager'; -import { ConsoleKeybindingContexts } from './console-keybinding-contexts'; import { ConsoleWidget } from './console-widget'; import { ConsoleContentWidget } from './console-content-widget'; import { nls } from '@theia/core/lib/common/nls'; @@ -70,22 +69,22 @@ export class ConsoleContribution implements FrontendApplicationContribution, Com keybindings.registerKeybinding({ command: ConsoleCommands.SELECT_ALL.id, keybinding: 'ctrlcmd+a', - context: ConsoleKeybindingContexts.consoleContentFocus + when: 'consoleContentFocus' }); keybindings.registerKeybinding({ command: ConsoleCommands.EXECUTE.id, keybinding: 'enter', - context: ConsoleKeybindingContexts.consoleInputFocus + when: 'consoleInputFocus' }); keybindings.registerKeybinding({ command: ConsoleCommands.NAVIGATE_BACK.id, keybinding: 'up', - context: ConsoleKeybindingContexts.consoleNavigationBackEnabled + when: 'consoleInputFocus && consoleNavigationBackEnabled' }); keybindings.registerKeybinding({ command: ConsoleCommands.NAVIGATE_FORWARD.id, keybinding: 'down', - context: ConsoleKeybindingContexts.consoleNavigationForwardEnabled + when: 'consoleInputFocus && consoleNavigationForwardEnabled' }); } diff --git a/packages/console/src/browser/console-frontend-module.ts b/packages/console/src/browser/console-frontend-module.ts index 2cee38f9362e3..899417c992a86 100644 --- a/packages/console/src/browser/console-frontend-module.ts +++ b/packages/console/src/browser/console-frontend-module.ts @@ -16,19 +16,14 @@ import { ContainerModule } from '@theia/core/shared/inversify'; import { CommandContribution, MenuContribution } from '@theia/core'; -import { FrontendApplicationContribution, KeybindingContext, KeybindingContribution } from '@theia/core/lib/browser'; +import { FrontendApplicationContribution, KeybindingContribution } from '@theia/core/lib/browser'; import { ConsoleContribution } from './console-contribution'; import { ConsoleManager } from './console-manager'; -import { ConsoleInputFocusContext, ConsoleNavigationBackEnabled, ConsoleNavigationForwardEnabled, ConsoleContentFocusContext } from './console-keybinding-contexts'; import '../../src/browser/style/index.css'; export default new ContainerModule(bind => { bind(ConsoleManager).toSelf().inSingletonScope(); - bind(KeybindingContext).to(ConsoleInputFocusContext).inSingletonScope(); - bind(KeybindingContext).to(ConsoleContentFocusContext).inSingletonScope(); - bind(KeybindingContext).to(ConsoleNavigationBackEnabled).inSingletonScope(); - bind(KeybindingContext).to(ConsoleNavigationForwardEnabled).inSingletonScope(); bind(ConsoleContribution).toSelf().inSingletonScope(); bind(FrontendApplicationContribution).toService(ConsoleContribution); bind(CommandContribution).toService(ConsoleContribution); diff --git a/packages/console/src/browser/console-keybinding-contexts.ts b/packages/console/src/browser/console-keybinding-contexts.ts deleted file mode 100644 index 755c569707bbb..0000000000000 --- a/packages/console/src/browser/console-keybinding-contexts.ts +++ /dev/null @@ -1,107 +0,0 @@ -// ***************************************************************************** -// Copyright (C) 2018 TypeFox and others. -// -// This program and the accompanying materials are made available under the -// terms of the Eclipse Public License v. 2.0 which is available at -// http://www.eclipse.org/legal/epl-2.0. -// -// This Source Code may also be made available under the following Secondary -// Licenses when the conditions for such availability set forth in the Eclipse -// Public License v. 2.0 are satisfied: GNU General Public License, version 2 -// with the GNU Classpath Exception which is available at -// https://www.gnu.org/software/classpath/license.html. -// -// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 -// ***************************************************************************** - -import { injectable, inject } from '@theia/core/shared/inversify'; -import { KeybindingContext } from '@theia/core/lib/browser'; -import { ConsoleManager } from './console-manager'; -import { ConsoleWidget } from './console-widget'; - -export namespace ConsoleKeybindingContexts { - - /** - * ID of a keybinding context that is enabled when the console content has the focus. - */ - export const consoleContentFocus = 'consoleContentFocus'; - - /** - * ID of a keybinding context that is enabled when the console input has the focus. - */ - export const consoleInputFocus = 'consoleInputFocus'; - - /** - * ID of a keybinding context that is enabled when the console history navigation back is enabled. - */ - export const consoleNavigationBackEnabled = 'consoleNavigationBackEnabled'; - - /** - * ID of a keybinding context that is enabled when the console history navigation forward is enabled. - */ - export const consoleNavigationForwardEnabled = 'consoleNavigationForwardEnabled'; - -} - -@injectable() -export class ConsoleInputFocusContext implements KeybindingContext { - - readonly id: string = ConsoleKeybindingContexts.consoleInputFocus; - - @inject(ConsoleManager) - protected readonly manager: ConsoleManager; - - isEnabled(): boolean { - const console = this.manager.activeConsole; - return !!console && this.isConsoleEnabled(console); - } - - protected isConsoleEnabled(console: ConsoleWidget): boolean { - return console.hasInputFocus(); - } - -} - -@injectable() -export class ConsoleContentFocusContext extends ConsoleInputFocusContext { - - override readonly id: string = ConsoleKeybindingContexts.consoleContentFocus; - - protected override isConsoleEnabled(console: ConsoleWidget): boolean { - return !console.input.isFocused(); - } - -} - -@injectable() -export class ConsoleNavigationBackEnabled extends ConsoleInputFocusContext { - - override readonly id: string = ConsoleKeybindingContexts.consoleNavigationBackEnabled; - - protected override isConsoleEnabled(console: ConsoleWidget): boolean { - if (!super.isConsoleEnabled(console)) { - return false; - } - const editor = console.input.getControl(); - return editor.getPosition()!.equals({ lineNumber: 1, column: 1 }); - } - -} - -@injectable() -export class ConsoleNavigationForwardEnabled extends ConsoleInputFocusContext { - - override readonly id: string = ConsoleKeybindingContexts.consoleNavigationForwardEnabled; - - protected override isConsoleEnabled(console: ConsoleWidget): boolean { - if (!super.isConsoleEnabled(console)) { - return false; - } - const editor = console.input.getControl(); - const model = console.input.getControl().getModel()!; - const lineNumber = model.getLineCount(); - const column = model.getLineMaxColumn(lineNumber); - return editor.getPosition()!.equals({ lineNumber, column }); - } - -} diff --git a/packages/console/src/browser/console-widget.ts b/packages/console/src/browser/console-widget.ts index ed508a7f1ec71..0f6065fefde09 100644 --- a/packages/console/src/browser/console-widget.ts +++ b/packages/console/src/browser/console-widget.ts @@ -17,7 +17,7 @@ import { ElementExt } from '@theia/core/shared/@phosphor/domutils'; import { injectable, inject, postConstruct, interfaces, Container } from '@theia/core/shared/inversify'; import { TreeSourceNode } from '@theia/core/lib/browser/source-tree'; -import { ContextKey } from '@theia/core/lib/browser/context-key-service'; +import { ContextKeyService, ContextKey } from '@theia/core/lib/browser/context-key-service'; import { BaseWidget, PanelLayout, Widget, Message, MessageLoop, StatefulWidget, CompositeTreeNode } from '@theia/core/lib/browser'; import { MonacoEditor } from '@theia/monaco/lib/browser/monaco-editor'; import URI from '@theia/core/lib/common/uri'; @@ -75,7 +75,11 @@ export class ConsoleWidget extends BaseWidget implements StatefulWidget { @inject(MonacoEditorProvider) protected readonly editorProvider: MonacoEditorProvider; + @inject(ContextKeyService) + protected readonly contextKeyService: ContextKeyService; + protected _input: MonacoEditor; + protected _inputFocusContextKey: ContextKey; constructor() { super(); @@ -129,7 +133,13 @@ export class ConsoleWidget extends BaseWidget implements StatefulWidget { this.updateFont(); if (inputFocusContextKey) { this.toDispose.push(input.onFocusChanged(() => inputFocusContextKey.set(this.hasInputFocus()))); + this.toDispose.push(input.onCursorPositionChanged(() => input.getControl().createContextKey('consoleNavigationBackEnabled', this.consoleNavigationBackEnabled))); + this.toDispose.push(input.onCursorPositionChanged(() => input.getControl().createContextKey('consoleNavigationForwardEnabled', this.consoleNavigationForwardEnabled))); } + input.getControl().createContextKey('consoleInputFocus', true); + const contentContext = this.contextKeyService.createScoped(this.content.node); + contentContext.setContext('consoleContentFocus', true); + this.toDispose.push(contentContext); } protected createInput(node: HTMLElement): Promise { @@ -159,6 +169,18 @@ export class ConsoleWidget extends BaseWidget implements StatefulWidget { return this._input; } + get consoleNavigationBackEnabled(): boolean { + const editor = this.input.getControl(); + return !!editor.getPosition()!.equals({ lineNumber: 1, column: 1 }); + } + + get consoleNavigationForwardEnabled(): boolean { + const editor = this.input.getControl(); + const lineNumber = editor.getModel()!.getLineCount(); + const column = editor.getModel()!.getLineMaxColumn(lineNumber); + return !!editor.getPosition()!.equals({ lineNumber, column }); + } + selectAll(): void { const selection = document.getSelection(); if (selection) { diff --git a/packages/debug/src/browser/debug-frontend-application-contribution.ts b/packages/debug/src/browser/debug-frontend-application-contribution.ts index af484d25cce29..4ca406c3860b4 100644 --- a/packages/debug/src/browser/debug-frontend-application-contribution.ts +++ b/packages/debug/src/browser/debug-frontend-application-contribution.ts @@ -20,7 +20,7 @@ import { import { injectable, inject } from '@theia/core/shared/inversify'; import * as monaco from '@theia/monaco-editor-core'; import { MenuModelRegistry, CommandRegistry, MAIN_MENU_BAR, Command, Emitter, Mutable, CompoundMenuNodeRole } from '@theia/core/lib/common'; -import { EDITOR_LINENUMBER_CONTEXT_MENU, EditorKeybindingContexts, EditorManager } from '@theia/editor/lib/browser'; +import { EDITOR_LINENUMBER_CONTEXT_MENU, EditorManager } from '@theia/editor/lib/browser'; import { DebugSessionManager } from './debug-session-manager'; import { DebugWidget } from './view/debug-widget'; import { FunctionBreakpoint } from './breakpoint/breakpoint-marker'; @@ -36,7 +36,6 @@ import { DebugStackFrame } from './model/debug-stack-frame'; import { DebugVariablesWidget } from './view/debug-variables-widget'; import { DebugVariable } from './console/debug-console-items'; import { DebugSessionWidget } from './view/debug-session-widget'; -import { DebugKeybindingContexts } from './debug-keybinding-contexts'; import { DebugEditorModel } from './editor/debug-editor-model'; import { DebugEditorService } from './editor/debug-editor-service'; import { DebugConsoleContribution } from './console/debug-console-contribution'; @@ -1021,60 +1020,60 @@ export class DebugFrontendApplicationContribution extends AbstractViewContributi keybindings.registerKeybinding({ command: DebugCommands.STOP.id, keybinding: 'shift+f5', - context: DebugKeybindingContexts.inDebugMode + when: 'inDebugMode' }); keybindings.registerKeybinding({ command: DebugCommands.RESTART.id, keybinding: 'shift+ctrlcmd+f5', - context: DebugKeybindingContexts.inDebugMode + when: 'inDebugMode' }); keybindings.registerKeybinding({ command: DebugCommands.STEP_OVER.id, keybinding: 'f10', - context: DebugKeybindingContexts.inDebugMode + when: 'inDebugMode' }); keybindings.registerKeybinding({ command: DebugCommands.STEP_INTO.id, keybinding: 'f11', - context: DebugKeybindingContexts.inDebugMode + when: 'inDebugMode' }); keybindings.registerKeybinding({ command: DebugCommands.STEP_OUT.id, keybinding: 'shift+f11', - context: DebugKeybindingContexts.inDebugMode + when: 'inDebugMode' }); keybindings.registerKeybinding({ command: DebugCommands.CONTINUE.id, keybinding: 'f5', - context: DebugKeybindingContexts.inDebugMode + when: 'inDebugMode' }); keybindings.registerKeybinding({ command: DebugCommands.PAUSE.id, keybinding: 'f6', - context: DebugKeybindingContexts.inDebugMode + when: 'inDebugMode' }); keybindings.registerKeybinding({ command: DebugCommands.TOGGLE_BREAKPOINT.id, keybinding: 'f9', - context: EditorKeybindingContexts.editorTextFocus + when: 'editorTextFocus' }); keybindings.registerKeybinding({ command: DebugCommands.INLINE_BREAKPOINT.id, keybinding: 'shift+f9', - context: EditorKeybindingContexts.editorTextFocus + when: 'editorTextFocus' }); keybindings.registerKeybinding({ command: DebugBreakpointWidgetCommands.ACCEPT.id, keybinding: 'enter', - context: DebugKeybindingContexts.breakpointWidgetInputFocus + when: 'breakpointWidgetFocus' }); keybindings.registerKeybinding({ command: DebugBreakpointWidgetCommands.CLOSE.id, keybinding: 'esc', - context: DebugKeybindingContexts.breakpointWidgetInputStrictFocus + when: 'isBreakpointWidgetVisible || breakpointWidgetFocus' }); } diff --git a/packages/debug/src/browser/debug-frontend-module.ts b/packages/debug/src/browser/debug-frontend-module.ts index f645edb64657c..d00eb179a8a9f 100644 --- a/packages/debug/src/browser/debug-frontend-module.ts +++ b/packages/debug/src/browser/debug-frontend-module.ts @@ -22,7 +22,7 @@ import { DebugWidget } from './view/debug-widget'; import { DebugPath, DebugService } from '../common/debug-service'; import { WidgetFactory, WebSocketConnectionProvider, FrontendApplicationContribution, - bindViewContribution, KeybindingContext + bindViewContribution } from '@theia/core/lib/browser'; import { DebugSessionManager } from './debug-session-manager'; import { DebugResourceResolver } from './debug-resource'; @@ -39,7 +39,6 @@ import { DebugFrontendApplicationContribution } from './debug-frontend-applicati import { DebugConsoleContribution } from './console/debug-console-contribution'; import { BreakpointManager } from './breakpoint/breakpoint-manager'; import { DebugEditorService } from './editor/debug-editor-service'; -import { InDebugModeContext, BreakpointWidgetInputFocusContext, BreakpointWidgetInputStrictFocusContext } from './debug-keybinding-contexts'; import { DebugEditorModelFactory, DebugEditorModel } from './editor/debug-editor-model'; import { bindDebugPreferences } from './debug-preferences'; import { DebugSchemaUpdater } from './debug-schema-updater'; @@ -100,9 +99,6 @@ export default new ContainerModule((bind: interfaces.Bind) => { bind(DebugResourceResolver).toSelf().inSingletonScope(); bind(ResourceResolver).toService(DebugResourceResolver); - bind(KeybindingContext).to(InDebugModeContext).inSingletonScope(); - bind(KeybindingContext).to(BreakpointWidgetInputFocusContext).inSingletonScope(); - bind(KeybindingContext).to(BreakpointWidgetInputStrictFocusContext).inSingletonScope(); bindViewContribution(bind, DebugFrontendApplicationContribution); bind(FrontendApplicationContribution).toService(DebugFrontendApplicationContribution); bind(TabBarToolbarContribution).toService(DebugFrontendApplicationContribution); diff --git a/packages/debug/src/browser/debug-keybinding-contexts.ts b/packages/debug/src/browser/debug-keybinding-contexts.ts deleted file mode 100644 index 6c8ea255ba896..0000000000000 --- a/packages/debug/src/browser/debug-keybinding-contexts.ts +++ /dev/null @@ -1,75 +0,0 @@ -// ***************************************************************************** -// Copyright (C) 2018 TypeFox and others. -// -// This program and the accompanying materials are made available under the -// terms of the Eclipse Public License v. 2.0 which is available at -// http://www.eclipse.org/legal/epl-2.0. -// -// This Source Code may also be made available under the following Secondary -// Licenses when the conditions for such availability set forth in the Eclipse -// Public License v. 2.0 are satisfied: GNU General Public License, version 2 -// with the GNU Classpath Exception which is available at -// https://www.gnu.org/software/classpath/license.html. -// -// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 -// ***************************************************************************** - -import { injectable, inject } from '@theia/core/shared/inversify'; -import { KeybindingContext } from '@theia/core/lib/browser'; -import { DebugSessionManager } from './debug-session-manager'; -import { DebugEditorService } from './editor/debug-editor-service'; -import { DebugEditorModel } from './editor/debug-editor-model'; - -export namespace DebugKeybindingContexts { - - export const inDebugMode = 'inDebugMode'; - - export const breakpointWidgetInputFocus = 'breakpointWidgetInputFocus'; - - export const breakpointWidgetInputStrictFocus = 'breakpointWidgetInputStrictFocus'; - -} - -@injectable() -export class InDebugModeContext implements KeybindingContext { - - readonly id: string = DebugKeybindingContexts.inDebugMode; - - @inject(DebugSessionManager) - protected readonly manager: DebugSessionManager; - - isEnabled(): boolean { - return this.manager.inDebugMode; - } - -} - -@injectable() -export class BreakpointWidgetInputFocusContext implements KeybindingContext { - - readonly id: string = DebugKeybindingContexts.breakpointWidgetInputFocus; - - @inject(DebugEditorService) - protected readonly editors: DebugEditorService; - - isEnabled(): boolean { - const model = this.editors.model; - return !!model && !!model.breakpointWidget.position && this.isFocused(model); - } - - protected isFocused(model: DebugEditorModel): boolean { - return !!model.breakpointWidget.input && model.breakpointWidget.input.isFocused({ strict: true }); - } - -} - -@injectable() -export class BreakpointWidgetInputStrictFocusContext extends BreakpointWidgetInputFocusContext { - - override readonly id: string = DebugKeybindingContexts.breakpointWidgetInputStrictFocus; - - protected override isFocused(model: DebugEditorModel): boolean { - return super.isFocused(model) || model.editor.isFocused({ strict: true }); - } - -} diff --git a/packages/debug/src/browser/editor/debug-breakpoint-widget.tsx b/packages/debug/src/browser/editor/debug-breakpoint-widget.tsx index 8b5c6dc5c0531..bd8c145ee2537 100644 --- a/packages/debug/src/browser/editor/debug-breakpoint-widget.tsx +++ b/packages/debug/src/browser/editor/debug-breakpoint-widget.tsx @@ -157,6 +157,7 @@ export class DebugBreakpointWidget implements Disposable { this.zone.layout(heightInLines); this.updatePlaceholder(); })); + this._input.getControl().createContextKey('breakpointWidgetFocus', true); } dispose(): void { @@ -198,10 +199,12 @@ export class DebugBreakpointWidget implements Disposable { this.zone.show({ afterLineNumber, afterColumn, heightInLines, frameWidth: 1 }); editor.setPosition(editor.getModel()!.getPositionAt(editor.getModel()!.getValueLength())); this._input.focus(); + this.editor.getControl().createContextKey('isBreakpointWidgetVisible', true); } hide(): void { this.zone.hide(); + this.editor.getControl().createContextKey('isBreakpointWidgetVisible', false); this.editor.focus(); } diff --git a/packages/editor/src/browser/editor-frontend-module.ts b/packages/editor/src/browser/editor-frontend-module.ts index 48c0524489116..a22365ea28e3c 100644 --- a/packages/editor/src/browser/editor-frontend-module.ts +++ b/packages/editor/src/browser/editor-frontend-module.ts @@ -19,13 +19,12 @@ import '../../src/browser/language-status/editor-language-status.css'; import { ContainerModule } from '@theia/core/shared/inversify'; import { CommandContribution, MenuContribution } from '@theia/core/lib/common'; -import { OpenHandler, WidgetFactory, FrontendApplicationContribution, KeybindingContext, KeybindingContribution } from '@theia/core/lib/browser'; +import { OpenHandler, WidgetFactory, FrontendApplicationContribution, KeybindingContribution } from '@theia/core/lib/browser'; import { VariableContribution } from '@theia/variable-resolver/lib/browser'; import { EditorManager, EditorAccess, ActiveEditorAccess, CurrentEditorAccess } from './editor-manager'; import { EditorContribution } from './editor-contribution'; import { EditorMenuContribution } from './editor-menu'; import { EditorCommandContribution } from './editor-command'; -import { EditorTextFocusContext, StrictEditorTextFocusContext, DiffEditorTextFocusContext } from './editor-keybinding-contexts'; import { EditorKeybindingContribution } from './editor-keybinding'; import { bindEditorPreferences } from './editor-preferences'; import { EditorWidgetFactory } from './editor-widget-factory'; @@ -55,10 +54,6 @@ export default new ContainerModule(bind => { bind(EditorMenuContribution).toSelf().inSingletonScope(); bind(MenuContribution).toService(EditorMenuContribution); - bind(StrictEditorTextFocusContext).toSelf().inSingletonScope(); - bind(KeybindingContext).toService(StrictEditorTextFocusContext); - bind(KeybindingContext).to(EditorTextFocusContext).inSingletonScope(); - bind(KeybindingContext).to(DiffEditorTextFocusContext).inSingletonScope(); bind(EditorKeybindingContribution).toSelf().inSingletonScope(); bind(KeybindingContribution).toService(EditorKeybindingContribution); diff --git a/packages/editor/src/browser/editor-keybinding-contexts.ts b/packages/editor/src/browser/editor-keybinding-contexts.ts deleted file mode 100644 index 9d478f5387411..0000000000000 --- a/packages/editor/src/browser/editor-keybinding-contexts.ts +++ /dev/null @@ -1,87 +0,0 @@ -// ***************************************************************************** -// Copyright (C) 2018 TypeFox and others. -// -// This program and the accompanying materials are made available under the -// terms of the Eclipse Public License v. 2.0 which is available at -// http://www.eclipse.org/legal/epl-2.0. -// -// This Source Code may also be made available under the following Secondary -// Licenses when the conditions for such availability set forth in the Eclipse -// Public License v. 2.0 are satisfied: GNU General Public License, version 2 -// with the GNU Classpath Exception which is available at -// https://www.gnu.org/software/classpath/license.html. -// -// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 -// ***************************************************************************** - -import { injectable, inject } from '@theia/core/shared/inversify'; -import { KeybindingContext } from '@theia/core/lib/browser/keybinding'; -import { EditorManager } from './editor-manager'; -import { EditorWidget } from './editor-widget'; -import { DiffUris } from '@theia/core/lib/browser'; - -export namespace EditorKeybindingContexts { - - /** - * ID of a keybinding context that is enabled when the active text editor has the focus. - */ - export const editorTextFocus = 'editorTextFocus'; - - /** - * ID of a keybinding context that is enabled when the active diff editor has the focus. - */ - export const diffEditorTextFocus = 'diffEditorTextFocus'; - - /** - * Unique identifier of a keybinding context that is enabled if the active editor has the focus but it does not have any overlaying widgets, such as the content assist widget. - */ - export const strictEditorTextFocus = 'strictEditorTextFocus'; -} - -@injectable() -export class EditorTextFocusContext implements KeybindingContext { - - readonly id: string = EditorKeybindingContexts.editorTextFocus; - - @inject(EditorManager) - protected readonly editorManager: EditorManager; - - isEnabled(): boolean { - return !!this.getEditor(); - } - - protected getEditor(): EditorWidget | undefined { - const widget = this.editorManager.activeEditor; - if (widget && this.canHandle(widget)) { - return widget; - } - return undefined; - } - - protected canHandle(widget: EditorWidget): boolean { - return widget.editor.isFocused(); - } - -} - -@injectable() -export class DiffEditorTextFocusContext extends EditorTextFocusContext { - - override readonly id: string = EditorKeybindingContexts.diffEditorTextFocus; - - protected override canHandle(widget: EditorWidget): boolean { - return super.canHandle(widget) && DiffUris.isDiffUri(widget.editor.uri); - } - -} - -/** - * Keybinding context that is enabled when the active text editor has the focus **AND** it does not - * have any widgets (for example, the content assist widget) overlaying the active editor. - */ -@injectable() -export class StrictEditorTextFocusContext extends EditorTextFocusContext { - - override readonly id: string = EditorKeybindingContexts.strictEditorTextFocus; - -} diff --git a/packages/editor/src/browser/index.ts b/packages/editor/src/browser/index.ts index 93f40bd14bf8d..fa5faf6f67aa4 100644 --- a/packages/editor/src/browser/index.ts +++ b/packages/editor/src/browser/index.ts @@ -20,7 +20,6 @@ export * from './editor-widget'; export * from './editor-manager'; export * from './editor-command'; export * from './editor-menu'; -export * from './editor-keybinding-contexts'; export * from './editor-frontend-module'; export * from './editor-preferences'; export * from './decorations'; diff --git a/packages/git/src/browser/blame/blame-contribution.ts b/packages/git/src/browser/blame/blame-contribution.ts index a3fb023eec088..b35eed05637e3 100644 --- a/packages/git/src/browser/blame/blame-contribution.ts +++ b/packages/git/src/browser/blame/blame-contribution.ts @@ -14,14 +14,15 @@ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 // ***************************************************************************** -import { inject, injectable } from '@theia/core/shared/inversify'; +import { inject, injectable, postConstruct } from '@theia/core/shared/inversify'; import { KeybindingContribution, KeybindingRegistry } from '@theia/core/lib/browser'; import { CommandContribution, CommandRegistry, Command, MenuContribution, MenuModelRegistry, DisposableCollection } from '@theia/core/lib/common'; import { BlameDecorator } from './blame-decorator'; -import { EditorManager, EditorKeybindingContexts, EditorWidget, EditorTextFocusContext, StrictEditorTextFocusContext } from '@theia/editor/lib/browser'; +import { EditorManager, EditorWidget } from '@theia/editor/lib/browser'; import { BlameManager } from './blame-manager'; import URI from '@theia/core/lib/common/uri'; import { EDITOR_CONTEXT_MENU_SCM } from '@theia/scm-extra/lib/browser/scm-extra-contribution'; +import { ContextKey, ContextKeyService } from '@theia/core/lib/browser/context-key-service'; import debounce = require('@theia/core/shared/lodash.debounce'); @@ -48,6 +49,21 @@ export class BlameContribution implements CommandContribution, KeybindingContrib @inject(BlameManager) protected readonly blameManager: BlameManager; + @inject(ContextKeyService) + protected readonly contextKeyService: ContextKeyService; + + protected _visibleBlameAnnotations: ContextKey; + + @postConstruct() + protected init(): void { + this._visibleBlameAnnotations = this.contextKeyService.createKey('showsBlameAnnotations', this.visibleBlameAnnotations()); + this.editorManager.onActiveEditorChanged(() => this.updateContext()); + } + + protected updateContext(): void { + this._visibleBlameAnnotations.set(this.visibleBlameAnnotations()); + } + registerCommands(commands: CommandRegistry): void { commands.registerCommand(BlameCommands.TOGGLE_GIT_ANNOTATIONS, { execute: () => { @@ -100,6 +116,14 @@ export class BlameContribution implements CommandContribution, KeybindingContrib return this.blameManager.isBlameable(uri.toString()); } + protected visibleBlameAnnotations(): boolean { + const widget = this.editorManager.activeEditor; + if (widget && widget.editor.isFocused() && this.showsBlameAnnotations(widget.editor.uri)) { + return true; + } + return false; + } + protected appliedDecorations = new Map(); protected async showBlame(editorWidget: EditorWidget): Promise { @@ -128,6 +152,7 @@ export class BlameContribution implements CommandContribution, KeybindingContrib if (toDispose.disposed) { this.appliedDecorations.delete(uri); }; + this.updateContext(); } } @@ -136,6 +161,7 @@ export class BlameContribution implements CommandContribution, KeybindingContrib if (decorations) { this.appliedDecorations.delete(uri.toString()); decorations.dispose(); + this.updateContext(); } } @@ -148,34 +174,14 @@ export class BlameContribution implements CommandContribution, KeybindingContrib registerKeybindings(keybindings: KeybindingRegistry): void { keybindings.registerKeybinding({ command: BlameCommands.TOGGLE_GIT_ANNOTATIONS.id, - context: EditorKeybindingContexts.editorTextFocus, + when: 'editorTextFocus', keybinding: 'alt+b' }); keybindings.registerKeybinding({ command: BlameCommands.CLEAR_GIT_ANNOTATIONS.id, - context: BlameAnnotationsKeybindingContext.showsBlameAnnotations, + when: 'showsBlameAnnotations', keybinding: 'esc' }); } } - -@injectable() -export class BlameAnnotationsKeybindingContext extends EditorTextFocusContext { - - @inject(BlameContribution) - protected readonly blameContribution: BlameContribution; - - @inject(StrictEditorTextFocusContext) - protected readonly base: StrictEditorTextFocusContext; - - override id = BlameAnnotationsKeybindingContext.showsBlameAnnotations; - - protected override canHandle(widget: EditorWidget): boolean { - return this.base.isEnabled() && this.blameContribution.showsBlameAnnotations(widget.editor.uri); - } -} - -export namespace BlameAnnotationsKeybindingContext { - export const showsBlameAnnotations = 'showsBlameAnnotations'; -} diff --git a/packages/git/src/browser/blame/blame-module.ts b/packages/git/src/browser/blame/blame-module.ts index c2b5924658e30..af028178b21cb 100644 --- a/packages/git/src/browser/blame/blame-module.ts +++ b/packages/git/src/browser/blame/blame-module.ts @@ -15,9 +15,9 @@ // ***************************************************************************** import { interfaces } from '@theia/core/shared/inversify'; -import { KeybindingContribution, KeybindingContext } from '@theia/core/lib/browser'; +import { KeybindingContribution } from '@theia/core/lib/browser'; import { CommandContribution, MenuContribution } from '@theia/core/lib/common'; -import { BlameContribution, BlameAnnotationsKeybindingContext } from './blame-contribution'; +import { BlameContribution } from './blame-contribution'; import { BlameDecorator } from './blame-decorator'; import { BlameManager } from './blame-manager'; @@ -28,6 +28,4 @@ export function bindBlame(bind: interfaces.Bind): void { for (const serviceIdentifier of [CommandContribution, KeybindingContribution, MenuContribution]) { bind(serviceIdentifier).toService(BlameContribution); } - bind(BlameAnnotationsKeybindingContext).toSelf().inSingletonScope(); - bind(KeybindingContext).toService(BlameAnnotationsKeybindingContext); } diff --git a/packages/messages/src/browser/messages-frontend-module.ts b/packages/messages/src/browser/messages-frontend-module.ts index 2367036f8f8df..5a7fa32963998 100644 --- a/packages/messages/src/browser/messages-frontend-module.ts +++ b/packages/messages/src/browser/messages-frontend-module.ts @@ -21,8 +21,8 @@ import { MessageClient } from '@theia/core/lib/common'; import { NotificationManager } from './notifications-manager'; import { bindNotificationPreferences } from './notification-preferences'; import { NotificationsRenderer } from './notifications-renderer'; -import { NotificationsContribution, NotificationsKeybindingContext } from './notifications-contribution'; -import { FrontendApplicationContribution, KeybindingContribution, KeybindingContext, StylingParticipant } from '@theia/core/lib/browser'; +import { NotificationsContribution } from './notifications-contribution'; +import { FrontendApplicationContribution, KeybindingContribution, StylingParticipant } from '@theia/core/lib/browser'; import { CommandContribution } from '@theia/core'; import { ColorContribution } from '@theia/core/lib/browser/color-application-contribution'; import { NotificationContentRenderer } from './notification-content-renderer'; @@ -36,8 +36,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(KeybindingContribution).toService(NotificationsContribution); bind(ColorContribution).toService(NotificationsContribution); bind(StylingParticipant).toService(NotificationsContribution); - bind(NotificationsKeybindingContext).toSelf().inSingletonScope(); - bind(KeybindingContext).toService(NotificationsKeybindingContext); bind(NotificationManager).toSelf().inSingletonScope(); rebind(MessageClient).toService(NotificationManager); bindNotificationPreferences(bind); diff --git a/packages/messages/src/browser/notifications-contribution.ts b/packages/messages/src/browser/notifications-contribution.ts index 520cb74f4ec46..b152f9c828c54 100644 --- a/packages/messages/src/browser/notifications-contribution.ts +++ b/packages/messages/src/browser/notifications-contribution.ts @@ -17,9 +17,8 @@ import { injectable, inject } from '@theia/core/shared/inversify'; import { FrontendApplicationContribution, StatusBar, FrontendApplication, StatusBarAlignment, - KeybindingContribution, KeybindingRegistry, KeybindingContext, StylingParticipant, ColorTheme, CssStyleCollector + KeybindingContribution, KeybindingRegistry, StylingParticipant, ColorTheme, CssStyleCollector } from '@theia/core/lib/browser'; -import { Keybinding } from '@theia/core/lib/common/keybinding'; import { NotificationsCommands } from './notifications-commands'; import { CommandContribution, CommandRegistry } from '@theia/core'; import { NotificationManager } from './notifications-manager'; @@ -98,7 +97,7 @@ export class NotificationsContribution implements FrontendApplicationContributio registerKeybindings(keybindings: KeybindingRegistry): void { keybindings.registerKeybinding({ command: NotificationsCommands.HIDE.id, - context: NotificationsKeybindingContext.notificationsVisible, + when: 'notificationsVisible', keybinding: 'esc' }); } @@ -217,19 +216,3 @@ export class NotificationsContribution implements FrontendApplicationContributio } } } - -@injectable() -export class NotificationsKeybindingContext implements KeybindingContext { - - @inject(NotificationManager) - protected readonly manager: NotificationManager; - - readonly id = NotificationsKeybindingContext.notificationsVisible; - isEnabled(_arg: Keybinding): boolean { - return this.manager.centerVisible || this.manager.toastsVisible; - } - -} -export namespace NotificationsKeybindingContext { - export const notificationsVisible = 'notificationsVisible'; -} diff --git a/packages/messages/src/browser/notifications-manager.ts b/packages/messages/src/browser/notifications-manager.ts index de372b245e8b3..c074720d7fab2 100644 --- a/packages/messages/src/browser/notifications-manager.ts +++ b/packages/messages/src/browser/notifications-manager.ts @@ -82,6 +82,7 @@ export class NotificationManager extends MessageClient { protected notificationToastsVisibleKey: ContextKey; protected notificationCenterVisibleKey: ContextKey; + protected notificationsVisible: ContextKey; @postConstruct() protected init(): void { @@ -91,11 +92,13 @@ export class NotificationManager extends MessageClient { protected async doInit(): Promise { this.notificationToastsVisibleKey = this.contextKeyService.createKey('notificationToastsVisible', false); this.notificationCenterVisibleKey = this.contextKeyService.createKey('notificationCenterVisible', false); + this.notificationsVisible = this.contextKeyService.createKey('notificationsVisible', false); } protected updateContextKeys(): void { this.notificationToastsVisibleKey.set(this.toastsVisible); this.notificationCenterVisibleKey.set(this.centerVisible); + this.notificationsVisible.set(this.toastsVisible || this.centerVisible); } get toastsVisible(): boolean { @@ -137,7 +140,7 @@ export class NotificationManager extends MessageClient { } this.deferredResults.delete(messageId); if ((this.centerVisible && !this.notifications.size) || (this.toastsVisible && !this.toasts.size)) { - this.visibilityState = 'hidden'; + this.setVisibilityState('hidden'); } result.resolve(action); this.fireUpdatedEvent(); diff --git a/packages/monaco/src/browser/monaco-frontend-module.ts b/packages/monaco/src/browser/monaco-frontend-module.ts index e0124adf42501..bf384e0d51a8d 100644 --- a/packages/monaco/src/browser/monaco-frontend-module.ts +++ b/packages/monaco/src/browser/monaco-frontend-module.ts @@ -39,7 +39,6 @@ import { PreferenceScope, PreferenceChange, OVERRIDE_PROPERTY_PATTERN, QuickInputService, StylingParticipant } from '@theia/core/lib/browser'; import { TextEditorProvider, DiffNavigatorProvider, TextEditor } from '@theia/editor/lib/browser'; -import { StrictEditorTextFocusContext } from '@theia/editor/lib/browser/editor-keybinding-contexts'; import { MonacoEditorProvider, MonacoEditorFactory } from './monaco-editor-provider'; import { MonacoEditorMenuContribution } from './monaco-menu'; import { MonacoEditorCommandHandlers } from './monaco-command'; @@ -54,7 +53,6 @@ import { MonacoStatusBarContribution } from './monaco-status-bar-contribution'; import { MonacoCommandService, MonacoCommandServiceFactory } from './monaco-command-service'; import { MonacoCommandRegistry } from './monaco-command-registry'; import { MonacoDiffNavigatorFactory } from './monaco-diff-navigator-factory'; -import { MonacoStrictEditorTextFocusContext } from './monaco-keybinding-contexts'; import { MonacoFrontendApplicationContribution } from './monaco-frontend-application-contribution'; import MonacoTextmateModuleBinder from './textmate/monaco-textmate-frontend-bindings'; import { MonacoBulkEditService } from './monaco-bulk-edit-service'; @@ -159,7 +157,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { bind(MenuContribution).toService(MonacoEditorMenuContribution); bind(MonacoKeybindingContribution).toSelf().inSingletonScope(); bind(KeybindingContribution).toService(MonacoKeybindingContribution); - rebind(StrictEditorTextFocusContext).to(MonacoStrictEditorTextFocusContext).inSingletonScope(); bind(MonacoQuickInputImplementation).toSelf().inSingletonScope(); bind(MonacoQuickInputService).toSelf().inSingletonScope(); diff --git a/packages/monaco/src/browser/monaco-keybinding-contexts.ts b/packages/monaco/src/browser/monaco-keybinding-contexts.ts deleted file mode 100644 index 752ee2cd42573..0000000000000 --- a/packages/monaco/src/browser/monaco-keybinding-contexts.ts +++ /dev/null @@ -1,43 +0,0 @@ -// ***************************************************************************** -// Copyright (C) 2018 TypeFox and others. -// -// This program and the accompanying materials are made available under the -// terms of the Eclipse Public License v. 2.0 which is available at -// http://www.eclipse.org/legal/epl-2.0. -// -// This Source Code may also be made available under the following Secondary -// Licenses when the conditions for such availability set forth in the Eclipse -// Public License v. 2.0 are satisfied: GNU General Public License, version 2 -// with the GNU Classpath Exception which is available at -// https://www.gnu.org/software/classpath/license.html. -// -// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 -// ***************************************************************************** - -import { injectable } from '@theia/core/shared/inversify'; -import { EditorWidget } from '@theia/editor/lib/browser/editor-widget'; -import { StrictEditorTextFocusContext } from '@theia/editor/lib/browser/editor-keybinding-contexts'; -import { MonacoEditor } from './monaco-editor'; - -/** - * Besides checking whether this editor is the currently active one and has the focus, it also checks the followings: - * - the suggest widget is visible - * - the find (and replace) widget is visible. - * - the rename input widget (which we use for refactoring and not find and replace) is visible. - * - * If any of the above-mentioned additional checks evaluates to `true` the `canHandle` will evaluate to `false`. - * - * See: https://github.com/eamodio/vscode-gitlens/blob/57226d54d1e929be04b02ee31ca294c50305481b/package.json#L2857 - */ -@injectable() -export class MonacoStrictEditorTextFocusContext extends StrictEditorTextFocusContext { - - protected override canHandle(widget: EditorWidget): boolean { - const { editor } = widget; - if (editor instanceof MonacoEditor) { - return editor.isFocused({ strict: true }); - } - return super.canHandle(widget); - } - -} diff --git a/packages/navigator/src/browser/navigator-contribution.ts b/packages/navigator/src/browser/navigator-contribution.ts index 884a2a64a953b..2cf9ab6fa55a4 100644 --- a/packages/navigator/src/browser/navigator-contribution.ts +++ b/packages/navigator/src/browser/navigator-contribution.ts @@ -51,7 +51,6 @@ import { import { EXPLORER_VIEW_CONTAINER_ID, EXPLORER_VIEW_CONTAINER_TITLE_OPTIONS } from './navigator-widget-factory'; import { FILE_NAVIGATOR_ID, FileNavigatorWidget } from './navigator-widget'; import { FileNavigatorPreferences } from './navigator-preferences'; -import { NavigatorKeybindingContexts } from './navigator-keybinding-context'; import { FileNavigatorFilter } from './navigator-filter'; import { WorkspaceNode } from './navigator-tree'; import { NavigatorContextKeyService } from './navigator-context-key-service'; @@ -507,19 +506,19 @@ export class FileNavigatorContribution extends AbstractViewContribution { bind(FrontendApplicationContribution).toService(FileNavigatorContribution); bind(TabBarToolbarContribution).toService(FileNavigatorContribution); - bind(KeybindingContext).to(NavigatorActiveContext).inSingletonScope(); - bind(FileNavigatorWidget).toDynamicValue(ctx => createFileNavigatorWidget(ctx.container) ); diff --git a/packages/navigator/src/browser/navigator-keybinding-context.ts b/packages/navigator/src/browser/navigator-keybinding-context.ts deleted file mode 100644 index ffd39c1924fb4..0000000000000 --- a/packages/navigator/src/browser/navigator-keybinding-context.ts +++ /dev/null @@ -1,36 +0,0 @@ -// ***************************************************************************** -// Copyright (C) 2018 Ericsson and others. -// -// This program and the accompanying materials are made available under the -// terms of the Eclipse Public License v. 2.0 which is available at -// http://www.eclipse.org/legal/epl-2.0. -// -// This Source Code may also be made available under the following Secondary -// Licenses when the conditions for such availability set forth in the Eclipse -// Public License v. 2.0 are satisfied: GNU General Public License, version 2 -// with the GNU Classpath Exception which is available at -// https://www.gnu.org/software/classpath/license.html. -// -// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 -// ***************************************************************************** - -import { injectable, inject } from '@theia/core/shared/inversify'; -import { KeybindingContext, ApplicationShell } from '@theia/core/lib/browser'; -import { FileNavigatorWidget } from './navigator-widget'; - -export namespace NavigatorKeybindingContexts { - export const navigatorActive = 'navigatorActive'; -} - -@injectable() -export class NavigatorActiveContext implements KeybindingContext { - - readonly id: string = NavigatorKeybindingContexts.navigatorActive; - - @inject(ApplicationShell) - protected readonly applicationShell: ApplicationShell; - - isEnabled(): boolean { - return this.applicationShell.activeWidget instanceof FileNavigatorWidget; - } -} diff --git a/packages/terminal/src/browser/terminal-frontend-contribution.ts b/packages/terminal/src/browser/terminal-frontend-contribution.ts index 5916ab41f399e..a4feb00b0c0a6 100644 --- a/packages/terminal/src/browser/terminal-frontend-contribution.ts +++ b/packages/terminal/src/browser/terminal-frontend-contribution.ts @@ -36,7 +36,6 @@ import { } from '@theia/core/lib/browser'; import { TabBarToolbarContribution, TabBarToolbarRegistry } from '@theia/core/lib/browser/shell/tab-bar-toolbar'; import { TERMINAL_WIDGET_FACTORY_ID, TerminalWidgetFactoryOptions, TerminalWidgetImpl } from './terminal-widget-impl'; -import { TerminalKeybindingContexts } from './terminal-keybinding-contexts'; import { TerminalService } from './base/terminal-service'; import { TerminalWidgetOptions, TerminalWidget, TerminalLocation } from './base/terminal-widget'; import { ContributedTerminalProfileStore, NULL_PROFILE, TerminalProfile, TerminalProfileService, TerminalProfileStore, UserTerminalProfileStore } from './terminal-profile-service'; @@ -239,7 +238,11 @@ export class TerminalFrontendContribution implements FrontendApplicationContribu }); const terminalFocusKey = this.contextKeyService.createKey('terminalFocus', false); - const updateFocusKey = () => terminalFocusKey.set(this.shell.activeWidget instanceof TerminalWidget); + const terminalSearchToggle = this.contextKeyService.createKey('terminalHideSearch', false); + const updateFocusKey = () => { + terminalFocusKey.set(this.shell.activeWidget instanceof TerminalWidget); + terminalSearchToggle.set(this.terminalHideSearch); + }; updateFocusKey(); this.shell.onDidChangeActiveWidget(updateFocusKey); @@ -256,6 +259,14 @@ export class TerminalFrontendContribution implements FrontendApplicationContribu }); } + get terminalHideSearch(): boolean { + if (!(this.shell.activeWidget instanceof TerminalWidget)) { + return false; + } + const searchWidget = this.shell.activeWidget.getSearchBox(); + return searchWidget.isVisible; + } + async onStart(app: FrontendApplication): Promise { await this.contributeDefaultProfiles(); @@ -844,7 +855,7 @@ export class TerminalFrontendContribution implements FrontendApplicationContribu keybindings.registerKeybinding({ command: TerminalCommands.TERMINAL_FIND_TEXT_CANCEL.id, keybinding: 'esc', - context: TerminalKeybindingContexts.terminalHideSearch + when: 'terminalHideSearch' }); keybindings.registerKeybinding({ command: TerminalCommands.SCROLL_LINE_UP.id, diff --git a/packages/terminal/src/browser/terminal-frontend-module.ts b/packages/terminal/src/browser/terminal-frontend-module.ts index c935e71138471..e5547eb1d64ad 100644 --- a/packages/terminal/src/browser/terminal-frontend-module.ts +++ b/packages/terminal/src/browser/terminal-frontend-module.ts @@ -20,7 +20,7 @@ import 'xterm/css/xterm.css'; import { ContainerModule, Container } from '@theia/core/shared/inversify'; import { CommandContribution, MenuContribution, nls } from '@theia/core/lib/common'; import { bindContributionProvider } from '@theia/core'; -import { KeybindingContribution, WebSocketConnectionProvider, WidgetFactory, KeybindingContext, FrontendApplicationContribution } from '@theia/core/lib/browser'; +import { KeybindingContribution, WebSocketConnectionProvider, WidgetFactory, FrontendApplicationContribution } from '@theia/core/lib/browser'; import { TabBarToolbarContribution } from '@theia/core/lib/browser/shell/tab-bar-toolbar'; import { TerminalFrontendContribution } from './terminal-frontend-contribution'; import { TerminalWidgetImpl, TERMINAL_WIDGET_FACTORY_ID } from './terminal-widget-impl'; @@ -28,7 +28,6 @@ import { TerminalWidget, TerminalWidgetOptions } from './base/terminal-widget'; import { ITerminalServer, terminalPath } from '../common/terminal-protocol'; import { TerminalWatcher } from '../common/terminal-watcher'; import { IShellTerminalServer, shellTerminalPath, ShellTerminalServerProxy } from '../common/shell-terminal-protocol'; -import { TerminalActiveContext, TerminalSearchVisibleContext } from './terminal-keybinding-contexts'; import { createCommonBindings } from '../common/terminal-common-module'; import { TerminalService } from './base/terminal-service'; import { bindTerminalPreferences } from './terminal-preferences'; @@ -50,8 +49,6 @@ import { export default new ContainerModule(bind => { bindTerminalPreferences(bind); - bind(KeybindingContext).to(TerminalActiveContext).inSingletonScope(); - bind(KeybindingContext).to(TerminalSearchVisibleContext).inSingletonScope(); bind(TerminalWidget).to(TerminalWidgetImpl).inTransientScope(); bind(TerminalWatcher).toSelf().inSingletonScope(); diff --git a/packages/terminal/src/browser/terminal-keybinding-contexts.ts b/packages/terminal/src/browser/terminal-keybinding-contexts.ts deleted file mode 100644 index 715b1a5371869..0000000000000 --- a/packages/terminal/src/browser/terminal-keybinding-contexts.ts +++ /dev/null @@ -1,52 +0,0 @@ -// ***************************************************************************** -// Copyright (C) 2018 TypeFox and others. -// -// This program and the accompanying materials are made available under the -// terms of the Eclipse Public License v. 2.0 which is available at -// http://www.eclipse.org/legal/epl-2.0. -// -// This Source Code may also be made available under the following Secondary -// Licenses when the conditions for such availability set forth in the Eclipse -// Public License v. 2.0 are satisfied: GNU General Public License, version 2 -// with the GNU Classpath Exception which is available at -// https://www.gnu.org/software/classpath/license.html. -// -// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 -// ***************************************************************************** - -import { injectable, inject } from '@theia/core/shared/inversify'; -import { KeybindingContext, ApplicationShell } from '@theia/core/lib/browser'; -import { TerminalWidget } from './base/terminal-widget'; - -export namespace TerminalKeybindingContexts { - export const terminalActive = 'terminalActive'; - export const terminalHideSearch = 'hideSearch'; -} - -@injectable() -export class TerminalActiveContext implements KeybindingContext { - readonly id: string = TerminalKeybindingContexts.terminalActive; - - @inject(ApplicationShell) - protected readonly shell: ApplicationShell; - - isEnabled(): boolean { - return this.shell.activeWidget instanceof TerminalWidget; - } -} - -@injectable() -export class TerminalSearchVisibleContext implements KeybindingContext { - readonly id: string = TerminalKeybindingContexts.terminalHideSearch; - - @inject(ApplicationShell) - protected readonly shell: ApplicationShell; - - isEnabled(): boolean { - if (!(this.shell.activeWidget instanceof TerminalWidget)) { - return false; - } - const searchWidget = this.shell.activeWidget.getSearchBox(); - return searchWidget.isVisible; - } -} From 03d0cb83dc72f7a72158d69478494c7e99098e39 Mon Sep 17 00:00:00 2001 From: Samuel Berg Date: Wed, 20 Sep 2023 12:56:55 +0200 Subject: [PATCH 54/79] vsx-registry: add hint to fetching extensions error (#12858) Clarifies the error by suggesting it could be caused by network configuration issues. Contributed by STMicroelectronics Signed-off-by: Samuel BERG --- CHANGELOG.md | 4 ++++ packages/vsx-registry/src/browser/vsx-extensions-widget.tsx | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a4bb0c145048b..6348661ba1e7f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ - [Previous Changelogs](https://github.com/eclipse-theia/theia/tree/master/doc/changelogs/) +## v1.42.0 + +- [vsx-registry] added a hint to extension fetching ENOTFOUND errors [#12858](https://github.com/eclipse-theia/theia/pull/12858) - Contributed by STMicroelectronics + ## v1.41.0 - 08/31/2023 - [application-package] added handling to quit the electron app when the backend fails to start [#12778](https://github.com/eclipse-theia/theia/pull/12778) - Contributed on behalf of STMicroelectronics. diff --git a/packages/vsx-registry/src/browser/vsx-extensions-widget.tsx b/packages/vsx-registry/src/browser/vsx-extensions-widget.tsx index c934595990578..6b79ed3dea49f 100644 --- a/packages/vsx-registry/src/browser/vsx-extensions-widget.tsx +++ b/packages/vsx-registry/src/browser/vsx-extensions-widget.tsx @@ -143,9 +143,11 @@ export class VSXExtensionsWidget extends SourceTreeWidget implements BadgeWidget const searchError = this.extensionsSource.getModel().searchError; if (!!searchError) { const message = nls.localize('theia/vsx-registry/errorFetching', 'Error fetching extensions.'); + const configurationHint = nls.localize('theia/vsx-registry/errorFetchingConfigurationHint', 'This could be caused by network configuration issues.'); + const hint = searchError.includes('ENOTFOUND') ? configurationHint : ''; return ; } } From d2b7f3b7424eec5808bff0de52ab82e1bb33d584 Mon Sep 17 00:00:00 2001 From: FernandoAscencio <48699277+FernandoAscencio@users.noreply.github.com> Date: Mon, 25 Sep 2023 06:55:27 -0400 Subject: [PATCH 55/79] Keybinding: Error Message Localization (#12889) Closes #12878 Signed-off-by: FernandoAscencio Co-authored-by: Vincent Fugnitto --- packages/core/src/common/keys.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/core/src/common/keys.ts b/packages/core/src/common/keys.ts index 780304a37d1f7..c95b5ae470d43 100644 --- a/packages/core/src/common/keys.ts +++ b/packages/core/src/common/keys.ts @@ -14,6 +14,7 @@ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 // ***************************************************************************** +import { nls } from './nls'; import { isOSX } from './os'; import { isObject } from './types'; @@ -252,7 +253,7 @@ export class KeyCode { } /* If duplicates i.e ctrl+ctrl+a or alt+alt+b or b+alt+b it is invalid */ if (keys.length !== new Set(keys).size) { - throw new Error(`Can't parse keybinding ${keybinding} Duplicate modifiers`); + throw new Error(nls.localize('theia/core/keybinding/duplicateModifierError', "Can't parse keybinding {0} Duplicate modifiers", keybinding)); } for (let keyString of keys) { @@ -266,7 +267,7 @@ export class KeyCode { if (isOSX) { schema.meta = true; } else { - throw new Error(`Can't parse keybinding ${keybinding} meta is for OSX only`); + throw new Error(nls.localize('theia/core/keybinding/metaError', "Can't parse keybinding {0} meta is for OSX only", keybinding)); } /* ctrlcmd for M1 keybindings that work on both macOS and other platforms */ } else if (keyString === SpecialCases.CTRLCMD) { @@ -288,7 +289,7 @@ export class KeyCode { schema.key = key; } } else { - throw new Error(`Unrecognized key '${keyString}' in '${keybinding}'`); + throw new Error(nls.localize('theia/core/keybinding/unrecognizedKeyError', 'Unrecognized key {0} in {1}', keyString, keybinding)); } } From f038673dc228485b34e8762686525d8e5f258afb Mon Sep 17 00:00:00 2001 From: Chris Radke Date: Mon, 25 Sep 2023 15:50:14 +0200 Subject: [PATCH 56/79] Add support for multiline searches (#12868) Signed-off-by: Christian Radke --- packages/search-in-workspace/package.json | 3 +- .../search-in-workspace-textarea.tsx | 153 ++++++++++++++++++ ...search-in-workspace-result-tree-widget.tsx | 92 ++++++----- .../browser/search-in-workspace-widget.tsx | 19 +-- .../src/browser/styles/index.css | 45 ++++-- .../common/search-in-workspace-interface.ts | 4 + .../ripgrep-search-in-workspace-server.ts | 4 + 7 files changed, 256 insertions(+), 64 deletions(-) create mode 100644 packages/search-in-workspace/src/browser/components/search-in-workspace-textarea.tsx diff --git a/packages/search-in-workspace/package.json b/packages/search-in-workspace/package.json index 355b7ecf7c405..17be748fcc3c5 100644 --- a/packages/search-in-workspace/package.json +++ b/packages/search-in-workspace/package.json @@ -10,7 +10,8 @@ "@theia/process": "1.41.0", "@theia/workspace": "1.41.0", "@vscode/ripgrep": "^1.14.2", - "minimatch": "^5.1.0" + "minimatch": "^5.1.0", + "react-autosize-textarea": "^7.0.0" }, "publishConfig": { "access": "public" diff --git a/packages/search-in-workspace/src/browser/components/search-in-workspace-textarea.tsx b/packages/search-in-workspace/src/browser/components/search-in-workspace-textarea.tsx new file mode 100644 index 0000000000000..812c46ebad243 --- /dev/null +++ b/packages/search-in-workspace/src/browser/components/search-in-workspace-textarea.tsx @@ -0,0 +1,153 @@ +// ***************************************************************************** +// Copyright (C) 2021 Ericsson and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// http://www.eclipse.org/legal/epl-2.0. +// +// This Source Code may also be made available under the following Secondary +// Licenses when the conditions for such availability set forth in the Eclipse +// Public License v. 2.0 are satisfied: GNU General Public License, version 2 +// with the GNU Classpath Exception which is available at +// https://www.gnu.org/software/classpath/license.html. +// +// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { Key, KeyCode } from '@theia/core/lib/browser'; +import * as React from '@theia/core/shared/react'; +import TextareaAutosize from 'react-autosize-textarea'; +import debounce = require('@theia/core/shared/lodash.debounce'); + +interface HistoryState { + history: string[]; + index: number; +}; +type TextareaAttributes = React.TextareaHTMLAttributes; + +export class SearchInWorkspaceTextArea extends React.Component { + static LIMIT = 100; + + private textarea = React.createRef(); + + constructor(props: TextareaAttributes) { + super(props); + this.state = { + history: [], + index: 0, + }; + } + + updateState(index: number, history?: string[]): void { + this.value = history ? history[index] : this.state.history[index]; + this.setState(prevState => { + const newState = { + ...prevState, + index, + }; + if (history) { + newState.history = history; + } + return newState; + }); + } + + get value(): string { + return this.textarea.current?.value ?? ''; + } + + set value(value: string) { + if (this.textarea.current) { + this.textarea.current.value = value; + } + } + + /** + * Handle history navigation without overriding the parent's onKeyDown handler, if any. + */ + protected readonly onKeyDown = (e: React.KeyboardEvent): void => { + // Navigate history only when cursor is at first or last position of the textarea + if (Key.ARROW_UP.keyCode === KeyCode.createKeyCode(e.nativeEvent).key?.keyCode && e.currentTarget.selectionStart === 0) { + e.preventDefault(); + this.previousValue(); + } else if (Key.ARROW_DOWN.keyCode === KeyCode.createKeyCode(e.nativeEvent).key?.keyCode && e.currentTarget.selectionEnd === e.currentTarget.value.length) { + e.preventDefault(); + this.nextValue(); + } + + // Prevent newline on enter + if (Key.ENTER.keyCode === KeyCode.createKeyCode(e.nativeEvent).key?.keyCode && !e.nativeEvent.shiftKey) { + e.preventDefault(); + } + + this.props.onKeyDown?.(e); + }; + + /** + * Switch the textarea's text to the previous value, if any. + */ + previousValue(): void { + const { history, index } = this.state; + if (!this.value) { + this.value = history[index]; + } else if (index > 0 && index < history.length) { + this.updateState(index - 1); + } + } + + /** + * Switch the textarea's text to the next value, if any. + */ + nextValue(): void { + const { history, index } = this.state; + if (index === history.length - 1) { + this.value = ''; + } else if (!this.value) { + this.value = history[index]; + } else if (index >= 0 && index < history.length - 1) { + this.updateState(index + 1); + } + } + + /** + * Handle history collection and textarea resizing without overriding the parent's onChange handler, if any. + */ + protected readonly onChange = (e: React.ChangeEvent): void => { + this.addToHistory(); + this.props.onChange?.(e); + }; + + /** + * Add a nonempty current value to the history, if not already present. (Debounced, 1 second delay.) + */ + readonly addToHistory = debounce(this.doAddToHistory, 1000); + + private doAddToHistory(): void { + if (!this.value) { + return; + } + const history = this.state.history + .filter(term => term !== this.value) + .concat(this.value) + .slice(-SearchInWorkspaceTextArea.LIMIT); + this.updateState(history.length - 1, history); + } + + override render(): React.ReactNode { + const { onResize, ...filteredProps } = this.props; + return ( + + + ); + } +} diff --git a/packages/search-in-workspace/src/browser/search-in-workspace-result-tree-widget.tsx b/packages/search-in-workspace/src/browser/search-in-workspace-result-tree-widget.tsx index b2e4bcda5d117..2b6922ba3f7c7 100644 --- a/packages/search-in-workspace/src/browser/search-in-workspace-result-tree-widget.tsx +++ b/packages/search-in-workspace/src/browser/search-in-workspace-result-tree-widget.tsx @@ -36,7 +36,7 @@ import { import { CancellationTokenSource, Emitter, EOL, Event, ProgressService } from '@theia/core'; import { EditorManager, EditorDecoration, TrackedRangeStickiness, OverviewRulerLane, - EditorWidget, EditorOpenerOptions, FindMatch + EditorWidget, EditorOpenerOptions, FindMatch, Position } from '@theia/editor/lib/browser'; import { WorkspaceService } from '@theia/workspace/lib/browser'; import { FileResourceResolver, FileSystemPreferences } from '@theia/filesystem/lib/browser'; @@ -303,12 +303,16 @@ export class SearchInWorkspaceResultTreeWidget extends TreeWidget { const matches: SearchMatch[] = []; results.forEach(r => { - const lineText: string = widget.editor.document.getLineContent(r.range.start.line); + const numberOfLines = searchTerm.split('\n').length; + const lineTexts = []; + for (let i = 0; i < numberOfLines; i++) { + lineTexts.push(widget.editor.document.getLineContent(r.range.start.line + i)); + } matches.push({ line: r.range.start.line, character: r.range.start.character, - length: r.range.end.character - r.range.start.character, - lineText + length: searchTerm.length, + lineText: lineTexts.join('\n') }); }); @@ -873,6 +877,7 @@ export class SearchInWorkspaceResultTreeWidget extends TreeWidget { // Open the file only if the function is called to replace all matches under a specific node. const widget: EditorWidget = replaceOne ? await this.doOpen(toReplace[0]) : await this.doGetWidget(toReplace[0]); const source: string = widget.editor.document.getText(); + const replaceOperations = toReplace.map(resultLineNode => ({ text: replacementText, range: { @@ -880,12 +885,10 @@ export class SearchInWorkspaceResultTreeWidget extends TreeWidget { line: resultLineNode.line - 1, character: resultLineNode.character - 1 }, - end: { - line: resultLineNode.line - 1, - character: resultLineNode.character - 1 + resultLineNode.length - } + end: this.findEndCharacterPosition(resultLineNode), } })); + // Replace the text. await widget.editor.replaceText({ source, @@ -955,6 +958,23 @@ export class SearchInWorkspaceResultTreeWidget extends TreeWidget { } } + private findEndCharacterPosition(node: SearchInWorkspaceResultLineNode): Position { + const lineText = typeof node.lineText === 'string' ? node.lineText : node.lineText.text; + const lines = lineText.split('\n'); + const line = node.line + lines.length - 2; + let character = node.character - 1 + node.length; + if (lines.length > 1) { + character = node.length - lines[0].length + node.character - lines.length; + if (lines.length > 2) { + for (const lineNum of Array(lines.length - 2).keys()) { + character -= lines[lineNum + 1].length; + } + } + } + + return { line, character }; + } + protected renderRootFolderNode(node: SearchInWorkspaceRootFolderNode): React.ReactNode { return

    @@ -1017,28 +1037,33 @@ export class SearchInWorkspaceResultTreeWidget extends TreeWidget { wordBreak.lastIndex++; } - const before = lineText.slice(start, character - 1).trimLeft(); - - return
    - {this.searchInWorkspacePreferences['search.lineNumbers'] && {node.line}} - - {before} - - {this.renderMatchLinePart(node)} - - {lineText.slice(node.character + node.length - 1, 250 - before.length + node.length)} - -
    ; + const before = lineText.slice(start, character - 1).trimStart(); + const lineCount = lineText.split('\n').length; + + return <> +
    + {this.searchInWorkspacePreferences['search.lineNumbers'] && {node.line}} + + {before} + + {this.renderMatchLinePart(node)} + {lineCount > 1 || + {lineText.slice(node.character + node.length - 1, 250 - before.length + node.length)} + } +
    + {lineCount > 1 &&
    +{lineCount - 1}
    } + ; } protected renderMatchLinePart(node: SearchInWorkspaceResultLineNode): React.ReactNode { - const replaceTerm = this.isReplacing ? {this._replaceTerm} : ''; + const replaceTermLines = this._replaceTerm.split('\n'); + const replaceTerm = this.isReplacing ? {replaceTermLines[0]} : ''; const className = `match${this.isReplacing ? ' strike-through' : ''}`; - const match = typeof node.lineText === 'string' ? - node.lineText.substring(node.character - 1, node.length + node.character - 1) - : node.lineText.text.substring(node.lineText.character - 1, node.length + node.lineText.character - 1); + const text = typeof node.lineText === 'string' ? node.lineText : node.lineText.text; + const match = text.substring(node.character - 1, node.character + node.length - 1); + const matchLines = match.split('\n'); return - {match} + {matchLines[0]} {replaceTerm} ; } @@ -1071,10 +1096,7 @@ export class SearchInWorkspaceResultTreeWidget extends TreeWidget { line: node.line - 1, character: node.character - 1 }, - end: { - line: node.line - 1, - character: node.character - 1 + node.length - } + end: this.findEndCharacterPosition(node), }, mode: preview ? 'reveal' : 'activate', preview, @@ -1100,16 +1122,8 @@ export class SearchInWorkspaceResultTreeWidget extends TreeWidget { content = await resource.readContents(); } - const lines = content.split('\n'); - node.children.forEach(l => { - const leftPositionedNodes = node.children.filter(rl => rl.line === l.line && rl.character < l.character); - const diff = (this._replaceTerm.length - this.searchTerm.length) * leftPositionedNodes.length; - const start = lines[l.line - 1].substring(0, l.character - 1 + diff); - const end = lines[l.line - 1].substring(l.character - 1 + diff + l.length); - lines[l.line - 1] = start + this._replaceTerm + end; - }); - - return fileUri.withScheme(MEMORY_TEXT).withQuery(lines.join('\n')); + const searchTermRegExp = new RegExp(this.searchTerm, 'g'); + return fileUri.withScheme(MEMORY_TEXT).withQuery(content.replace(searchTermRegExp, this._replaceTerm)); } protected decorateEditor(node: SearchInWorkspaceFileNode | undefined, editorWidget: EditorWidget): void { diff --git a/packages/search-in-workspace/src/browser/search-in-workspace-widget.tsx b/packages/search-in-workspace/src/browser/search-in-workspace-widget.tsx index fc6755c562255..c5aada64b85d2 100644 --- a/packages/search-in-workspace/src/browser/search-in-workspace-widget.tsx +++ b/packages/search-in-workspace/src/browser/search-in-workspace-widget.tsx @@ -28,6 +28,7 @@ import { ProgressBarFactory } from '@theia/core/lib/browser/progress-bar-factory import { EditorManager } from '@theia/editor/lib/browser'; import { SearchInWorkspacePreferences } from './search-in-workspace-preferences'; import { SearchInWorkspaceInput } from './components/search-in-workspace-input'; +import { SearchInWorkspaceTextArea } from './components/search-in-workspace-textarea'; import { nls } from '@theia/core/lib/common/nls'; export interface SearchFieldState { @@ -65,8 +66,8 @@ export class SearchInWorkspaceWidget extends BaseWidget implements StatefulWidge protected searchTerm = ''; protected replaceTerm = ''; - private searchRef = React.createRef(); - private replaceRef = React.createRef(); + private searchRef = React.createRef(); + private replaceRef = React.createRef(); private includeRef = React.createRef(); private excludeRef = React.createRef(); @@ -142,6 +143,7 @@ export class SearchInWorkspaceWidget extends BaseWidget implements StatefulWidge matchCase: false, matchWholeWord: false, useRegExp: false, + multiline: false, includeIgnored: false, include: [], exclude: [], @@ -323,6 +325,8 @@ export class SearchInWorkspaceWidget extends BaseWidget implements StatefulWidge protected override onResize(msg: Widget.ResizeMessage): void { super.onResize(msg); + this.searchRef.current?.forceUpdate(); + this.replaceRef.current?.forceUpdate(); MessageLoop.sendMessage(this.resultTreeWidget, Widget.ResizeMessage.UnknownSize); } @@ -447,7 +451,8 @@ export class SearchInWorkspaceWidget extends BaseWidget implements StatefulWidge const searchOptions: SearchInWorkspaceOptions = { ...this.searchInWorkspaceOptions, followSymlinks: this.shouldFollowSymlinks(), - matchCase: this.shouldMatchCase() + matchCase: this.shouldMatchCase(), + multiline: this.searchTerm.includes('\n') }; this.resultTreeWidget.search(this.searchTerm, searchOptions); } @@ -471,12 +476,10 @@ export class SearchInWorkspaceWidget extends BaseWidget implements StatefulWidge } protected renderSearchField(): React.ReactNode { - const input = - span { - width: 15px; - height: 15px; + width: 16px; + height: 16px; margin-left: 2.5px; margin-right: 0.5px; background-repeat: no-repeat; background-position: center; background-size: contain; + border-radius: 5px; +} + +.result-node-buttons > span:hover { + background-color: var(--theia-toolbar-hoverBackground); } .search-and-replace-container { @@ -346,10 +360,11 @@ } .replace-all-button-container { - width: 25px; - display: flex; - align-items: center; - justify-content: center; + width: 25px; + display: flex; + align-items: start; + justify-content: center; + padding-top: 3px; } .result-node-buttons .replace-result { diff --git a/packages/search-in-workspace/src/common/search-in-workspace-interface.ts b/packages/search-in-workspace/src/common/search-in-workspace-interface.ts index bade899bdda86..28168ae8b9bba 100644 --- a/packages/search-in-workspace/src/common/search-in-workspace-interface.ts +++ b/packages/search-in-workspace/src/common/search-in-workspace-interface.ts @@ -41,6 +41,10 @@ export interface SearchInWorkspaceOptions { * Use regular expressions for search if true. */ useRegExp?: boolean; + /** + * Use multiline search if true. + */ + multiline?: boolean; /** * Include all .gitignored and hidden files. */ diff --git a/packages/search-in-workspace/src/node/ripgrep-search-in-workspace-server.ts b/packages/search-in-workspace/src/node/ripgrep-search-in-workspace-server.ts index f22ccaf9ed731..a10fc6588a15c 100644 --- a/packages/search-in-workspace/src/node/ripgrep-search-in-workspace-server.ts +++ b/packages/search-in-workspace/src/node/ripgrep-search-in-workspace-server.ts @@ -101,6 +101,10 @@ export class RipgrepSearchInWorkspaceServer implements SearchInWorkspaceServer { args.add('--hidden'); args.add('--json'); + if (options?.multiline) { + args.add('--multiline'); + } + if (options?.matchCase) { args.add('--case-sensitive'); } else { From fcde5ea91fcefd904b152be8e31c2fdb3d9ab4f8 Mon Sep 17 00:00:00 2001 From: Stefan Dirix Date: Tue, 26 Sep 2023 16:10:01 +0200 Subject: [PATCH 57/79] fix: propagate log-config changes (#12566) If Theia is started with the "--log-config" option the 'LogLevelCliContribution' watches for file changes and fires a 'logConfigChangedEvent'. This event was not listened to. Therefore already existing 'ILogger' levels were not updated. This is now fixed by notifying loggers about log config changes to update their log level. Also refactors the backend architecture to also use the existing client mechanism for notifications. Signed-off-by: Stefan Dirix Contributed on behalf of STMicroelectronics --- CHANGELOG.md | 1 + packages/core/src/common/logger-protocol.ts | 4 ++++ packages/core/src/common/logger-watcher.ts | 19 ++++++++++++------- packages/core/src/common/logger.ts | 5 +++++ .../core/src/node/console-logger-server.ts | 7 +++++-- .../core/src/node/logger-backend-module.ts | 9 ++++++++- 6 files changed, 35 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6348661ba1e7f..6d7ec86fcf408 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ ## v1.42.0 +- [core] fixed logger level propagation when log config file changes at runtime [#12566](https://github.com/eclipse-theia/theia/pull/12566) - Contributed on behalf of STMicroelectronics - [vsx-registry] added a hint to extension fetching ENOTFOUND errors [#12858](https://github.com/eclipse-theia/theia/pull/12858) - Contributed by STMicroelectronics ## v1.41.0 - 08/31/2023 diff --git a/packages/core/src/common/logger-protocol.ts b/packages/core/src/common/logger-protocol.ts index 57327924c901c..8079711d25ee3 100644 --- a/packages/core/src/common/logger-protocol.ts +++ b/packages/core/src/common/logger-protocol.ts @@ -38,6 +38,7 @@ export interface ILogLevelChangedEvent { export interface ILoggerClient { onLogLevelChanged(event: ILogLevelChangedEvent): void; + onLogConfigChanged(): void; } @injectable() @@ -49,6 +50,9 @@ export class DispatchingLoggerClient implements ILoggerClient { this.clients.forEach(client => client.onLogLevelChanged(event)); } + onLogConfigChanged(): void { + this.clients.forEach(client => client.onLogConfigChanged()); + } } export const rootLoggerName = 'root'; diff --git a/packages/core/src/common/logger-watcher.ts b/packages/core/src/common/logger-watcher.ts index 945c68d6cee54..bef03644b6fda 100644 --- a/packages/core/src/common/logger-watcher.ts +++ b/packages/core/src/common/logger-watcher.ts @@ -22,22 +22,27 @@ import { ILoggerClient, ILogLevelChangedEvent } from './logger-protocol'; export class LoggerWatcher { getLoggerClient(): ILoggerClient { - const emitter = this.onLogLevelChangedEmitter; + const logLevelEmitter = this.onLogLevelChangedEmitter; + const logConfigEmitter = this.onLogConfigChangedEmitter; return { onLogLevelChanged(event: ILogLevelChangedEvent): void { - emitter.fire(event); - } + logLevelEmitter.fire(event); + }, + onLogConfigChanged(): void { + logConfigEmitter.fire(); + }, }; } - private onLogLevelChangedEmitter = new Emitter(); + protected onLogLevelChangedEmitter = new Emitter(); get onLogLevelChanged(): Event { return this.onLogLevelChangedEmitter.event; } - // FIXME: get rid of it, backend services should as well set a client on the server - fireLogLevelChanged(event: ILogLevelChangedEvent): void { - this.onLogLevelChangedEmitter.fire(event); + protected onLogConfigChangedEmitter = new Emitter(); + + get onLogConfigChanged(): Event { + return this.onLogConfigChangedEmitter.event; } } diff --git a/packages/core/src/common/logger.ts b/packages/core/src/common/logger.ts index 54900d53ac773..bd4a9b2379e8a 100644 --- a/packages/core/src/common/logger.ts +++ b/packages/core/src/common/logger.ts @@ -261,6 +261,11 @@ export class Logger implements ILogger { } }); }); + + /* Refetch log level if overall config in backend changed. */ + this.loggerWatcher.onLogConfigChanged(() => { + this._logLevel = this.created.then(_ => this.server.getLogLevel(this.name)); + }); } setLogLevel(logLevel: number): Promise { diff --git a/packages/core/src/node/console-logger-server.ts b/packages/core/src/node/console-logger-server.ts index a8068c29c6f69..e15f682e21cf8 100644 --- a/packages/core/src/node/console-logger-server.ts +++ b/packages/core/src/node/console-logger-server.ts @@ -17,7 +17,7 @@ import { inject, injectable, postConstruct } from 'inversify'; import { LoggerWatcher } from '../common/logger-watcher'; import { LogLevelCliContribution } from './logger-cli-contribution'; -import { ILoggerServer, ILoggerClient, ConsoleLogger } from '../common/logger-protocol'; +import { ILoggerServer, ILoggerClient, ConsoleLogger, rootLoggerName } from '../common/logger-protocol'; @injectable() export class ConsoleLoggerServer implements ILoggerServer { @@ -32,9 +32,13 @@ export class ConsoleLoggerServer implements ILoggerServer { @postConstruct() protected init(): void { + this.setLogLevel(rootLoggerName, this.cli.defaultLogLevel); for (const name of Object.keys(this.cli.logLevels)) { this.setLogLevel(name, this.cli.logLevels[name]); } + this.cli.onLogConfigChanged(() => { + this.client?.onLogConfigChanged(); + }); } async setLogLevel(name: string, newLogLevel: number): Promise { @@ -45,7 +49,6 @@ export class ConsoleLoggerServer implements ILoggerServer { if (this.client !== undefined) { this.client.onLogLevelChanged(event); } - this.watcher.fireLogLevelChanged(event); } async getLogLevel(name: string): Promise { diff --git a/packages/core/src/node/logger-backend-module.ts b/packages/core/src/node/logger-backend-module.ts index 368b90885ebd2..c8ac66b935f49 100644 --- a/packages/core/src/node/logger-backend-module.ts +++ b/packages/core/src/node/logger-backend-module.ts @@ -63,7 +63,14 @@ export const loggerBackendModule = new ContainerModule(bind => { bind(DispatchingLoggerClient).toSelf().inSingletonScope(); bindLogger(bind, { onLoggerServerActivation: ({ container }, server) => { - server.setClient(container.get(DispatchingLoggerClient)); + const dispatchingLoggerClient = container.get(DispatchingLoggerClient); + server.setClient(dispatchingLoggerClient); + + // register backend logger watcher as a client + const loggerWatcher = container.get(LoggerWatcher); + dispatchingLoggerClient.clients.add(loggerWatcher.getLoggerClient()); + + // make sure dispatching logger client is the only client server.setClient = () => { throw new Error('use DispatchingLoggerClient'); }; From ba3722b04ff91eb6a4af6a571c9e263c77cdd8b5 Mon Sep 17 00:00:00 2001 From: Akos Kitta <1405703+kittaakos@users.noreply.github.com> Date: Tue, 26 Sep 2023 19:43:22 +0200 Subject: [PATCH 58/79] chore(deps): use `ws@8.14.1` (#12909) Update the typing of the package to `8+` to support new APIs. For example, `createWebSocketStream`. Signed-off-by: Akos Kitta --- packages/core/README.md | 2 +- packages/core/package.json | 4 ++-- yarn.lock | 24 +++++++++--------------- 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/packages/core/README.md b/packages/core/README.md index abbfd686508ee..529bd1473ec86 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -105,7 +105,7 @@ export class SomeClass { - `nsfw` (from [`nsfw@^2.2.4`](https://www.npmjs.com/package/nsfw)) - `markdown-it` (from [`markdown-it@^12.3.2`](https://www.npmjs.com/package/markdown-it)) - `react` (from [`react@^18.2.0`](https://www.npmjs.com/package/react)) - - `ws` (from [`ws@^7.1.2`](https://www.npmjs.com/package/ws)) + - `ws` (from [`ws@^8.14.1`](https://www.npmjs.com/package/ws)) - `yargs` (from [`yargs@^15.3.1`](https://www.npmjs.com/package/yargs)) ## Logging Configuration diff --git a/packages/core/package.json b/packages/core/package.json index 6fe319fd61508..c9a86c2c1ed52 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -30,7 +30,7 @@ "@types/react-dom": "^18.0.6", "@types/route-parser": "^0.1.1", "@types/safer-buffer": "^2.1.0", - "@types/ws": "^5.1.2", + "@types/ws": "^8.5.5", "@types/yargs": "^15", "@vscode/codicons": "*", "ajv": "^6.5.3", @@ -71,7 +71,7 @@ "uuid": "^8.3.2", "vscode-languageserver-protocol": "^3.17.2", "vscode-uri": "^2.1.1", - "ws": "^7.1.2", + "ws": "^8.14.1", "yargs": "^15.3.1" }, "peerDependencies": { diff --git a/yarn.lock b/yarn.lock index a460decdf8a92..843003f79c8a5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1813,11 +1813,6 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== -"@types/events@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" - integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== - "@types/express-serve-static-core@^4.17.33": version "4.17.35" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz#c95dd4424f0d32e525d23812aa8ab8e4d3906c4f" @@ -2217,12 +2212,11 @@ resolved "https://registry.yarnpkg.com/@types/write-json-file/-/write-json-file-2.2.1.tgz#74155aaccbb0d532be21f9d66bebc4ea875a5a62" integrity sha512-JdO/UpPm9RrtQBNVcZdt3M7j3mHO/kXaea9LBGx3UgWJd1f9BkIWP7jObLBG6ZtRyqp7KzLFEsaPhWcidVittA== -"@types/ws@^5.1.2": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-5.1.2.tgz#f02d3b1cd46db7686734f3ce83bdf46c49decd64" - integrity sha512-NkTXUKTYdXdnPE2aUUbGOXE1XfMK527SCvU/9bj86kyFF6kZ9ZnOQ3mK5jADn98Y2vEUD/7wKDgZa7Qst2wYOg== +"@types/ws@^8.5.5": + version "8.5.5" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb" + integrity sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg== dependencies: - "@types/events" "*" "@types/node" "*" "@types/yargs-parser@*": @@ -11544,16 +11538,16 @@ ws@8.11.0, ws@~8.11.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== -ws@^7.1.2: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - ws@^8.13.0: version "8.13.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== +ws@^8.14.1: + version "8.14.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.1.tgz#4b9586b4f70f9e6534c7bb1d3dc0baa8b8cf01e0" + integrity sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A== + xdg-basedir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" From 4564a4bdfa5f51c5753369e45bb0267a01ce65c9 Mon Sep 17 00:00:00 2001 From: Remi Schnekenburger Date: Wed, 27 Sep 2023 15:36:01 +0200 Subject: [PATCH 59/79] Stub TestController invalidateTestResults (#12944) - add missing API for TestController as a stub contributed on behalf of STMicroelectronics Signed-off-by: Remi Schnekenburger --- CHANGELOG.md | 1 + .../plugin-ext/src/plugin/plugin-context.ts | 4 +++- .../plugin-ext/src/plugin/stubs/tests-api.ts | 4 ++++ packages/plugin/src/theia.d.ts | 19 +++++++++++++++++++ 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d7ec86fcf408..52a80ad7394df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ ## v1.42.0 - [core] fixed logger level propagation when log config file changes at runtime [#12566](https://github.com/eclipse-theia/theia/pull/12566) - Contributed on behalf of STMicroelectronics +- [vscode] stub TestController invalidateTestResults [#12944](https://github.com/eclipse-theia/theia/pull/12944) - Contributed by STMicroelectronics - [vsx-registry] added a hint to extension fetching ENOTFOUND errors [#12858](https://github.com/eclipse-theia/theia/pull/12858) - Contributed by STMicroelectronics ## v1.41.0 - 08/31/2023 diff --git a/packages/plugin-ext/src/plugin/plugin-context.ts b/packages/plugin-ext/src/plugin/plugin-context.ts index 0e73c0d34f9df..0f44efee200fa 100644 --- a/packages/plugin-ext/src/plugin/plugin-context.ts +++ b/packages/plugin-ext/src/plugin/plugin-context.ts @@ -232,7 +232,8 @@ import { createRunProfile, createTestRun, testItemCollection, - createTestItem + createTestItem, + invalidateTestResults } from './stubs/tests-api'; import { TimelineExtImpl } from './timeline'; import { ThemingExtImpl } from './theming'; @@ -1010,6 +1011,7 @@ export function createAPIFactory( createRunProfile, createTestRun, createTestItem, + invalidateTestResults, dispose: () => undefined, }; }, diff --git a/packages/plugin-ext/src/plugin/stubs/tests-api.ts b/packages/plugin-ext/src/plugin/stubs/tests-api.ts index 79a896de20562..16b06b2ec5597 100644 --- a/packages/plugin-ext/src/plugin/stubs/tests-api.ts +++ b/packages/plugin-ext/src/plugin/stubs/tests-api.ts @@ -96,3 +96,7 @@ export const createTestItem = ( range: undefined, error: undefined, }); + +export const invalidateTestResults = ( + items?: theia.TestItem | readonly theia.TestItem[] +): void => undefined; diff --git a/packages/plugin/src/theia.d.ts b/packages/plugin/src/theia.d.ts index 59c8d7374cdc4..0a2e5130eb1a2 100644 --- a/packages/plugin/src/theia.d.ts +++ b/packages/plugin/src/theia.d.ts @@ -15980,6 +15980,25 @@ export module '@theia/plugin' { */ createTestItem(id: string, label: string, uri?: Uri): TestItem; + /** + * Marks an item's results as being outdated. This is commonly called when + * code or configuration changes and previous results should no longer + * be considered relevant. The same logic used to mark results as outdated + * may be used to drive {@link TestRunRequest.continuous continuous test runs}. + * + * If an item is passed to this method, test results for the item and all of + * its children will be marked as outdated. If no item is passed, then all + * test owned by the TestController will be marked as outdated. + * + * Any test runs started before the moment this method is called, including + * runs which may still be ongoing, will be marked as outdated and deprioritized + * in the editor's UI. + * + * @param item Item to mark as outdated. If undefined, all the controller's items are marked outdated. + * @stubbed + */ + invalidateTestResults(items?: TestItem | readonly TestItem[]): void; + /** * Unregisters the test controller, disposing of its associated tests * and unpersisted results. From 7e3aa4282b5696e3015929b1d7c0f082bc9d6f36 Mon Sep 17 00:00:00 2001 From: Remi Schnekenburger Date: Wed, 27 Sep 2023 15:59:58 +0200 Subject: [PATCH 60/79] vscode support iconPath in QuickPickItem (#12945) fixes #12883 VS Code 1.81 finalized the support for the iconPath in QuickPickItem. This is a partial support: full API support and the display of the ThemeIcon, but the display of the URI based icons is not yet available. This last part requires an update in monaco editor core Contributed on behalf of STMicroelectronics --- CHANGELOG.md | 1 + packages/core/src/common/quick-pick-service.ts | 1 + .../src/browser/monaco-quick-input-service.ts | 15 ++++++++++++++- packages/plugin-ext/src/plugin/quick-open.ts | 1 + packages/plugin-ext/src/plugin/type-converters.ts | 3 ++- packages/plugin/src/theia.d.ts | 5 +++++ 6 files changed, 24 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 52a80ad7394df..4940d003374e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ - [core] fixed logger level propagation when log config file changes at runtime [#12566](https://github.com/eclipse-theia/theia/pull/12566) - Contributed on behalf of STMicroelectronics - [vscode] stub TestController invalidateTestResults [#12944](https://github.com/eclipse-theia/theia/pull/12944) - Contributed by STMicroelectronics +- [vscode] support iconPath in QuickPickItem [#12945](https://github.com/eclipse-theia/theia/pull/12945) - Contributed by STMicroelectronics - [vsx-registry] added a hint to extension fetching ENOTFOUND errors [#12858](https://github.com/eclipse-theia/theia/pull/12858) - Contributed by STMicroelectronics ## v1.41.0 - 08/31/2023 diff --git a/packages/core/src/common/quick-pick-service.ts b/packages/core/src/common/quick-pick-service.ts index 847e1b16de583..f87b6bfb27797 100644 --- a/packages/core/src/common/quick-pick-service.ts +++ b/packages/core/src/common/quick-pick-service.ts @@ -54,6 +54,7 @@ export interface QuickPickItem { description?: string; detail?: string; keySequence?: KeySequence; + iconPath?: URI | Uri | { light?: URI | Uri; dark: URI | Uri } | { id: string }; iconClasses?: string[]; alwaysShow?: boolean; highlights?: QuickPickItemHighlights; diff --git a/packages/monaco/src/browser/monaco-quick-input-service.ts b/packages/monaco/src/browser/monaco-quick-input-service.ts index 0fddf71d686c8..408d3c09aafb8 100644 --- a/packages/monaco/src/browser/monaco-quick-input-service.ts +++ b/packages/monaco/src/browser/monaco-quick-input-service.ts @@ -18,7 +18,7 @@ import { ApplicationShell, InputBox, InputOptions, KeybindingRegistry, NormalizedQuickInputButton, PickOptions, QuickInputButton, QuickInputHideReason, QuickInputService, QuickPick, QuickPickItem, - QuickPickItemButtonEvent, QuickPickItemHighlights, QuickPickOptions, QuickPickSeparator + QuickPickItemButtonEvent, QuickPickItemHighlights, QuickPickOptions, QuickPickSeparator, codiconArray } from '@theia/core/lib/browser'; import { injectable, inject, postConstruct } from '@theia/core/shared/inversify'; import { @@ -42,6 +42,7 @@ import { Event } from '@theia/core'; import { MonacoColorRegistry } from './monaco-color-registry'; import { ThemeService } from '@theia/core/lib/browser/theming'; import { IStandaloneThemeService } from '@theia/monaco-editor-core/esm/vs/editor/standalone/common/standaloneTheme'; +import { ThemeIcon } from '@theia/monaco-editor-core/esm/vs/platform/theme/common/themeService'; // Copied from @vscode/src/vs/base/parts/quickInput/browser/quickInputList.ts export interface IListElement { @@ -316,6 +317,18 @@ export class MonacoQuickInputService implements QuickInputService { const monacoPicks: Promise[]> = new Promise(async resolve => { const updatedPicks = (await picks).map(pick => { if (pick.type !== 'separator') { + const icon = pick.iconPath; + // @monaco-uplift + // Other kind of icons (URI and URI dark/light) shall be supported once monaco editor has been upgraded to at least 1.81. + // see https://github.com/eclipse-theia/theia/pull/12945#issue-1913645228 + if (ThemeIcon.isThemeIcon(icon)) { + const codicon = codiconArray(icon.id); + if (pick.iconClasses) { + pick.iconClasses.push(...codicon); + } else { + pick.iconClasses = codicon; + } + } pick.buttons &&= pick.buttons.map(QuickInputButton.normalize); } return pick as M; diff --git a/packages/plugin-ext/src/plugin/quick-open.ts b/packages/plugin-ext/src/plugin/quick-open.ts index ad2975571403d..82a564107a404 100644 --- a/packages/plugin-ext/src/plugin/quick-open.ts +++ b/packages/plugin-ext/src/plugin/quick-open.ts @@ -655,6 +655,7 @@ export class QuickPickExt extends QuickInputExt i pickItems.push({ kind: item.kind, label: item.label, + iconPath: item.iconPath ? getIconUris(item.iconPath) : undefined, description: item.description, handle, detail: item.detail, diff --git a/packages/plugin-ext/src/plugin/type-converters.ts b/packages/plugin-ext/src/plugin/type-converters.ts index 8dc7b11def8be..a109a68f489f2 100644 --- a/packages/plugin-ext/src/plugin/type-converters.ts +++ b/packages/plugin-ext/src/plugin/type-converters.ts @@ -1212,11 +1212,12 @@ export function convertToTransferQuickPickItems(items: rpc.Item[]): rpc.Transfer } else if (item.kind === QuickPickItemKind.Separator) { return { type: 'separator', label: item.label, handle: index }; } else { - const { label, description, detail, picked, alwaysShow, buttons } = item; + const { label, description, iconPath, detail, picked, alwaysShow, buttons } = item; return { type: 'item', label, description, + iconPath, detail, picked, alwaysShow, diff --git a/packages/plugin/src/theia.d.ts b/packages/plugin/src/theia.d.ts index 0a2e5130eb1a2..146981c847d52 100644 --- a/packages/plugin/src/theia.d.ts +++ b/packages/plugin/src/theia.d.ts @@ -2140,6 +2140,11 @@ export module '@theia/plugin' { */ kind?: QuickPickItemKind; + /** + * The icon path or {@link ThemeIcon} for the QuickPickItem. + */ + iconPath?: Uri | { light: Uri; dark: Uri } | ThemeIcon; + /** * A human-readable string which is rendered less prominent in the same line. Supports rendering of * {@link ThemeIcon theme icons} via the `$()`-syntax. From 990908be18b5045280d2fa12c2be12dc3c7bdb82 Mon Sep 17 00:00:00 2001 From: Stefan Dirix Date: Wed, 27 Sep 2023 17:36:26 +0200 Subject: [PATCH 61/79] chore: improve frontend startup performance (#12936) The frontend awaits 'initialize', 'configure' and 'onStart' for all frontend contributions. It's therefore very important that no expensive code is run there. By not awaiting expensive operations in - DebugFrontendApplicationContribution.onStart (~300ms) - EditorNavigationContribution.onStart (~36-400ms) - TerminalFrontendContribution.onStart (~100-300ms) the reported startup time without using plugins is reduced by ~400-1000ms which is an improvement of ~20-40%. Contributed on behalf of STMicroelectronics --- CHANGELOG.md | 1 + packages/core/src/browser/common-frontend-contribution.ts | 1 + .../src/browser/debug-frontend-application-contribution.ts | 4 ++-- packages/editor/src/browser/editor-navigation-contribution.ts | 2 +- .../terminal/src/browser/terminal-frontend-contribution.ts | 2 +- 5 files changed, 6 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4940d003374e8..df95d73adec19 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ ## v1.42.0 - [core] fixed logger level propagation when log config file changes at runtime [#12566](https://github.com/eclipse-theia/theia/pull/12566) - Contributed on behalf of STMicroelectronics +- [core] improve frontend startup time [#12936](https://github.com/eclipse-theia/theia/pull/12936) - Contributed on behalf of STMicroelectronics - [vscode] stub TestController invalidateTestResults [#12944](https://github.com/eclipse-theia/theia/pull/12944) - Contributed by STMicroelectronics - [vscode] support iconPath in QuickPickItem [#12945](https://github.com/eclipse-theia/theia/pull/12945) - Contributed by STMicroelectronics - [vsx-registry] added a hint to extension fetching ENOTFOUND errors [#12858](https://github.com/eclipse-theia/theia/pull/12858) - Contributed by STMicroelectronics diff --git a/packages/core/src/browser/common-frontend-contribution.ts b/packages/core/src/browser/common-frontend-contribution.ts index 7df314fd08cb5..c446f1e88c729 100644 --- a/packages/core/src/browser/common-frontend-contribution.ts +++ b/packages/core/src/browser/common-frontend-contribution.ts @@ -428,6 +428,7 @@ export class CommonFrontendContribution implements FrontendApplicationContributi protected pinnedKey: ContextKey; async configure(app: FrontendApplication): Promise { + // FIXME: This request blocks valuable startup time (~200ms). const configDirUri = await this.environments.getConfigDirUri(); // Global settings this.encodingRegistry.registerOverride({ diff --git a/packages/debug/src/browser/debug-frontend-application-contribution.ts b/packages/debug/src/browser/debug-frontend-application-contribution.ts index 4ca406c3860b4..5e833a8a39f29 100644 --- a/packages/debug/src/browser/debug-frontend-application-contribution.ts +++ b/packages/debug/src/browser/debug-frontend-application-contribution.ts @@ -473,8 +473,8 @@ export class DebugFrontendApplicationContribution extends AbstractViewContributi this.schemaUpdater.update(); this.configurations.load(); - await this.breakpointManager.load(); - await this.watchManager.load(); + this.breakpointManager.load(); + this.watchManager.load(); } onStop(): void { diff --git a/packages/editor/src/browser/editor-navigation-contribution.ts b/packages/editor/src/browser/editor-navigation-contribution.ts index 9aa98da47d800..36c5ed2ad6d50 100644 --- a/packages/editor/src/browser/editor-navigation-contribution.ts +++ b/packages/editor/src/browser/editor-navigation-contribution.ts @@ -175,7 +175,7 @@ export class EditorNavigationContribution implements Disposable, FrontendApplica } async onStart(): Promise { - await this.restoreState(); + this.restoreState(); } onStop(): void { diff --git a/packages/terminal/src/browser/terminal-frontend-contribution.ts b/packages/terminal/src/browser/terminal-frontend-contribution.ts index a4feb00b0c0a6..5ca103b796db7 100644 --- a/packages/terminal/src/browser/terminal-frontend-contribution.ts +++ b/packages/terminal/src/browser/terminal-frontend-contribution.ts @@ -268,7 +268,7 @@ export class TerminalFrontendContribution implements FrontendApplicationContribu } async onStart(app: FrontendApplication): Promise { - await this.contributeDefaultProfiles(); + this.contributeDefaultProfiles(); this.terminalPreferences.onPreferenceChanged(e => { if (e.preferenceName.startsWith('terminal.integrated.')) { From bc712cadffc8994c984729d2ab2773cc9a12fbaa Mon Sep 17 00:00:00 2001 From: Remi Schnekenburger Date: Thu, 28 Sep 2023 09:05:36 +0200 Subject: [PATCH 62/79] Bump API version to 1.81.0 (#12882) (#12949) Contributed on behalf of ST Microelectronics Signed-off-by: Remi Schnekenburger --- dev-packages/application-package/src/api.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-packages/application-package/src/api.ts b/dev-packages/application-package/src/api.ts index 3477750352347..7c9cc58372ab8 100644 --- a/dev-packages/application-package/src/api.ts +++ b/dev-packages/application-package/src/api.ts @@ -18,4 +18,4 @@ * The default supported API version the framework supports. * The version should be in the format `x.y.z`. */ -export const DEFAULT_SUPPORTED_API_VERSION = '1.80.0'; +export const DEFAULT_SUPPORTED_API_VERSION = '1.81.0'; From 001a886f60e9f364d6ff0f15cff8f578d31a3b80 Mon Sep 17 00:00:00 2001 From: Stefan Dirix Date: Thu, 28 Sep 2023 12:07:47 +0200 Subject: [PATCH 63/79] fix: restore src-gen frontend production behavior (#12950) Restores the usage of 'require' in production mode when loading included modules. At the moment, both in development as well as in production mode, the frontend will be generated using the 'import' function. Webpack will use this opportunity for code splitting, leading to the generation of many small bundles. As they are sequentially loaded, this has a negative effect on the startup speed of the frontend. By using 'require' instead, weppack will produce a single bundle, which is faster to transmit without additional roundtrips. This behavior was used for production mode in all previous Theia versions and is now restored. Contributed on behalf of STMicroelectronics --- CHANGELOG.md | 1 + .../src/generator/frontend-generator.ts | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index df95d73adec19..114bac6cc5d07 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ - [core] fixed logger level propagation when log config file changes at runtime [#12566](https://github.com/eclipse-theia/theia/pull/12566) - Contributed on behalf of STMicroelectronics - [core] improve frontend startup time [#12936](https://github.com/eclipse-theia/theia/pull/12936) - Contributed on behalf of STMicroelectronics +- [dev-packages] restore src-gen frontend production behavior [12950](https://github.com/eclipse-theia/theia/pull/12950) - Contributed on behalf of STMicroelectronics - [vscode] stub TestController invalidateTestResults [#12944](https://github.com/eclipse-theia/theia/pull/12944) - Contributed by STMicroelectronics - [vscode] support iconPath in QuickPickItem [#12945](https://github.com/eclipse-theia/theia/pull/12945) - Contributed by STMicroelectronics - [vsx-registry] added a hint to extension fetching ENOTFOUND errors [#12858](https://github.com/eclipse-theia/theia/pull/12858) - Contributed by STMicroelectronics diff --git a/dev-packages/application-manager/src/generator/frontend-generator.ts b/dev-packages/application-manager/src/generator/frontend-generator.ts index 59cccab6e37b7..7b121dd635b64 100644 --- a/dev-packages/application-manager/src/generator/frontend-generator.ts +++ b/dev-packages/application-manager/src/generator/frontend-generator.ts @@ -97,7 +97,7 @@ async function preload(parent) { container.parent = parent; try { ${Array.from(frontendPreloadModules.values(), jsModulePath => `\ - await load(container, import('${jsModulePath}'));`).join(EOL)} + await load(container, ${this.importOrRequire()}('${jsModulePath}'));`).join(EOL)} const { Preloader } = require('@theia/core/lib/browser/preload/preloader'); const preloader = container.get(Preloader); await preloader.initialize(); @@ -125,7 +125,7 @@ module.exports = (async () => { try { ${Array.from(frontendModules.values(), jsModulePath => `\ - await load(container, import('${jsModulePath}'));`).join(EOL)} + await load(container, ${this.importOrRequire()}('${jsModulePath}'));`).join(EOL)} await start(); } catch (reason) { console.error('Failed to start the frontend application.'); @@ -142,6 +142,10 @@ ${Array.from(frontendModules.values(), jsModulePath => `\ `; } + protected importOrRequire(): string { + return this.options.mode !== 'production' ? 'import' : 'require'; + } + /** HTML for secondary windows that contain an extracted widget. */ protected compileSecondaryWindowHtml(): string { return ` From e0b4cb92817a24e3af432e79fff15c146b891ca5 Mon Sep 17 00:00:00 2001 From: Mark Sujew Date: Thu, 28 Sep 2023 12:42:27 +0200 Subject: [PATCH 64/79] Update nls metadata file for API version 1.81.0 (#12951) --- .../src/tests/theia-explorer-view.test.ts | 2 +- .../core/src/common/i18n/nls.metadata.json | 7688 +++++++++-------- .../editor/debug-breakpoint-widget.tsx | 10 +- .../browser/getting-started-preferences.ts | 4 +- .../browser/terminal-frontend-contribution.ts | 2 +- 5 files changed, 3980 insertions(+), 3726 deletions(-) diff --git a/examples/playwright/src/tests/theia-explorer-view.test.ts b/examples/playwright/src/tests/theia-explorer-view.test.ts index fccbe5b55efe6..6ea87938d7acb 100644 --- a/examples/playwright/src/tests/theia-explorer-view.test.ts +++ b/examples/playwright/src/tests/theia-explorer-view.test.ts @@ -153,7 +153,7 @@ test.describe('Theia Explorer View', () => { const menuItems = await menu.visibleMenuItems(); expect(menuItems).toContain('New File...'); expect(menuItems).toContain('New Folder...'); - expect(menuItems).toContain('Open in Terminal'); + expect(menuItems).toContain('Open in Integrated Terminal'); expect(menuItems).toContain('Find in Folder...'); await menu.close(); diff --git a/packages/core/src/common/i18n/nls.metadata.json b/packages/core/src/common/i18n/nls.metadata.json index 4fb018819f051..0697a14efd7e4 100644 --- a/packages/core/src/common/i18n/nls.metadata.json +++ b/packages/core/src/common/i18n/nls.metadata.json @@ -19,12 +19,6 @@ ] } ], - "vs/code/node/cliProcessMain": [ - "cli" - ], - "vs/code/node/sharedProcess/sharedProcessMain": [ - "sharedLog" - ], "vs/code/electron-sandbox/processExplorer/processExplorerMain": [ "name", "cpu", @@ -36,6 +30,12 @@ "copyAll", "debug" ], + "vs/code/node/cliProcessMain": [ + "cli" + ], + "vs/code/node/sharedProcess/sharedProcessMain": [ + "sharedLog" + ], "vs/workbench/electron-sandbox/desktop.main": [ "join.closeStorage" ], @@ -75,6 +75,7 @@ "window.doubleClickIconToClose", "titleBarStyle", "windowControlsOverlay", + "nativeContextMenuLocation", "dialogStyle", "window.nativeTabs", "window.nativeFullScreen", @@ -168,18 +169,6 @@ "restartExtensionHost", "restartExtensionHost.reason" ], - "vs/workbench/contrib/localization/electron-sandbox/localization.contribution": [ - "updateLocale", - "changeAndRestart", - "neverAgain" - ], - "vs/workbench/contrib/files/electron-sandbox/fileActions.contribution": [ - "revealInWindows", - "revealInMac", - "openContainer", - "miShare", - "filesCategory" - ], "vs/workbench/contrib/extensions/electron-sandbox/extensions.contribution": [ "runtimeExtension" ], @@ -243,6 +232,10 @@ "terminal.explorerKind.external", "terminal.explorerKind.both", "explorer.openInTerminalKind", + "terminal.sourceControlRepositoriesKind.integrated", + "terminal.sourceControlRepositoriesKind.external", + "terminal.sourceControlRepositoriesKind.both", + "sourceControlRepositories.openInTerminalKind", "terminal.external.windowsExec", "terminal.external.osxExec", "terminal.external.linuxExec" @@ -275,6 +268,12 @@ "Only translate 'Starting remote tunnel', do not change the format of the rest (markdown link format)" ] }, + { + "key": "remoteTunnel.serviceInstallFailed", + "comment": [ + "{Locked=\"](command:{0})\"}" + ] + }, "accountPreference.placeholder", "signed in", "others", @@ -291,6 +290,11 @@ "&& denotes a mnemonic" ] }, + "tunnel.enable.placeholder", + "tunnel.enable.session", + "tunnel.enable.session.description", + "tunnel.enable.service", + "tunnel.enable.service.description", { "key": "progress.turnOn.final", "comment": [ @@ -324,6 +328,18 @@ "remoteTunnelAccess.machineNameRegex", "remoteTunnelAccess.preventSleep" ], + "vs/workbench/contrib/localization/electron-sandbox/localization.contribution": [ + "updateLocale", + "changeAndRestart", + "neverAgain" + ], + "vs/workbench/contrib/files/electron-sandbox/fileActions.contribution": [ + "revealInWindows", + "revealInMac", + "openContainer", + "miShare", + "filesCategory" + ], "vs/base/common/platform": [ { "key": "ensureLoaderPluginIsLoaded", @@ -753,6 +769,82 @@ "defaultColorDecorators", "tabFocusMode" ], + "vs/code/electron-sandbox/issue/issueReporterPage": [ + "sendSystemInfo", + "sendProcessInfo", + "sendWorkspaceInfo", + "sendExtensions", + "sendExperiments", + { + "key": "reviewGuidanceLabel", + "comment": [ + "{Locked=\"\"}", + "{Locked=\"\"}" + ] + }, + "completeInEnglish", + "issueTypeLabel", + "issueSourceLabel", + "issueSourceEmptyValidation", + "disableExtensionsLabelText", + "disableExtensions", + "chooseExtension", + "extensionWithNonstandardBugsUrl", + "extensionWithNoBugsUrl", + "issueTitleLabel", + "issueTitleRequired", + "titleEmptyValidation", + "titleLengthValidation", + "details", + "descriptionEmptyValidation", + "show", + "show", + "show", + "show", + "show" + ], + "vs/code/electron-sandbox/issue/issueReporterService": [ + "hide", + "show", + "createOnGitHub", + "previewOnGitHub", + "loadingData", + "rateLimited", + "similarIssues", + "open", + "closed", + "open", + "closed", + "noSimilarIssues", + "bugReporter", + "featureRequest", + "performanceIssue", + "selectSource", + "vscode", + "extension", + "marketplace", + "unknown", + "handlesIssuesElsewhere", + "elsewhereDescription", + "openIssueReporter", + "stepsToReproduce", + "bugDescription", + "stepsToReproduce", + "performanceIssueDesciption", + "description", + "featureRequestDescription", + "pasteData", + "disabledExtensions", + "noCurrentExperiments" + ], + "vs/platform/environment/node/argvHelper": [ + "multipleValues", + "emptyValue", + "deprecatedArgument", + "unknownSubCommandOption", + "unknownOption", + "gotoValidation" + ], "vs/base/common/errorMessage": [ "stackTrace.format", "nodeExceptionMessage", @@ -777,14 +869,6 @@ "confirmOpenMessage", "confirmOpenDetail" ], - "vs/platform/environment/node/argvHelper": [ - "multipleValues", - "emptyValue", - "deprecatedArgument", - "unknownSubCommandOption", - "unknownOption", - "gotoValidation" - ], "vs/platform/files/common/files": [ "unknownError", "sizeB", @@ -835,6 +919,7 @@ "httpConfigurationTitle", "proxy", "strictSSL", + "proxyKerberosServicePrincipal", "proxyAuthorization", "proxySupportOff", "proxySupportOn", @@ -886,6 +971,15 @@ "extensions", "preferences" ], + "vs/platform/extensionManagement/common/extensionsScannerService": [ + "fileReadFail", + "jsonParseFail", + "jsonParseInvalidType", + "jsonsParseReportErrors", + "jsonInvalidFormat", + "jsonsParseReportErrors", + "jsonInvalidFormat" + ], "vs/platform/extensionManagement/common/extensionManagementCLI": [ "notFound", "useId", @@ -915,15 +1009,6 @@ "notInstalleddOnLocation", "notInstalled" ], - "vs/platform/extensionManagement/common/extensionsScannerService": [ - "fileReadFail", - "jsonParseFail", - "jsonParseInvalidType", - "jsonsParseReportErrors", - "jsonInvalidFormat", - "jsonsParseReportErrors", - "jsonInvalidFormat" - ], "vs/platform/extensionManagement/node/extensionManagementService": [ "incompatible", "MarketPlaceDisabled", @@ -961,84 +1046,6 @@ "vs/platform/userDataProfile/common/userDataProfile": [ "defaultProfile" ], - "vs/code/electron-sandbox/issue/issueReporterPage": [ - "sendSystemInfo", - "sendProcessInfo", - "sendWorkspaceInfo", - "sendExtensions", - "sendExperiments", - { - "key": "reviewGuidanceLabel", - "comment": [ - "{Locked=\"\"}", - "{Locked=\"\"}" - ] - }, - "completeInEnglish", - "issueTypeLabel", - "issueSourceLabel", - "issueSourceEmptyValidation", - "disableExtensionsLabelText", - "disableExtensions", - "chooseExtension", - "extensionWithNonstandardBugsUrl", - "extensionWithNoBugsUrl", - "issueTitleLabel", - "issueTitleRequired", - "titleEmptyValidation", - "titleLengthValidation", - "details", - "descriptionEmptyValidation", - "show", - "show", - "show", - "show", - "show" - ], - "vs/code/electron-sandbox/issue/issueReporterService": [ - "hide", - "show", - "createOnGitHub", - "previewOnGitHub", - "loadingData", - "rateLimited", - "similarIssues", - "open", - "closed", - "open", - "closed", - "noSimilarIssues", - "bugReporter", - "featureRequest", - "performanceIssue", - "selectSource", - "vscode", - "extension", - "marketplace", - "unknown", - "handlesIssuesElsewhere", - "elsewhereDescription", - "openIssueReporter", - "stepsToReproduce", - "bugDescription", - "stepsToReproduce", - "performanceIssueDesciption", - "description", - "featureRequestDescription", - "pasteData", - "disabledExtensions", - "noCurrentExperiments" - ], - "vs/platform/telemetry/common/telemetryLogAppender": [ - "telemetryLog" - ], - "vs/platform/userDataSync/common/userDataSync": [ - "settings sync", - "settingsSync.keybindingsPerPlatform", - "settingsSync.ignoredExtensions", - "app.extension.identifier.errorMessage", - "settingsSync.ignoredSettings" - ], "vs/platform/userDataSync/common/userDataSyncLog": [ "userDataSyncLog" ], @@ -1051,6 +1058,13 @@ "vs/platform/userDataSync/common/userDataSyncResourceProvider": [ "incompatible sync data" ], + "vs/platform/userDataSync/common/userDataSync": [ + "settings sync", + "settingsSync.keybindingsPerPlatform", + "settingsSync.ignoredExtensions", + "app.extension.identifier.errorMessage", + "settingsSync.ignoredSettings" + ], "vs/platform/remoteTunnel/node/remoteTunnelService": [ "remoteTunnelService.building", { @@ -1065,7 +1079,11 @@ "{0} is a tunnel name" ] }, - "remoteTunnelService.openTunnel" + "remoteTunnelService.openTunnel", + "remoteTunnelService.serviceInstallFailed" + ], + "vs/platform/telemetry/common/telemetryLogAppender": [ + "telemetryLog" ], "vs/workbench/browser/workbench": [ "loaderErrorNative" @@ -1141,10 +1159,8 @@ ], "vs/workbench/services/configuration/browser/configurationService": [ "configurationDefaults.description", - "experimental" - ], - "vs/platform/workspace/common/workspace": [ - "codeWorkspace" + "experimental", + "setting description" ], "vs/workbench/services/remote/electron-sandbox/remoteAgentService": [ "devTools", @@ -1201,14 +1217,17 @@ "expand mode", "typeNavigationMode" ], + "vs/platform/workspace/common/workspace": [ + "codeWorkspace" + ], + "vs/platform/contextkey/browser/contextKeyService": [ + "getContextKeyInfo" + ], "vs/platform/markers/common/markers": [ "sev.error", "sev.warning", "sev.info" ], - "vs/platform/contextkey/browser/contextKeyService": [ - "getContextKeyInfo" - ], "vs/platform/contextkey/common/contextkey": [ "contextkey.parser.error.emptyString", "contextkey.parser.error.emptyString.hint", @@ -1222,14 +1241,6 @@ "contextkey.scanner.errorForLinterWithHint", "contextkey.scanner.errorForLinter" ], - "vs/workbench/browser/actions/textInputActions": [ - "undo", - "redo", - "cut", - "copy", - "paste", - "selectAll" - ], "vs/workbench/browser/workbench.contribution": [ "workbench.editor.titleScrollbarSizing.default", "workbench.editor.titleScrollbarSizing.large", @@ -1477,42 +1488,15 @@ "zenMode.hideActivityBar", "zenMode.hideLineNumbers", "zenMode.restore", - "zenMode.silentNotifications", - "security.allowedUNCHosts.patternErrorMessage", - "security.allowedUNCHosts", - "security.restrictUNCAccess" + "zenMode.silentNotifications" ], - "vs/workbench/browser/actions/developerActions": [ - "inspect context keys", - "toggle screencast mode", - { - "key": "logStorage", - "comment": [ - "A developer only action to log the contents of the storage for the current window." - ] - }, - "storageLogDialogMessage", - "storageLogDialogDetails", - { - "key": "logWorkingCopies", - "comment": [ - "A developer only action to log the working copies that exist." - ] - }, - "screencastModeConfigurationTitle", - "screencastMode.location.verticalPosition", - "screencastMode.fontSize", - "keyboardShortcutsFormat.keys", - "keyboardShortcutsFormat.command", - "keyboardShortcutsFormat.commandWithGroup", - "keyboardShortcutsFormat.commandAndKeys", - "keyboardShortcutsFormat.commandWithGroupAndKeys", - "screencastMode.keyboardShortcutsFormat", - "screencastMode.onlyKeyboardShortcuts", - "screencastMode.hideSingleEditorCursorMoves", - "screencastMode.keyboardOverlayTimeout", - "screencastMode.mouseIndicatorColor", - "screencastMode.mouseIndicatorSize" + "vs/workbench/browser/actions/textInputActions": [ + "undo", + "redo", + "cut", + "copy", + "paste", + "selectAll" ], "vs/workbench/browser/actions/helpActions": [ "keybindingsReference", @@ -1573,6 +1557,35 @@ ] } ], + "vs/workbench/browser/actions/developerActions": [ + "inspect context keys", + "toggle screencast mode", + { + "key": "logStorage", + "comment": [ + "A developer only action to log the contents of the storage for the current window." + ] + }, + "storageLogDialogMessage", + "storageLogDialogDetails", + { + "key": "logWorkingCopies", + "comment": [ + "A developer only action to log the working copies that exist." + ] + }, + "screencastModeConfigurationTitle", + "screencastMode.location.verticalPosition", + "screencastMode.fontSize", + "screencastMode.keyboardOptions.description", + "screencastMode.keyboardOptions.showKeys", + "screencastMode.keyboardOptions.showCommands", + "screencastMode.keyboardOptions.showCommandGroups", + "screencastMode.keyboardOptions.showSingleEditorCursorMoves", + "screencastMode.keyboardOverlayTimeout", + "screencastMode.mouseIndicatorColor", + "screencastMode.mouseIndicatorSize" + ], "vs/workbench/browser/actions/layoutActions": [ "menuBarIcon", "activityBarLeft", @@ -1879,14 +1892,6 @@ "addFolderToWorkspaceTitle", "workspaceFolderPickerPlaceholder" ], - "vs/workbench/browser/actions/quickAccessActions": [ - "quickOpen", - "quickOpenWithModes", - "quickNavigateNext", - "quickNavigatePrevious", - "quickSelectNext", - "quickSelectPrevious" - ], "vs/workbench/services/actions/common/menusExtensionPoint": [ "menus.commandPalette", "menus.touchBar", @@ -2007,49 +2012,13 @@ "missing.submenu", "submenuItem.duplicate" ], - "vs/workbench/api/common/configurationExtensionPoint": [ - "vscode.extension.contributes.configuration.title", - "vscode.extension.contributes.configuration.order", - "vscode.extension.contributes.configuration.properties", - "vscode.extension.contributes.configuration.property.empty", - "vscode.extension.contributes.configuration.properties.schema", - "scope.application.description", - "scope.machine.description", - "scope.window.description", - "scope.resource.description", - "scope.language-overridable.description", - "scope.machine-overridable.description", - "scope.description", - "scope.enumDescriptions", - "scope.markdownEnumDescriptions", - "scope.enumItemLabels", - "scope.markdownDescription", - "scope.deprecationMessage", - "scope.markdownDeprecationMessage", - "scope.singlelineText.description", - "scope.multilineText.description", - "scope.editPresentation", - "scope.order", - "scope.ignoreSync", - "config.property.defaultConfiguration.warning", - "vscode.extension.contributes.configuration", - "invalid.title", - "invalid.properties", - "config.property.duplicate", - "invalid.property", - "invalid.allOf", - "workspaceConfig.folders.description", - "workspaceConfig.path.description", - "workspaceConfig.name.description", - "workspaceConfig.uri.description", - "workspaceConfig.name.description", - "workspaceConfig.settings.description", - "workspaceConfig.launch.description", - "workspaceConfig.tasks.description", - "workspaceConfig.extensions.description", - "workspaceConfig.remoteAuthority", - "workspaceConfig.transient", - "unknownWorkspaceProperty" + "vs/workbench/browser/actions/quickAccessActions": [ + "quickOpen", + "quickOpenWithModes", + "quickNavigateNext", + "quickNavigatePrevious", + "quickSelectNext", + "quickSelectPrevious" ], "vs/workbench/api/browser/viewsExtensionPoint": [ { @@ -2107,6 +2076,50 @@ "optstring", "optenum" ], + "vs/workbench/api/common/configurationExtensionPoint": [ + "vscode.extension.contributes.configuration.title", + "vscode.extension.contributes.configuration.order", + "vscode.extension.contributes.configuration.properties", + "vscode.extension.contributes.configuration.property.empty", + "vscode.extension.contributes.configuration.properties.schema", + "scope.application.description", + "scope.machine.description", + "scope.window.description", + "scope.resource.description", + "scope.language-overridable.description", + "scope.machine-overridable.description", + "scope.description", + "scope.enumDescriptions", + "scope.markdownEnumDescriptions", + "scope.enumItemLabels", + "scope.markdownDescription", + "scope.deprecationMessage", + "scope.markdownDeprecationMessage", + "scope.singlelineText.description", + "scope.multilineText.description", + "scope.editPresentation", + "scope.order", + "scope.ignoreSync", + "config.property.defaultConfiguration.warning", + "vscode.extension.contributes.configuration", + "invalid.title", + "invalid.properties", + "config.property.duplicate", + "invalid.property", + "invalid.allOf", + "workspaceConfig.folders.description", + "workspaceConfig.path.description", + "workspaceConfig.name.description", + "workspaceConfig.uri.description", + "workspaceConfig.name.description", + "workspaceConfig.settings.description", + "workspaceConfig.launch.description", + "workspaceConfig.tasks.description", + "workspaceConfig.extensions.description", + "workspaceConfig.remoteAuthority", + "workspaceConfig.transient", + "unknownWorkspaceProperty" + ], "vs/workbench/browser/parts/editor/editor.contribution": [ "textEditor", "textDiffEditor", @@ -2573,6 +2586,35 @@ ] } ], + "vs/workbench/services/keybinding/common/keybindingEditing": [ + "errorKeybindingsFileDirty", + "parseErrors", + "errorInvalidConfiguration", + "emptyKeybindingsHeader" + ], + "vs/workbench/services/decorations/browser/decorationsService": [ + "bubbleTitle" + ], + "vs/workbench/services/progress/browser/progressService": [ + "progress.text2", + "progress.title3", + "progress.title2", + "progress.title2", + "status.progress", + "cancel", + "cancel", + "dismiss" + ], + "vs/workbench/services/preferences/browser/preferencesService": [ + "openFolderFirst", + "emptyKeybindingsHeader", + "defaultKeybindings", + "defaultKeybindings", + "fail.createSettings" + ], + "vs/workbench/services/configuration/common/jsonEditingService": [ + "errorInvalidFile" + ], "vs/workbench/services/extensions/browser/extensionUrlHandler": [ "confirmUrl", "rememberConfirmUrl", @@ -2608,35 +2650,6 @@ "extensions", "no" ], - "vs/workbench/services/keybinding/common/keybindingEditing": [ - "errorKeybindingsFileDirty", - "parseErrors", - "errorInvalidConfiguration", - "emptyKeybindingsHeader" - ], - "vs/workbench/services/decorations/browser/decorationsService": [ - "bubbleTitle" - ], - "vs/workbench/services/progress/browser/progressService": [ - "progress.text2", - "progress.title3", - "progress.title2", - "progress.title2", - "status.progress", - "cancel", - "cancel", - "dismiss" - ], - "vs/workbench/services/preferences/browser/preferencesService": [ - "openFolderFirst", - "emptyKeybindingsHeader", - "defaultKeybindings", - "defaultKeybindings", - "fail.createSettings" - ], - "vs/workbench/services/configuration/common/jsonEditingService": [ - "errorInvalidFile" - ], "vs/workbench/services/editor/browser/editorResolverService": [ "editorResolver.conflictingDefaults", "editorResolver.configureDefault", @@ -2757,10 +2770,36 @@ "resolving uri", "preview profile", "import profile", + "create profile", + "save profile", + "create new profle", + "settings", + "keybindings", + "snippets", + "tasks", + "extensions", + "name placeholder", + "save", + "create", + "customise the profile", + "profileExists", + "invalid configurations", + "use default profile", + "name required", + "create from", + "empty profile", + "from templates", + "from existing profiles", + "create profile", "export", "close", + "create from profile", + "progress extensions", + "switching profile", "troubleshoot issue", "troubleshoot profile progress", + "progress extensions", + "switching profile", "profiles.exporting", "export success", { @@ -2788,16 +2827,16 @@ "preview profile message", "learn more", "install extensions title", + "create profile", "cancel", "import", - "Importing profile", + "switching profile", "progress settings", "progress keybindings", "progress tasks", "progress snippets", "progress global state", "progress extensions", - "switching profile", "select profile content handler", "profile already exists", { @@ -2822,11 +2861,14 @@ "export profile dialog", "select profile", "select", + "select", + "from default", "export profile name", "export profile title", "profile name required" ], "vs/workbench/services/userDataProfile/browser/userDataProfileManagement": [ + "reload message when updated", "reload message when removed", "reload message when removed", "cannotRenameDefaultProfile", @@ -2870,62 +2912,13 @@ "hideView", "resetViewLocation" ], - "vs/workbench/services/authentication/browser/authenticationService": [ - "authentication.id", - "authentication.label", - { - "key": "authenticationExtensionPoint", - "comment": [ - "'Contributes' means adds here" - ] - }, - "authentication.Placeholder", - "authentication.missingId", - "authentication.missingLabel", - "authentication.idConflict", - "loading", - "sign in", - "confirmAuthenticationAccess", + "vs/workbench/services/userDataSync/browser/userDataSyncWorkbenchService": [ + "no authentication providers", + "no account", + "sync in progress", + "settings sync", { - "key": "allow", - "comment": [ - "&& denotes a mnemonic" - ] - }, - { - "key": "deny", - "comment": [ - "&& denotes a mnemonic" - ] - }, - "useOtherAccount", - { - "key": "selectAccount", - "comment": [ - "The placeholder {0} is the name of an extension. {1} is the name of the type of account, such as Microsoft or GitHub." - ] - }, - "getSessionPlateholder", - { - "key": "accessRequest", - "comment": [ - "The placeholder {0} will be replaced with an authentication provider''s label. {1} will be replaced with an extension name. (1) is to indicate that this menu item contributes to a badge count" - ] - }, - { - "key": "signInRequest", - "comment": [ - "The placeholder {0} will be replaced with an authentication provider's label. {1} will be replaced with an extension name. (1) is to indicate that this menu item contributes to a badge count." - ] - } - ], - "vs/workbench/services/userDataSync/browser/userDataSyncWorkbenchService": [ - "no authentication providers", - "no account", - "sync in progress", - "settings sync", - { - "key": "yes", + "key": "yes", "comment": [ "&& denotes a mnemonic" ] @@ -2969,6 +2962,55 @@ "others", "sign in using account" ], + "vs/workbench/services/authentication/browser/authenticationService": [ + "authentication.id", + "authentication.label", + { + "key": "authenticationExtensionPoint", + "comment": [ + "'Contributes' means adds here" + ] + }, + "authentication.Placeholder", + "authentication.missingId", + "authentication.missingLabel", + "authentication.idConflict", + "loading", + "sign in", + "confirmAuthenticationAccess", + { + "key": "allow", + "comment": [ + "&& denotes a mnemonic" + ] + }, + { + "key": "deny", + "comment": [ + "&& denotes a mnemonic" + ] + }, + "useOtherAccount", + { + "key": "selectAccount", + "comment": [ + "The placeholder {0} is the name of an extension. {1} is the name of the type of account, such as Microsoft or GitHub." + ] + }, + "getSessionPlateholder", + { + "key": "accessRequest", + "comment": [ + "The placeholder {0} will be replaced with an authentication provider''s label. {1} will be replaced with an extension name. (1) is to indicate that this menu item contributes to a badge count" + ] + }, + { + "key": "signInRequest", + "comment": [ + "The placeholder {0} will be replaced with an authentication provider's label. {1} will be replaced with an extension name. (1) is to indicate that this menu item contributes to a badge count." + ] + } + ], "vs/workbench/services/assignment/common/assignmentService": [ "workbench.enableExperiments" ], @@ -3002,29 +3044,12 @@ "troubleshootIssue", "title.stop" ], - "vs/workbench/contrib/preferences/browser/keybindingsEditorContribution": [ - "defineKeybinding.kbLayoutErrorMessage", - { - "key": "defineKeybinding.kbLayoutLocalAndUSMessage", - "comment": [ - "Please translate maintaining the stars (*) around the placeholders such that they will be rendered in bold.", - "The placeholders will contain a keyboard combination e.g. Ctrl+Shift+/" - ] - }, - { - "key": "defineKeybinding.kbLayoutLocalMessage", - "comment": [ - "Please translate maintaining the stars (*) around the placeholder such that it will be rendered in bold.", - "The placeholder will contain a keyboard combination e.g. Ctrl+Shift+/" - ] - } - ], "vs/workbench/contrib/preferences/browser/preferences.contribution": [ "settingsEditor2", "keybindingsEditor", "openSettings2", "openUserSettingsJson", - "openCurrentProfileSettingsJson", + "openApplicationSettingsJson", "preferences", "settings", { @@ -3037,7 +3062,6 @@ "openGlobalSettings", "openRawDefaultSettings", "openSettingsJson", - "openSettingsJson", "openWorkspaceSettings", "openAccessibilitySettings", "openWorkspaceSettingsFile", @@ -3070,8 +3094,8 @@ "settings.focusLevelUp", "preferences", "openGlobalKeybindings", - "Keyboard Shortcuts", - "Keyboard Shortcuts", + "keyboardShortcuts", + "keyboardShortcuts", "openDefaultKeybindingsFile", "openGlobalKeybindingsFile", "showDefaultKeybindings", @@ -3087,12 +3111,6 @@ ] } ], - "vs/workbench/contrib/performance/browser/performance.contribution": [ - "show.label", - "cycles", - "insta.trace", - "emitter" - ], "vs/workbench/contrib/notebook/browser/notebook.contribution": [ "notebook.editorOptions.experimentalCustomization", "notebookConfigurationTitle", @@ -3115,6 +3133,7 @@ "insertToolbarLocation.both", "insertToolbarLocation.hidden", "notebook.globalToolbar.description", + "notebook.stickyScroll.description", "notebook.consolidatedOutputButton.description", "notebook.showFoldingControls.description", "showFoldingControls.always", @@ -3135,7 +3154,8 @@ "notebook.codeActionsOnSave", "notebook.formatOnCellExecution", "notebook.confirmDeleteRunningCell", - "notebook.findScope" + "notebook.findScope", + "notebook.remoteSaving" ], "vs/workbench/contrib/chat/browser/chat.contribution": [ "interactiveSessionConfigurationTitle", @@ -3144,10 +3164,18 @@ "interactiveSession.editor.fontWeight", "interactiveSession.editor.wordWrap", "interactiveSession.editor.lineHeight", + "interactiveSession.defaultMode.chatView", + "interactiveSession.defaultMode.quickQuestion", + "interactiveSession.defaultMode.both", + "interactiveSession.defaultMode", + "interactiveSession.quickQuestion.mode", "chat", "chat", "chatAccessibleView" ], + "vs/workbench/contrib/inlineChat/browser/inlineChat.contribution": [ + "inlineChatAccessibleView" + ], "vs/workbench/contrib/interactive/browser/interactive.contribution": [ "interactiveWindow", "interactive.open", @@ -3178,45 +3206,28 @@ "searchForAdditionalTestExtensions", "testExplorer" ], - "vs/workbench/contrib/logs/common/logs.contribution": [ - "setDefaultLogLevel", - "remote name", - "remote name", - "show window log" - ], - "vs/workbench/contrib/quickaccess/browser/quickAccess.contribution": [ - "helpQuickAccessPlaceholder", - "helpQuickAccess", - "viewQuickAccessPlaceholder", - "viewQuickAccess", - "commandsQuickAccessPlaceholder", - "commandsQuickAccess", - { - "key": "miCommandPalette", - "comment": [ - "&& denotes a mnemonic" - ] - }, - { - "key": "miShowAllCommands", - "comment": [ - "&& denotes a mnemonic" - ] - }, + "vs/workbench/contrib/preferences/browser/keybindingsEditorContribution": [ + "defineKeybinding.kbLayoutErrorMessage", { - "key": "miOpenView", + "key": "defineKeybinding.kbLayoutLocalAndUSMessage", "comment": [ - "&& denotes a mnemonic" + "Please translate maintaining the stars (*) around the placeholders such that they will be rendered in bold.", + "The placeholders will contain a keyboard combination e.g. Ctrl+Shift+/" ] }, { - "key": "miGotoLine", + "key": "defineKeybinding.kbLayoutLocalMessage", "comment": [ - "&& denotes a mnemonic" + "Please translate maintaining the stars (*) around the placeholder such that it will be rendered in bold.", + "The placeholder will contain a keyboard combination e.g. Ctrl+Shift+/" ] - }, - "commandPalette", - "commandPalette" + } + ], + "vs/workbench/contrib/logs/common/logs.contribution": [ + "setDefaultLogLevel", + "remote name", + "remote name", + "show window log" ], "vs/workbench/contrib/files/browser/explorerViewlet": [ "explorerViewIcon", @@ -3264,6 +3275,40 @@ ] } ], + "vs/workbench/contrib/quickaccess/browser/quickAccess.contribution": [ + "helpQuickAccessPlaceholder", + "helpQuickAccess", + "viewQuickAccessPlaceholder", + "viewQuickAccess", + "commandsQuickAccessPlaceholder", + "commandsQuickAccess", + { + "key": "miCommandPalette", + "comment": [ + "&& denotes a mnemonic" + ] + }, + { + "key": "miShowAllCommands", + "comment": [ + "&& denotes a mnemonic" + ] + }, + { + "key": "miOpenView", + "comment": [ + "&& denotes a mnemonic" + ] + }, + { + "key": "miGotoLine", + "comment": [ + "&& denotes a mnemonic" + ] + }, + "commandPalette", + "commandPalette" + ], "vs/workbench/contrib/files/browser/fileActions.contribution": [ "copyPath", "copyRelativePath", @@ -3552,31 +3597,6 @@ "fileOperation", "refactoring.autoSave" ], - "vs/workbench/contrib/bulkEdit/browser/preview/bulkEdit.contribution": [ - "overlap", - "detail", - { - "key": "continue", - "comment": [ - "&& denotes a mnemonic" - ] - }, - "apply", - "cat", - "Discard", - "cat", - "toogleSelection", - "cat", - "groupByFile", - "cat", - "groupByType", - "cat", - "groupByType", - "cat", - "refactorPreviewViewIcon", - "panel", - "panel" - ], "vs/workbench/contrib/search/browser/search.contribution": [ "name", "search", @@ -3656,7 +3676,33 @@ "search.decorations.badges", "scm.defaultViewMode.tree", "scm.defaultViewMode.list", - "search.defaultViewMode" + "search.defaultViewMode", + "search.experimental.closedNotebookResults" + ], + "vs/workbench/contrib/bulkEdit/browser/preview/bulkEdit.contribution": [ + "overlap", + "detail", + { + "key": "continue", + "comment": [ + "&& denotes a mnemonic" + ] + }, + "apply", + "cat", + "Discard", + "cat", + "toogleSelection", + "cat", + "groupByFile", + "cat", + "groupByType", + "cat", + "groupByType", + "cat", + "refactorPreviewViewIcon", + "panel", + "panel" ], "vs/workbench/contrib/searchEditor/browser/searchEditor.contribution": [ "searchEditor", @@ -3811,7 +3857,8 @@ "scm accept", "scm view next commit", "scm view previous commit", - "open in terminal" + "open in external terminal", + "open in integrated terminal" ], "vs/workbench/contrib/debug/browser/debug.contribution": [ "debugCategory", @@ -4108,18 +4155,30 @@ "debugIcon.breakpointCurrentStackframeForeground", "debugIcon.breakpointStackframeForeground" ], - "vs/workbench/contrib/debug/browser/callStackEditorContribution": [ - "topStackFrameLineHighlight", - "focusedStackFrameLineHighlight" - ], - "vs/workbench/contrib/debug/browser/repl": [ + "vs/workbench/contrib/debug/browser/debugViewlet": [ { - "key": "workbench.debug.filter.placeholder", + "key": "miOpenConfigurations", "comment": [ - "Text in the brackets after e.g. is not localizable" + "&& denotes a mnemonic" ] }, - "showing filtered repl lines", + { + "key": "selectWorkspaceFolder", + "comment": [ + "User picks a workspace folder or a workspace configuration file here. Workspace configuration files can contain settings and thus a launch.json configuration can be written into one." + ] + }, + "debugPanel", + "startAdditionalSession" + ], + "vs/workbench/contrib/debug/browser/repl": [ + { + "key": "workbench.debug.filter.placeholder", + "comment": [ + "Text in the brackets after e.g. is not localizable" + ] + }, + "showing filtered repl lines", "debugConsole", "startDebugFirst", { @@ -4138,22 +4197,6 @@ "copyAll", "copy" ], - "vs/workbench/contrib/debug/browser/debugViewlet": [ - { - "key": "miOpenConfigurations", - "comment": [ - "&& denotes a mnemonic" - ] - }, - { - "key": "selectWorkspaceFolder", - "comment": [ - "User picks a workspace folder or a workspace configuration file here. Workspace configuration files can contain settings and thus a launch.json configuration can be written into one." - ] - }, - "debugPanel", - "startAdditionalSession" - ], "vs/workbench/contrib/markers/browser/markers.contribution": [ "markersViewIcon", { @@ -4199,10 +4242,11 @@ "manyProblems", "totalProblems" ], - "vs/workbench/contrib/mergeEditor/browser/mergeEditor.contribution": [ - "name", - "diffAlgorithm.legacy", - "diffAlgorithm.advanced" + "vs/workbench/contrib/performance/browser/performance.contribution": [ + "show.label", + "cycles", + "insta.trace", + "emitter" ], "vs/workbench/contrib/commands/common/commands.contribution": [ "runCommands", @@ -4211,6 +4255,10 @@ "runCommands.invalidArgs", "runCommands.noCommandsToRun" ], + "vs/workbench/contrib/debug/browser/callStackEditorContribution": [ + "topStackFrameLineHighlight", + "focusedStackFrameLineHighlight" + ], "vs/workbench/contrib/comments/browser/comments.contribution": [ "commentsConfigurationTitle", "openComments", @@ -4236,51 +4284,10 @@ "vs/workbench/contrib/webviewPanel/browser/webviewPanel.contribution": [ "webview.editor.label" ], - "vs/workbench/contrib/extensions/browser/extensionsViewlet": [ - { - "key": "remote", - "comment": [ - "Remote as in remote machine" - ] - }, - "installed", - "select and install local extensions", - "install remote in local", - "popularExtensions", - "recommendedExtensions", - "enabledExtensions", - "disabledExtensions", - "marketPlace", - "installed", - "recently updated", - "enabled", - "disabled", - "availableUpdates", - "builtin", - "workspaceUnsupported", - "workspaceRecommendedExtensions", - "otherRecommendedExtensions", - "builtinFeatureExtensions", - "builtInThemesExtensions", - "builtinProgrammingLanguageExtensions", - "untrustedUnsupportedExtensions", - "untrustedPartiallySupportedExtensions", - "virtualUnsupportedExtensions", - "virtualPartiallySupportedExtensions", - "deprecated", - "searchExtensions", - "extensionFoundInSection", - "extensionFound", - "extensionsFoundInSection", - "extensionsFound", - "suggestProxyError", - "open user settings", - "extensionToUpdate", - "extensionsToUpdate", - "extensionToReload", - "extensionsToReload", - "malicious warning", - "reloadNow" + "vs/workbench/contrib/mergeEditor/browser/mergeEditor.contribution": [ + "name", + "diffAlgorithm.legacy", + "diffAlgorithm.advanced" ], "vs/workbench/contrib/extensions/browser/extensions.contribution": [ "manageExtensionsQuickAccessPlaceholder", @@ -4418,6 +4425,7 @@ "workbench.extensions.action.copyExtensionId", "workbench.extensions.action.configure", "workbench.extensions.action.configureKeybindings", + "workbench.extensions.action.toggleApplyToAllProfiles", "workbench.extensions.action.toggleIgnoreExtension", "workbench.extensions.action.ignoreRecommendation", "workbench.extensions.action.undoIgnoredRecommendation", @@ -4433,6 +4441,52 @@ "extensions", "extensions" ], + "vs/workbench/contrib/extensions/browser/extensionsViewlet": [ + { + "key": "remote", + "comment": [ + "Remote as in remote machine" + ] + }, + "installed", + "select and install local extensions", + "install remote in local", + "popularExtensions", + "recommendedExtensions", + "enabledExtensions", + "disabledExtensions", + "marketPlace", + "installed", + "recently updated", + "enabled", + "disabled", + "availableUpdates", + "builtin", + "workspaceUnsupported", + "workspaceRecommendedExtensions", + "otherRecommendedExtensions", + "builtinFeatureExtensions", + "builtInThemesExtensions", + "builtinProgrammingLanguageExtensions", + "untrustedUnsupportedExtensions", + "untrustedPartiallySupportedExtensions", + "virtualUnsupportedExtensions", + "virtualPartiallySupportedExtensions", + "deprecated", + "searchExtensions", + "extensionFoundInSection", + "extensionFound", + "extensionsFoundInSection", + "extensionsFound", + "suggestProxyError", + "open user settings", + "extensionToUpdate", + "extensionsToUpdate", + "extensionToReload", + "extensionsToReload", + "malicious warning", + "reloadNow" + ], "vs/workbench/contrib/output/browser/output.contribution": [ "outputViewIcon", "output", @@ -4464,6 +4518,12 @@ "output", "output.smartScroll.enabled" ], + "vs/workbench/contrib/output/browser/outputView": [ + "output model title", + "channel", + "output", + "outputViewAriaLabel" + ], "vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution": [ "scopedConsoleAction.Integrated", "scopedConsoleAction.external", @@ -4547,6 +4607,7 @@ "ConfigureDefaultBuildTask.label", "ConfigureDefaultTestTask.label", "workbench.action.tasks.openUserTasks", + "userTasks", "tasksQuickAccessPlaceholder", "tasksQuickAccessHelp", "tasksConfigurationTitle", @@ -4637,12 +4698,6 @@ "snippetSchema.json", "snippetSchema.json.scope" ], - "vs/workbench/contrib/output/browser/outputView": [ - "output model title", - "channel", - "output", - "outputViewAriaLabel" - ], "vs/workbench/contrib/folding/browser/folding.contribution": [ "null", "nullFormatterDescription", @@ -5164,7 +5219,9 @@ ], "vs/workbench/contrib/accessibility/browser/accessibility.contribution": [ "editor-help", - "hoverAccessibleView" + "hoverAccessibleView", + "notification.accessibleView", + "notification" ], "vs/workbench/contrib/share/browser/share.contribution": [ "share", @@ -5175,6 +5232,31 @@ "open link", "experimental.share.enabled" ], + "vs/workbench/browser/parts/dialogs/dialogHandler": [ + "aboutDetail", + { + "key": "copy", + "comment": [ + "&& denotes a mnemonic" + ] + }, + "ok" + ], + "vs/workbench/electron-sandbox/parts/dialogs/dialogHandler": [ + { + "key": "aboutDetail", + "comment": [ + "Electron, Chromium, Node.js and V8 are product names that need no translation" + ] + }, + { + "key": "copy", + "comment": [ + "&& denotes a mnemonic" + ] + }, + "okButton" + ], "vs/platform/configuration/common/configurationRegistry": [ "defaultLanguageConfigurationOverrides.title", "defaultLanguageConfiguration.description", @@ -5313,32 +5395,10 @@ "vs/workbench/common/configuration": [ "applicationConfigurationTitle", "workbenchConfigurationTitle", - "securityConfigurationTitle" - ], - "vs/workbench/browser/parts/dialogs/dialogHandler": [ - "aboutDetail", - { - "key": "copy", - "comment": [ - "&& denotes a mnemonic" - ] - }, - "ok" - ], - "vs/workbench/electron-sandbox/parts/dialogs/dialogHandler": [ - { - "key": "aboutDetail", - "comment": [ - "Electron, Chromium, Node.js and V8 are product names that need no translation" - ] - }, - { - "key": "copy", - "comment": [ - "&& denotes a mnemonic" - ] - }, - "okButton" + "securityConfigurationTitle", + "security.allowedUNCHosts.patternErrorMessage", + "security.allowedUNCHosts", + "security.restrictUNCAccess" ], "vs/workbench/services/textfile/browser/textFileService": [ "textFileCreate.source", @@ -5727,9 +5787,6 @@ "windowActiveBorder", "windowInactiveBorder" ], - "vs/base/common/actions": [ - "submenu.empty" - ], "vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService": [ "save", "saveWorkspace", @@ -5793,8 +5850,10 @@ "non web extensions detail", "non web extensions" ], + "vs/base/common/actions": [ + "submenu.empty" + ], "vs/workbench/services/extensionManagement/electron-sandbox/remoteExtensionManagementService": [ - "notFoundCompatiblePrereleaseDependency", "notFoundReleaseExtension", "notFoundCompatibleDependency" ], @@ -5853,71 +5912,11 @@ "openLogsFolder", "openExtensionLogsFolder" ], - "vs/workbench/contrib/localization/electron-sandbox/minimalTranslations": [ - "showLanguagePackExtensions", - "searchMarketplace", - "installAndRestartMessage", - "installAndRestart" + "vs/workbench/contrib/codeEditor/electron-sandbox/selectionClipboard": [ + "actions.pasteSelectionClipboard" ], - "vs/workbench/contrib/localization/common/localization.contribution": [ - "vscode.extension.contributes.localizations", - "vscode.extension.contributes.localizations.languageId", - "vscode.extension.contributes.localizations.languageName", - "vscode.extension.contributes.localizations.languageNameLocalized", - "vscode.extension.contributes.localizations.translations", - "vscode.extension.contributes.localizations.translations.id", - "vscode.extension.contributes.localizations.translations.id.pattern", - "vscode.extension.contributes.localizations.translations.path" - ], - "vs/editor/common/editorContextKeys": [ - "editorTextFocus", - "editorFocus", - "textInputFocus", - "editorReadonly", - "inDiffEditor", - "isEmbeddedDiffEditor", - "editorColumnSelection", - "editorHasSelection", - "editorHasMultipleSelections", - "editorTabMovesFocus", - "editorHoverVisible", - "editorHoverFocused", - "stickyScrollFocused", - "stickyScrollVisible", - "standaloneColorPickerVisible", - "standaloneColorPickerFocused", - "inCompositeEditor", - "editorLangId", - "editorHasCompletionItemProvider", - "editorHasCodeActionsProvider", - "editorHasCodeLensProvider", - "editorHasDefinitionProvider", - "editorHasDeclarationProvider", - "editorHasImplementationProvider", - "editorHasTypeDefinitionProvider", - "editorHasHoverProvider", - "editorHasDocumentHighlightProvider", - "editorHasDocumentSymbolProvider", - "editorHasReferenceProvider", - "editorHasRenameProvider", - "editorHasSignatureHelpProvider", - "editorHasInlayHintsProvider", - "editorHasDocumentFormattingProvider", - "editorHasDocumentSelectionFormattingProvider", - "editorHasMultipleDocumentFormattingProvider", - "editorHasMultipleDocumentSelectionFormattingProvider" - ], - "vs/workbench/common/editor": [ - "promptOpenWith.defaultEditor.displayName", - "builtinProviderDisplayName", - "openLargeFile", - "configureEditorLargeFileConfirmation" - ], - "vs/workbench/contrib/codeEditor/electron-sandbox/selectionClipboard": [ - "actions.pasteSelectionClipboard" - ], - "vs/workbench/contrib/codeEditor/electron-sandbox/startDebugTextMate": [ - "startDebugTextMate" + "vs/workbench/contrib/codeEditor/electron-sandbox/startDebugTextMate": [ + "startDebugTextMate" ], "vs/workbench/browser/editor": [ "preview", @@ -5930,6 +5929,12 @@ "saveprofile.dialogTitle", "saveprofile.saveButton" ], + "vs/workbench/common/editor": [ + "promptOpenWith.defaultEditor.displayName", + "builtinProviderDisplayName", + "openLargeFile", + "configureEditorLargeFileConfirmation" + ], "vs/workbench/contrib/extensions/electron-sandbox/debugExtensionHostAction": [ "debugExtensionHost", "restart1", @@ -6012,6 +6017,35 @@ "vscode.extension.contributes.terminal.types.icon.light", "vscode.extension.contributes.terminal.types.icon.dark" ], + "vs/editor/common/languages": [ + "Array", + "Boolean", + "Class", + "Constant", + "Constructor", + "Enum", + "EnumMember", + "Event", + "Field", + "File", + "Function", + "Interface", + "Key", + "Method", + "Module", + "Namespace", + "Null", + "Number", + "Object", + "Operator", + "Package", + "Property", + "String", + "Struct", + "TypeParameter", + "Variable", + "symbolAriaLabel" + ], "vs/workbench/services/userDataSync/common/userDataSync": [ "settings", "keybindings", @@ -6043,11 +6077,6 @@ ] } ], - "vs/workbench/contrib/tasks/common/tasks": [ - "tasks.taskRunningContext", - "tasksCategory", - "TaskDefinition.missingRequiredProperty" - ], "vs/workbench/contrib/tasks/common/taskService": [ "tasks.customExecutionSupported", "tasks.shellExecutionSupported", @@ -6055,11 +6084,131 @@ "tasks.processExecutionSupported", "tasks.serverlessWebContext" ], + "vs/workbench/contrib/tasks/browser/terminalTaskSystem": [ + "TerminalTaskSystem.unknownError", + "TerminalTaskSystem.taskLoadReporting", + "dependencyCycle", + "dependencyFailed", + "TerminalTaskSystem.nonWatchingMatcher", + { + "key": "task.executingInFolder", + "comment": [ + "The workspace folder the task is running in", + "The task command line or label" + ] + }, + { + "key": "task.executing.shellIntegration", + "comment": [ + "The task command line or label" + ] + }, + { + "key": "task.executingInFolder", + "comment": [ + "The workspace folder the task is running in", + "The task command line or label" + ] + }, + { + "key": "task.executing.shell-integration", + "comment": [ + "The task command line or label" + ] + }, + { + "key": "task.executing", + "comment": [ + "The task command line or label" + ] + }, + "TerminalTaskSystem", + "unknownProblemMatcher", + "closeTerminal", + "reuseTerminal" + ], + "vs/workbench/contrib/tasks/common/tasks": [ + "tasks.taskRunningContext", + "tasksCategory", + "TaskDefinition.missingRequiredProperty" + ], "vs/workbench/common/views": [ "defaultViewIcon", "duplicateId", "treeView.notRegistered" ], + "vs/platform/audioCues/browser/audioCueService": [ + "audioCues.lineHasError.name", + "audioCues.lineHasWarning.name", + "audioCues.lineHasFoldedArea.name", + "audioCues.lineHasBreakpoint.name", + "audioCues.lineHasInlineSuggestion.name", + "audioCues.terminalQuickFix.name", + "audioCues.onDebugBreak.name", + "audioCues.noInlayHints", + "audioCues.taskCompleted", + "audioCues.taskFailed", + "audioCues.terminalCommandFailed", + "audioCues.terminalBell", + "audioCues.notebookCellCompleted", + "audioCues.notebookCellFailed", + "audioCues.diffLineInserted", + "audioCues.diffLineDeleted", + "audioCues.diffLineModified", + "audioCues.chatRequestSent", + "audioCues.chatResponseReceived", + "audioCues.chatResponsePending" + ], + "vs/workbench/contrib/terminal/common/terminalContextKey": [ + "terminalFocusContextKey", + "terminalFocusInAnyContextKey", + "terminalAccessibleBufferFocusContextKey", + "terminalEditorFocusContextKey", + "terminalCountContextKey", + "terminalTabsFocusContextKey", + "terminalShellTypeContextKey", + "terminalAltBufferActive", + "terminalSuggestWidgetVisible", + "terminalViewShowing", + "terminalTextSelectedContextKey", + "terminalTextSelectedInFocusedContextKey", + "terminalProcessSupportedContextKey", + "terminalTabsSingularSelectedContextKey", + "isSplitTerminalContextKey", + "inTerminalRunCommandPickerContextKey", + "terminalShellIntegrationEnabled" + ], + "vs/workbench/contrib/localHistory/electron-sandbox/localHistoryCommands": [ + "revealInWindows", + "revealInMac", + "openContainer" + ], + "vs/workbench/contrib/webview/electron-sandbox/webviewCommands": [ + "openToolsLabel", + "iframeWebviewAlert" + ], + "vs/workbench/contrib/mergeEditor/electron-sandbox/devCommands": [ + "mergeEditor", + "merge.dev.openState", + "mergeEditor.enterJSON", + "merge.dev.openSelectionInTemporaryMergeEditor" + ], + "vs/workbench/contrib/localization/common/localization.contribution": [ + "vscode.extension.contributes.localizations", + "vscode.extension.contributes.localizations.languageId", + "vscode.extension.contributes.localizations.languageName", + "vscode.extension.contributes.localizations.languageNameLocalized", + "vscode.extension.contributes.localizations.translations", + "vscode.extension.contributes.localizations.translations.id", + "vscode.extension.contributes.localizations.translations.id.pattern", + "vscode.extension.contributes.localizations.translations.path" + ], + "vs/workbench/contrib/localization/electron-sandbox/minimalTranslations": [ + "showLanguagePackExtensions", + "searchMarketplace", + "installAndRestartMessage", + "installAndRestart" + ], "vs/workbench/contrib/tasks/browser/abstractTaskService": [ "ConfigureTaskRunnerAction.label", "tasks", @@ -6160,104 +6309,44 @@ "taskService.openDiff", "taskService.openDiffs" ], - "vs/workbench/contrib/tasks/browser/terminalTaskSystem": [ - "TerminalTaskSystem.unknownError", - "TerminalTaskSystem.taskLoadReporting", - "dependencyCycle", - "dependencyFailed", - "TerminalTaskSystem.nonWatchingMatcher", - { - "key": "task.executingInFolder", - "comment": [ - "The workspace folder the task is running in", - "The task command line or label" - ] - }, - { - "key": "task.executing.shellIntegration", - "comment": [ - "The task command line or label" - ] - }, - { - "key": "task.executingInFolder", - "comment": [ - "The workspace folder the task is running in", - "The task command line or label" - ] - }, - { - "key": "task.executing.shell-integration", - "comment": [ - "The task command line or label" - ] - }, - { - "key": "task.executing", - "comment": [ - "The task command line or label" - ] - }, - "TerminalTaskSystem", - "unknownProblemMatcher", - "closeTerminal", - "reuseTerminal" - ], - "vs/platform/audioCues/browser/audioCueService": [ - "audioCues.lineHasError.name", - "audioCues.lineHasWarning.name", - "audioCues.lineHasFoldedArea.name", - "audioCues.lineHasBreakpoint.name", - "audioCues.lineHasInlineSuggestion.name", - "audioCues.terminalQuickFix.name", - "audioCues.onDebugBreak.name", - "audioCues.noInlayHints", - "audioCues.taskCompleted", - "audioCues.taskFailed", - "audioCues.terminalCommandFailed", - "audioCues.terminalBell", - "audioCues.notebookCellCompleted", - "audioCues.notebookCellFailed", - "audioCues.diffLineInserted", - "audioCues.diffLineDeleted", - "audioCues.diffLineModified", - "audioCues.chatRequestSent", - "audioCues.chatResponseReceived", - "audioCues.chatResponsePending" - ], - "vs/workbench/contrib/terminal/common/terminalContextKey": [ - "terminalFocusContextKey", - "terminalFocusInAnyContextKey", - "terminalAccessibleBufferFocusContextKey", - "terminalEditorFocusContextKey", - "terminalCountContextKey", - "terminalTabsFocusContextKey", - "terminalShellTypeContextKey", - "terminalAltBufferActive", - "terminalSuggestWidgetVisible", - "terminalViewShowing", - "terminalTextSelectedContextKey", - "terminalTextSelectedInFocusedContextKey", - "terminalProcessSupportedContextKey", - "terminalTabsSingularSelectedContextKey", - "isSplitTerminalContextKey", - "inTerminalRunCommandPickerContextKey", - "terminalShellIntegrationEnabled" - ], - "vs/workbench/contrib/webview/electron-sandbox/webviewCommands": [ - "openToolsLabel", - "iframeWebviewAlert" - ], - "vs/workbench/contrib/localHistory/electron-sandbox/localHistoryCommands": [ - "revealInWindows", - "revealInMac", - "openContainer" - ], - "vs/workbench/contrib/mergeEditor/electron-sandbox/devCommands": [ - "mergeEditor", - "merge.dev.openState", - "mergeEditor.enterJSON", - "merge.dev.openSelectionInTemporaryMergeEditor" + "vs/editor/common/editorContextKeys": [ + "editorTextFocus", + "editorFocus", + "textInputFocus", + "editorReadonly", + "inDiffEditor", + "isEmbeddedDiffEditor", + "accessibleDiffViewerVisible", + "editorColumnSelection", + "editorHasSelection", + "editorHasMultipleSelections", + "editorTabMovesFocus", + "editorHoverVisible", + "editorHoverFocused", + "stickyScrollFocused", + "stickyScrollVisible", + "standaloneColorPickerVisible", + "standaloneColorPickerFocused", + "inCompositeEditor", + "editorLangId", + "editorHasCompletionItemProvider", + "editorHasCodeActionsProvider", + "editorHasCodeLensProvider", + "editorHasDefinitionProvider", + "editorHasDeclarationProvider", + "editorHasImplementationProvider", + "editorHasTypeDefinitionProvider", + "editorHasHoverProvider", + "editorHasDocumentHighlightProvider", + "editorHasDocumentSymbolProvider", + "editorHasReferenceProvider", + "editorHasRenameProvider", + "editorHasSignatureHelpProvider", + "editorHasInlayHintsProvider", + "editorHasDocumentFormattingProvider", + "editorHasDocumentSelectionFormattingProvider", + "editorHasMultipleDocumentFormattingProvider", + "editorHasMultipleDocumentSelectionFormattingProvider" ], "vs/workbench/api/common/extHostExtensionService": [ "extensionTestError1", @@ -6272,6 +6361,10 @@ "vs/workbench/api/common/extHostTerminalService": [ "launchFail.idMissingOnExtHost" ], + "vs/workbench/api/common/extHostTunnelService": [ + "tunnelPrivacy.private", + "tunnelPrivacy.public" + ], "vs/workbench/api/common/extHostLogService": [ "remote", "worker", @@ -6286,9 +6379,8 @@ "vs/workbench/api/node/extHostDebugService": [ "debug.terminal.title" ], - "vs/workbench/api/node/extHostTunnelService": [ - "tunnelPrivacy.private", - "tunnelPrivacy.public" + "vs/base/browser/ui/button/button": [ + "button dropdown more actions" ], "vs/platform/dialogs/electron-main/dialogMainService": [ "open", @@ -6369,14 +6461,6 @@ "cantUninstall", "sourceMissing" ], - "vs/platform/workspaces/electron-main/workspacesHistoryMainService": [ - "newWindow", - "newWindowDesc", - "recentFoldersAndWorkspaces", - "recentFolders", - "untitledWorkspace", - "workspaceName" - ], "vs/platform/windows/electron-main/windowsMainService": [ { "key": "ok", @@ -6410,6 +6494,14 @@ "confirmOpenDetail", "doNotAskAgain" ], + "vs/platform/workspaces/electron-main/workspacesHistoryMainService": [ + "newWindow", + "newWindowDesc", + "recentFoldersAndWorkspaces", + "recentFolders", + "untitledWorkspace", + "workspaceName" + ], "vs/platform/workspaces/electron-main/workspacesManagementMainService": [ { "key": "ok", @@ -6423,6 +6515,22 @@ "vs/platform/files/common/io": [ "fileTooLargeError" ], + "vs/base/browser/ui/tree/abstractTree": [ + "filter", + "fuzzySearch", + "type to filter", + "type to search", + "type to search", + "close", + "not found" + ], + "vs/platform/theme/common/iconRegistry": [ + "iconDefinition.fontId", + "iconDefinition.fontCharacter", + "widgetClose", + "previousChangeIcon", + "nextChangeIcon" + ], "vs/platform/extensions/common/extensionValidator": [ "extensionDescription.publisher", "extensionDescription.name", @@ -6465,8 +6573,8 @@ "vs/platform/extensionManagement/common/abstractExtensionManagementService": [ "MarketPlaceDisabled", "malicious extension", + "notFoundDeprecatedReplacementExtension", "incompatible platform", - "notFoundCompatiblePrereleaseDependency", "notFoundReleaseExtension", "notFoundCompatibleDependency", "singleDependentError", @@ -6479,9 +6587,6 @@ "vs/platform/extensionManagement/node/extensionManagementUtil": [ "invalidManifest" ], - "vs/base/browser/ui/button/button": [ - "button dropdown more actions" - ], "vs/base/common/date": [ "date.fromNow.in", "date.fromNow.now", @@ -6563,33 +6668,11 @@ "session expired", "turned off machine" ], - "vs/base/browser/ui/tree/abstractTree": [ - "filter", - "fuzzySearch", - "type to filter", - "type to search", - "type to search", - "close", - "not found" - ], - "vs/platform/theme/common/iconRegistry": [ - "iconDefinition.fontId", - "iconDefinition.fontCharacter", - "widgetClose", - "previousChangeIcon", - "nextChangeIcon" - ], "vs/workbench/browser/parts/notifications/notificationsAlerts": [ "alertErrorMessage", "alertWarningMessage", "alertInfoMessage" ], - "vs/workbench/browser/parts/notifications/notificationsCenter": [ - "notificationsEmpty", - "notifications", - "notificationsToolbar", - "notificationsCenterWidgetAriaLabel" - ], "vs/workbench/browser/parts/notifications/notificationsStatus": [ "status.notifications", "status.notifications", @@ -6625,6 +6708,16 @@ }, "status.message" ], + "vs/workbench/browser/parts/notifications/notificationsCenter": [ + "notificationsEmpty", + "notifications", + "notificationsToolbar", + "notificationsCenterWidgetAriaLabel" + ], + "vs/workbench/browser/parts/notifications/notificationsToasts": [ + "notificationAriaLabel", + "notificationWithSourceAriaLabel" + ], "vs/workbench/browser/parts/notifications/notificationsCommands": [ "notifications", "showNotifications", @@ -6634,16 +6727,13 @@ "toggleDoNotDisturbMode", "focusNotificationToasts" ], - "vs/workbench/browser/parts/notifications/notificationsToasts": [ - "notificationAriaLabel", - "notificationWithSourceAriaLabel" - ], "vs/platform/actions/browser/menuEntryActionViewItem": [ "titleAndKb", "titleAndKb", "titleAndKbAndAlt" ], "vs/workbench/services/configuration/common/configurationEditing": [ + "fsError", "openTasksConfiguration", "openLaunchConfiguration", "open", @@ -6686,6 +6776,15 @@ "workspaceTarget", "folderTarget" ], + "vs/editor/browser/coreCommands": [ + "stickydesc", + "stickydesc", + "removedCursor" + ], + "vs/editor/browser/widget/codeEditorWidget": [ + "cursors.maximum", + "goToSetting" + ], "vs/editor/common/core/editorColorRegistry": [ "lineHighlight", "lineHighlightBorderBox", @@ -6696,9 +6795,23 @@ "caret", "editorCursorBackground", "editorWhitespaces", + "editorLineNumbers", "editorIndentGuides", + "deprecatedEditorIndentGuides", "editorActiveIndentGuide", - "editorLineNumbers", + "deprecatedEditorActiveIndentGuide", + "editorIndentGuides1", + "editorIndentGuides2", + "editorIndentGuides3", + "editorIndentGuides4", + "editorIndentGuides5", + "editorIndentGuides6", + "editorActiveIndentGuide1", + "editorActiveIndentGuide2", + "editorActiveIndentGuide3", + "editorActiveIndentGuide4", + "editorActiveIndentGuide5", + "editorActiveIndentGuide6", "editorActiveLineNumber", "deprecatedEditorActiveLineNumber", "editorActiveLineNumber", @@ -6741,22 +6854,6 @@ "editorUnicodeHighlight.border", "editorUnicodeHighlight.background" ], - "vs/platform/contextkey/common/scanner": [ - "contextkey.scanner.hint.didYouMean1", - "contextkey.scanner.hint.didYouMean2", - "contextkey.scanner.hint.didYouMean3", - "contextkey.scanner.hint.didYouForgetToOpenOrCloseQuote", - "contextkey.scanner.hint.didYouForgetToEscapeSlash" - ], - "vs/editor/browser/coreCommands": [ - "stickydesc", - "stickydesc", - "removedCursor" - ], - "vs/editor/browser/widget/codeEditorWidget": [ - "cursors.maximum", - "goToSetting" - ], "vs/editor/contrib/anchorSelect/browser/anchorSelect": [ "selectionAnchor", "anchorSet", @@ -6765,6 +6862,20 @@ "selectFromAnchorToCursor", "cancelSelectionAnchor" ], + "vs/platform/contextkey/common/scanner": [ + "contextkey.scanner.hint.didYouMean1", + "contextkey.scanner.hint.didYouMean2", + "contextkey.scanner.hint.didYouMean3", + "contextkey.scanner.hint.didYouForgetToOpenOrCloseQuote", + "contextkey.scanner.hint.didYouForgetToEscapeSlash" + ], + "vs/editor/browser/widget/diffEditorWidget": [ + "diffInsertIcon", + "diffRemoveIcon", + "diff-aria-navigation-tip", + "diff.tooLarge", + "revertChangeHoverMessage" + ], "vs/editor/contrib/bracketMatching/browser/bracketMatching": [ "overviewRulerBracketMatchForeground", "smartSelect.jumpBracket", @@ -6777,13 +6888,6 @@ ] } ], - "vs/editor/browser/widget/diffEditorWidget": [ - "diffInsertIcon", - "diffRemoveIcon", - "diff-aria-navigation-tip", - "diff.tooLarge", - "revertChangeHoverMessage" - ], "vs/editor/contrib/caretOperations/browser/caretOperations": [ "caret.moveLeft", "caret.moveRight" @@ -6922,6 +7026,11 @@ ] } ], + "vs/editor/contrib/fontZoom/browser/fontZoom": [ + "EditorFontZoomIn.label", + "EditorFontZoomOut.label", + "EditorFontZoomReset.label" + ], "vs/editor/contrib/folding/browser/folding": [ "unfoldAction.label", "unFoldRecursivelyAction.label", @@ -6946,11 +7055,6 @@ "formatDocument.label", "formatSelection.label" ], - "vs/editor/contrib/fontZoom/browser/fontZoom": [ - "EditorFontZoomIn.label", - "EditorFontZoomOut.label", - "EditorFontZoomReset.label" - ], "vs/editor/contrib/gotoSymbol/browser/goToCommands": [ "peek.submenu", "def.title", @@ -7017,6 +7121,9 @@ "generic.noResult", "ref.title" ], + "vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition": [ + "multipleResults" + ], "vs/editor/contrib/gotoError/browser/gotoError": [ "markerAction.next.label", "nextMarkerIcon", @@ -7037,9 +7144,6 @@ ] } ], - "vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition": [ - "multipleResults" - ], "vs/editor/contrib/hover/browser/hover": [ { "key": "showOrFocusHover", @@ -7050,6 +7154,8 @@ "If the hover is already visible, it will take focus." ] }, + "chatAccessibleViewHint", + "chatAccessibleViewHintNoKb", { "key": "showDefinitionPreviewHover", "comment": [ @@ -7104,12 +7210,6 @@ "comment": [ "Action that allows to go to the bottom in the hover widget with the end command when the hover widget is focused." ] - }, - { - "key": "escapeFocusHover", - "comment": [ - "Action that allows to escape from the hover widget with the escape command when the hover widget is focused." - ] } ], "vs/editor/contrib/indentation/browser/indentation": [ @@ -7387,6 +7487,8 @@ "changeConfigToOnWinLinux", "auto_on", "auto_off", + "screenReaderModeEnabled", + "screenReaderModeDisabled", "tabFocusModeOnMsg", "tabFocusModeOnMsgNoKb", "tabFocusModeOffMsg", @@ -7474,20 +7576,6 @@ "invalid.semanticTokenScopes.scopes.value", "invalid.semanticTokenScopes.scopes.selector" ], - "vs/workbench/api/browser/statusBarExtensionPoint": [ - "id", - "name", - "text", - "tooltip", - "command", - "alignment", - "priority", - "accessibilityInformation", - "accessibilityInformation.role", - "accessibilityInformation.label", - "vscode.extension.contributes.statusBarItems", - "invalid" - ], "vs/workbench/contrib/codeEditor/browser/languageConfigurationExtensionPoint": [ "parseErrors", "formatError", @@ -7553,6 +7641,20 @@ "schema.onEnterRules.action.appendText", "schema.onEnterRules.action.removeText" ], + "vs/workbench/api/browser/statusBarExtensionPoint": [ + "id", + "name", + "text", + "tooltip", + "command", + "alignment", + "priority", + "accessibilityInformation", + "accessibilityInformation.role", + "accessibilityInformation.label", + "vscode.extension.contributes.statusBarItems", + "invalid" + ], "vs/workbench/api/browser/mainThreadCLICommands": [ "cannot be installed" ], @@ -7621,9 +7723,6 @@ "msg-write", "label" ], - "vs/workbench/api/browser/mainThreadProgress": [ - "manageExtension" - ], "vs/workbench/api/browser/mainThreadMessageService": [ "extensionSource", "defaultSource", @@ -7636,6 +7735,9 @@ ] } ], + "vs/workbench/api/browser/mainThreadProgress": [ + "manageExtension" + ], "vs/workbench/api/browser/mainThreadSaveParticipant": [ "timeout.onWillSave" ], @@ -7667,10 +7769,6 @@ "vs/workbench/api/browser/mainThreadTask": [ "task.label" ], - "vs/workbench/api/browser/mainThreadTunnelService": [ - "remote.tunnel.openTunnel", - "remote.tunnelsView.elevationButton" - ], "vs/workbench/api/browser/mainThreadAuthentication": [ "noTrustedExtensions", "manageTrustedExtensions.cancel", @@ -7701,70 +7799,9 @@ ] } ], - "vs/workbench/browser/parts/auxiliarybar/auxiliaryBarActions": [ - "toggleAuxiliaryIconRight", - "toggleAuxiliaryIconRightOn", - "toggleAuxiliaryIconLeft", - "toggleAuxiliaryIconLeftOn", - "toggleAuxiliaryBar", - "secondary sidebar", - { - "key": "secondary sidebar mnemonic", - "comment": [ - "&& denotes a mnemonic" - ] - }, - "focusAuxiliaryBar", - "toggleSecondarySideBar", - "toggleSecondarySideBar", - "hideAuxiliaryBar" - ], - "vs/workbench/browser/parts/panel/panelActions": [ - "maximizeIcon", - "restoreIcon", - "closeIcon", - "togglePanelOffIcon", - "togglePanelOnIcon", - "togglePanelVisibility", - "toggle panel", - { - "key": "toggle panel mnemonic", - "comment": [ - "&& denotes a mnemonic" - ] - }, - "focusPanel", - "focusPanel", - "positionPanelLeft", - "positionPanelLeftShort", - "positionPanelRight", - "positionPanelRightShort", - "positionPanelBottom", - "positionPanelBottomShort", - "alignPanelLeft", - "alignPanelLeftShort", - "alignPanelRight", - "alignPanelRightShort", - "alignPanelCenter", - "alignPanelCenterShort", - "alignPanelJustify", - "alignPanelJustifyShort", - "positionPanel", - "alignPanel", - "previousPanelView", - "nextPanelView", - "toggleMaximizedPanel", - "maximizePanel", - "minimizePanel", - "panelMaxNotSupported", - "closePanel", - "closeSecondarySideBar", - "togglePanel", - "hidePanel", - "movePanelToSecondarySideBar", - "movePanelToSecondarySideBar", - "moveSidePanelToPanel", - "moveSidePanelToPanel" + "vs/workbench/api/browser/mainThreadTunnelService": [ + "remote.tunnel.openTunnel", + "remote.tunnelsView.elevationButton" ], "vs/workbench/browser/quickaccess": [ "inQuickOpen" @@ -7855,15 +7892,6 @@ }, "product.extensionEnabledApiProposals" ], - "vs/workbench/browser/parts/views/treeView": [ - "no-dataprovider", - "treeView.enableCollapseAll", - "treeView.enableRefresh", - "refresh", - "collapseAll", - "treeView.toggleCollapseAll", - "command-error" - ], "vs/workbench/browser/parts/views/viewPaneContainer": [ "views", "viewMoveUp", @@ -7927,21 +7955,14 @@ "debuggerDisabled", "internalConsoleOptions" ], - "vs/workbench/contrib/files/common/files": [ - "explorerViewletVisible", - "foldersViewVisible", - "explorerResourceIsFolder", - "explorerResourceReadonly", - "explorerResourceIsRoot", - "explorerResourceCut", - "explorerResourceMoveableToTrash", - "filesExplorerFocus", - "openEditorsFocus", - "explorerViewletFocus", - "explorerViewletCompressedFocus", - "explorerViewletCompressedFirstFocus", - "explorerViewletCompressedLastFocus", - "viewHasSomeCollapsibleItem" + "vs/workbench/browser/parts/views/treeView": [ + "no-dataprovider", + "treeView.enableCollapseAll", + "treeView.enableRefresh", + "refresh", + "collapseAll", + "treeView.toggleCollapseAll", + "command-error" ], "vs/workbench/contrib/remote/browser/remoteExplorer": [ "ports", @@ -7961,6 +7982,69 @@ "remote.tunnelsView.makePublic", "remote.tunnelsView.elevationButton" ], + "vs/workbench/browser/parts/panel/panelActions": [ + "maximizeIcon", + "restoreIcon", + "closeIcon", + "togglePanelOffIcon", + "togglePanelOnIcon", + "togglePanelVisibility", + "toggle panel", + { + "key": "toggle panel mnemonic", + "comment": [ + "&& denotes a mnemonic" + ] + }, + "focusPanel", + "focusPanel", + "positionPanelLeft", + "positionPanelLeftShort", + "positionPanelRight", + "positionPanelRightShort", + "positionPanelBottom", + "positionPanelBottomShort", + "alignPanelLeft", + "alignPanelLeftShort", + "alignPanelRight", + "alignPanelRightShort", + "alignPanelCenter", + "alignPanelCenterShort", + "alignPanelJustify", + "alignPanelJustifyShort", + "positionPanel", + "alignPanel", + "previousPanelView", + "nextPanelView", + "toggleMaximizedPanel", + "maximizePanel", + "minimizePanel", + "panelMaxNotSupported", + "closePanel", + "closeSecondarySideBar", + "togglePanel", + "hidePanel", + "movePanelToSecondarySideBar", + "movePanelToSecondarySideBar", + "moveSidePanelToPanel", + "moveSidePanelToPanel" + ], + "vs/workbench/contrib/files/common/files": [ + "explorerViewletVisible", + "foldersViewVisible", + "explorerResourceIsFolder", + "explorerResourceReadonly", + "explorerResourceIsRoot", + "explorerResourceCut", + "explorerResourceMoveableToTrash", + "filesExplorerFocus", + "openEditorsFocus", + "explorerViewletFocus", + "explorerViewletCompressedFocus", + "explorerViewletCompressedFirstFocus", + "explorerViewletCompressedLastFocus", + "viewHasSomeCollapsibleItem" + ], "vs/workbench/common/editor/sideBySideEditorInput": [ "sideBySideLabels" ], @@ -7970,6 +8054,24 @@ "vs/workbench/common/editor/diffEditorInput": [ "sideBySideLabels" ], + "vs/workbench/browser/parts/auxiliarybar/auxiliaryBarActions": [ + "toggleAuxiliaryIconRight", + "toggleAuxiliaryIconRightOn", + "toggleAuxiliaryIconLeft", + "toggleAuxiliaryIconLeftOn", + "toggleAuxiliaryBar", + "secondary sidebar", + { + "key": "secondary sidebar mnemonic", + "comment": [ + "&& denotes a mnemonic" + ] + }, + "focusAuxiliaryBar", + "toggleSecondarySideBar", + "toggleSecondarySideBar", + "hideAuxiliaryBar" + ], "vs/workbench/browser/parts/editor/textDiffEditor": [ "textDiffEditor", "fileTooLargeForHeapErrorWithSize", @@ -8183,6 +8285,26 @@ "toggleEditorType", "reopenTextEditor" ], + "vs/workbench/browser/parts/editor/editorCommands": [ + "editorCommand.activeEditorMove.description", + "editorCommand.activeEditorMove.arg.name", + "editorCommand.activeEditorMove.arg.description", + "editorCommand.activeEditorCopy.description", + "editorCommand.activeEditorCopy.arg.name", + "editorCommand.activeEditorCopy.arg.description", + "toggleInlineView", + "compare", + "splitEditorInGroup", + "joinEditorInGroup", + "toggleJoinEditorInGroup", + "toggleSplitEditorInGroupLayout", + "focusLeftSideEditor", + "focusRightSideEditor", + "focusOtherSideEditor", + "toggleEditorGroupLock", + "lockEditorGroup", + "unlockEditorGroup" + ], "vs/editor/browser/editorExtensions": [ { "key": "miUndo", @@ -8206,25 +8328,12 @@ }, "selectAll" ], - "vs/workbench/browser/parts/editor/editorCommands": [ - "editorCommand.activeEditorMove.description", - "editorCommand.activeEditorMove.arg.name", - "editorCommand.activeEditorMove.arg.description", - "editorCommand.activeEditorCopy.description", - "editorCommand.activeEditorCopy.arg.name", - "editorCommand.activeEditorCopy.arg.description", - "toggleInlineView", - "compare", - "splitEditorInGroup", - "joinEditorInGroup", - "toggleJoinEditorInGroup", - "toggleSplitEditorInGroupLayout", - "focusLeftSideEditor", - "focusRightSideEditor", - "focusOtherSideEditor", - "toggleEditorGroupLock", - "lockEditorGroup", - "unlockEditorGroup" + "vs/workbench/browser/parts/editor/editorQuickAccess": [ + "noViewResults", + "entryAriaLabelWithGroupDirty", + "entryAriaLabelWithGroup", + "entryAriaLabelDirty", + "closeEditor" ], "vs/workbench/browser/parts/editor/editorConfiguration": [ "interactiveWindow", @@ -8234,13 +8343,6 @@ "editor.editorAssociations", "editorLargeFileSizeConfirmation" ], - "vs/workbench/browser/parts/editor/editorQuickAccess": [ - "noViewResults", - "entryAriaLabelWithGroupDirty", - "entryAriaLabelWithGroup", - "entryAriaLabelDirty", - "closeEditor" - ], "vs/workbench/browser/parts/editor/accessibilityStatus": [ "screenReaderDetectedExplanation.question", "screenReaderDetectedExplanation.answerYes", @@ -8248,24 +8350,6 @@ "screenReaderDetected", "status.editor.screenReaderMode" ], - "vs/editor/browser/widget/diffEditorWidget2/diffEditorWidget2.contribution": [ - "toggleCollapseUnchangedRegions", - "collapseUnchangedRegions", - "showUnchangedRegions", - "toggleShowMovedCodeBlocks", - "showMoves" - ], - "vs/workbench/browser/parts/editor/editorGroupView": [ - "ariaLabelGroupActions", - "emptyEditorGroup", - "groupLabel", - "groupAriaLabel" - ], - "vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart": [ - "move second side bar left", - "move second side bar right", - "hide second side bar" - ], "vs/workbench/browser/parts/activitybar/activitybarPart": [ "settingsViewBarIcon", "accountsViewBarIcon", @@ -8280,6 +8364,19 @@ "accounts", "accounts" ], + "vs/editor/browser/widget/diffEditorWidget2/diffEditorWidget2.contribution": [ + "toggleCollapseUnchangedRegions", + "collapseUnchangedRegions", + "showUnchangedRegions", + "toggleShowMovedCodeBlocks", + "diffEditor", + "switchSide" + ], + "vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart": [ + "move second side bar left", + "move second side bar right", + "hide second side bar" + ], "vs/workbench/browser/parts/panel/panelPart": [ "resetLocation", "resetLocation", @@ -8289,6 +8386,12 @@ "align panel", "hidePanel" ], + "vs/workbench/browser/parts/editor/editorGroupView": [ + "ariaLabelGroupActions", + "emptyEditorGroup", + "groupLabel", + "groupAriaLabel" + ], "vs/workbench/browser/parts/editor/editorDropTarget": [ "dropIntoEditorPrompt" ], @@ -8518,7 +8621,22 @@ "error.cannotparseicontheme", "error.invalidformat" ], - "vs/workbench/services/themes/common/themeExtensionPoints": [ + "vs/workbench/services/themes/common/colorThemeSchema": [ + "schema.token.settings", + "schema.token.foreground", + "schema.token.background.warning", + "schema.token.fontStyle", + "schema.fontStyle.error", + "schema.token.fontStyle.none", + "schema.properties.name", + "schema.properties.scope", + "schema.workbenchColors", + "schema.tokenColors.path", + "schema.colors", + "schema.supportsSemanticHighlighting", + "schema.semanticTokenColors" + ], + "vs/workbench/services/themes/common/themeExtensionPoints": [ "vscode.extension.contributes.themes", "vscode.extension.contributes.themes.id", "vscode.extension.contributes.themes.label", @@ -8537,21 +8655,6 @@ "reqid", "invalid.path.1" ], - "vs/workbench/services/themes/common/colorThemeSchema": [ - "schema.token.settings", - "schema.token.foreground", - "schema.token.background.warning", - "schema.token.fontStyle", - "schema.fontStyle.error", - "schema.token.fontStyle.none", - "schema.properties.name", - "schema.properties.scope", - "schema.workbenchColors", - "schema.tokenColors.path", - "schema.colors", - "schema.supportsSemanticHighlighting", - "schema.semanticTokenColors" - ], "vs/workbench/services/themes/common/themeConfiguration": [ "colorTheme", "colorThemeError", @@ -8711,7 +8814,8 @@ "keybindings" ], "vs/workbench/services/userDataProfile/browser/snippetsResource": [ - "snippets" + "snippets", + "exclude" ], "vs/workbench/services/userDataProfile/browser/tasksResource": [ "tasks" @@ -8719,6 +8823,7 @@ "vs/workbench/services/userDataProfile/browser/extensionsResource": [ "extensions", "disabled", + "exclude", "exclude" ], "vs/workbench/services/userDataProfile/browser/globalStateResource": [ @@ -8746,12 +8851,6 @@ "invalid.tokenTypes", "invalid.path.1" ], - "vs/workbench/contrib/preferences/browser/keybindingWidgets": [ - "defineKeybinding.initial", - "defineKeybinding.oneExists", - "defineKeybinding.existing", - "defineKeybinding.chordsTo" - ], "vs/editor/contrib/suggest/browser/suggest": [ "suggestWidgetHasSelection", "suggestWidgetDetailsVisible", @@ -8762,11 +8861,6 @@ "suggestionInsertMode", "suggestionCanResolve" ], - "vs/workbench/contrib/preferences/browser/preferencesActions": [ - "configureLanguageBasedSettings", - "languageDescriptionConfigured", - "pickLanguage" - ], "vs/workbench/contrib/preferences/browser/keybindingsEditor": [ "recordKeysLabel", "sortByPrecedeneLabel", @@ -8802,6 +8896,11 @@ "noWhen", "keyboard shortcuts aria label" ], + "vs/workbench/contrib/preferences/browser/preferencesActions": [ + "configureLanguageBasedSettings", + "languageDescriptionConfigured", + "pickLanguage" + ], "vs/workbench/contrib/preferences/browser/preferencesIcons": [ "settingsScopeDropDownIcon", "settingsMoreActionIcon", @@ -8837,9 +8936,6 @@ "turnOnSyncButton", "lastSyncedLabel" ], - "vs/workbench/contrib/performance/browser/perfviewEditor": [ - "name" - ], "vs/workbench/contrib/notebook/browser/notebookEditor": [ "fail.noEditor", "fail.noEditor.extensionMissing", @@ -8860,14 +8956,14 @@ "vs/workbench/contrib/notebook/browser/services/notebookExecutionServiceImpl": [ "notebookRunTrust" ], + "vs/editor/common/languages/modesRegistry": [ + "plainText.alias" + ], "vs/workbench/contrib/notebook/browser/services/notebookKeymapServiceImpl": [ "disableOtherKeymapsConfirmation", "yes", "no" ], - "vs/editor/common/languages/modesRegistry": [ - "plainText.alias" - ], "vs/workbench/contrib/comments/browser/commentReply": [ "reply", "newComment", @@ -8888,16 +8984,14 @@ "verbosity.interactiveEditor.description", "verbosity.keybindingsEditor.description", "verbosity.notebook", + "verbosity.hover", + "verbosity.notification", "editor.action.accessibilityHelp", - "editor.action.accessibleView" - ], - "vs/workbench/contrib/notebook/browser/controller/coreActions": [ - "notebookActions.category", - "notebookMenu.insertCell", - "notebookMenu.cellTitle", - "miShare" + "editor.action.accessibleView", + "editor.action.accessibleViewNext", + "editor.action.accessibleViewPrevious" ], - "vs/workbench/contrib/notebook/browser/notebookAccessibilityHelp": [ + "vs/workbench/contrib/notebook/browser/notebookAccessibility": [ "notebook.overview", "notebook.cell.edit", "notebook.cell.editNoKb", @@ -8909,7 +9003,26 @@ "notebook.cell.executeAndFocusContainer", "notebook.cell.executeAndFocusContainerNoKb", "notebook.cell.insertCodeCellBelowAndFocusContainer", - "notebook.changeCellType" + "notebook.changeCellType", + "NotebookCellOutputAccessibleView" + ], + "vs/workbench/contrib/accessibility/browser/accessibleView": [ + "openDoc", + "disable-help-hint", + "exit-tip", + "accessibleViewAriaLabelWithNav", + "accessibleViewAriaLabel", + "disableAccessibilityHelp", + "chatAccessibleViewNextPreviousHint", + "chatAccessibleViewNextPreviousHintNoKb", + "chatAccessibleViewHint", + "chatAccessibleViewHintNoKb" + ], + "vs/workbench/contrib/notebook/browser/controller/coreActions": [ + "notebookActions.category", + "notebookMenu.insertCell", + "notebookMenu.cellTitle", + "miShare" ], "vs/workbench/contrib/notebook/browser/controller/insertCellActions": [ "notebookActions.insertCodeCellAbove", @@ -8960,45 +9073,6 @@ "revealLastFailedCell", "revealLastFailedCellShort" ], - "vs/workbench/contrib/notebook/browser/controller/editActions": [ - "notebookActions.editCell", - "notebookActions.quitEdit", - "notebookActions.deleteCell", - "confirmDeleteButton", - "confirmDeleteButtonMessage", - "doNotAskAgain", - "clearCellOutputs", - "clearAllCellsOutputs", - "changeLanguage", - "changeLanguage", - "languageDescription", - "languageDescriptionConfigured", - "autoDetect", - "languagesPicks", - "pickLanguageToConfigure", - "detectLanguage", - "noDetection" - ], - "vs/workbench/contrib/notebook/browser/controller/layoutActions": [ - "workbench.notebook.layout.select.label", - "workbench.notebook.layout.configure.label", - "workbench.notebook.layout.configure.label", - "customizeNotebook", - "notebook.toggleLineNumbers", - "notebook.showLineNumbers", - "notebook.toggleCellToolbarPosition", - "notebook.toggleBreadcrumb", - "notebook.saveMimeTypeOrder", - "notebook.placeholder", - "saveTarget.machine", - "saveTarget.workspace", - "workbench.notebook.layout.webview.reset.label" - ], - "vs/workbench/contrib/notebook/browser/controller/foldingController": [ - "fold.cell", - "unfold.cell", - "fold.cell" - ], "vs/workbench/contrib/notebook/browser/contrib/clipboard/notebookClipboard": [ "notebookActions.copy", "notebookActions.cut", @@ -9016,6 +9090,24 @@ "formatCell.label", "formatCells.label" ], + "vs/workbench/contrib/notebook/browser/controller/layoutActions": [ + "workbench.notebook.layout.select.label", + "workbench.notebook.layout.configure.label", + "workbench.notebook.layout.configure.label", + "customizeNotebook", + "notebook.toggleLineNumbers", + "notebook.showLineNumbers", + "notebook.toggleCellToolbarPosition", + "notebook.toggleBreadcrumb", + "notebook.saveMimeTypeOrder", + "notebook.placeholder", + "saveTarget.machine", + "saveTarget.workspace", + "workbench.notebook.layout.webview.reset.label" + ], + "vs/workbench/contrib/notebook/browser/contrib/gettingStarted/notebookGettingStarted": [ + "workbench.notebook.layout.gettingStarted.label" + ], "vs/workbench/contrib/notebook/browser/contrib/saveParticipants/saveParticipants": [ "notebookFormatSave.formatting", "label", @@ -9032,28 +9124,10 @@ "vs/workbench/contrib/notebook/browser/contrib/layout/layoutActions": [ "notebook.toggleCellToolbarPosition" ], - "vs/workbench/contrib/notebook/browser/contrib/navigation/arrow": [ - "cursorMoveDown", - "cursorMoveUp", - "focusFirstCell", - "focusLastCell", - "focusOutput", - "focusOutputOut", - "notebookActions.centerActiveCell", - "cursorPageUp", - "cursorPageUpSelect", - "cursorPageDown", - "cursorPageDownSelect", - "notebook.navigation.allowNavigateToSurroundingCells" - ], "vs/workbench/contrib/notebook/browser/contrib/outline/notebookOutline": [ - "empty", "outline.showCodeCells", "breadcrumbs.showCodeCells" ], - "vs/workbench/contrib/notebook/browser/contrib/gettingStarted/notebookGettingStarted": [ - "workbench.notebook.layout.gettingStarted.label" - ], "vs/workbench/contrib/notebook/browser/contrib/profile/notebookProfile": [ "setProfileTitle" ], @@ -9069,6 +9143,11 @@ "notebook.cell.statusBar.timerTooltip.reportIssueFootnote", "notebook.cell.statusBar.timerTooltip" ], + "vs/workbench/contrib/notebook/browser/controller/foldingController": [ + "fold.cell", + "unfold.cell", + "fold.cell" + ], "vs/workbench/contrib/notebook/browser/contrib/editorStatusBar/editorStatusBar": [ "notebook.info", "tooltop", @@ -9102,6 +9181,20 @@ "notebookActions.expandAllCellOutput", "notebookActions.toggleScrolling" ], + "vs/workbench/contrib/notebook/browser/contrib/navigation/arrow": [ + "cursorMoveDown", + "cursorMoveUp", + "focusFirstCell", + "focusLastCell", + "focusOutput", + "focusOutputOut", + "notebookActions.centerActiveCell", + "cursorPageUp", + "cursorPageUpSelect", + "cursorPageDown", + "cursorPageDownSelect", + "notebook.navigation.allowNavigateToSurroundingCells" + ], "vs/workbench/contrib/notebook/browser/contrib/troubleshoot/layout": [ "workbench.notebook.toggleLayoutTroubleshoot", "workbench.notebook.inspectLayout", @@ -9136,6 +9229,25 @@ "interactiveSession.history.delete", "interactiveSession.history.pick" ], + "vs/workbench/contrib/notebook/browser/controller/editActions": [ + "notebookActions.editCell", + "notebookActions.quitEdit", + "notebookActions.deleteCell", + "confirmDeleteButton", + "confirmDeleteButtonMessage", + "doNotAskAgain", + "clearCellOutputs", + "clearAllCellsOutputs", + "changeLanguage", + "changeLanguage", + "languageDescription", + "languageDescriptionConfigured", + "autoDetect", + "languagesPicks", + "pickLanguageToConfigure", + "detectLanguage", + "noDetection" + ], "vs/workbench/contrib/chat/browser/actions/chatCodeblockActions": [ "interactive.copyCodeBlock.label", "interactive.insertCodeBlock.label", @@ -9152,10 +9264,6 @@ "interactive.submit.label", "interactive.cancel.label" ], - "vs/workbench/contrib/chat/browser/actions/chatQuickInputActions": [ - "askQuickQuestion", - "askabot" - ], "vs/workbench/contrib/chat/browser/actions/chatTitleActions": [ "interactive.helpful.label", "interactive.unhelpful.label", @@ -9194,11 +9302,6 @@ "interactiveSession.clear.label", "interactiveSession.clear.label" ], - "vs/workbench/contrib/accessibility/browser/accessibleView": [ - "openDoc", - "disable-help-hint", - "exit-tip" - ], "vs/workbench/contrib/chat/common/chatViewModel": [ "thinking" ], @@ -9213,14 +9316,14 @@ "inChat", "hasChatProvider" ], - "vs/workbench/contrib/chat/browser/contrib/chatInputEditorContrib": [ - "interactive.input.placeholderWithCommands", - "interactive.input.placeholderNoCommands" - ], "vs/workbench/contrib/chat/common/chatColors": [ "chat.requestBackground", "chat.requestBorder" ], + "vs/workbench/contrib/chat/browser/contrib/chatInputEditorContrib": [ + "interactive.input.placeholderWithCommands", + "interactive.input.placeholderNoCommands" + ], "vs/workbench/contrib/inlineChat/browser/inlineChatController": [ "welcome.1", "welcome.2", @@ -9255,8 +9358,20 @@ "undo.newfile", "feedback.helpful", "feedback.unhelpful", - "toggleDiff", - "toggleDiff2", + "showDiff", + { + "key": "miShowDiff", + "comment": [ + "&& denotes a mnemonic" + ] + }, + "showDiff2", + { + "key": "miShowDiff2", + "comment": [ + "&& denotes a mnemonic" + ] + }, "apply1", "apply2", "cancel", @@ -9270,14 +9385,16 @@ "inlineChatHasProvider", "inlineChatVisible", "inlineChatFocused", + "inlineChatResponseFocused", "inlineChatEmpty", "inlineChatInnerCursorFirst", "inlineChatInnerCursorLast", + "inlineChatInnerCursorStart", + "inlineChatInnerCursorEnd", "inlineChatMarkdownMessageCropState", "inlineChatOuterCursorPosition", "inlineChatHasActiveRequest", "inlineChatHasStashedSession", - "inlineChatDiff", "inlineChatResponseType", "inlineChatResponseTypes", "inlineChatDidEdit", @@ -9297,7 +9414,8 @@ "mode", "mode.livePreview", "mode.preview", - "mode.live" + "mode.live", + "showDiff" ], "vs/editor/contrib/peekView/browser/peekView": [ "inReferenceSearchEditor", @@ -9419,6 +9537,13 @@ }, "testExplorer" ], + "vs/workbench/contrib/testing/browser/testingProgressUiService": [ + "testProgress.runningInitial", + "testProgress.running", + "testProgressWithSkip.running", + "testProgress.completed", + "testProgressWithSkip.completed" + ], "vs/workbench/contrib/testing/browser/testingOutputPeek": [ "testing.markdownPeekError", "testOutputTitle", @@ -9445,12 +9570,32 @@ "testing.openMessageInEditor", "testing.toggleTestingPeekHistory" ], - "vs/workbench/contrib/testing/browser/testingProgressUiService": [ - "testProgress.runningInitial", - "testProgress.running", - "testProgressWithSkip.running", - "testProgress.completed", - "testProgressWithSkip.completed" + "vs/workbench/contrib/testing/common/configuration": [ + "testConfigurationTitle", + "testing.autoRun.delay", + "testing.automaticallyOpenPeekView", + "testing.automaticallyOpenPeekView.failureAnywhere", + "testing.automaticallyOpenPeekView.failureInVisibleDocument", + "testing.automaticallyOpenPeekView.never", + "testing.showAllMessages", + "testing.automaticallyOpenPeekViewDuringContinuousRun", + "testing.countBadge", + "testing.countBadge.failed", + "testing.countBadge.off", + "testing.countBadge.passed", + "testing.countBadge.skipped", + "testing.followRunningTest", + "testing.defaultGutterClickAction", + "testing.defaultGutterClickAction.run", + "testing.defaultGutterClickAction.debug", + "testing.defaultGutterClickAction.contextMenu", + "testing.gutterEnabled", + "testing.saveBeforeTest", + "testing.openTesting.neverOpen", + "testing.openTesting.openOnTestStart", + "testing.openTesting.openOnTestFailure", + "testing.openTesting", + "testing.alwaysRevealTestOnStateChange" ], "vs/workbench/contrib/testing/browser/testingViewPaneContainer": [ "testing" @@ -9482,6 +9627,10 @@ "testing.testItemHasUri", "testing.testItemIsHidden" ], + "vs/workbench/contrib/testing/browser/testingConfigurationUi": [ + "testConfigurationUi.pick", + "updateTestConfiguration" + ], "vs/workbench/contrib/testing/browser/testExplorerActions": [ "hideTest", "unhideTest", @@ -9534,37 +9683,6 @@ "testing.refreshTests", "testing.cancelTestRefresh" ], - "vs/workbench/contrib/testing/browser/testingConfigurationUi": [ - "testConfigurationUi.pick", - "updateTestConfiguration" - ], - "vs/workbench/contrib/testing/common/configuration": [ - "testConfigurationTitle", - "testing.autoRun.delay", - "testing.automaticallyOpenPeekView", - "testing.automaticallyOpenPeekView.failureAnywhere", - "testing.automaticallyOpenPeekView.failureInVisibleDocument", - "testing.automaticallyOpenPeekView.never", - "testing.showAllMessages", - "testing.automaticallyOpenPeekViewDuringContinuousRun", - "testing.countBadge", - "testing.countBadge.failed", - "testing.countBadge.off", - "testing.countBadge.passed", - "testing.countBadge.skipped", - "testing.followRunningTest", - "testing.defaultGutterClickAction", - "testing.defaultGutterClickAction.run", - "testing.defaultGutterClickAction.debug", - "testing.defaultGutterClickAction.contextMenu", - "testing.gutterEnabled", - "testing.saveBeforeTest", - "testing.openTesting.neverOpen", - "testing.openTesting.openOnTestStart", - "testing.openTesting.openOnTestFailure", - "testing.openTesting", - "testing.alwaysRevealTestOnStateChange" - ], "vs/workbench/contrib/logs/common/logsActions": [ "setLogLevel", "all", @@ -9586,8 +9704,40 @@ "sessions placeholder", "log placeholder" ], - "vs/platform/quickinput/browser/helpQuickAccess": [ - "helpPickAriaLabel" + "vs/workbench/contrib/preferences/browser/keybindingWidgets": [ + "defineKeybinding.initial", + "defineKeybinding.oneExists", + "defineKeybinding.existing", + "defineKeybinding.chordsTo" + ], + "vs/workbench/contrib/files/browser/views/explorerView": [ + "explorerSection", + "createNewFile", + "createNewFolder", + "refreshExplorer", + "collapseExplorerFolders" + ], + "vs/workbench/contrib/files/browser/views/openEditorsView": [ + { + "key": "openEditors", + "comment": [ + "Open is an adjective" + ] + }, + "dirtyCounter", + "openEditors", + "flipLayout", + "miToggleEditorLayoutWithoutMnemonic", + { + "key": "miToggleEditorLayout", + "comment": [ + "&& denotes a mnemonic" + ] + }, + "newUntitledFile" + ], + "vs/workbench/contrib/files/browser/views/emptyView": [ + "noWorkspace" ], "vs/workbench/contrib/quickaccess/browser/viewQuickAccess": [ "noViewResults", @@ -9601,6 +9751,9 @@ "openView", "quickOpenView" ], + "vs/platform/quickinput/browser/helpQuickAccess": [ + "helpPickAriaLabel" + ], "vs/workbench/contrib/quickaccess/browser/commandsQuickAccess": [ "noCommandResults", "configure keybinding", @@ -9618,35 +9771,6 @@ ] } ], - "vs/workbench/contrib/files/browser/views/explorerView": [ - "explorerSection", - "createNewFile", - "createNewFolder", - "refreshExplorer", - "collapseExplorerFolders" - ], - "vs/workbench/contrib/files/browser/views/emptyView": [ - "noWorkspace" - ], - "vs/workbench/contrib/files/browser/views/openEditorsView": [ - { - "key": "openEditors", - "comment": [ - "Open is an adjective" - ] - }, - "dirtyCounter", - "openEditors", - "flipLayout", - "miToggleEditorLayoutWithoutMnemonic", - { - "key": "miToggleEditorLayout", - "comment": [ - "&& denotes a mnemonic" - ] - }, - "newUntitledFile" - ], "vs/workbench/contrib/files/browser/fileActions": [ "newFile", "newFolder", @@ -9903,6 +10027,10 @@ "useVersion2", "showEmptyDecorations" ], + "vs/workbench/contrib/files/common/dirtyFilesIndicator": [ + "dirtyFile", + "dirtyFiles" + ], "vs/workbench/contrib/files/browser/editors/textFileEditor": [ "textFileEditor", "openFolder", @@ -9913,13 +10041,6 @@ "unavailableResourceErrorEditorText", "createFile" ], - "vs/workbench/contrib/files/common/dirtyFilesIndicator": [ - "dirtyFile", - "dirtyFiles" - ], - "vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPreview": [ - "default" - ], "vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess": [ "cannotRunGotoLine", "gotoLineColumnLabel", @@ -9927,18 +10048,6 @@ "gotoLineLabelEmptyWithLimit", "gotoLineLabelEmpty" ], - "vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPane": [ - "ok", - "cancel", - "empty.msg", - "conflict.1", - "conflict.N", - "edt.title.del", - "rename", - "create", - "edt.title.2", - "edt.title.1" - ], "vs/workbench/contrib/codeEditor/browser/quickaccess/gotoSymbolQuickAccess": [ "empty", "gotoSymbol", @@ -9991,6 +10100,11 @@ "searchViewIcon", "searchNewEditorIcon" ], + "vs/workbench/contrib/search/browser/symbolsQuickAccess": [ + "noSymbolResults", + "openToSide", + "openToBottom" + ], "vs/workbench/contrib/search/browser/searchWidget": [ "search.action.replaceAll.disabled.label", "search.action.replaceAll.enabled.label", @@ -10001,11 +10115,6 @@ "label.Replace", "search.replace.placeHolder" ], - "vs/workbench/contrib/search/browser/symbolsQuickAccess": [ - "noSymbolResults", - "openToSide", - "openToBottom" - ], "vs/workbench/contrib/search/browser/searchActionsCopy": [ "copyMatchLabel", "copyPathLabel", @@ -10072,6 +10181,21 @@ "ViewAsTreeAction.label", "ViewAsListAction.label" ], + "vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPane": [ + "ok", + "cancel", + "empty.msg", + "conflict.1", + "conflict.N", + "edt.title.del", + "rename", + "create", + "edt.title.2", + "edt.title.1" + ], + "vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPreview": [ + "default" + ], "vs/workbench/contrib/search/browser/searchActionsBase": [ "search" ], @@ -10096,15 +10220,15 @@ "viewPaneContainerCollapsedIcon", "viewToolbarAriaLabel" ], - "vs/workbench/contrib/search/browser/searchMessage": [ - "unable to open trust", - "unable to open" - ], "vs/workbench/contrib/search/browser/patternInputWidget": [ "defaultLabel", "onlySearchInOpenEditors", "useExcludesAndIgnoreFilesDescription" ], + "vs/workbench/contrib/search/browser/searchMessage": [ + "unable to open trust", + "unable to open" + ], "vs/workbench/contrib/search/browser/searchResultsView": [ "searchFolderMatch.other.label", "searchFolderMatch.other.label", @@ -10163,6 +10287,13 @@ "vs/workbench/contrib/scm/browser/scmViewPaneContainer": [ "source control" ], + "vs/workbench/contrib/scm/browser/scmRepositoriesViewPane": [ + "scm" + ], + "vs/workbench/contrib/workspace/common/workspace": [ + "workspaceTrustEnabledCtx", + "workspaceTrustedCtx" + ], "vs/workbench/contrib/scm/browser/scmViewPane": [ "scm", "input", @@ -10181,12 +10312,78 @@ "label.close", "scm.providerBorder" ], - "vs/workbench/contrib/scm/browser/scmRepositoriesViewPane": [ - "scm" + "vs/workbench/contrib/debug/browser/callStackView": [ + { + "key": "running", + "comment": [ + "indicates state" + ] + }, + "showMoreStackFrames2", + { + "key": "session", + "comment": [ + "Session is a noun" + ] + }, + { + "key": "running", + "comment": [ + "indicates state" + ] + }, + "restartFrame", + "loadAllStackFrames", + "showMoreAndOrigin", + "showMoreStackFrames", + { + "key": "pausedOn", + "comment": [ + "indicates reason for program being paused" + ] + }, + "paused", + { + "comment": [ + "Debug is a noun in this context, not a verb." + ], + "key": "callStackAriaLabel" + }, + { + "key": "threadAriaLabel", + "comment": [ + "Placeholders stand for the thread name and the thread state.For example \"Thread 1\" and \"Stopped" + ] + }, + "stackFrameAriaLabel", + { + "key": "running", + "comment": [ + "indicates state" + ] + }, + { + "key": "sessionLabel", + "comment": [ + "Placeholders stand for the session name and the session state. For example \"Launch Program\" and \"Running\"" + ] + }, + "showMoreStackFrames", + "collapse" ], - "vs/workbench/contrib/workspace/common/workspace": [ - "workspaceTrustEnabledCtx", - "workspaceTrustedCtx" + "vs/workbench/contrib/debug/browser/debugColors": [ + "debugToolBarBackground", + "debugToolBarBorder", + "debugIcon.startForeground", + "debugIcon.pauseForeground", + "debugIcon.stopForeground", + "debugIcon.disconnectForeground", + "debugIcon.restartForeground", + "debugIcon.stepOverForeground", + "debugIcon.stepIntoForeground", + "debugIcon.stepOutForeground", + "debugIcon.continueForeground", + "debugIcon.stepBackForeground" ], "vs/workbench/contrib/debug/browser/breakpointsView": [ "unverifiedExceptionBreakpoint", @@ -10262,117 +10459,11 @@ "editBreakpoint", "editHitCount" ], - "vs/workbench/contrib/debug/browser/debugColors": [ - "debugToolBarBackground", - "debugToolBarBorder", - "debugIcon.startForeground", - "debugIcon.pauseForeground", - "debugIcon.stopForeground", - "debugIcon.disconnectForeground", - "debugIcon.restartForeground", - "debugIcon.stepOverForeground", - "debugIcon.stepIntoForeground", - "debugIcon.stepOutForeground", - "debugIcon.continueForeground", - "debugIcon.stepBackForeground" + "vs/workbench/contrib/debug/browser/debugConsoleQuickAccess": [ + "workbench.action.debug.startDebug" ], - "vs/workbench/contrib/debug/browser/callStackView": [ - { - "key": "running", - "comment": [ - "indicates state" - ] - }, - "showMoreStackFrames2", - { - "key": "session", - "comment": [ - "Session is a noun" - ] - }, - { - "key": "running", - "comment": [ - "indicates state" - ] - }, - "restartFrame", - "loadAllStackFrames", - "showMoreAndOrigin", - "showMoreStackFrames", - { - "key": "pausedOn", - "comment": [ - "indicates reason for program being paused" - ] - }, - "paused", - { - "comment": [ - "Debug is a noun in this context, not a verb." - ], - "key": "callStackAriaLabel" - }, - { - "key": "threadAriaLabel", - "comment": [ - "Placeholders stand for the thread name and the thread state.For example \"Thread 1\" and \"Stopped" - ] - }, - "stackFrameAriaLabel", - { - "key": "running", - "comment": [ - "indicates state" - ] - }, - { - "key": "sessionLabel", - "comment": [ - "Placeholders stand for the session name and the session state. For example \"Launch Program\" and \"Running\"" - ] - }, - "showMoreStackFrames", - "collapse" - ], - "vs/workbench/contrib/debug/browser/debugCommands": [ - "debug", - "restartDebug", - "stepOverDebug", - "stepIntoDebug", - "stepIntoTargetDebug", - "stepOutDebug", - "pauseDebug", - "disconnect", - "disconnectSuspend", - "stop", - "continueDebug", - "focusSession", - "selectAndStartDebugging", - "openLaunchJson", - "startDebug", - "startWithoutDebugging", - "nextDebugConsole", - "prevDebugConsole", - "openLoadedScript", - "callStackTop", - "callStackBottom", - "callStackUp", - "callStackDown", - "selectDebugConsole", - "selectDebugSession", - "chooseLocation", - "noExecutableCode", - "jumpToCursor", - "editor.debug.action.stepIntoTargets.none", - "addConfiguration", - "addInlineBreakpoint" - ], - "vs/workbench/contrib/debug/browser/debugConsoleQuickAccess": [ - "workbench.action.debug.startDebug" - ], - "vs/workbench/contrib/debug/browser/debugEditorActions": [ - "toggleBreakpointAction", + "vs/workbench/contrib/debug/browser/debugEditorActions": [ + "toggleBreakpointAction", { "key": "miToggleBreakpoint", "comment": [ @@ -10506,6 +10597,39 @@ "addConfigTo", "addConfiguration" ], + "vs/workbench/contrib/debug/browser/debugCommands": [ + "debug", + "restartDebug", + "stepOverDebug", + "stepIntoDebug", + "stepIntoTargetDebug", + "stepOutDebug", + "pauseDebug", + "disconnect", + "disconnectSuspend", + "stop", + "continueDebug", + "focusSession", + "selectAndStartDebugging", + "openLaunchJson", + "startDebug", + "startWithoutDebugging", + "nextDebugConsole", + "prevDebugConsole", + "openLoadedScript", + "callStackTop", + "callStackBottom", + "callStackUp", + "callStackDown", + "selectDebugConsole", + "selectDebugSession", + "chooseLocation", + "noExecutableCode", + "jumpToCursor", + "editor.debug.action.stepIntoTargets.none", + "addConfiguration", + "addInlineBreakpoint" + ], "vs/workbench/contrib/debug/browser/debugStatus": [ "status.debug", "debugTarget", @@ -10614,6 +10738,11 @@ "addWatchExpression", "removeAllWatchExpressions" ], + "vs/workbench/contrib/debug/common/debugContentProvider": [ + "unable", + "canNotResolveSourceWithError", + "canNotResolveSource" + ], "vs/workbench/contrib/debug/browser/welcomeView": [ "run", { @@ -10623,21 +10752,8 @@ "{Locked=\"](command:{0})\"}" ] }, - { - "key": "runAndDebugAction", - "comment": [ - "{0} will be replaced with a keybinding", - "Please do not translate the word \"command\", it is part of our internal syntax which must not change", - "{Locked=\"](command:{1})\"}" - ] - }, - { - "key": "detectThenRunAndDebug", - "comment": [ - "Please do not translate the word \"command\", it is part of our internal syntax which must not change", - "{Locked=\"](command:{0})\"}" - ] - }, + "runAndDebugAction", + "detectThenRunAndDebug", { "key": "customizeRunAndDebug", "comment": [ @@ -10654,11 +10770,6 @@ }, "allDebuggersDisabled" ], - "vs/workbench/contrib/debug/common/debugContentProvider": [ - "unable", - "canNotResolveSourceWithError", - "canNotResolveSource" - ], "vs/workbench/contrib/debug/common/debugLifecycle": [ "debug.debugSessionCloseConfirmationSingular", "debug.debugSessionCloseConfirmationPlural", @@ -10722,9 +10833,6 @@ "logMessage", "breakpointType" ], - "vs/platform/history/browser/contextScopedHistoryWidget": [ - "suggestWidgetVisible" - ], "vs/workbench/contrib/debug/browser/debugActionViewItems": [ "debugLaunchConfigurations", "noConfigurations", @@ -10732,6 +10840,9 @@ "addConfiguration", "debugSession" ], + "vs/platform/history/browser/contextScopedHistoryWidget": [ + "suggestWidgetVisible" + ], "vs/workbench/contrib/debug/browser/linkDetector": [ "followForwardedLink", "followLink", @@ -10819,6 +10930,60 @@ "tooltip.N", "markers.showOnFile" ], + "vs/workbench/contrib/performance/browser/perfviewEditor": [ + "name" + ], + "vs/workbench/contrib/comments/browser/commentService": [ + "hasCommentingProvider" + ], + "vs/workbench/contrib/comments/browser/commentsEditorContribution": [ + "nextCommentThreadAction", + "previousCommentThreadAction", + "comments.toggleCommenting", + "comments.addCommand", + "comments.collapseAll", + "comments.expandAll", + "comments.expandUnresolved" + ], + "vs/workbench/contrib/url/browser/trustedDomains": [ + "trustedDomain.manageTrustedDomain", + "trustedDomain.trustDomain", + "trustedDomain.trustAllPorts", + "trustedDomain.trustSubDomain", + "trustedDomain.trustAllDomains", + "trustedDomain.manageTrustedDomains" + ], + "vs/workbench/contrib/url/browser/trustedDomainsValidator": [ + "openExternalLinkAt", + { + "key": "open", + "comment": [ + "&& denotes a mnemonic" + ] + }, + { + "key": "copy", + "comment": [ + "&& denotes a mnemonic" + ] + }, + { + "key": "configureTrustedDomains", + "comment": [ + "&& denotes a mnemonic" + ] + } + ], + "vs/workbench/contrib/webviewPanel/browser/webviewCommands": [ + "editor.action.webvieweditor.showFind", + "editor.action.webvieweditor.hideFind", + "editor.action.webvieweditor.findNext", + "editor.action.webvieweditor.findPrevious", + "refreshWebviewLabel" + ], + "vs/workbench/contrib/webviewPanel/browser/webviewEditor": [ + "context.activeWebviewId" + ], "vs/workbench/contrib/mergeEditor/browser/commands/commands": [ "title", "layout.mixed", @@ -10875,74 +11040,29 @@ "vs/workbench/contrib/mergeEditor/browser/view/mergeEditor": [ "mergeEditor" ], - "vs/workbench/contrib/comments/browser/commentsEditorContribution": [ - "nextCommentThreadAction", - "previousCommentThreadAction", - "comments.toggleCommenting", - "comments.addCommand", - "comments.collapseAll", - "comments.expandAll", - "comments.expandUnresolved" + "vs/workbench/contrib/customEditor/common/customEditor": [ + "context.customEditor" ], - "vs/workbench/contrib/comments/browser/commentService": [ - "hasCommentingProvider" + "vs/workbench/contrib/externalUriOpener/common/configuration": [ + "externalUriOpeners", + "externalUriOpeners.uri", + "externalUriOpeners.uri", + "externalUriOpeners.defaultId" ], - "vs/workbench/contrib/url/browser/trustedDomains": [ - "trustedDomain.manageTrustedDomain", - "trustedDomain.trustDomain", - "trustedDomain.trustAllPorts", - "trustedDomain.trustSubDomain", - "trustedDomain.trustAllDomains", - "trustedDomain.manageTrustedDomains" + "vs/workbench/contrib/externalUriOpener/common/externalUriOpenerService": [ + "selectOpenerDefaultLabel.web", + "selectOpenerDefaultLabel", + "selectOpenerConfigureTitle", + "selectOpenerPlaceHolder" ], - "vs/workbench/contrib/url/browser/trustedDomainsValidator": [ - "openExternalLinkAt", - { - "key": "open", - "comment": [ - "&& denotes a mnemonic" - ] - }, + "vs/workbench/contrib/extensions/common/extensionsInput": [ + "extensionsInputName" + ], + "vs/workbench/contrib/extensions/browser/extensionsActions": [ + "VS Code for Web", + "cannot be installed", { - "key": "copy", - "comment": [ - "&& denotes a mnemonic" - ] - }, - { - "key": "configureTrustedDomains", - "comment": [ - "&& denotes a mnemonic" - ] - } - ], - "vs/workbench/contrib/webviewPanel/browser/webviewEditor": [ - "context.activeWebviewId" - ], - "vs/workbench/contrib/webviewPanel/browser/webviewCommands": [ - "editor.action.webvieweditor.showFind", - "editor.action.webvieweditor.hideFind", - "editor.action.webvieweditor.findNext", - "editor.action.webvieweditor.findPrevious", - "refreshWebviewLabel" - ], - "vs/workbench/contrib/customEditor/common/customEditor": [ - "context.customEditor" - ], - "vs/workbench/contrib/externalUriOpener/common/configuration": [ - "externalUriOpeners", - "externalUriOpeners.uri", - "externalUriOpeners.uri", - "externalUriOpeners.defaultId" - ], - "vs/workbench/contrib/extensions/common/extensionsInput": [ - "extensionsInputName" - ], - "vs/workbench/contrib/extensions/browser/extensionsActions": [ - "VS Code for Web", - "cannot be installed", - { - "key": "more information", + "key": "more information", "comment": [ "&& denotes a mnemonic" ] @@ -10953,8 +11073,6 @@ "cancel", "update operation", "install operation", - "install release version message", - "install release version", "check logs", "download", "install vsix", @@ -11121,54 +11239,6 @@ "extensionButtonProminentForeground", "extensionButtonProminentHoverBackground" ], - "vs/workbench/contrib/extensions/browser/extensionsViews": [ - "extensions", - "offline error", - "error", - "no extensions found", - "suggestProxyError", - "open user settings", - "no local extensions", - "extension.arialabel.verifiedPublihser", - "extension.arialabel.publihser", - "extension.arialabel.deprecated", - "extension.arialabel.rating" - ], - "vs/workbench/contrib/externalUriOpener/common/externalUriOpenerService": [ - "selectOpenerDefaultLabel.web", - "selectOpenerDefaultLabel", - "selectOpenerConfigureTitle", - "selectOpenerPlaceHolder" - ], - "vs/workbench/contrib/extensions/browser/extensionsIcons": [ - "extensionsViewIcon", - "manageExtensionIcon", - "clearSearchResultsIcon", - "refreshIcon", - "filterIcon", - "installLocalInRemoteIcon", - "installWorkspaceRecommendedIcon", - "configureRecommendedIcon", - "syncEnabledIcon", - "syncIgnoredIcon", - "remoteIcon", - "installCountIcon", - "ratingIcon", - "verifiedPublisher", - "preReleaseIcon", - "sponsorIcon", - "starFullIcon", - "starHalfIcon", - "starEmptyIcon", - "errorIcon", - "warningIcon", - "infoIcon", - "trustIcon", - "activationtimeIcon" - ], - "vs/platform/dnd/browser/dnd": [ - "fileTooLarge" - ], "vs/workbench/contrib/extensions/common/extensionsFileTemplate": [ "app.extensions.json.title", "app.extensions.json.recommendations", @@ -11176,11 +11246,6 @@ "app.extensions.json.unwantedRecommendations", "app.extension.identifier.errorMessage" ], - "vs/workbench/contrib/extensions/common/extensionsUtils": [ - "disableOtherKeymapsConfirmation", - "yes", - "no" - ], "vs/workbench/contrib/extensions/browser/extensionEditor": [ "extension version", "preRelease", @@ -11296,22 +11361,14 @@ "find next", "find previous" ], + "vs/workbench/contrib/extensions/common/extensionsUtils": [ + "disableOtherKeymapsConfirmation", + "yes", + "no" + ], "vs/workbench/contrib/extensions/browser/extensionsActivationProgress": [ "activation" ], - "vs/workbench/contrib/extensions/browser/extensionsDependencyChecker": [ - "extensions", - "auto install missing deps", - "finished installing missing deps", - "reload", - "no missing deps" - ], - "vs/workbench/contrib/extensions/browser/extensionsQuickAccess": [ - "type", - "searchFor", - "install", - "manage" - ], "vs/workbench/contrib/extensions/browser/extensionsWorkbenchService": [ "Manifest is not found", "postUninstallTooltip", @@ -11414,6 +11471,39 @@ "vs/workbench/contrib/extensions/browser/extensionEnablementWorkspaceTrustTransitionParticipant": [ "restartExtensionHost.reason" ], + "vs/workbench/contrib/extensions/browser/extensionsDependencyChecker": [ + "extensions", + "auto install missing deps", + "finished installing missing deps", + "reload", + "no missing deps" + ], + "vs/workbench/contrib/extensions/browser/extensionsIcons": [ + "extensionsViewIcon", + "manageExtensionIcon", + "clearSearchResultsIcon", + "refreshIcon", + "filterIcon", + "installLocalInRemoteIcon", + "installWorkspaceRecommendedIcon", + "configureRecommendedIcon", + "syncEnabledIcon", + "syncIgnoredIcon", + "remoteIcon", + "installCountIcon", + "ratingIcon", + "verifiedPublisher", + "preReleaseIcon", + "sponsorIcon", + "starFullIcon", + "starHalfIcon", + "starEmptyIcon", + "errorIcon", + "warningIcon", + "infoIcon", + "trustIcon", + "activationtimeIcon" + ], "vs/workbench/contrib/extensions/browser/extensionsCompletionItemsProvider": [ "exampleExtension" ], @@ -11422,9 +11512,90 @@ "showDeprecated", "neverShowAgain" ], + "vs/platform/dnd/browser/dnd": [ + "fileTooLarge" + ], + "vs/workbench/contrib/extensions/browser/extensionsViews": [ + "extensions", + "offline error", + "error", + "no extensions found", + "suggestProxyError", + "open user settings", + "no local extensions", + "extension.arialabel.verifiedPublihser", + "extension.arialabel.publihser", + "extension.arialabel.deprecated", + "extension.arialabel.rating" + ], "vs/workbench/contrib/output/browser/logViewer": [ "logViewerAriaLabel" ], + "vs/workbench/contrib/terminal/browser/terminal.contribution": [ + "tasksQuickAccessPlaceholder", + "tasksQuickAccessHelp", + "terminal", + "terminal", + { + "key": "miToggleIntegratedTerminal", + "comment": [ + "&& denotes a mnemonic" + ] + } + ], + "vs/workbench/contrib/extensions/browser/extensionsQuickAccess": [ + "type", + "searchFor", + "install", + "manage" + ], + "vs/workbench/contrib/terminal/browser/terminalView": [ + "terminal.useMonospace", + "terminal.monospaceOnly", + "terminals", + "terminalConnectingLabel" + ], + "vs/workbench/contrib/terminalContrib/developer/browser/terminal.developer.contribution": [ + "workbench.action.terminal.showTextureAtlas", + "workbench.action.terminal.writeDataToTerminal", + "workbench.action.terminal.writeDataToTerminal.prompt", + "workbench.action.terminal.restartPtyHost" + ], + "vs/workbench/contrib/terminalContrib/environmentChanges/browser/terminal.environmentChanges.contribution": [ + "workbench.action.terminal.showEnvironmentContributions", + "envChanges", + "extension", + "ScopedEnvironmentContributionInfo" + ], + "vs/workbench/contrib/terminalContrib/find/browser/terminal.find.contribution": [ + "workbench.action.terminal.focusFind", + "workbench.action.terminal.hideFind", + "workbench.action.terminal.toggleFindRegex", + "workbench.action.terminal.toggleFindWholeWord", + "workbench.action.terminal.toggleFindCaseSensitive", + "workbench.action.terminal.findNext", + "workbench.action.terminal.findPrevious", + "workbench.action.terminal.searchWorkspace" + ], + "vs/workbench/contrib/terminalContrib/accessibility/browser/terminal.accessibility.contribution": [ + "workbench.action.terminal.focusAccessibleBuffer", + "workbench.action.terminal.navigateAccessibleBuffer", + "workbench.action.terminal.accessibleBufferGoToNextCommand", + "workbench.action.terminal.accessibleBufferGoToPreviousCommand" + ], + "vs/workbench/contrib/terminalContrib/links/browser/terminal.links.contribution": [ + "workbench.action.terminal.openDetectedLink", + "workbench.action.terminal.openLastUrlLink", + "workbench.action.terminal.openLastLocalFileLink" + ], + "vs/workbench/contrib/terminalContrib/quickFix/browser/terminal.quickFix.contribution": [ + "workbench.action.terminal.showQuickFixes" + ], + "vs/workbench/contrib/tasks/browser/runAutomaticTasks": [ + "workbench.action.tasks.manageAutomaticRunning", + "workbench.action.tasks.allowAutomaticTasks", + "workbench.action.tasks.disallowAutomaticTasks" + ], "vs/workbench/contrib/tasks/common/problemMatcher": [ "ProblemPatternParser.problemPattern.missingRegExp", "ProblemPatternParser.loopProperty.notLast", @@ -11495,11 +11666,6 @@ "eslint-stylish", "go" ], - "vs/workbench/contrib/tasks/browser/runAutomaticTasks": [ - "workbench.action.tasks.manageAutomaticRunning", - "workbench.action.tasks.allowAutomaticTasks", - "workbench.action.tasks.disallowAutomaticTasks" - ], "vs/workbench/contrib/tasks/common/jsonSchema_v1": [ "JsonSchema.version.deprecated", "JsonSchema.version", @@ -11641,6 +11807,15 @@ ] } ], + "vs/workbench/contrib/emmet/browser/actions/expandAbbreviation": [ + "expandAbbreviationAction", + { + "key": "miEmmetExpandAbbreviation", + "comment": [ + "&& denotes a mnemonic" + ] + } + ], "vs/workbench/contrib/remote/browser/remoteIndicator": [ "statusBarOfflineBackground", "statusBarOfflineForeground", @@ -11680,102 +11855,25 @@ "remoteHost", "networkStatusOfflineTooltip", "networkStatusHighLatencyTooltip", + "remote.startActions.help", + "remote.startActions.install", "closeRemoteConnection.title", "reloadWindow", "closeVirtualWorkspace.title", - "remote.startActions.help", - "remote.startActions.install", "remoteActions", "remote.startActions.installingExtension" ], - "vs/workbench/contrib/terminal/browser/terminal.contribution": [ - "tasksQuickAccessPlaceholder", - "tasksQuickAccessHelp", - "terminal", - "terminal", - { - "key": "miToggleIntegratedTerminal", - "comment": [ - "&& denotes a mnemonic" - ] - } - ], - "vs/workbench/contrib/terminalContrib/accessibility/browser/terminal.accessibility.contribution": [ - "workbench.action.terminal.focusAccessibleBuffer", - "workbench.action.terminal.navigateAccessibleBuffer", - "workbench.action.terminal.accessibleBufferGoToNextCommand", - "workbench.action.terminal.accessibleBufferGoToPreviousCommand" - ], - "vs/workbench/contrib/terminal/browser/terminalView": [ - "terminal.useMonospace", - "terminal.monospaceOnly", - "terminals", - "terminalConnectingLabel" - ], - "vs/workbench/contrib/terminalContrib/developer/browser/terminal.developer.contribution": [ - "workbench.action.terminal.showTextureAtlas", - "workbench.action.terminal.writeDataToTerminal", - "workbench.action.terminal.writeDataToTerminal.prompt", - "workbench.action.terminal.restartPtyHost" - ], - "vs/workbench/contrib/terminalContrib/environmentChanges/browser/terminal.environmentChanges.contribution": [ - "workbench.action.terminal.showEnvironmentContributions", - "envChanges", - "extension" - ], - "vs/workbench/contrib/terminalContrib/quickFix/browser/terminal.quickFix.contribution": [ - "workbench.action.terminal.showQuickFixes" - ], - "vs/workbench/contrib/emmet/browser/actions/expandAbbreviation": [ - "expandAbbreviationAction", - { - "key": "miEmmetExpandAbbreviation", - "comment": [ - "&& denotes a mnemonic" - ] - } - ], - "vs/workbench/contrib/codeEditor/browser/accessibility/accessibility": [ - "accessibilityHelpTitle", - "emergencyConfOn", - "openingDocs", - "introMsg", - "status", - "changeConfigToOnMac", - "changeConfigToOnWinLinux", - "auto_unknown", - "auto_on", - "auto_off", - "configuredOn", - "configuredOff", - "tabFocusModeOnMsg", - "tabFocusModeOnMsgNoKb", - "tabFocusModeOffMsg", - "tabFocusModeOffMsgNoKb", - "openDocMac", - "openDocWinLinux", - "outroMsg", - "toggleScreenReaderMode" - ], - "vs/workbench/contrib/terminalContrib/links/browser/terminal.links.contribution": [ - "workbench.action.terminal.openDetectedLink", - "workbench.action.terminal.openLastUrlLink", - "workbench.action.terminal.openLastLocalFileLink" + "vs/workbench/contrib/codeEditor/browser/accessibility/accessibility": [ + "toggleScreenReaderMode" ], "vs/workbench/contrib/codeEditor/browser/diffEditorHelper": [ + "hintWhitespace", "hintTimeout", "removeTimeout", - "hintWhitespace" - ], - "vs/workbench/contrib/terminalContrib/find/browser/terminal.find.contribution": [ - "workbench.action.terminal.focusFind", - "workbench.action.terminal.hideFind", - "workbench.action.terminal.toggleFindRegex", - "workbench.action.terminal.toggleFindWholeWord", - "workbench.action.terminal.toggleFindCaseSensitive", - "workbench.action.terminal.findNext", - "workbench.action.terminal.findPrevious", - "workbench.action.terminal.searchWorkspace" + "msg1", + "msg2", + "msg3", + "chat-help-label" ], "vs/workbench/contrib/codeEditor/browser/inspectKeybindings": [ "workbench.action.inspectKeyMap", @@ -11840,42 +11938,42 @@ "miMultiCursorCmd", "miMultiCursorCtrl" ], - "vs/workbench/contrib/codeEditor/browser/toggleRenderControlCharacter": [ - "toggleRenderControlCharacters", + "vs/workbench/contrib/codeEditor/browser/toggleWordWrap": [ + "editorWordWrap", + "toggle.wordwrap", + "unwrapMinified", + "wrapMinified", { - "key": "miToggleRenderControlCharacters", + "key": "miToggleWordWrap", "comment": [ "&& denotes a mnemonic" ] } ], - "vs/workbench/contrib/codeEditor/browser/toggleRenderWhitespace": [ - "toggleRenderWhitespace", + "vs/workbench/contrib/codeEditor/browser/toggleRenderControlCharacter": [ + "toggleRenderControlCharacters", { - "key": "miToggleRenderWhitespace", + "key": "miToggleRenderControlCharacters", "comment": [ "&& denotes a mnemonic" ] } ], - "vs/workbench/contrib/codeEditor/browser/toggleWordWrap": [ - "editorWordWrap", - "toggle.wordwrap", - "unwrapMinified", - "wrapMinified", + "vs/workbench/contrib/codeEditor/browser/untitledTextEditorHint/untitledTextEditorHint": [ { - "key": "miToggleWordWrap", + "key": "message", "comment": [ - "&& denotes a mnemonic" + "Preserve double-square brackets and their order", + "language refers to a programming language" ] } ], - "vs/workbench/contrib/codeEditor/browser/untitledTextEditorHint/untitledTextEditorHint": [ + "vs/workbench/contrib/codeEditor/browser/toggleRenderWhitespace": [ + "toggleRenderWhitespace", { - "key": "message", + "key": "miToggleRenderWhitespace", "comment": [ - "Preserve double-square brackets and their order", - "language refers to a programming language" + "&& denotes a mnemonic" ] } ], @@ -11914,22 +12012,6 @@ "vs/workbench/contrib/snippets/browser/commands/surroundWithSnippet": [ "label" ], - "vs/workbench/contrib/snippets/browser/snippetCodeActionProvider": [ - "codeAction", - "overflow.start.title", - "title" - ], - "vs/workbench/contrib/snippets/browser/snippetsService": [ - "invalid.path.0", - "invalid.language.0", - "invalid.language", - "invalid.path.1", - "vscode.extension.contributes.snippets", - "vscode.extension.contributes.snippets-language", - "vscode.extension.contributes.snippets-path", - "badVariableUse", - "badFile" - ], "vs/workbench/contrib/format/browser/formatActionsMultiple": [ "null", "nullFormatterDescription", @@ -11974,6 +12056,8 @@ "update.noReleaseNotesOnline", "read the release notes", "releaseNotes", + "update service disabled", + "learn more", "updateIsReady", "checkingForUpdates", "downloading", @@ -11998,6 +12082,7 @@ "DownloadingUpdate", "installUpdate...", "installingUpdate", + "showUpdateReleaseNotes", "restartToUpdate", "switchToInsiders", "switchToStable", @@ -12025,8 +12110,10 @@ ] } ], - "vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedInput": [ - "getStarted" + "vs/workbench/contrib/snippets/browser/snippetCodeActionProvider": [ + "codeAction", + "overflow.start.title", + "title" ], "vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedService": [ "builtin", @@ -12081,6 +12168,20 @@ ] } ], + "vs/workbench/contrib/snippets/browser/snippetsService": [ + "invalid.path.0", + "invalid.language.0", + "invalid.language", + "invalid.path.1", + "vscode.extension.contributes.snippets", + "vscode.extension.contributes.snippets-language", + "vscode.extension.contributes.snippets-path", + "badVariableUse", + "badFile" + ], + "vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedInput": [ + "getStarted" + ], "vs/workbench/contrib/welcomeGettingStarted/browser/startupPage": [ "welcome.displayName", "startupPage.markdownPreviewError" @@ -12128,33 +12229,7 @@ "title.template", "1.problem", "N.problem", - "deep.problem", - "Array", - "Boolean", - "Class", - "Constant", - "Constructor", - "Enum", - "EnumMember", - "Event", - "Field", - "File", - "Function", - "Interface", - "Key", - "Method", - "Module", - "Namespace", - "Null", - "Number", - "Object", - "Operator", - "Package", - "Property", - "String", - "Struct", - "TypeParameter", - "Variable" + "deep.problem" ], "vs/workbench/contrib/outline/browser/outlinePane": [ "no-editor", @@ -12266,39 +12341,28 @@ "workbench.actions.syncData.reset" ], "vs/workbench/contrib/userDataProfile/browser/userDataProfile": [ - "create empty profile", - "save profile as", "profiles", "switchProfile", "selectProfile", - "rename profile", + "edit profile", "show profile contents", "export profile", "export profile in share", "import profile", - "import from file", "import from url", + "import from file", + "templates", "import profile quick pick title", "import profile placeholder", "profile import error", "import profile dialog", "import profile share", - "name", - "create from current profle", - "create empty profile", - "profileExists", + "save profile as", "create profile", - "empty", - "using current", - "templates", - "create profile title", "delete profile", "current", "delete specific profile", - "pick profile to delete", - "create profile from templates", - "create profile from template title", - "no templates" + "pick profile to delete" ], "vs/workbench/contrib/userDataProfile/browser/userDataProfileActions": [ "create temporary profile", @@ -12318,6 +12382,7 @@ "editSessionViewIcon" ], "vs/workbench/contrib/editSessions/browser/editSessionsStorageService": [ + "choose account read placeholder", "choose account placeholder", "signed in", "others", @@ -12347,13 +12412,6 @@ "cloud changes", "open file" ], - "vs/workbench/contrib/codeActions/common/codeActionsExtensionPoint": [ - "contributes.codeActions", - "contributes.codeActions.languages", - "contributes.codeActions.kind", - "contributes.codeActions.title", - "contributes.codeActions.description" - ], "vs/workbench/contrib/codeActions/common/documentationExtensionPoint": [ "contributes.documentation", "contributes.documentation.refactorings", @@ -12362,6 +12420,13 @@ "contributes.documentation.refactoring.when", "contributes.documentation.refactoring.command" ], + "vs/workbench/contrib/codeActions/common/codeActionsExtensionPoint": [ + "contributes.codeActions", + "contributes.codeActions.languages", + "contributes.codeActions.kind", + "contributes.codeActions.title", + "contributes.codeActions.description" + ], "vs/workbench/contrib/codeActions/browser/codeActionsContribution": [ "codeActionsOnSave.fixAll", "codeActionsOnSave", @@ -12601,13 +12666,8 @@ "overwritingExtension", "extensionUnderDevelopment" ], - "vs/workbench/contrib/localization/common/localizationsActions": [ - "configureLocale", - "chooseLocale", - "installed", - "available", - "moreInfo", - "clearDisplayLanguage" + "vs/workbench/contrib/extensions/common/reportExtensionIssueAction": [ + "reportExtensionIssue" ], "vs/workbench/contrib/extensions/electron-sandbox/extensionsSlowActions": [ "cmd.reportOrShow", @@ -12618,36 +12678,26 @@ "attach.title", "attach.msg2" ], - "vs/workbench/contrib/extensions/common/reportExtensionIssueAction": [ - "reportExtensionIssue" - ], "vs/workbench/contrib/terminal/electron-sandbox/terminalRemote": [ "workbench.action.terminal.newLocal" ], - "vs/workbench/contrib/tasks/common/taskTemplates": [ - "dotnetCore", - "msbuild", - "externalCommand", - "Maven" + "vs/workbench/contrib/terminal/browser/baseTerminalBackend": [ + "ptyHostStatus", + "ptyHostStatus.short", + "nonResponsivePtyHost", + "ptyHostStatus.ariaLabel" ], - "vs/workbench/contrib/tasks/browser/taskQuickPick": [ - "taskQuickPick.showAll", - "configureTaskIcon", - "removeTaskIcon", - "configureTask", - "contributedTasks", - "taskType", - "removeRecent", - "recentlyUsed", - "configured", - "configured", - "TaskQuickPick.changeSettingDetails", - "TaskQuickPick.changeSettingNo", - "TaskService.pickRunTask", - "TaskQuickPick.changeSettingsOptions", - "TaskQuickPick.goBack", - "TaskQuickPick.noTasksForType", - "noProviderForTask" + "vs/workbench/contrib/tasks/browser/taskTerminalStatus": [ + "taskTerminalStatus.active", + "taskTerminalStatus.succeeded", + "taskTerminalStatus.succeededInactive", + "taskTerminalStatus.errors", + "taskTerminalStatus.errorsInactive", + "taskTerminalStatus.warnings", + "taskTerminalStatus.warningsInactive", + "taskTerminalStatus.infos", + "taskTerminalStatus.infosInactive", + "task.watchFirstError" ], "vs/workbench/contrib/tasks/common/taskConfiguration": [ "ConfigurationParser.invalidCWD", @@ -12672,34 +12722,49 @@ ] } ], - "vs/workbench/contrib/terminal/browser/baseTerminalBackend": [ - "ptyHostStatus", - "ptyHostStatus.short", - "nonResponsivePtyHost", - "ptyHostStatus.ariaLabel" - ], - "vs/workbench/contrib/tasks/browser/taskTerminalStatus": [ - "taskTerminalStatus.active", - "taskTerminalStatus.succeeded", - "taskTerminalStatus.succeededInactive", - "taskTerminalStatus.errors", - "taskTerminalStatus.errorsInactive", - "taskTerminalStatus.warnings", - "taskTerminalStatus.warningsInactive", - "taskTerminalStatus.infos", - "taskTerminalStatus.infosInactive", - "task.watchFirstError" - ], "vs/workbench/contrib/localHistory/browser/localHistory": [ "localHistoryIcon", "localHistoryRestore" ], - "vs/workbench/contrib/debug/common/abstractDebugAdapter": [ - "timeout" - ], - "vs/workbench/contrib/debug/node/debugAdapter": [ - "debugAdapterBinNotFound", - { + "vs/workbench/contrib/localization/common/localizationsActions": [ + "configureLocale", + "chooseLocale", + "installed", + "available", + "moreInfo", + "clearDisplayLanguage" + ], + "vs/workbench/contrib/tasks/common/taskTemplates": [ + "dotnetCore", + "msbuild", + "externalCommand", + "Maven" + ], + "vs/workbench/contrib/tasks/browser/taskQuickPick": [ + "taskQuickPick.showAll", + "configureTaskIcon", + "removeTaskIcon", + "configureTask", + "contributedTasks", + "taskType", + "removeRecent", + "recentlyUsed", + "configured", + "configured", + "TaskQuickPick.changeSettingDetails", + "TaskQuickPick.changeSettingNo", + "TaskService.pickRunTask", + "TaskQuickPick.changeSettingsOptions", + "TaskQuickPick.goBack", + "TaskQuickPick.noTasksForType", + "noProviderForTask" + ], + "vs/workbench/contrib/debug/common/abstractDebugAdapter": [ + "timeout" + ], + "vs/workbench/contrib/debug/node/debugAdapter": [ + "debugAdapterBinNotFound", + { "key": "debugAdapterCannotDetermineExecutable", "comment": [ "Adapter executable file not found" @@ -12907,7 +12972,11 @@ "clearedInput" ], "vs/workbench/browser/parts/notifications/notificationsList": [ + "notificationAccessibleViewHint", + "notificationAccessibleViewHintNoKb", + "notificationAriaLabelHint", "notificationAriaLabel", + "notificationWithSourceAriaLabelHint", "notificationWithSourceAriaLabel", "notificationsList" ], @@ -12940,6 +13009,17 @@ ] } ], + "vs/editor/browser/widget/inlineDiffMargin": [ + "diff.clipboard.copyDeletedLinesContent.label", + "diff.clipboard.copyDeletedLinesContent.single.label", + "diff.clipboard.copyChangedLinesContent.label", + "diff.clipboard.copyChangedLinesContent.single.label", + "diff.clipboard.copyDeletedLineContent.label", + "diff.clipboard.copyChangedLineContent.label", + "diff.inline.revertChange.label", + "diff.clipboard.copyDeletedLineContent.label", + "diff.clipboard.copyChangedLineContent.label" + ], "vs/editor/browser/widget/diffReview": [ "diffReviewInsertIcon", "diffReviewRemoveIcon", @@ -12970,17 +13050,6 @@ "insertLine", "deleteLine" ], - "vs/editor/browser/widget/inlineDiffMargin": [ - "diff.clipboard.copyDeletedLinesContent.label", - "diff.clipboard.copyDeletedLinesContent.single.label", - "diff.clipboard.copyChangedLinesContent.label", - "diff.clipboard.copyChangedLinesContent.single.label", - "diff.clipboard.copyDeletedLineContent.label", - "diff.clipboard.copyChangedLineContent.label", - "diff.inline.revertChange.label", - "diff.clipboard.copyDeletedLineContent.label", - "diff.clipboard.copyChangedLineContent.label" - ], "vs/editor/common/viewLayout/viewLineRenderer": [ "showMore", "overflow.chars" @@ -13015,21 +13084,14 @@ "autoFix.label", "editor.action.autoFix.noneMessage" ], - "vs/editor/contrib/codeAction/browser/codeActionController": [ - "hideMoreActions", - "showMoreActions" - ], "vs/editor/contrib/codeAction/browser/lightBulbWidget": [ "preferredcodeActionWithKb", "codeActionWithKb", "codeAction" ], - "vs/editor/contrib/dropOrPasteInto/browser/copyPasteController": [ - "pasteWidgetVisible", - "postPasteWidgetTitle", - "pasteIntoEditorProgress", - "pasteAsPickerPlaceholder", - "pasteAsProgress" + "vs/editor/contrib/codeAction/browser/codeActionController": [ + "hideMoreActions", + "showMoreActions" ], "vs/editor/contrib/dropOrPasteInto/browser/defaultProviders": [ "builtIn", @@ -13041,6 +13103,13 @@ "defaultDropProvider.uriList.relativePaths", "defaultDropProvider.uriList.relativePath" ], + "vs/editor/contrib/dropOrPasteInto/browser/copyPasteController": [ + "pasteWidgetVisible", + "postPasteWidgetTitle", + "pasteIntoEditorProgress", + "pasteAsPickerPlaceholder", + "pasteAsProgress" + ], "vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController": [ "dropWidgetVisible", "postDropWidgetTitle", @@ -13195,22 +13264,6 @@ "overviewRulerWordHighlightStrongForeground", "overviewRulerWordHighlightTextForeground" ], - "vs/editor/contrib/parameterHints/browser/parameterHintsWidget": [ - "parameterHintsNextIcon", - "parameterHintsPreviousIcon", - "hint", - "editorHoverWidgetHighlightForeground" - ], - "vs/editor/contrib/rename/browser/renameInputField": [ - "renameInputVisible", - "renameAriaLabel", - { - "key": "label", - "comment": [ - "placeholders are keybindings, e.g \"F2 to Rename, Shift+F2 to Preview\"" - ] - } - ], "vs/editor/contrib/stickyScroll/browser/stickyScrollActions": [ "toggleStickyScroll", { @@ -13256,6 +13309,12 @@ "label.desc", "ariaCurrenttSuggestionReadDetails" ], + "vs/editor/contrib/parameterHints/browser/parameterHintsWidget": [ + "parameterHintsNextIcon", + "parameterHintsPreviousIcon", + "hint", + "editorHoverWidgetHighlightForeground" + ], "vs/platform/theme/common/tokenClassificationRegistry": [ "schema.token.settings", "schema.token.foreground", @@ -13333,6 +13392,16 @@ "collapseAll", "expandAll" ], + "vs/editor/contrib/rename/browser/renameInputField": [ + "renameInputVisible", + "renameAriaLabel", + { + "key": "label", + "comment": [ + "placeholders are keybindings, e.g \"F2 to Rename, Shift+F2 to Preview\"" + ] + } + ], "vs/workbench/contrib/comments/browser/commentsTreeViewer": [ "comments.view.title", "commentsCount", @@ -13343,32 +13412,6 @@ "commentRange", "lastReplyFrom" ], - "vs/workbench/contrib/testing/common/testResult": [ - "runFinished" - ], - "vs/workbench/browser/parts/compositeBarActions": [ - "titleKeybinding", - "badgeTitle", - "additionalViews", - "numberBadge", - "manageExtension", - "hide", - "keep", - "hideBadge", - "showBadge", - "toggle", - "toggleBadge" - ], - "vs/base/browser/ui/tree/treeDefaults": [ - "collapse all" - ], - "vs/workbench/browser/parts/views/checkbox": [ - "checked", - "unchecked" - ], - "vs/base/browser/ui/splitview/paneview": [ - "viewSection" - ], "vs/workbench/contrib/remote/browser/tunnelView": [ "tunnel.forwardedPortsViewEnabled", "remote.tunnelsView.addPort", @@ -13430,6 +13473,32 @@ "tunnelContext.protocolMenu", "portWithRunningProcess.foreground" ], + "vs/workbench/contrib/testing/common/testResult": [ + "runFinished" + ], + "vs/workbench/browser/parts/compositeBarActions": [ + "titleKeybinding", + "badgeTitle", + "additionalViews", + "numberBadge", + "manageExtension", + "hide", + "keep", + "hideBadge", + "showBadge", + "toggle", + "toggleBadge" + ], + "vs/base/browser/ui/splitview/paneview": [ + "viewSection" + ], + "vs/base/browser/ui/tree/treeDefaults": [ + "collapse all" + ], + "vs/workbench/browser/parts/views/checkbox": [ + "checked", + "unchecked" + ], "vs/workbench/contrib/remote/browser/remoteIcons": [ "getStartedIcon", "documentationIcon", @@ -13457,45 +13526,6 @@ "binaryError", "openAnyway" ], - "vs/editor/browser/widget/diffEditorWidget2/colors": [ - "diffEditor.move.border" - ], - "vs/workbench/browser/parts/editor/editorPanes": [ - "editorOpenErrorDialog", - { - "key": "ok", - "comment": [ - "&& denotes a mnemonic" - ] - } - ], - "vs/workbench/browser/parts/editor/tabsTitleControl": [ - "ariaLabelTabActions" - ], - "vs/workbench/browser/parts/editor/editorGroupWatermark": [ - "watermark.showCommands", - "watermark.quickAccess", - "watermark.openFile", - "watermark.openFolder", - "watermark.openFileFolder", - "watermark.openRecent", - "watermark.newUntitledFile", - "watermark.findInFiles", - { - "key": "watermark.toggleTerminal", - "comment": [ - "toggle is a verb here" - ] - }, - "watermark.startDebugging", - { - "key": "watermark.toggleFullscreen", - "comment": [ - "toggle is a verb here" - ] - }, - "watermark.showSettings" - ], "vs/workbench/browser/parts/activitybar/activitybarActions": [ "loading", "authProviderUnavailable", @@ -13591,6 +13621,12 @@ ] } ], + "vs/editor/browser/widget/diffEditor.contribution": [ + "accessibleDiffViewer", + "editor.action.accessibleDiffViewer.next", + "Open Accessible Diff Viewer", + "editor.action.accessibleDiffViewer.prev" + ], "vs/workbench/browser/parts/compositePart": [ "ariaCompositeToolbarLabel", "viewsAndMoreActions", @@ -13602,6 +13638,42 @@ "vs/workbench/browser/parts/sidebar/sidebarActions": [ "focusSideBar" ], + "vs/workbench/browser/parts/editor/tabsTitleControl": [ + "ariaLabelTabActions" + ], + "vs/workbench/browser/parts/editor/editorPanes": [ + "editorOpenErrorDialog", + { + "key": "ok", + "comment": [ + "&& denotes a mnemonic" + ] + } + ], + "vs/workbench/browser/parts/editor/editorGroupWatermark": [ + "watermark.showCommands", + "watermark.quickAccess", + "watermark.openFile", + "watermark.openFolder", + "watermark.openFileFolder", + "watermark.openRecent", + "watermark.newUntitledFile", + "watermark.findInFiles", + { + "key": "watermark.toggleTerminal", + "comment": [ + "toggle is a verb here" + ] + }, + "watermark.startDebugging", + { + "key": "watermark.toggleFullscreen", + "comment": [ + "toggle is a verb here" + ] + }, + "watermark.showSettings" + ], "vs/base/browser/ui/iconLabel/iconLabelHover": [ "iconLabel.loading" ], @@ -13647,6 +13719,14 @@ "vs/editor/common/model/editStack": [ "edit" ], + "vs/base/browser/ui/selectBox/selectBoxCustom": [ + { + "key": "selectBox", + "comment": [ + "Behave like native select dropdown element." + ] + } + ], "vs/platform/quickinput/browser/quickInput": [ "quickInput.back", "inputModeEntry", @@ -13682,18 +13762,6 @@ "vscode.extension.contributes.grammars.balancedBracketScopes", "vscode.extension.contributes.grammars.unbalancedBracketScopes" ], - "vs/workbench/contrib/preferences/browser/preferencesWidgets": [ - "userSettings", - "userSettingsRemote", - "workspaceSettings", - "folderSettings", - "settingsSwitcherBarAriaLabel", - "userSettings", - "userSettingsRemote", - "workspaceSettings", - "userSettings", - "workspaceSettings" - ], "vs/base/browser/ui/keybindingLabel/keybindingLabel": [ "unbound" ], @@ -13727,6 +13795,7 @@ "unsupportedPolicySetting", "unsupportLanguageOverrideSetting", "defaultProfileSettingWhileNonDefaultActive", + "allProfileSettingWhileInNonDefaultProfileSetting", "unsupportedRemoteMachineSetting", "unsupportedWindowSetting", "unsupportedApplicationSetting", @@ -13787,14 +13856,17 @@ "security", "workspace" ], - "vs/workbench/contrib/preferences/browser/tocTree": [ - { - "key": "settingsTOC", - "comment": [ - "A label for the table of contents for the full settings list" - ] - }, - "groupRowAriaLabel" + "vs/workbench/contrib/preferences/browser/preferencesWidgets": [ + "userSettings", + "userSettingsRemote", + "workspaceSettings", + "folderSettings", + "settingsSwitcherBarAriaLabel", + "userSettings", + "userSettingsRemote", + "workspaceSettings", + "userSettings", + "workspaceSettings" ], "vs/workbench/contrib/preferences/browser/settingsTree": [ "extensions", @@ -13813,7 +13885,17 @@ "settings", "copySettingIdLabel", "copySettingAsJSONLabel", - "stopSyncingSetting" + "stopSyncingSetting", + "applyToAllProfiles" + ], + "vs/workbench/contrib/preferences/browser/tocTree": [ + { + "key": "settingsTOC", + "comment": [ + "A label for the table of contents for the full settings list" + ] + }, + "groupRowAriaLabel" ], "vs/workbench/contrib/preferences/browser/settingsSearchMenu": [ "modifiedSettingsSearch", @@ -13865,6 +13947,8 @@ "contributes.preload.localResourceRoots" ], "vs/workbench/contrib/notebook/browser/notebookEditorWidget": [ + "notebookTreeAriaLabelHelp", + "notebookTreeAriaLabelHelpNoKb", "notebookTreeAriaLabel", "notebook.cellBorderColor", "notebook.focusedEditorBorder", @@ -13960,9 +14044,14 @@ "vs/editor/contrib/codeAction/browser/codeAction": [ "applyCodeActionFailed" ], + "vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineProvider": [ + "empty" + ], "vs/workbench/contrib/chat/browser/actions/chatAccessibilityHelp": [ "chat.overview", "chat.requestHistory", + "chat.inspectResponse", + "chat.inspectResponseNoKb", "chat.announcement", "workbench.action.chat.focus", "workbench.action.chat.focusNoKb", @@ -13975,29 +14064,47 @@ "inlineChat.overview", "inlineChat.access", "inlineChat.requestHistory", + "inlineChat.inspectResponse", + "inlineChat.inspectResponseNoKb", "inlineChat.contextActions", "inlineChat.fix", "inlineChat.diff", "inlineChat.diffNoKb", - "inlineChat.explain", "inlineChat.toolbar", "chat.audioCues", "chat-help-label", "inline-chat-label" ], + "vs/workbench/contrib/chat/browser/actions/quickQuestionActions/quickQuestionAction": [ + "chat" + ], + "vs/workbench/contrib/chat/browser/actions/quickQuestionActions/multipleByScrollQuickQuestionAction": [ + "clear", + "openInChat" + ], + "vs/workbench/contrib/chat/browser/actions/quickQuestionActions/singleQuickQuestionAction": [ + "askabot" + ], + "vs/workbench/contrib/chat/browser/chatInputPart": [ + "actions.chat.accessibiltyHelp", + "chatInput.accessibilityHelpNoKb", + "chatInput" + ], "vs/workbench/contrib/chat/browser/chatListRenderer": [ "chat", + "noCodeBlocksHint", + "noCodeBlocks", + "singleCodeBlockHint", "singleCodeBlock", + "multiCodeBlockHint", "multiCodeBlock", "chat.codeBlockHelp", "chat.codeBlock.toolbarVerbose", "chat.codeBlock.toolbar", "chat.codeBlockLabel" ], - "vs/workbench/contrib/chat/browser/chatInputPart": [ - "actions.chat.accessibiltyHelp", - "chatInput.accessibilityHelpNoKb", - "chatInput" + "vs/workbench/contrib/chat/browser/chatSlashCommandContentWidget": [ + "exited slash command mode" ], "vs/workbench/contrib/inlineChat/browser/inlineChatStrategies": [ "lines.0", @@ -14087,13 +14194,6 @@ "terminal.tab.activeBorder", "terminal.ansiColor" ], - "vs/platform/quickinput/browser/commandsQuickAccess": [ - "recentlyUsed", - "commonlyUsed", - "morecCommands", - "commandPickAriaLabelWithKeybinding", - "canNotRun" - ], "vs/workbench/contrib/files/browser/views/explorerDecorationsProvider": [ "canNotResolve", "symbolicLlink", @@ -14121,6 +14221,13 @@ "numberOfFolders", "numberOfFiles" ], + "vs/platform/quickinput/browser/commandsQuickAccess": [ + "recentlyUsed", + "commonlyUsed", + "morecCommands", + "commandPickAriaLabelWithKeybinding", + "canNotRun" + ], "vs/workbench/contrib/files/browser/fileImportExport": [ "uploadingFiles", "overwrite", @@ -14186,24 +14293,6 @@ ] } ], - "vs/workbench/contrib/bulkEdit/browser/preview/bulkEditTree": [ - "bulkEdit", - "aria.renameAndEdit", - "aria.createAndEdit", - "aria.deleteAndEdit", - "aria.editOnly", - "aria.rename", - "aria.create", - "aria.delete", - "aria.replace", - "aria.del", - "aria.insert", - "rename.label", - "detail.rename", - "detail.create", - "detail.del", - "title" - ], "vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess": [ "cannotRunGotoSymbolWithoutEditor", "cannotRunGotoSymbolWithoutSymbolProvider", @@ -14246,6 +14335,24 @@ "vs/workbench/contrib/search/browser/searchFindInput": [ "searchFindInputNotebookFilter.label" ], + "vs/workbench/contrib/bulkEdit/browser/preview/bulkEditTree": [ + "bulkEdit", + "aria.renameAndEdit", + "aria.createAndEdit", + "aria.deleteAndEdit", + "aria.editOnly", + "aria.rename", + "aria.create", + "aria.delete", + "aria.replace", + "aria.del", + "aria.insert", + "rename.label", + "detail.rename", + "detail.create", + "detail.del", + "title" + ], "vs/workbench/contrib/searchEditor/browser/searchEditorSerialization": [ "invalidQueryStringError", "numFiles", @@ -14335,6 +14442,9 @@ "taskNotTrackedWithTaskId", "taskNotTracked" ], + "vs/workbench/contrib/debug/common/debugSource": [ + "unknownSource" + ], "vs/workbench/contrib/debug/browser/debugSession": [ "noDebugAdapter", "noDebugAdapter", @@ -14376,9 +14486,6 @@ "debuggingStarted", "debuggingStopped" ], - "vs/workbench/contrib/debug/common/debugSource": [ - "unknownSource" - ], "vs/base/browser/ui/findinput/replaceInput": [ "defaultLabel", "label.preserveCaseToggle" @@ -14396,6 +14503,10 @@ "fileColumnLabel", "sourceColumnLabel" ], + "vs/workbench/contrib/comments/browser/commentsController": [ + "hasCommentingRange", + "pickCommentService" + ], "vs/workbench/contrib/mergeEditor/common/mergeEditor": [ "is", "isr", @@ -14482,11 +14593,6 @@ }, "noMoreWarn" ], - "vs/workbench/contrib/mergeEditor/browser/view/editors/baseCodeEditorView": [ - "base", - "compareWith", - "compareWithTooltip" - ], "vs/workbench/contrib/mergeEditor/browser/view/viewModel": [ "noConflictMessage" ], @@ -14525,17 +14631,9 @@ "mergeEditor.conflict.input1.background", "mergeEditor.conflict.input2.background" ], - "vs/workbench/contrib/comments/browser/commentsController": [ - "hasCommentingRange", - "pickCommentService" - ], "vs/workbench/contrib/customEditor/common/contributedCustomEditors": [ "builtinProviderDisplayName" ], - "vs/platform/files/browser/htmlFileSystemProvider": [ - "fileSystemRenameError", - "fileSystemNotAllowedError" - ], "vs/workbench/contrib/extensions/browser/extensionsWidgets": [ "ratedLabel", "sponsor", @@ -14562,11 +14660,20 @@ "extensionPreReleaseForeground", "extensionIcon.sponsorForeground" ], + "vs/workbench/contrib/mergeEditor/browser/view/editors/baseCodeEditorView": [ + "base", + "compareWith", + "compareWithTooltip" + ], "vs/workbench/contrib/extensions/browser/extensionsViewer": [ "error", "Unknown Extension", "extensions" ], + "vs/platform/files/browser/htmlFileSystemProvider": [ + "fileSystemRenameError", + "fileSystemNotAllowedError" + ], "vs/workbench/contrib/extensions/browser/exeBasedRecommendations": [ "exeBasedRecommendation" ], @@ -14580,79 +14687,16 @@ "showLanguageExtensions", "dontShowAgainExtension" ], - "vs/workbench/contrib/extensions/browser/configBasedRecommendations": [ - "exeBasedRecommendation" - ], "vs/workbench/contrib/extensions/browser/webRecommendations": [ "reason" ], - "vs/workbench/contrib/tasks/common/jsonSchemaCommon": [ - "JsonSchema.options", - "JsonSchema.options.cwd", - "JsonSchema.options.env", - "JsonSchema.tasks.matcherError", - "JsonSchema.tasks.matcherError", - "JsonSchema.shellConfiguration", - "JsonSchema.shell.executable", - "JsonSchema.shell.args", - "JsonSchema.command", - "JsonSchema.tasks.args", - "JsonSchema.tasks.taskName", - "JsonSchema.command", - "JsonSchema.tasks.args", - "JsonSchema.tasks.windows", - "JsonSchema.tasks.matchers", - "JsonSchema.tasks.mac", - "JsonSchema.tasks.matchers", - "JsonSchema.tasks.linux", - "JsonSchema.tasks.matchers", - "JsonSchema.tasks.suppressTaskName", - "JsonSchema.tasks.showOutput", - "JsonSchema.echoCommand", - "JsonSchema.tasks.watching.deprecation", - "JsonSchema.tasks.watching", - "JsonSchema.tasks.background", - "JsonSchema.tasks.promptOnClose", - "JsonSchema.tasks.build", - "JsonSchema.tasks.test", - "JsonSchema.tasks.matchers", - "JsonSchema.command", - "JsonSchema.args", - "JsonSchema.showOutput", - "JsonSchema.watching.deprecation", - "JsonSchema.watching", - "JsonSchema.background", - "JsonSchema.promptOnClose", - "JsonSchema.echoCommand", - "JsonSchema.suppressTaskName", - "JsonSchema.taskSelector", - "JsonSchema.matchers", - "JsonSchema.tasks" - ], - "vs/workbench/services/configurationResolver/common/configurationResolverUtils": [ - "deprecatedVariables" - ], - "vs/workbench/services/configurationResolver/common/configurationResolverSchema": [ - "JsonSchema.input.id", - "JsonSchema.input.type", - "JsonSchema.input.description", - "JsonSchema.input.default", - "JsonSchema.inputs", - "JsonSchema.input.type.promptString", - "JsonSchema.input.password", - "JsonSchema.input.type.pickString", - "JsonSchema.input.options", - "JsonSchema.input.pickString.optionLabel", - "JsonSchema.input.pickString.optionValue", - "JsonSchema.input.type.command", - "JsonSchema.input.command.command", - "JsonSchema.input.command.args", - "JsonSchema.input.command.args", - "JsonSchema.input.command.args" + "vs/workbench/contrib/extensions/browser/configBasedRecommendations": [ + "exeBasedRecommendation" ], - "vs/workbench/contrib/remote/browser/explorerViewItems": [ - "remotes", - "remote.explorer.switch" + "vs/workbench/contrib/terminal/browser/terminalQuickAccess": [ + "workbench.action.terminal.newplus", + "workbench.action.terminal.newWithProfilePlus", + "renameTerminal" ], "vs/workbench/contrib/terminal/browser/terminalActions": [ "showTerminalTabs", @@ -14736,23 +14780,6 @@ "workbench.action.terminal.newWorkspacePlaceholder", "workbench.action.terminal.rename.prompt" ], - "vs/workbench/contrib/terminal/browser/terminalService": [ - "terminalService.terminalCloseConfirmationSingular", - "terminalService.terminalCloseConfirmationPlural", - { - "key": "terminate", - "comment": [ - "&& denotes a mnemonic" - ] - }, - "localTerminalVirtualWorkspace", - "localTerminalRemote" - ], - "vs/workbench/contrib/terminal/browser/terminalQuickAccess": [ - "workbench.action.terminal.newplus", - "workbench.action.terminal.newWithProfilePlus", - "renameTerminal" - ], "vs/workbench/contrib/terminal/common/terminalConfiguration": [ "cwd", "cwdFolder", @@ -14897,6 +14924,18 @@ "terminal.integrated.smoothScrolling", "terminal.integrated.enableImages" ], + "vs/workbench/contrib/terminal/browser/terminalService": [ + "terminalService.terminalCloseConfirmationSingular", + "terminalService.terminalCloseConfirmationPlural", + { + "key": "terminate", + "comment": [ + "&& denotes a mnemonic" + ] + }, + "localTerminalVirtualWorkspace", + "localTerminalRemote" + ], "vs/workbench/contrib/terminal/browser/terminalIcons": [ "terminalViewIcon", "renameTerminalIcon", @@ -14994,6 +15033,11 @@ "vs/platform/terminal/common/terminalLogService": [ "terminalLoggerName" ], + "vs/workbench/contrib/terminal/browser/terminalTabbedView": [ + "moveTabsRight", + "moveTabsLeft", + "hideTabs" + ], "vs/workbench/contrib/terminal/browser/terminalTooltip": [ "shellIntegration.enabled", "launchFailed.exitCodeOnlyShellIntegration", @@ -15006,11 +15050,6 @@ }, "shellProcessTooltip.commandLine" ], - "vs/workbench/contrib/terminal/browser/terminalTabbedView": [ - "moveTabsRight", - "moveTabsLeft", - "hideTabs" - ], "vs/workbench/contrib/terminalContrib/accessibility/browser/terminalAccessibilityHelp": [ "terminal-help-label", "focusAccessibleBuffer", @@ -15039,15 +15078,31 @@ "terminal.integrated.accessibleBuffer", "terminal.integrated.symbolQuickPick.labelNoExitCode" ], - "vs/workbench/contrib/terminalContrib/quickFix/browser/terminalQuickFixBuiltinActions": [ - "terminal.freePort", - "terminal.createPR" + "vs/workbench/contrib/terminalContrib/links/browser/terminalLinkManager": [ + "terminalLinkHandler.followLinkAlt.mac", + "terminalLinkHandler.followLinkAlt", + "terminalLinkHandler.followLinkCmd", + "terminalLinkHandler.followLinkCtrl", + "followLink", + "followForwardedLink", + "followLinkUrl" + ], + "vs/workbench/contrib/terminalContrib/links/browser/terminalLinkQuickpick": [ + "terminal.integrated.openDetectedLink", + "terminal.integrated.urlLinks", + "terminal.integrated.localFileLinks", + "terminal.integrated.searchLinks", + "terminal.integrated.showMoreLinks" ], "vs/workbench/contrib/terminalContrib/quickFix/browser/quickFixAddon": [ "quickFix.command", "quickFix.opener", "codeAction.widget.id.quickfix" ], + "vs/workbench/contrib/terminalContrib/quickFix/browser/terminalQuickFixBuiltinActions": [ + "terminal.freePort", + "terminal.createPR" + ], "vs/workbench/contrib/terminalContrib/quickFix/browser/terminalQuickFixService": [ "vscode.extension.contributes.terminalQuickFixes", "vscode.extension.contributes.terminalQuickFixes.id", @@ -15055,25 +15110,82 @@ "vscode.extension.contributes.terminalQuickFixes.outputMatcher", "vscode.extension.contributes.terminalQuickFixes.commandExitResult" ], - "vs/workbench/contrib/terminalContrib/links/browser/terminalLinkManager": [ - "terminalLinkHandler.followLinkAlt.mac", - "terminalLinkHandler.followLinkAlt", - "terminalLinkHandler.followLinkCmd", - "terminalLinkHandler.followLinkCtrl", - "followLink", - "followForwardedLink", - "followLinkUrl" + "vs/workbench/contrib/tasks/common/jsonSchemaCommon": [ + "JsonSchema.options", + "JsonSchema.options.cwd", + "JsonSchema.options.env", + "JsonSchema.tasks.matcherError", + "JsonSchema.tasks.matcherError", + "JsonSchema.shellConfiguration", + "JsonSchema.shell.executable", + "JsonSchema.shell.args", + "JsonSchema.command", + "JsonSchema.tasks.args", + "JsonSchema.tasks.taskName", + "JsonSchema.command", + "JsonSchema.tasks.args", + "JsonSchema.tasks.windows", + "JsonSchema.tasks.matchers", + "JsonSchema.tasks.mac", + "JsonSchema.tasks.matchers", + "JsonSchema.tasks.linux", + "JsonSchema.tasks.matchers", + "JsonSchema.tasks.suppressTaskName", + "JsonSchema.tasks.showOutput", + "JsonSchema.echoCommand", + "JsonSchema.tasks.watching.deprecation", + "JsonSchema.tasks.watching", + "JsonSchema.tasks.background", + "JsonSchema.tasks.promptOnClose", + "JsonSchema.tasks.build", + "JsonSchema.tasks.test", + "JsonSchema.tasks.matchers", + "JsonSchema.command", + "JsonSchema.args", + "JsonSchema.showOutput", + "JsonSchema.watching.deprecation", + "JsonSchema.watching", + "JsonSchema.background", + "JsonSchema.promptOnClose", + "JsonSchema.echoCommand", + "JsonSchema.suppressTaskName", + "JsonSchema.taskSelector", + "JsonSchema.matchers", + "JsonSchema.tasks" ], - "vs/workbench/contrib/terminalContrib/links/browser/terminalLinkQuickpick": [ - "terminal.integrated.openDetectedLink", - "terminal.integrated.urlLinks", - "terminal.integrated.localFileLinks", - "terminal.integrated.searchLinks", - "terminal.integrated.showMoreLinks" + "vs/workbench/services/configurationResolver/common/configurationResolverUtils": [ + "deprecatedVariables" + ], + "vs/workbench/services/configurationResolver/common/configurationResolverSchema": [ + "JsonSchema.input.id", + "JsonSchema.input.type", + "JsonSchema.input.description", + "JsonSchema.input.default", + "JsonSchema.inputs", + "JsonSchema.input.type.promptString", + "JsonSchema.input.password", + "JsonSchema.input.type.pickString", + "JsonSchema.input.options", + "JsonSchema.input.pickString.optionLabel", + "JsonSchema.input.pickString.optionValue", + "JsonSchema.input.type.command", + "JsonSchema.input.command.command", + "JsonSchema.input.command.args", + "JsonSchema.input.command.args", + "JsonSchema.input.command.args" + ], + "vs/workbench/contrib/remote/browser/explorerViewItems": [ + "remotes", + "remote.explorer.switch" ], "vs/workbench/contrib/snippets/browser/commands/abstractSnippetsActions": [ "snippets" ], + "vs/workbench/contrib/snippets/browser/snippetsFile": [ + "source.workspaceSnippetGlobal", + "source.userSnippetGlobal", + "source.userSnippet" + ], "vs/workbench/contrib/snippets/browser/snippetPicker": [ "sep.userSnippet", "sep.workspaceSnippet", @@ -15083,11 +15195,6 @@ "pick.placeholder", "pick.noSnippetAvailable" ], - "vs/workbench/contrib/snippets/browser/snippetsFile": [ - "source.workspaceSnippetGlobal", - "source.userSnippetGlobal", - "source.userSnippet" - ], "vs/workbench/contrib/snippets/browser/snippetCompletionProvider": [ "detail.snippet", "snippetSuggest.longLabel", @@ -15470,14 +15577,14 @@ "vs/platform/terminal/common/terminalProfiles": [ "terminalAutomaticProfile" ], + "vs/workbench/contrib/webview/browser/webviewElement": [ + "fatalErrorMessage" + ], "vs/platform/quickinput/browser/quickPickPin": [ "terminal.commands.pinned", "pinCommand", "pinnedCommand" ], - "vs/workbench/contrib/webview/browser/webviewElement": [ - "fatalErrorMessage" - ], "vs/workbench/api/common/extHostDiagnostics": [ { "key": "limitHit", @@ -15486,13 +15593,13 @@ ] } ], - "vs/workbench/api/common/extHostProgress": [ - "extensionSource" - ], "vs/workbench/api/common/extHostLanguageFeatures": [ "defaultPasteLabel", "defaultDropLabel" ], + "vs/workbench/api/common/extHostProgress": [ + "extensionSource" + ], "vs/workbench/api/common/extHostStatusBar": [ "extensionLabel", "status.extensionMessage" @@ -15500,6 +15607,10 @@ "vs/workbench/api/common/extHostTreeViews": [ "treeView.duplicateElement" ], + "vs/workbench/api/common/extHostNotebook": [ + "err.readonly", + "fileModifiedError" + ], "vs/workbench/api/common/extHostChat": [ "emptyResponse", "errorResponse" @@ -15519,14 +15630,6 @@ "close", "find" ], - "vs/editor/browser/controller/textAreaHandler": [ - "editor", - "accessibilityOffAriaLabel" - ], - "vs/editor/browser/widget/diffEditor.contribution": [ - "editor.action.diffReview.next", - "editor.action.diffReview.prev" - ], "vs/editor/contrib/codeAction/browser/codeActionMenu": [ "codeAction.widget.id.more", "codeAction.widget.id.quickfix", @@ -15612,14 +15715,21 @@ ] } ], - "vs/editor/contrib/suggest/browser/suggestWidgetDetails": [ - "details.close", - "loading" - ], "vs/editor/contrib/suggest/browser/suggestWidgetRenderer": [ "suggestMoreInfoIcon", "readMore" ], + "vs/editor/browser/controller/textAreaHandler": [ + "editor", + "accessibilityModeOff", + "accessibilityOffAriaLabel", + "accessibilityOffAriaLabelNoKb", + "accessibilityOffAriaLabelNoKbs" + ], + "vs/editor/contrib/suggest/browser/suggestWidgetDetails": [ + "details.close", + "loading" + ], "vs/workbench/contrib/comments/common/commentModel": [ "noComments" ], @@ -15644,11 +15754,18 @@ "commentThreadActiveRangeBackground", "commentThreadActiveRangeBorder" ], - "vs/editor/browser/widget/diffEditorWidget2/diffReview": [ - "diffReviewInsertIcon", - "diffReviewRemoveIcon", - "diffReviewCloseIcon", + "vs/editor/browser/widget/diffEditorWidget2/unchangedRanges": [ + "foldUnchanged" + ], + "vs/editor/browser/widget/diffEditorWidget2/diffEditorEditors": [ + "diff-aria-navigation-tip" + ], + "vs/editor/browser/widget/diffEditorWidget2/accessibleDiffViewer": [ + "accessibleDiffViewerInsertIcon", + "accessibleDiffViewerRemoveIcon", + "accessibleDiffViewerCloseIcon", "label.close", + "ariaLabel", "no_lines_changed", "one_line_changed", "more_lines_changed", @@ -15674,11 +15791,8 @@ "insertLine", "deleteLine" ], - "vs/editor/browser/widget/diffEditorWidget2/unchangedRanges": [ - "foldUnchanged" - ], - "vs/editor/browser/widget/diffEditorWidget2/diffEditorEditors": [ - "diff-aria-navigation-tip" + "vs/editor/browser/widget/diffEditorWidget2/colors": [ + "diffEditor.move.border" ], "vs/workbench/browser/parts/editor/editorPlaceholder": [ "trustRequiredEditor", @@ -15691,6 +15805,10 @@ "unknownErrorEditorTextWithoutError", "retry" ], + "vs/base/browser/ui/menu/menubar": [ + "mAppMenu", + "mMore" + ], "vs/workbench/browser/parts/editor/titleControl": [ "ariaLabelEditorActions", "draggedEditorGroup" @@ -15718,16 +15836,12 @@ "cmd.focusAndSelect", "cmd.focus" ], - "vs/base/browser/ui/menu/menubar": [ - "mAppMenu", - "mMore" + "vs/platform/quickinput/browser/quickInputList": [ + "quickInput" ], "vs/platform/quickinput/browser/quickInputUtils": [ "executeCommand" ], - "vs/platform/quickinput/browser/quickInputList": [ - "quickInput" - ], "vs/workbench/contrib/preferences/browser/settingsEditorSettingIndicators": [ "workspaceUntrustedLabel", "trustLabel", @@ -15814,6 +15928,22 @@ "vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer": [ "cellExecutionOrderCountLabel" ], + "vs/workbench/contrib/notebook/browser/viewParts/notebookEditorStickyScroll": [ + "toggleStickyScroll", + { + "key": "mitoggleStickyScroll", + "comment": [ + "&& denotes a mnemonic" + ] + }, + "notebookStickyScroll", + { + "key": "miNotebookStickyScroll", + "comment": [ + "&& denotes a mnemonic" + ] + } + ], "vs/workbench/services/workingCopy/common/storedFileWorkingCopyManager": [ "join.fileWorkingCopyManager" ], @@ -15922,29 +16052,44 @@ "noDebugAdapter", "moreInfo" ], - "vs/base/browser/ui/selectBox/selectBoxCustom": [ - { - "key": "selectBox", - "comment": [ - "Behave like native select dropdown element." - ] - } + "vs/workbench/contrib/comments/browser/commentGlyphWidget": [ + "editorGutterCommentRangeForeground", + "editorOverviewRuler.commentForeground", + "editorOverviewRuler.commentUnresolvedForeground", + "editorGutterCommentGlyphForeground", + "editorGutterCommentUnresolvedGlyphForeground" ], "vs/workbench/contrib/mergeEditor/browser/mergeMarkers/mergeMarkersController": [ "conflictingLine", "conflictingLines" ], + "vs/workbench/contrib/mergeEditor/browser/view/conflictActions": [ + "accept", + "acceptTooltip", + "acceptBoth0First", + "acceptBoth", + "acceptBothTooltip", + "append", + "appendTooltip", + "combine", + "acceptBothTooltip", + "ignore", + "markAsHandledTooltip", + "manualResolution", + "manualResolutionTooltip", + "noChangesAccepted", + "noChangesAcceptedTooltip", + "remove", + "removeTooltip", + "remove", + "removeTooltip", + "resetToBase", + "resetToBaseTooltip" + ], "vs/workbench/contrib/mergeEditor/browser/model/mergeEditorModel": [ "setInputHandled", "undoMarkAsHandled" ], - "vs/workbench/contrib/comments/browser/commentGlyphWidget": [ - "editorGutterCommentRangeForeground", - "editorOverviewRuler.commentForeground", - "editorOverviewRuler.commentUnresolvedForeground", - "editorGutterCommentGlyphForeground", - "editorGutterCommentUnresolvedGlyphForeground" - ], "vs/workbench/contrib/customEditor/common/extensionPoint": [ "contributes.customEditors", "contributes.viewType", @@ -15972,29 +16117,6 @@ "cancel", "createQuickLaunchProfile" ], - "vs/workbench/contrib/mergeEditor/browser/view/conflictActions": [ - "accept", - "acceptTooltip", - "acceptBoth0First", - "acceptBoth", - "acceptBothTooltip", - "append", - "appendTooltip", - "combine", - "acceptBothTooltip", - "ignore", - "markAsHandledTooltip", - "manualResolution", - "manualResolutionTooltip", - "noChangesAccepted", - "noChangesAcceptedTooltip", - "remove", - "removeTooltip", - "remove", - "removeTooltip", - "resetToBase", - "resetToBaseTooltip" - ], "vs/workbench/contrib/terminal/browser/terminalInstance": [ "terminalTypeTask", "terminalTypeLocal", @@ -16054,12 +16176,6 @@ }, "label" ], - "vs/workbench/contrib/terminal/browser/xterm/decorationStyles": [ - "terminalPromptContextMenu", - "terminalPromptCommandFailed", - "terminalPromptCommandFailedWithExitCode", - "terminalPromptCommandSuccess" - ], "vs/workbench/contrib/terminalContrib/links/browser/terminalLinkDetectorAdapter": [ "searchWorkspace", "openFile", @@ -16078,6 +16194,12 @@ "ariaSearchNoResult", "ariaSearchNoResultWithLineNumNoCurrentMatch" ], + "vs/workbench/contrib/terminal/browser/xterm/decorationStyles": [ + "terminalPromptContextMenu", + "terminalPromptCommandFailed", + "terminalPromptCommandFailedWithExitCode", + "terminalPromptCommandSuccess" + ], "vs/workbench/contrib/welcomeGettingStarted/common/media/theme_picker": [ "dark", "light", @@ -16085,6 +16207,11 @@ "HighContrastLight", "seeMore" ], + "vs/workbench/contrib/welcomeGettingStarted/common/media/notebookProfile": [ + "default", + "jupyter", + "colab" + ], "vs/workbench/contrib/userDataSync/browser/userDataSyncConflictsView": [ "explanation", { @@ -16105,11 +16232,6 @@ "Theirs", "Yours" ], - "vs/workbench/contrib/welcomeGettingStarted/common/media/notebookProfile": [ - "default", - "jupyter", - "colab" - ], "vs/platform/actionWidget/browser/actionList": [ { "key": "label-preview", @@ -16256,6 +16378,12 @@ "selectRecentDirectoryMac", "selectRecentDirectory" ], + "vs/workbench/contrib/notebook/browser/view/cellParts/codeCellExecutionIcon": [ + "notebook.cell.status.success", + "notebook.cell.status.failed", + "notebook.cell.status.pending", + "notebook.cell.status.executing" + ], "vs/workbench/contrib/notebook/browser/view/cellParts/cellOutput": [ "empty", "noRenderer.2", @@ -16266,22 +16394,11 @@ "promptChooseMimeType.placeHolder", "unavailableRenderInfo" ], - "vs/workbench/contrib/notebook/browser/view/cellParts/codeCellExecutionIcon": [ - "notebook.cell.status.success", - "notebook.cell.status.failed", - "notebook.cell.status.pending", - "notebook.cell.status.executing" - ], "vs/workbench/contrib/comments/browser/commentThreadBody": [ "commentThreadAria.withRange", "commentThreadAria.document", "commentThreadAria" ], - "vs/workbench/contrib/comments/browser/commentThreadHeader": [ - "collapseIcon", - "label.collapse", - "startThread" - ], "vs/workbench/contrib/terminal/browser/environmentVariableInfo": [ "extensionEnvironmentContributionInfoStale", "relaunchTerminalLabel", @@ -16289,6 +16406,11 @@ "showEnvironmentContributions", "ScopedEnvironmentContributionInfo" ], + "vs/workbench/contrib/comments/browser/commentThreadHeader": [ + "collapseIcon", + "label.collapse", + "startThread" + ], "vs/workbench/contrib/comments/browser/commentNode": [ "commentToggleReaction", "commentToggleReactionError", @@ -16341,12 +16463,6 @@ "{0}\n\nPlease make sure the following directories are writeable:\n\n{1}", "&&Close" ], - "vs/code/node/cliProcessMain": [ - "CLI" - ], - "vs/code/node/sharedProcess/sharedProcessMain": [ - "Shared" - ], "vs/code/electron-sandbox/processExplorer/processExplorerMain": [ "Process Name", "CPU (%)", @@ -16358,6 +16474,12 @@ "Copy All", "Debug" ], + "vs/code/node/cliProcessMain": [ + "CLI" + ], + "vs/code/node/sharedProcess/sharedProcessMain": [ + "Shared" + ], "vs/workbench/electron-sandbox/desktop.main": [ "Saving UI state" ], @@ -16392,6 +16514,7 @@ "If enabled, this setting will close the window when the application icon in the title bar is double-clicked. The window will not be able to be dragged by the icon. This setting is effective only if `#window.titleBarStyle#` is set to `custom`.", "Adjust the appearance of the window title bar. On Linux and Windows, this setting also affects the application and context menu appearances. Changes require a full restart to apply.", "Use window controls provided by the platform instead of our HTML-based window controls. Changes require a full restart to apply.", + "Let the OS handle positioning of the context menu in cases where it should appear under the mouse.", "Adjust the appearance of dialog windows.", "Enables macOS Sierra window tabs. Note that changes require a full restart to apply and that native tabs will disable a custom title bar style if configured.", "Controls if native full-screen should be used on macOS. Disable this option to prevent macOS from creating a new space when going full-screen.", @@ -16470,18 +16593,6 @@ "Restart Extension Host", "Restarting extension host on explicit request." ], - "vs/workbench/contrib/localization/electron-sandbox/localization.contribution": [ - "Would you like to change {0}'s display language to {1} and restart?", - "Change Language and Restart", - "Don't Show Again" - ], - "vs/workbench/contrib/files/electron-sandbox/fileActions.contribution": [ - "Reveal in File Explorer", - "Reveal in Finder", - "Open Containing Folder", - "Share", - "File" - ], "vs/workbench/contrib/extensions/electron-sandbox/extensions.contribution": [ "Running Extensions" ], @@ -16520,6 +16631,10 @@ "Use the configured external terminal.", "Use the other two together.", "When opening a file from the Explorer in a terminal, determines what kind of terminal will be launched", + "Use VS Code's integrated terminal.", + "Use the configured external terminal.", + "Use the other two together.", + "When opening a repository from the Source Control Repositories view in a terminal, determines what kind of terminal will be launched", "Customizes which terminal to run on Windows.", "Customizes which terminal application to run on macOS.", "Customizes which terminal to run on Linux." @@ -16537,12 +16652,18 @@ "Do not show again", "[Looking for remote tunnel](command:{0})", "[Starting remote tunnel](command:{0})", + "Installation as a service failed, and we fell back to running the tunnel for this session. See the [error log](command:{0}) for details.", "Sign in to an account to enable remote access", "Signed In", "Others", "Sign in with {0}", "Remote Tunnels is currently in preview. Please report any problems using the \"Help: Report Issue\" command.", "&&Enable", + "Select how you want to enable access", + "Turn on for this session", + "Run whenever {0} is open", + "Install as a service", + "Run whenever you're logged in", "You can now access this machine anywhere via the secure tunnel [{0}](command:{4}). To connect via a different machine, use the generated [{1}]({2}) link or use the [{6}]({7}) extension in the desktop or web. You can [configure](command:{3}) or [turn off](command:{5}) this access via the VS Code Accounts menu.", "Copy Browser Link to Clipboard", "Show Extension", @@ -16561,6 +16682,18 @@ "The name must only consist of letters, numbers, underscore and dash. It must not start with a dash.", "Prevent the computer from sleeping when remote tunnel access is turned on." ], + "vs/workbench/contrib/localization/electron-sandbox/localization.contribution": [ + "Would you like to change {0}'s display language to {1} and restart?", + "Change Language and Restart", + "Don't Show Again" + ], + "vs/workbench/contrib/files/electron-sandbox/fileActions.contribution": [ + "Reveal in File Explorer", + "Reveal in Finder", + "Open Containing Folder", + "Share", + "File" + ], "vs/base/common/platform": [ "_" ], @@ -16956,6 +17089,76 @@ "Controls whether inline color decorations should be shown using the default document color provider", "Controls whether the editor receives tabs or defers them to the workbench for navigation." ], + "vs/code/electron-sandbox/issue/issueReporterPage": [ + "Include my system information", + "Include my currently running processes", + "Include my workspace metadata", + "Include my enabled extensions", + "Include A/B experiment info", + "Before you report an issue here please review the guidance we provide.", + "Please complete the form in English.", + "This is a", + "File on", + "An issue source is required.", + "Try to reproduce the problem after {0}. If the problem only reproduces when extensions are active, it is likely an issue with an extension.", + "disabling all extensions and reloading the window", + "Extension", + "The issue reporter is unable to create issues for this extension. Please visit {0} to report an issue.", + "The issue reporter is unable to create issues for this extension, as it does not specify a URL for reporting issues. Please check the marketplace page of this extension to see if other instructions are available.", + "Title", + "Please enter a title.", + "A title is required.", + "The title is too long.", + "Please enter details.", + "A description is required.", + "show", + "show", + "show", + "show", + "show" + ], + "vs/code/electron-sandbox/issue/issueReporterService": [ + "hide", + "show", + "Create on GitHub", + "Preview on GitHub", + "Loading data...", + "GitHub query limit exceeded. Please wait.", + "Similar issues", + "Open", + "Closed", + "Open", + "Closed", + "No similar issues found", + "Bug Report", + "Feature Request", + "Performance Issue", + "Select source", + "Visual Studio Code", + "An extension", + "Extensions marketplace", + "Don't know", + "This extension handles issues outside of VS Code", + "The '{0}' extension prefers to use an external issue reporter. To be taken to that issue reporting experience, click the button below.", + "Open External Issue Reporter", + "Steps to Reproduce", + "Share the steps needed to reliably reproduce the problem. Please include actual and expected results. We support GitHub-flavored Markdown. You will be able to edit your issue and add screenshots when we preview it on GitHub.", + "Steps to Reproduce", + "When did this performance issue happen? Does it occur on startup or after a specific series of actions? We support GitHub-flavored Markdown. You will be able to edit your issue and add screenshots when we preview it on GitHub.", + "Description", + "Please describe the feature you would like to see. We support GitHub-flavored Markdown. You will be able to edit your issue and add screenshots when we preview it on GitHub.", + "We have written the needed data into your clipboard because it was too large to send. Please paste.", + "Extensions are disabled", + "No current experiments." + ], + "vs/platform/environment/node/argvHelper": [ + "Option '{0}' is defined more than once. Using value '{1}'.", + "Option '{0}' requires a non empty value. Ignoring the option.", + "Option '{0}' is deprecated: {1}", + "Warning: '{0}' is not in the list of known options for subcommand '{1}'", + "Warning: '{0}' is not in the list of known options, but still passed to Electron/Chromium.", + "Arguments in `--goto` mode should be in the format of `FILE(:LINE(:CHARACTER))`." + ], "vs/base/common/errorMessage": [ "{0}: {1}", "A system error occurred ({0})", @@ -16970,14 +17173,6 @@ "An external application wants to open '{0}' in {1}. Do you want to open this file or folder?", "If you did not initiate this request, it may represent an attempted attack on your system. Unless you took an explicit action to initiate this request, you should press 'No'" ], - "vs/platform/environment/node/argvHelper": [ - "Option '{0}' is defined more than once. Using value '{1}'.", - "Option '{0}' requires a non empty value. Ignoring the option.", - "Option '{0}' is deprecated: {1}", - "Warning: '{0}' is not in the list of known options for subcommand '{1}'", - "Warning: '{0}' is not in the list of known options, but still passed to Electron/Chromium.", - "Arguments in `--goto` mode should be in the format of `FILE(:LINE(:CHARACTER))`." - ], "vs/platform/files/common/files": [ "Unknown Error", "{0}B", @@ -17028,6 +17223,7 @@ "HTTP", "The proxy setting to use. If not set, will be inherited from the `http_proxy` and `https_proxy` environment variables.", "Controls whether the proxy server certificate should be verified against the list of supplied CAs.", + "Overrides the principal service name for Kerberos authentication with the HTTP proxy. A default based on the proxy hostname is used when this is not set.", "The value to send as the `Proxy-Authorization` header for every network request.", "Disable proxy support for extensions.", "Enable proxy support for extensions.", @@ -17064,6 +17260,15 @@ "Extensions", "Preferences" ], + "vs/platform/extensionManagement/common/extensionsScannerService": [ + "Cannot read file {0}: {1}.", + "Failed to parse {0}: [{1}, {2}] {3}.", + "Invalid manifest file {0}: Not an JSON object.", + "Failed to parse {0}: {1}.", + "Invalid format {0}: JSON object expected.", + "Failed to parse {0}: {1}.", + "Invalid format {0}: JSON object expected." + ], "vs/platform/extensionManagement/common/extensionManagementCLI": [ "Extension '{0}' not found.", "Make sure you use the full extension ID, including the publisher, e.g.: {0}", @@ -17093,15 +17298,6 @@ "Extension '{0}' is not installed on {1}.", "Extension '{0}' is not installed." ], - "vs/platform/extensionManagement/common/extensionsScannerService": [ - "Cannot read file {0}: {1}.", - "Failed to parse {0}: [{1}, {2}] {3}.", - "Invalid manifest file {0}: Not an JSON object.", - "Failed to parse {0}: {1}.", - "Invalid format {0}: JSON object expected.", - "Failed to parse {0}: {1}.", - "Invalid format {0}: JSON object expected." - ], "vs/platform/extensionManagement/node/extensionManagementService": [ "Unable to install extension '{0}' as it is not compatible with VS Code '{1}'.", "Marketplace is not enabled", @@ -17139,78 +17335,6 @@ "vs/platform/userDataProfile/common/userDataProfile": [ "Default" ], - "vs/code/electron-sandbox/issue/issueReporterPage": [ - "Include my system information", - "Include my currently running processes", - "Include my workspace metadata", - "Include my enabled extensions", - "Include A/B experiment info", - "Before you report an issue here please review the guidance we provide.", - "Please complete the form in English.", - "This is a", - "File on", - "An issue source is required.", - "Try to reproduce the problem after {0}. If the problem only reproduces when extensions are active, it is likely an issue with an extension.", - "disabling all extensions and reloading the window", - "Extension", - "The issue reporter is unable to create issues for this extension. Please visit {0} to report an issue.", - "The issue reporter is unable to create issues for this extension, as it does not specify a URL for reporting issues. Please check the marketplace page of this extension to see if other instructions are available.", - "Title", - "Please enter a title.", - "A title is required.", - "The title is too long.", - "Please enter details.", - "A description is required.", - "show", - "show", - "show", - "show", - "show" - ], - "vs/code/electron-sandbox/issue/issueReporterService": [ - "hide", - "show", - "Create on GitHub", - "Preview on GitHub", - "Loading data...", - "GitHub query limit exceeded. Please wait.", - "Similar issues", - "Open", - "Closed", - "Open", - "Closed", - "No similar issues found", - "Bug Report", - "Feature Request", - "Performance Issue", - "Select source", - "Visual Studio Code", - "An extension", - "Extensions marketplace", - "Don't know", - "This extension handles issues outside of VS Code", - "The '{0}' extension prefers to use an external issue reporter. To be taken to that issue reporting experience, click the button below.", - "Open External Issue Reporter", - "Steps to Reproduce", - "Share the steps needed to reliably reproduce the problem. Please include actual and expected results. We support GitHub-flavored Markdown. You will be able to edit your issue and add screenshots when we preview it on GitHub.", - "Steps to Reproduce", - "When did this performance issue happen? Does it occur on startup or after a specific series of actions? We support GitHub-flavored Markdown. You will be able to edit your issue and add screenshots when we preview it on GitHub.", - "Description", - "Please describe the feature you would like to see. We support GitHub-flavored Markdown. You will be able to edit your issue and add screenshots when we preview it on GitHub.", - "We have written the needed data into your clipboard because it was too large to send. Please paste.", - "Extensions are disabled", - "No current experiments." - ], - "vs/platform/telemetry/common/telemetryLogAppender": [ - "Telemetry{0}" - ], - "vs/platform/userDataSync/common/userDataSync": [ - "Settings Sync", - "Synchronize keybindings for each platform.", - "List of extensions to be ignored while synchronizing. The identifier of an extension is always `${publisher}.${name}`. For example: `vscode.csharp`.", - "Expected format '${publisher}.${name}'. Example: 'vscode.csharp'.", - "Configure settings to be ignored while synchronizing." - ], "vs/platform/userDataSync/common/userDataSyncLog": [ "Settings Sync" ], @@ -17223,11 +17347,22 @@ "vs/platform/userDataSync/common/userDataSyncResourceProvider": [ "Cannot parse sync data as it is not compatible with the current version." ], + "vs/platform/userDataSync/common/userDataSync": [ + "Settings Sync", + "Synchronize keybindings for each platform.", + "List of extensions to be ignored while synchronizing. The identifier of an extension is always `${publisher}.${name}`. For example: `vscode.csharp`.", + "Expected format '${publisher}.${name}'. Example: 'vscode.csharp'.", + "Configure settings to be ignored while synchronizing." + ], "vs/platform/remoteTunnel/node/remoteTunnelService": [ "Building CLI from sources", "Connecting as {0} ({1})", "Opening tunnel {0}", - "Opening tunnel" + "Opening tunnel", + "Failed to install tunnel as a service, starting in session..." + ], + "vs/platform/telemetry/common/telemetryLogAppender": [ + "Telemetry{0}" ], "vs/workbench/browser/workbench": [ "Failed to load a required file. Please restart the application to try again. Details: {0}" @@ -17283,10 +17418,8 @@ ], "vs/workbench/services/configuration/browser/configurationService": [ "Contribute defaults for configurations", - "Experiments" - ], - "vs/platform/workspace/common/workspace": [ - "Code Workspace" + "Experiments", + "Configure settings to be applied for all profiles." ], "vs/workbench/services/remote/electron-sandbox/remoteAgentService": [ "Open Developer Tools", @@ -17332,14 +17465,17 @@ "Controls how tree folders are expanded when clicking the folder names. Note that some trees and lists might choose to ignore this setting if it is not applicable.", "Controls the how type navigation works in lists and trees in the workbench. When set to 'trigger', type navigation begins once the 'list.triggerTypeNavigation' command is run." ], + "vs/platform/workspace/common/workspace": [ + "Code Workspace" + ], + "vs/platform/contextkey/browser/contextKeyService": [ + "A command that returns information about context keys" + ], "vs/platform/markers/common/markers": [ "Error", "Warning", "Info" ], - "vs/platform/contextkey/browser/contextKeyService": [ - "A command that returns information about context keys" - ], "vs/platform/contextkey/common/contextkey": [ "Empty context key expression", "Did you forget to write an expression? You can also put 'false' or 'true' to always evaluate to false or true, respectively.", @@ -17353,14 +17489,6 @@ "Unexpected token. Hint: {0}", "Unexpected token." ], - "vs/workbench/browser/actions/textInputActions": [ - "Undo", - "Redo", - "Cut", - "Copy", - "Paste", - "Select All" - ], "vs/workbench/browser/workbench.contribution": [ "The default size.", "Increases the size, so it can be grabbed more easily with the mouse.", @@ -17397,7 +17525,7 @@ "A pinned tab will show in a compact form with only icon or first letter of the editor name.", "A pinned tab shrinks to a compact fixed size showing parts of the editor name.", "Controls the size of pinned editor tabs. Pinned tabs are sorted to the beginning of all opened tabs and typically do not close until unpinned. This value is ignored when `#workbench.editor.showTabs#` is disabled.", - "Splits all the editor groups to equal parts unless a part has been changed in size.", + "Splits the active editor group to equal parts, unless all editor groups are already in equal parts. In that case, splits all the editor groups to equal parts.", "Splits all the editor groups to equal parts.", "Splits the active editor group to equal parts.", "Controls the size of editor groups when splitting them.", @@ -17533,32 +17661,15 @@ "Controls whether turning on Zen Mode also hides the activity bar either at the left or right of the workbench.", "Controls whether turning on Zen Mode also hides the editor line numbers.", "Controls whether a window should restore to Zen Mode if it was exited in Zen Mode.", - "Controls whether notifications do not disturb mode should be enabled while in Zen Mode. If true, only error notifications will pop out.", - "UNC host names must not contain backslashes.", - "A set of UNC host names (without leading or trailing backslash, for example `192.168.0.1` or `my-server`) to allow without user confirmation. If a UNC host is being accessed that is not allowed via this setting or has not been acknowledged via user confirmation, an error will occur and the operation stopped. A restart is required when changing this setting. Find out more about this setting at https://aka.ms/vscode-windows-unc.", - "If enabled, only allows access to UNC host names that are allowed by the `#security.allowedUNCHosts#` setting or after user confirmation. Find out more about this setting at https://aka.ms/vscode-windows-unc." + "Controls whether notifications do not disturb mode should be enabled while in Zen Mode. If true, only error notifications will pop out." ], - "vs/workbench/browser/actions/developerActions": [ - "Inspect Context Keys", - "Toggle Screencast Mode", - "Log Storage Database Contents", - "The storage database contents have been logged to the developer tools.", - "Open developer tools from the menu and select the Console tab.", - "Log Working Copies", - "Screencast Mode", - "Controls the vertical offset of the screencast mode overlay from the bottom as a percentage of the workbench height.", - "Controls the font size (in pixels) of the screencast mode keyboard.", - "Keys.", - "Command title.", - "Command title prefixed by its group.", - "Command title and keys.", - "Command title and keys, with the command prefixed by its group.", - "Controls what is displayed in the keyboard overlay when showing shortcuts.", - "Show only keyboard shortcuts in screencast mode (do not include action names).", - "Hide the single editor cursor move commands in screencast mode.", - "Controls how long (in milliseconds) the keyboard overlay is shown in screencast mode.", - "Controls the color in hex (#RGB, #RGBA, #RRGGBB or #RRGGBBAA) of the mouse indicator in screencast mode.", - "Controls the size (in pixels) of the mouse indicator in screencast mode." + "vs/workbench/browser/actions/textInputActions": [ + "Undo", + "Redo", + "Cut", + "Copy", + "Paste", + "Select All" ], "vs/workbench/browser/actions/helpActions": [ "Keyboard Shortcuts Reference", @@ -17579,6 +17690,25 @@ "Privacy Statement", "Privac&&y Statement" ], + "vs/workbench/browser/actions/developerActions": [ + "Inspect Context Keys", + "Toggle Screencast Mode", + "Log Storage Database Contents", + "The storage database contents have been logged to the developer tools.", + "Open developer tools from the menu and select the Console tab.", + "Log Working Copies", + "Screencast Mode", + "Controls the vertical offset of the screencast mode overlay from the bottom as a percentage of the workbench height.", + "Controls the font size (in pixels) of the screencast mode keyboard.", + "Options for customizing the keyboard overlay in screencast mode.", + "Show raw keys.", + "Show command names.", + "Show command group names, when commands are also shown.", + "Show single editor cursor move commands.", + "Controls how long (in milliseconds) the keyboard overlay is shown in screencast mode.", + "Controls the color in hex (#RGB, #RGBA, #RRGGBB or #RRGGBBAA) of the mouse indicator in screencast mode.", + "Controls the size (in pixels) of the mouse indicator in screencast mode." + ], "vs/workbench/browser/actions/layoutActions": [ "Represents the menu bar", "Represents the activity bar in the left position", @@ -17755,14 +17885,6 @@ "Add Folder to Workspace", "Select workspace folder" ], - "vs/workbench/browser/actions/quickAccessActions": [ - "Go to File...", - "Quick Open", - "Navigate Next in Quick Open", - "Navigate Previous in Quick Open", - "Select Next in Quick Open", - "Select Previous in Quick Open" - ], "vs/workbench/services/actions/common/menusExtensionPoint": [ "The Command Palette", "The touch bar (macOS only)", @@ -17873,49 +17995,13 @@ "Menu item references a submenu `{0}` which is not defined in the 'submenus' section.", "The `{0}` submenu was already contributed to the `{1}` menu." ], - "vs/workbench/api/common/configurationExtensionPoint": [ - "A title for the current category of settings. This label will be rendered in the Settings editor as a subheading. If the title is the same as the extension display name, then the category will be grouped under the main extension heading.", - "When specified, gives the order of this category of settings relative to other categories.", - "Description of the configuration properties.", - "Property should not be empty.", - "Schema of the configuration property.", - "Configuration that can be configured only in the user settings.", - "Configuration that can be configured only in the user settings or only in the remote settings.", - "Configuration that can be configured in the user, remote or workspace settings.", - "Configuration that can be configured in the user, remote, workspace or folder settings.", - "Resource configuration that can be configured in language specific settings.", - "Machine configuration that can be configured also in workspace or folder settings.", - "Scope in which the configuration is applicable. Available scopes are `application`, `machine`, `window`, `resource`, and `machine-overridable`.", - "Descriptions for enum values", - "Descriptions for enum values in the markdown format.", - "Labels for enum values to be displayed in the Settings editor. When specified, the {0} values still show after the labels, but less prominently.", - "The description in the markdown format.", - "If set, the property is marked as deprecated and the given message is shown as an explanation.", - "If set, the property is marked as deprecated and the given message is shown as an explanation in the markdown format.", - "The value will be shown in an inputbox.", - "The value will be shown in a textarea.", - "When specified, controls the presentation format of the string setting.", - "When specified, gives the order of this setting relative to other settings within the same category. Settings with an order property will be placed before settings without this property set.", - "When enabled, Settings Sync will not sync the user value of this configuration by default.", - "Cannot register configuration defaults for '{0}'. Only defaults for machine-overridable, window, resource and language overridable scoped settings are supported.", - "Contributes configuration settings.", - "'configuration.title' must be a string", - "'configuration.properties' must be an object", - "Cannot register '{0}'. This property is already registered.", - "configuration.properties property '{0}' must be an object", - "'configuration.allOf' is deprecated and should no longer be used. Instead, pass multiple configuration sections as an array to the 'configuration' contribution point.", - "List of folders to be loaded in the workspace.", - "A file path. e.g. `/root/folderA` or `./folderA` for a relative path that will be resolved against the location of the workspace file.", - "An optional name for the folder. ", - "URI of the folder", - "An optional name for the folder. ", - "Workspace settings", - "Workspace launch configurations", - "Workspace task configurations", - "Workspace extensions", - "The remote server where the workspace is located.", - "A transient workspace will disappear when restarting or reloading.", - "Unknown workspace configuration property" + "vs/workbench/browser/actions/quickAccessActions": [ + "Go to File...", + "Quick Open", + "Navigate Next in Quick Open", + "Navigate Previous in Quick Open", + "Select Next in Quick Open", + "Select Previous in Quick Open" ], "vs/workbench/api/browser/viewsExtensionPoint": [ "Unique id used to identify the container in which views can be contributed using 'views' contribution point", @@ -17968,6 +18054,50 @@ "property `{0}` can be omitted or must be of type `string`", "property `{0}` can be omitted or must be one of {1}" ], + "vs/workbench/api/common/configurationExtensionPoint": [ + "A title for the current category of settings. This label will be rendered in the Settings editor as a subheading. If the title is the same as the extension display name, then the category will be grouped under the main extension heading.", + "When specified, gives the order of this category of settings relative to other categories.", + "Description of the configuration properties.", + "Property should not be empty.", + "Schema of the configuration property.", + "Configuration that can be configured only in the user settings.", + "Configuration that can be configured only in the user settings or only in the remote settings.", + "Configuration that can be configured in the user, remote or workspace settings.", + "Configuration that can be configured in the user, remote, workspace or folder settings.", + "Resource configuration that can be configured in language specific settings.", + "Machine configuration that can be configured also in workspace or folder settings.", + "Scope in which the configuration is applicable. Available scopes are `application`, `machine`, `window`, `resource`, and `machine-overridable`.", + "Descriptions for enum values", + "Descriptions for enum values in the markdown format.", + "Labels for enum values to be displayed in the Settings editor. When specified, the {0} values still show after the labels, but less prominently.", + "The description in the markdown format.", + "If set, the property is marked as deprecated and the given message is shown as an explanation.", + "If set, the property is marked as deprecated and the given message is shown as an explanation in the markdown format.", + "The value will be shown in an inputbox.", + "The value will be shown in a textarea.", + "When specified, controls the presentation format of the string setting.", + "When specified, gives the order of this setting relative to other settings within the same category. Settings with an order property will be placed before settings without this property set.", + "When enabled, Settings Sync will not sync the user value of this configuration by default.", + "Cannot register configuration defaults for '{0}'. Only defaults for machine-overridable, window, resource and language overridable scoped settings are supported.", + "Contributes configuration settings.", + "'configuration.title' must be a string", + "'configuration.properties' must be an object", + "Cannot register '{0}'. This property is already registered.", + "configuration.properties property '{0}' must be an object", + "'configuration.allOf' is deprecated and should no longer be used. Instead, pass multiple configuration sections as an array to the 'configuration' contribution point.", + "List of folders to be loaded in the workspace.", + "A file path. e.g. `/root/folderA` or `./folderA` for a relative path that will be resolved against the location of the workspace file.", + "An optional name for the folder. ", + "URI of the folder", + "An optional name for the folder. ", + "Workspace settings", + "Workspace launch configurations", + "Workspace task configurations", + "Workspace extensions", + "The remote server where the workspace is located.", + "A transient workspace will disappear when restarting or reloading.", + "Unknown workspace configuration property" + ], "vs/workbench/browser/parts/editor/editor.contribution": [ "Text Editor", "Text Diff Editor", @@ -18139,21 +18269,6 @@ "Could not redo '{0}' across all files because an undo or redo operation occurred in the meantime", "Could not redo '{0}' because there is already an undo or redo operation running." ], - "vs/workbench/services/extensions/browser/extensionUrlHandler": [ - "Allow an extension to open this URI?", - "Don't ask again for this extension.", - "&&Open", - "Extension '{0}' is not installed. Would you like to install the extension and open this URL?", - "&&Install and Open", - "Installing Extension '{0}'...", - "Extension '{0}' is disabled. Would you like to enable the extension and open the URL?", - "&&Enable and Open", - "Extension '{0}' is not loaded. Would you like to reload the window to load the extension and open the URL?", - "&&Reload Window and Open", - "Manage Authorized Extension URIs...", - "Extensions", - "There are currently no authorized extension URIs." - ], "vs/workbench/services/keybinding/common/keybindingEditing": [ "Unable to write because the keybindings configuration file has unsaved changes. Please save it first and then try again.", "Unable to write to the keybindings configuration file. Please open it to correct errors/warnings in the file and try again.", @@ -18183,6 +18298,21 @@ "vs/workbench/services/configuration/common/jsonEditingService": [ "Unable to write into the file. Please open the file to correct errors/warnings in the file and try again." ], + "vs/workbench/services/extensions/browser/extensionUrlHandler": [ + "Allow an extension to open this URI?", + "Don't ask again for this extension.", + "&&Open", + "Extension '{0}' is not installed. Would you like to install the extension and open this URL?", + "&&Install and Open", + "Installing Extension '{0}'...", + "Extension '{0}' is disabled. Would you like to enable the extension and open the URL?", + "&&Enable and Open", + "Extension '{0}' is not loaded. Would you like to reload the window to load the extension and open the URL?", + "&&Reload Window and Open", + "Manage Authorized Extension URIs...", + "Extensions", + "There are currently no authorized extension URIs." + ], "vs/workbench/services/editor/browser/editorResolverService": [ "There are multiple default editors available for the resource.", "Configure Default", @@ -18303,10 +18433,36 @@ "{0}: Resolving profile content...", "Preview Profile", "Create Profile", + "Create Profile", + "Edit {0} Profile...", + "Create New Profile...", + "Settings", + "Keyboard Shortcuts", + "User Snippets", + "User Tasks", + "Extensions", + "Profile name", + "Save", + "Create", + "Choose what to configure in your Profile:", + "Profile with name {0} already exists.", + "The profile should contain at least one configuration.", + "Using Default Profile", + "Provide a name for the new profile", + "Copy from:", + "None", + "Profile Templates", + "Existing Profiles", + "Create Profile", "Export", "Close", + "Create Profile: {0}", + "Applying Extensions...", + "Switching Profile...", "Troubleshoot Issue", "Setting up Troubleshoot Profile: {0}", + "Applying Extensions...", + "Switching Profile...", "{0}: Exporting...", "Profile '{0}' was exported successfully.", "&&Copy Link", @@ -18319,16 +18475,16 @@ "By default, extensions aren't installed when previewing a profile on the web. You can still install them manually before importing the profile. ", "Learn more", "Install Extensions", + "Create Profile", "Cancel", "Create Profile", - "{0} ({1})...", + "Switching Profile...", "Applying Settings...", - "{0}ying Keyboard Shortcuts...", + "Applying Keyboard Shortcuts...", "Applying Tasks...", "Applying Snippets...", "Applying State...", "Applying Extensions...", - " Applying...", "Export '{0}' profile as...", "Profile with name '{0}' already exists. Do you want to overwrite it?", "&&Overwrite", @@ -18343,11 +18499,14 @@ "Save Profile", "Select Profile", "Select {0}", + "Select {0}", + "From Default Profile", "Name the profile", "Export Profile", "Profile name must be provided." ], "vs/workbench/services/userDataProfile/browser/userDataProfileManagement": [ + "The current profile has been updated. Please reload to switch back to the updated profile", "The current profile has been removed. Please reload to switch back to default profile", "The current profile has been removed. Please reload to switch back to default profile", "Cannot rename the default profile", @@ -18373,25 +18532,6 @@ "Hide '{0}'", "Reset Location" ], - "vs/workbench/services/authentication/browser/authenticationService": [ - "The id of the authentication provider.", - "The human readable name of the authentication provider.", - "Contributes authentication", - "No accounts requested yet...", - "An authentication contribution must specify an id.", - "An authentication contribution must specify a label.", - "This authentication id '{0}' has already been registered", - "Loading...", - "Sign in requested", - "The extension '{0}' wants to access the {1} account '{2}'.", - "&&Allow", - "&&Deny", - "Sign in to another account", - "The extension '{0}' wants to access a {1} account", - "Select an account for '{0}' to use or Esc to cancel", - "Grant access to {0} for {1}... (1)", - "Sign in with {0} to use {1} (1)" - ], "vs/workbench/services/userDataSync/browser/userDataSyncWorkbenchService": [ "Settings sync cannot be turned on because there are no authentication providers available.", "No account available", @@ -18417,6 +18557,25 @@ "Others", "Sign in with {0}" ], + "vs/workbench/services/authentication/browser/authenticationService": [ + "The id of the authentication provider.", + "The human readable name of the authentication provider.", + "Contributes authentication", + "No accounts requested yet...", + "An authentication contribution must specify an id.", + "An authentication contribution must specify a label.", + "This authentication id '{0}' has already been registered", + "Loading...", + "Sign in requested", + "The extension '{0}' wants to access the {1} account '{2}'.", + "&&Allow", + "&&Deny", + "Sign in to another account", + "The extension '{0}' wants to access a {1} account", + "Select an account for '{0}' to use or Esc to cancel", + "Grant access to {0} for {1}... (1)", + "Sign in with {0} to use {1} (1)" + ], "vs/workbench/services/assignment/common/assignmentService": [ "Fetches experiments to run from a Microsoft online service." ], @@ -18428,8 +18587,8 @@ "Issue troubleshooting is active and has temporarily reset your configurations to defaults. Check if you can still reproduce the problem and proceed by selecting from these options.", "Issue troubleshooting has identified that the issue is caused by your configurations. Please report the issue by exporting your configurations using \"Export Profile\" command and share the file in the issue report.", "Issue troubleshooting has identified that the issue is with {0}.", - "I can't reproduce", - "I can reproduce", + "I Can't Reproduce", + "I Can Reproduce", "Stop", "Troubleshoot Issue", "This likely means that the issue has been addressed already and will be available in an upcoming release. You can safely use {0} insiders until the new stable version is available.", @@ -18445,17 +18604,12 @@ "Troubleshoot Issue...", "Stop Troubleshoot Issue" ], - "vs/workbench/contrib/preferences/browser/keybindingsEditorContribution": [ - "You won't be able to produce this key combination under your current keyboard layout.", - "**{0}** for your current keyboard layout (**{1}** for US standard).", - "**{0}** for your current keyboard layout." - ], "vs/workbench/contrib/preferences/browser/preferences.contribution": [ "Settings Editor 2", "Keybindings Editor", "Open Settings (UI)", "Open User Settings (JSON)", - "Open Current Profile Settings (JSON)", + "Open Application Settings (JSON)", "Preferences", "Settings", "&&Settings", @@ -18463,7 +18617,6 @@ "Open User Settings", "Open Default Settings (JSON)", "Open Settings (JSON)", - "Open Settings (JSON)", "Open Workspace Settings", "Open Accessibility Settings", "Open Workspace Settings (JSON)", @@ -18498,12 +18651,6 @@ "Define Keybinding", "&&Preferences" ], - "vs/workbench/contrib/performance/browser/performance.contribution": [ - "Startup Performance", - "Print Service Cycles", - "Print Service Traces", - "Print Emitter Profiles" - ], "vs/workbench/contrib/notebook/browser/notebook.contribution": [ "Settings for code editors used in notebooks. This can be used to customize most editor.* settings.", "Notebook", @@ -18526,6 +18673,7 @@ "Both toolbars.", "The insert actions don't appear anywhere.", "Control whether to render a global toolbar inside the notebook editor.", + "Experimental. Control whether to render notebook Sticky Scroll headers in the notebook editor.", "Control whether outputs action should be rendered in the output toolbar.", "Controls when the Markdown header folding arrow is shown.", "The folding controls are always visible.", @@ -18546,7 +18694,8 @@ "Experimental. Run a series of CodeActions for a notebook on save. CodeActions must be specified, the file must not be saved after delay, and the editor must not be shutting down. Example: `source.fixAll: true`", "Format a notebook cell upon execution. A formatter must be available.", "Control whether a confirmation prompt is required to delete a running cell.", - "Customize the Find Widget behavior for searching within notebook cells. When both markup source and markup preview are enabled, the Find Widget will search either the source code or preview based on the current state of the cell." + "Customize the Find Widget behavior for searching within notebook cells. When both markup source and markup preview are enabled, the Find Widget will search either the source code or preview based on the current state of the cell.", + "Enables the incremental saving of notebooks in Remote environment. When enabled, only the changes to the notebook are sent to the extension host, improving performance for large notebooks and slow network connections." ], "vs/workbench/contrib/chat/browser/chat.contribution": [ "Chat", @@ -18555,10 +18704,18 @@ "Controls the font weight in chat codeblocks.", "Controls whether lines should wrap in chat codeblocks.", "Controls the line height in pixels in chat codeblocks. Use 0 to compute the line height from the font size.", + "Use the chat view as the default mode. Displays the chat icon in the Activity Bar.", + "Use the quick question as the default mode. Displays the chat icon in the Title Bar.", + "Displays the chat icon in the Activity Bar and the Title Bar which open their respective chat modes.", + "Controls the default mode of the chat experience.", + "Controls the mode of quick question chat experience.", "Chat", "Chat", "Chat Accessible View" ], + "vs/workbench/contrib/inlineChat/browser/inlineChat.contribution": [ + "Inline Chat Accessible View" + ], "vs/workbench/contrib/interactive/browser/interactive.contribution": [ "Interactive Window", "Open Interactive Window", @@ -18584,26 +18741,17 @@ "Install Additional Test Extensions...", "Test Explorer" ], + "vs/workbench/contrib/preferences/browser/keybindingsEditorContribution": [ + "You won't be able to produce this key combination under your current keyboard layout.", + "**{0}** for your current keyboard layout (**{1}** for US standard).", + "**{0}** for your current keyboard layout." + ], "vs/workbench/contrib/logs/common/logs.contribution": [ "Set Default Log Level", "{0} (Remote)", "{0} (Remote)", "Show Window Log" ], - "vs/workbench/contrib/quickaccess/browser/quickAccess.contribution": [ - "Type '{0}' to get help on the actions you can take from here.", - "Show all Quick Access Providers", - "Type the name of a view, output channel or terminal to open.", - "Open View", - "Type the name of a command to run.", - "Show and Run Commands", - "&&Command Palette...", - "Show All Commands", - "&&Open View...", - "Go to &&Line/Column...", - "Command Palette...", - "Command Palette..." - ], "vs/workbench/contrib/files/browser/explorerViewlet": [ "View icon of the explorer view.", "View icon of the open editors view.", @@ -18620,6 +18768,20 @@ "You have not yet opened a folder.\n{0}\nOpening a folder will close all currently open editors. To keep them open, {1} instead.", "You have not yet opened a folder.\n{0}" ], + "vs/workbench/contrib/quickaccess/browser/quickAccess.contribution": [ + "Type '{0}' to get help on the actions you can take from here.", + "Show all Quick Access Providers", + "Type the name of a view, output channel or terminal to open.", + "Open View", + "Type the name of a command to run.", + "Show and Run Commands", + "&&Command Palette...", + "Show All Commands", + "&&Open View...", + "Go to &&Line/Column...", + "Command Palette...", + "Command Palette..." + ], "vs/workbench/contrib/files/browser/fileActions.contribution": [ "Copy Path", "Copy Relative Path", @@ -18783,26 +18945,6 @@ "File operation", "Controls if files that were part of a refactoring are saved automatically" ], - "vs/workbench/contrib/bulkEdit/browser/preview/bulkEdit.contribution": [ - "Another refactoring is being previewed.", - "Press 'Continue' to discard the previous refactoring and continue with the current refactoring.", - "&&Continue", - "Apply Refactoring", - "Refactor Preview", - "Discard Refactoring", - "Refactor Preview", - "Toggle Change", - "Refactor Preview", - "Group Changes By File", - "Refactor Preview", - "Group Changes By Type", - "Refactor Preview", - "Group Changes By Type", - "Refactor Preview", - "View icon of the refactor preview view.", - "Refactor Preview", - "Refactor Preview" - ], "vs/workbench/contrib/search/browser/search.contribution": [ "Search", "Search", @@ -18867,7 +19009,28 @@ "Controls whether search file decorations should use badges.", "Shows search results as a tree.", "Shows search results as a list.", - "Controls the default search result view mode." + "Controls the default search result view mode.", + "Show notebook editor rich content results for closed notebooks. Please refresh your search results after changing this setting." + ], + "vs/workbench/contrib/bulkEdit/browser/preview/bulkEdit.contribution": [ + "Another refactoring is being previewed.", + "Press 'Continue' to discard the previous refactoring and continue with the current refactoring.", + "&&Continue", + "Apply Refactoring", + "Refactor Preview", + "Discard Refactoring", + "Refactor Preview", + "Toggle Change", + "Refactor Preview", + "Group Changes By File", + "Refactor Preview", + "Group Changes By Type", + "Refactor Preview", + "Group Changes By Type", + "Refactor Preview", + "View icon of the refactor preview view.", + "Refactor Preview", + "Refactor Preview" ], "vs/workbench/contrib/searchEditor/browser/searchEditor.contribution": [ "Search Editor", @@ -19012,7 +19175,8 @@ "Source Control: Accept Input", "Source Control: View Next Commit", "Source Control: View Previous Commit", - "Open In Terminal" + "Open in External Terminal", + "Open in Integrated Terminal" ], "vs/workbench/contrib/debug/browser/debug.contribution": [ "Debug", @@ -19154,9 +19318,11 @@ "Icon color for the current breakpoint stack frame.", "Icon color for all breakpoint stack frames." ], - "vs/workbench/contrib/debug/browser/callStackEditorContribution": [ - "Background color for the highlight of line at the top stack frame position.", - "Background color for the highlight of line at focused stack frame position." + "vs/workbench/contrib/debug/browser/debugViewlet": [ + "Open &&Configurations", + "Select a workspace folder to create a launch.json file in or add it to the workspace config file", + "Debug Console", + "Start Additional Session" ], "vs/workbench/contrib/debug/browser/repl": [ "Filter (e.g. text, !exclude)", @@ -19174,12 +19340,6 @@ "Copy All", "Copy" ], - "vs/workbench/contrib/debug/browser/debugViewlet": [ - "Open &&Configurations", - "Select a workspace folder to create a launch.json file in or add it to the workspace config file", - "Debug Console", - "Start Additional Session" - ], "vs/workbench/contrib/markers/browser/markers.contribution": [ "View icon of the markers view.", "&&Problems", @@ -19220,10 +19380,11 @@ "10K+", "Total {0} Problems" ], - "vs/workbench/contrib/mergeEditor/browser/mergeEditor.contribution": [ - "Merge Editor", - "Uses the legacy diffing algorithm.", - "Uses the advanced diffing algorithm." + "vs/workbench/contrib/performance/browser/performance.contribution": [ + "Startup Performance", + "Print Service Cycles", + "Print Service Traces", + "Print Emitter Profiles" ], "vs/workbench/contrib/commands/common/commands.contribution": [ "Run Commands", @@ -19232,6 +19393,10 @@ "'runCommands' has received an argument with incorrect type. Please, review the argument passed to the command.", "'runCommands' has not received commands to run. Did you forget to pass commands in the 'runCommands' argument?" ], + "vs/workbench/contrib/debug/browser/callStackEditorContribution": [ + "Background color for the highlight of line at the top stack frame position.", + "Background color for the highlight of line at focused stack frame position." + ], "vs/workbench/contrib/comments/browser/comments.contribution": [ "Comments", "Controls when the comments panel should open.", @@ -19257,46 +19422,10 @@ "vs/workbench/contrib/webviewPanel/browser/webviewPanel.contribution": [ "webview editor" ], - "vs/workbench/contrib/extensions/browser/extensionsViewlet": [ - "Remote", - "Installed", - "Install Local Extensions in '{0}'...", - "Install Remote Extensions Locally...", - "Popular", - "Recommended", - "Enabled", - "Disabled", - "Marketplace", - "Installed", - "Recently Updated", - "Enabled", - "Disabled", - "Available Updates", - "Builtin", - "Workspace Unsupported", - "Workspace Recommendations", - "Other Recommendations", - "Features", - "Themes", - "Programming Languages", - "Disabled in Restricted Mode", - "Limited in Restricted Mode", - "Disabled in Virtual Workspaces", - "Limited in Virtual Workspaces", - "Deprecated", - "Search Extensions in Marketplace", - "1 extension found in the {0} section.", - "1 extension found.", - "{0} extensions found in the {1} section.", - "{0} extensions found.", - "Marketplace returned 'ECONNREFUSED'. Please check the 'http.proxy' setting.", - "Open User Settings", - "{0} requires update", - "{0} require update", - "{0} requires reload", - "{0} require reload", - "We have uninstalled '{0}' which was reported to be problematic.", - "Reload Now" + "vs/workbench/contrib/mergeEditor/browser/mergeEditor.contribution": [ + "Merge Editor", + "Uses the legacy diffing algorithm.", + "Uses the advanced diffing algorithm." ], "vs/workbench/contrib/extensions/browser/extensions.contribution": [ "Press Enter to manage extensions.", @@ -19419,6 +19548,7 @@ "Copy Extension ID", "Extension Settings", "Extension Keyboard Shortcuts", + "Apply Extension to all Profiles", "Sync This Extension", "Ignore Recommendation", "Undo Ignored Recommendation", @@ -19434,6 +19564,47 @@ "Extensions", "Extensions" ], + "vs/workbench/contrib/extensions/browser/extensionsViewlet": [ + "Remote", + "Installed", + "Install Local Extensions in '{0}'...", + "Install Remote Extensions Locally...", + "Popular", + "Recommended", + "Enabled", + "Disabled", + "Marketplace", + "Installed", + "Recently Updated", + "Enabled", + "Disabled", + "Available Updates", + "Builtin", + "Workspace Unsupported", + "Workspace Recommendations", + "Other Recommendations", + "Features", + "Themes", + "Programming Languages", + "Disabled in Restricted Mode", + "Limited in Restricted Mode", + "Disabled in Virtual Workspaces", + "Limited in Virtual Workspaces", + "Deprecated", + "Search Extensions in Marketplace", + "1 extension found in the {0} section.", + "1 extension found.", + "{0} extensions found in the {1} section.", + "{0} extensions found.", + "Marketplace returned 'ECONNREFUSED'. Please check the 'http.proxy' setting.", + "Open User Settings", + "{0} requires update", + "{0} require update", + "{0} requires reload", + "{0} require reload", + "We have uninstalled '{0}' which was reported to be problematic.", + "Reload Now" + ], "vs/workbench/contrib/output/browser/output.contribution": [ "View icon of the output view.", "Output", @@ -19460,6 +19631,12 @@ "Output", "Enable/disable the ability of smart scrolling in the output view. Smart scrolling allows you to lock scrolling automatically when you click in the output view and unlocks when you click in the last line." ], + "vs/workbench/contrib/output/browser/outputView": [ + "{0} - Output", + "Output channel for '{0}'", + "Output", + "Output panel" + ], "vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution": [ "Open in Integrated Terminal", "Open in External Terminal", @@ -19498,6 +19675,7 @@ "Configure Default Build Task", "Configure Default Test Task", "Open User Tasks", + "User Tasks", "Type the name of a task to run.", "Run Task", "Tasks", @@ -19583,12 +19761,6 @@ "User snippet configuration", "A list of language names to which this snippet applies, e.g. 'typescript,javascript'." ], - "vs/workbench/contrib/output/browser/outputView": [ - "{0} - Output", - "Output channel for '{0}'", - "Output", - "Output panel" - ], "vs/workbench/contrib/folding/browser/folding.contribution": [ "All", "All active folding range providers", @@ -19668,18 +19840,18 @@ "vs/workbench/contrib/surveys/browser/nps.contribution": [ "Do you mind taking a quick feedback survey?", "Take Survey", - "Remind Me later", + "Remind Me Later", "Don't Show Again" ], "vs/workbench/contrib/surveys/browser/ces.contribution": [ "Got a moment to help the VS Code team? Please tell us about your experience with VS Code so far.", "Give Feedback", - "Remind Me later" + "Remind Me Later" ], "vs/workbench/contrib/surveys/browser/languageSurveys.contribution": [ "Help us improve our support for {0}", "Take Short Survey", - "Remind Me later", + "Remind Me Later", "Don't Show Again" ], "vs/workbench/contrib/welcomeGettingStarted/browser/gettingStarted.contribution": [ @@ -19973,9 +20145,9 @@ "Plays a sound when a task fails (non-zero exit code).", "Plays a sound when a terminal command fails (non-zero exit code).", "Plays a sound when terminal Quick Fixes are available.", - "Plays a sound when the focus moves to an inserted line in diff review mode or to the next/previous change", - "Plays a sound when the focus moves to a deleted line in diff review mode or to the next/previous change", - "Plays a sound when the focus moves to a modified line in diff review mode or to the next/previous change", + "Plays a sound when the focus moves to an inserted line in accessible diff viewer mode or to the next/previous change", + "Plays a sound when the focus moves to a deleted line in accessible diff viewer mode or to the next/previous change", + "Plays a sound when the focus moves to a modified line in accessible diff viewer mode or to the next/previous change", "Plays a sound when a notebook cell execution is successfully completed.", "Plays a sound when a notebook cell execution fails.", "Plays a sound when a chat request is made.", @@ -19990,7 +20162,9 @@ ], "vs/workbench/contrib/accessibility/browser/accessibility.contribution": [ "editor accessibility help", - "Hover Accessible View" + "Hover Accessible View", + "{0} Source: {1}", + "Notification Accessible View" ], "vs/workbench/contrib/share/browser/share.contribution": [ "Share...", @@ -20001,6 +20175,16 @@ "Open Link", "Controls whether to render the Share action next to the command center when {0} is {1}." ], + "vs/workbench/browser/parts/dialogs/dialogHandler": [ + "Version: {0}\nCommit: {1}\nDate: {2}\nBrowser: {3}", + "&&Copy", + "OK" + ], + "vs/workbench/electron-sandbox/parts/dialogs/dialogHandler": [ + "Version: {0}\nCommit: {1}\nDate: {2}\nElectron: {3}\nElectronBuildId: {4}\nChromium: {5}\nNode.js: {6}\nV8: {7}\nOS: {8}", + "&&Copy", + "OK" + ], "vs/platform/configuration/common/configurationRegistry": [ "Default Language Configuration Overrides", "Configure settings to be overridden for the {0} language.", @@ -20119,17 +20303,10 @@ "vs/workbench/common/configuration": [ "Application", "Workbench", - "Security" - ], - "vs/workbench/browser/parts/dialogs/dialogHandler": [ - "Version: {0}\nCommit: {1}\nDate: {2}\nBrowser: {3}", - "&&Copy", - "OK" - ], - "vs/workbench/electron-sandbox/parts/dialogs/dialogHandler": [ - "Version: {0}\nCommit: {1}\nDate: {2}\nElectron: {3}\nElectronBuildId: {4}\nChromium: {5}\nNode.js: {6}\nV8: {7}\nOS: {8}", - "&&Copy", - "OK" + "Security", + "UNC host names must not contain backslashes.", + "A set of UNC host names (without leading or trailing backslash, for example `192.168.0.1` or `my-server`) to allow without user confirmation. If a UNC host is being accessed that is not allowed via this setting or has not been acknowledged via user confirmation, an error will occur and the operation stopped. A restart is required when changing this setting. Find out more about this setting at https://aka.ms/vscode-windows-unc.", + "If enabled, only allows access to UNC host names that are allowed by the `#security.allowedUNCHosts#` setting or after user confirmation. Find out more about this setting at https://aka.ms/vscode-windows-unc." ], "vs/workbench/services/textfile/browser/textFileService": [ "File Created", @@ -20498,9 +20675,6 @@ "The color used for the border of the window when it is active. Only supported in the macOS and Linux desktop client when using the custom title bar.", "The color used for the border of the window when it is inactive. Only supported in the macOS and Linux desktop client when using the custom title bar." ], - "vs/base/common/actions": [ - "(empty)" - ], "vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService": [ "Save", "Save Workspace", @@ -20544,8 +20718,10 @@ "Contains extensions which are not supported.", "'{0}' contains extensions which are not supported in {1}." ], + "vs/base/common/actions": [ + "(empty)" + ], "vs/workbench/services/extensionManagement/electron-sandbox/remoteExtensionManagementService": [ - "Can't install pre-release version of '{0}' extension because it is not compatible with the current version of {1} (version {2}).", "Can't install release version of '{0}' extension because it has no release version.", "Can't install '{0}' extension because it is not compatible with the current version of {1} (version {2})." ], @@ -20599,66 +20775,6 @@ "Open Logs Folder", "Open Extension Logs Folder" ], - "vs/workbench/contrib/localization/electron-sandbox/minimalTranslations": [ - "Search language packs in the Marketplace to change the display language to {0}.", - "Search Marketplace", - "Install language pack to change the display language to {0}.", - "Install and Restart" - ], - "vs/workbench/contrib/localization/common/localization.contribution": [ - "Contributes localizations to the editor", - "Id of the language into which the display strings are translated.", - "Name of the language in English.", - "Name of the language in contributed language.", - "List of translations associated to the language.", - "Id of VS Code or Extension for which this translation is contributed to. Id of VS Code is always `vscode` and of extension should be in format `publisherId.extensionName`.", - "Id should be `vscode` or in format `publisherId.extensionName` for translating VS code or an extension respectively.", - "A relative path to a file containing translations for the language." - ], - "vs/editor/common/editorContextKeys": [ - "Whether the editor text has focus (cursor is blinking)", - "Whether the editor or an editor widget has focus (e.g. focus is in the find widget)", - "Whether an editor or a rich text input has focus (cursor is blinking)", - "Whether the editor is read-only", - "Whether the context is a diff editor", - "Whether the context is an embedded diff editor", - "Whether `editor.columnSelection` is enabled", - "Whether the editor has text selected", - "Whether the editor has multiple selections", - "Whether `Tab` will move focus out of the editor", - "Whether the editor hover is visible", - "Whether the editor hover is focused", - "Whether the sticky scroll is focused", - "Whether the sticky scroll is visible", - "Whether the standalone color picker is visible", - "Whether the standalone color picker is focused", - "Whether the editor is part of a larger editor (e.g. notebooks)", - "The language identifier of the editor", - "Whether the editor has a completion item provider", - "Whether the editor has a code actions provider", - "Whether the editor has a code lens provider", - "Whether the editor has a definition provider", - "Whether the editor has a declaration provider", - "Whether the editor has an implementation provider", - "Whether the editor has a type definition provider", - "Whether the editor has a hover provider", - "Whether the editor has a document highlight provider", - "Whether the editor has a document symbol provider", - "Whether the editor has a reference provider", - "Whether the editor has a rename provider", - "Whether the editor has a signature help provider", - "Whether the editor has an inline hints provider", - "Whether the editor has a document formatting provider", - "Whether the editor has a document selection formatting provider", - "Whether the editor has multiple document formatting providers", - "Whether the editor has multiple document selection formatting providers" - ], - "vs/workbench/common/editor": [ - "Text Editor", - "Built-in", - "Open Anyway", - "Configure Limit" - ], "vs/workbench/contrib/codeEditor/electron-sandbox/selectionClipboard": [ "Paste Selection Clipboard" ], @@ -20676,6 +20792,12 @@ "Save Extension Host Profile", "Save" ], + "vs/workbench/common/editor": [ + "Text Editor", + "Built-in", + "Open Anyway", + "Configure Limit" + ], "vs/workbench/contrib/extensions/electron-sandbox/debugExtensionHostAction": [ "Start Debugging Extension Host", "Profile Extensions", @@ -20737,6 +20859,35 @@ "Icon path when a light theme is used", "Icon path when a dark theme is used" ], + "vs/editor/common/languages": [ + "array", + "boolean", + "class", + "constant", + "constructor", + "enumeration", + "enumeration member", + "event", + "field", + "file", + "function", + "interface", + "key", + "method", + "module", + "namespace", + "null", + "number", + "object", + "operator", + "package", + "property", + "string", + "struct", + "type parameter", + "variable", + "{0} ({1})" + ], "vs/workbench/services/userDataSync/common/userDataSync": [ "Settings", "Keyboard Shortcuts", @@ -20758,11 +20909,6 @@ "A final restart is required to continue to use '{0}'. Again, thank you for your contribution.", "&&Restart" ], - "vs/workbench/contrib/tasks/common/tasks": [ - "Whether a task is currently running.", - "Tasks", - "Error: the task identifier '{0}' is missing the required property '{1}'. The task identifier will be ignored." - ], "vs/workbench/contrib/tasks/common/taskService": [ "Whether CustomExecution tasks are supported. Consider using in the when clause of a 'taskDefinition' contribution.", "Whether ShellExecution tasks are supported. Consider using in the when clause of a 'taskDefinition' contribution.", @@ -20770,11 +20916,104 @@ "Whether ProcessExecution tasks are supported. Consider using in the when clause of a 'taskDefinition' contribution.", "True when in the web with no remote authority." ], + "vs/workbench/contrib/tasks/browser/terminalTaskSystem": [ + "A unknown error has occurred while executing a task. See task output log for details.", + "There are issues with task \"{0}\". See the output for more details.", + "There is a dependency cycle. See task \"{0}\".", + "Couldn't resolve dependent task '{0}' in workspace folder '{1}'", + "Task {0} is a background task but uses a problem matcher without a background pattern", + "Executing task in folder {0}: {1}", + "Executing task: {0}", + "Executing task in folder {0}: {1}", + "Executing task: {0}", + "Executing task: {0}", + "Can't execute a shell command on an UNC drive using cmd.exe.", + "Problem matcher {0} can't be resolved. The matcher will be ignored", + "Press any key to close the terminal.", + "Terminal will be reused by tasks, press any key to close it." + ], + "vs/workbench/contrib/tasks/common/tasks": [ + "Whether a task is currently running.", + "Tasks", + "Error: the task identifier '{0}' is missing the required property '{1}'. The task identifier will be ignored." + ], "vs/workbench/common/views": [ "Default view icon.", "A view with id '{0}' is already registered", "No tree view with id '{0}' registered." ], + "vs/platform/audioCues/browser/audioCueService": [ + "Error on Line", + "Warning on Line", + "Folded Area on Line", + "Breakpoint on Line", + "Inline Suggestion on Line", + "Terminal Quick Fix", + "Debugger Stopped on Breakpoint", + "No Inlay Hints on Line", + "Task Completed", + "Task Failed", + "Terminal Command Failed", + "Terminal Bell", + "Notebook Cell Completed", + "Notebook Cell Failed", + "Diff Line Inserted", + "Diff Line Deleted", + "Diff Line Modified", + "Chat Request Sent", + "Chat Response Received", + "Chat Response Pending" + ], + "vs/workbench/contrib/terminal/common/terminalContextKey": [ + "Whether the terminal is focused.", + "Whether any terminal is focused, including detached terminals used in other UI.", + "Whether the terminal accessible buffer is focused.", + "Whether a terminal in the editor area is focused.", + "The current number of terminals.", + "Whether the terminal tabs widget is focused.", + "The shell type of the active terminal, this is set to the last known value when no terminals exist.", + "Whether the terminal's alt buffer is active.", + "Whether the terminal's suggest widget is visible.", + "Whether the terminal view is showing", + "Whether text is selected in the active terminal.", + "Whether text is selected in a focused terminal.", + "Whether terminal processes can be launched in the current workspace.", + "Whether one terminal is selected in the terminal tabs list.", + "Whether the focused tab's terminal is a split terminal.", + "Whether the terminal run command picker is currently open.", + "Whether shell integration is enabled in the active terminal" + ], + "vs/workbench/contrib/localHistory/electron-sandbox/localHistoryCommands": [ + "Reveal in File Explorer", + "Reveal in Finder", + "Open Containing Folder" + ], + "vs/workbench/contrib/webview/electron-sandbox/webviewCommands": [ + "Open Webview Developer Tools", + "Using standard dev tools to debug iframe based webview" + ], + "vs/workbench/contrib/mergeEditor/electron-sandbox/devCommands": [ + "Merge Editor (Dev)", + "Open Merge Editor State from JSON", + "Enter JSON", + "Open Selection In Temporary Merge Editor" + ], + "vs/workbench/contrib/localization/common/localization.contribution": [ + "Contributes localizations to the editor", + "Id of the language into which the display strings are translated.", + "Name of the language in English.", + "Name of the language in contributed language.", + "List of translations associated to the language.", + "Id of VS Code or Extension for which this translation is contributed to. Id of VS Code is always `vscode` and of extension should be in format `publisherId.extensionName`.", + "Id should be `vscode` or in format `publisherId.extensionName` for translating VS code or an extension respectively.", + "A relative path to a file containing translations for the language." + ], + "vs/workbench/contrib/localization/electron-sandbox/minimalTranslations": [ + "Search language packs in the Marketplace to change the display language to {0}.", + "Search Marketplace", + "Install language pack to change the display language to {0}.", + "Install and Restart" + ], "vs/workbench/contrib/tasks/browser/abstractTaskService": [ "Configure Task", "Tasks", @@ -20841,101 +21080,68 @@ "Fetching test tasks...", "Select the test task to run", "No test task to run found. Configure Tasks...", - "Select a task to terminate", - "No task is currently running", - "All Running Tasks", - "The launched process doesn't exist anymore. If the task spawned background tasks exiting VS Code might result in orphaned processes.", - "Failed to terminate running task", - "Select the task to restart", - "No task to restart", - "Select a Task Template", - "User", - "Create tasks.json file from template", - "Open tasks.json file", - "Select a task to configure", - "{0} is already marked as the default build task", - "Select a task to configure", - "Select the task to be used as the default build task", - "{0} is already marked as the default test task.", - "Select the task to be used as the default test task", - "Select the task to show its output", - "No task is running", - "The deprecated tasks version 0.1.0 has been removed. Your tasks have been upgraded to version 2.0.0. Open the diff to review the upgrade.", - "The deprecated tasks version 0.1.0 has been removed. Your tasks have been upgraded to version 2.0.0. Open the diffs to review the upgrade.", - "Open diff", - "Open diffs" - ], - "vs/workbench/contrib/tasks/browser/terminalTaskSystem": [ - "A unknown error has occurred while executing a task. See task output log for details.", - "There are issues with task \"{0}\". See the output for more details.", - "There is a dependency cycle. See task \"{0}\".", - "Couldn't resolve dependent task '{0}' in workspace folder '{1}'", - "Task {0} is a background task but uses a problem matcher without a background pattern", - "Executing task in folder {0}: {1}", - "Executing task: {0}", - "Executing task in folder {0}: {1}", - "Executing task: {0}", - "Executing task: {0}", - "Can't execute a shell command on an UNC drive using cmd.exe.", - "Problem matcher {0} can't be resolved. The matcher will be ignored", - "Press any key to close the terminal.", - "Terminal will be reused by tasks, press any key to close it." - ], - "vs/platform/audioCues/browser/audioCueService": [ - "Error on Line", - "Warning on Line", - "Folded Area on Line", - "Breakpoint on Line", - "Inline Suggestion on Line", - "Terminal Quick Fix", - "Debugger Stopped on Breakpoint", - "No Inlay Hints on Line", - "Task Completed", - "Task Failed", - "Terminal Command Failed", - "Terminal Bell", - "Notebook Cell Completed", - "Notebook Cell Failed", - "Diff Line Inserted", - "Diff Line Deleted", - "Diff Line Modified", - "Chat Request Sent", - "Chat Response Received", - "Chat Response Pending" - ], - "vs/workbench/contrib/terminal/common/terminalContextKey": [ - "Whether the terminal is focused.", - "Whether any terminal is focused, including detached terminals used in other UI.", - "Whether the terminal accessible buffer is focused.", - "Whether a terminal in the editor area is focused.", - "The current number of terminals.", - "Whether the terminal tabs widget is focused.", - "The shell type of the active terminal, this is set to the last known value when no terminals exist.", - "Whether the terminal's alt buffer is active.", - "Whether the terminal's suggest widget is visible.", - "Whether the terminal view is showing", - "Whether text is selected in the active terminal.", - "Whether text is selected in a focused terminal.", - "Whether terminal processes can be launched in the current workspace.", - "Whether one terminal is selected in the terminal tabs list.", - "Whether the focused tab's terminal is a split terminal.", - "Whether the terminal run command picker is currently open.", - "Whether shell integration is enabled in the active terminal" - ], - "vs/workbench/contrib/webview/electron-sandbox/webviewCommands": [ - "Open Webview Developer Tools", - "Using standard dev tools to debug iframe based webview" - ], - "vs/workbench/contrib/localHistory/electron-sandbox/localHistoryCommands": [ - "Reveal in File Explorer", - "Reveal in Finder", - "Open Containing Folder" + "Select a task to terminate", + "No task is currently running", + "All Running Tasks", + "The launched process doesn't exist anymore. If the task spawned background tasks exiting VS Code might result in orphaned processes.", + "Failed to terminate running task", + "Select the task to restart", + "No task to restart", + "Select a Task Template", + "User", + "Create tasks.json file from template", + "Open tasks.json file", + "Select a task to configure", + "{0} is already marked as the default build task", + "Select a task to configure", + "Select the task to be used as the default build task", + "{0} is already marked as the default test task.", + "Select the task to be used as the default test task", + "Select the task to show its output", + "No task is running", + "The deprecated tasks version 0.1.0 has been removed. Your tasks have been upgraded to version 2.0.0. Open the diff to review the upgrade.", + "The deprecated tasks version 0.1.0 has been removed. Your tasks have been upgraded to version 2.0.0. Open the diffs to review the upgrade.", + "Open diff", + "Open diffs" ], - "vs/workbench/contrib/mergeEditor/electron-sandbox/devCommands": [ - "Merge Editor (Dev)", - "Open Merge Editor State from JSON", - "Enter JSON", - "Open Selection In Temporary Merge Editor" + "vs/editor/common/editorContextKeys": [ + "Whether the editor text has focus (cursor is blinking)", + "Whether the editor or an editor widget has focus (e.g. focus is in the find widget)", + "Whether an editor or a rich text input has focus (cursor is blinking)", + "Whether the editor is read-only", + "Whether the context is a diff editor", + "Whether the context is an embedded diff editor", + "Whether the accessible diff viewer is visible", + "Whether `editor.columnSelection` is enabled", + "Whether the editor has text selected", + "Whether the editor has multiple selections", + "Whether `Tab` will move focus out of the editor", + "Whether the editor hover is visible", + "Whether the editor hover is focused", + "Whether the sticky scroll is focused", + "Whether the sticky scroll is visible", + "Whether the standalone color picker is visible", + "Whether the standalone color picker is focused", + "Whether the editor is part of a larger editor (e.g. notebooks)", + "The language identifier of the editor", + "Whether the editor has a completion item provider", + "Whether the editor has a code actions provider", + "Whether the editor has a code lens provider", + "Whether the editor has a definition provider", + "Whether the editor has a declaration provider", + "Whether the editor has an implementation provider", + "Whether the editor has a type definition provider", + "Whether the editor has a hover provider", + "Whether the editor has a document highlight provider", + "Whether the editor has a document symbol provider", + "Whether the editor has a reference provider", + "Whether the editor has a rename provider", + "Whether the editor has a signature help provider", + "Whether the editor has an inline hints provider", + "Whether the editor has a document formatting provider", + "Whether the editor has a document selection formatting provider", + "Whether the editor has multiple document formatting providers", + "Whether the editor has multiple document selection formatting providers" ], "vs/workbench/api/common/extHostExtensionService": [ "Cannot load test runner.", @@ -20950,6 +21156,10 @@ "vs/workbench/api/common/extHostTerminalService": [ "Could not find the terminal with id {0} on the extension host" ], + "vs/workbench/api/common/extHostTunnelService": [ + "Private", + "Public" + ], "vs/workbench/api/common/extHostLogService": [ "Extension Host (Remote)", "Extension Host (Worker)", @@ -20964,9 +21174,8 @@ "vs/workbench/api/node/extHostDebugService": [ "Debug Process" ], - "vs/workbench/api/node/extHostTunnelService": [ - "Private", - "Public" + "vs/base/browser/ui/button/button": [ + "More Actions..." ], "vs/platform/dialogs/electron-main/dialogMainService": [ "Open", @@ -21017,14 +21226,6 @@ "Unable to uninstall the shell command '{0}'.", "Unable to find shell script in '{0}'" ], - "vs/platform/workspaces/electron-main/workspacesHistoryMainService": [ - "New Window", - "Opens a new window", - "Recent Folders & Workspaces", - "Recent Folders", - "Untitled (Workspace)", - "{0} (Workspace)" - ], "vs/platform/windows/electron-main/windowsMainService": [ "&&OK", "Path does not exist", @@ -21038,6 +21239,14 @@ "The path '{0}' uses a host that is not allowed. Unless you trust the host, you should press 'Cancel'", "Permanently allow host '{0}'" ], + "vs/platform/workspaces/electron-main/workspacesHistoryMainService": [ + "New Window", + "Opens a new window", + "Recent Folders & Workspaces", + "Recent Folders", + "Untitled (Workspace)", + "{0} (Workspace)" + ], "vs/platform/workspaces/electron-main/workspacesManagementMainService": [ "&&OK", "Unable to save workspace '{0}'", @@ -21046,6 +21255,22 @@ "vs/platform/files/common/io": [ "File is too large to open" ], + "vs/base/browser/ui/tree/abstractTree": [ + "Filter", + "Fuzzy Match", + "Type to filter", + "Type to search", + "Type to search", + "Close", + "No elements found." + ], + "vs/platform/theme/common/iconRegistry": [ + "The id of the font to use. If not set, the font that is defined first is used.", + "The font character associated with the icon definition.", + "Icon for the close action in widgets.", + "Icon for goto previous editor location.", + "Icon for goto next editor location." + ], "vs/platform/extensions/common/extensionValidator": [ "property publisher must be of type `string`.", "property `{0}` is mandatory and must be of type `string`", @@ -21088,8 +21313,8 @@ "vs/platform/extensionManagement/common/abstractExtensionManagementService": [ "Marketplace is not enabled", "Can't install '{0}' extension since it was reported to be problematic.", + "Can't install '{0}' extension since it was deprecated and the replacement extension '{1}' can't be found.", "The '{0}' extension is not available in {1} for {2}.", - "Can't install pre-release version of '{0}' extension because it is not compatible with the current version of {1} (version {2}).", "Can't install release version of '{0}' extension because it has no release version.", "Can't install '{0}' extension because it is not compatible with the current version of {1} (version {2}).", "Cannot uninstall '{0}' extension. '{1}' extension depends on this.", @@ -21102,9 +21327,6 @@ "vs/platform/extensionManagement/node/extensionManagementUtil": [ "VSIX invalid: package.json is not a JSON file." ], - "vs/base/browser/ui/button/button": [ - "More Actions..." - ], "vs/base/common/date": [ "in {0}", "now", @@ -21181,33 +21403,11 @@ "Cannot sync because current session is expired", "Cannot sync because syncing is turned off on this machine from another machine." ], - "vs/base/browser/ui/tree/abstractTree": [ - "Filter", - "Fuzzy Match", - "Type to filter", - "Type to search", - "Type to search", - "Close", - "No elements found." - ], - "vs/platform/theme/common/iconRegistry": [ - "The id of the font to use. If not set, the font that is defined first is used.", - "The font character associated with the icon definition.", - "Icon for the close action in widgets.", - "Icon for goto previous editor location.", - "Icon for goto next editor location." - ], "vs/workbench/browser/parts/notifications/notificationsAlerts": [ "Error: {0}", "Warning: {0}", "Info: {0}" ], - "vs/workbench/browser/parts/notifications/notificationsCenter": [ - "No new notifications", - "Notifications", - "Notification Center Actions", - "Notifications Center" - ], "vs/workbench/browser/parts/notifications/notificationsStatus": [ "Notifications", "Notifications", @@ -21223,6 +21423,16 @@ "{0} New Notifications ({1} in progress)", "Status Message" ], + "vs/workbench/browser/parts/notifications/notificationsCenter": [ + "No new notifications", + "Notifications", + "Notification Center Actions", + "Notifications Center" + ], + "vs/workbench/browser/parts/notifications/notificationsToasts": [ + "{0}, notification", + "{0}, source: {1}, notification" + ], "vs/workbench/browser/parts/notifications/notificationsCommands": [ "Notifications", "Show Notifications", @@ -21232,16 +21442,13 @@ "Toggle Do Not Disturb Mode", "Focus Notification Toast" ], - "vs/workbench/browser/parts/notifications/notificationsToasts": [ - "{0}, notification", - "{0}, source: {1}, notification" - ], "vs/platform/actions/browser/menuEntryActionViewItem": [ "{0} ({1})", "{0} ({1})", "{0}\n[{1}] {2}" ], "vs/workbench/services/configuration/common/configurationEditing": [ + "Error while writing to {0}. {1}", "Open Tasks Configuration", "Open Launch Configuration", "Open Settings", @@ -21284,6 +21491,15 @@ "Workspace Settings", "Folder Settings" ], + "vs/editor/browser/coreCommands": [ + "Stick to the end even when going to longer lines", + "Stick to the end even when going to longer lines", + "Removed secondary cursors" + ], + "vs/editor/browser/widget/codeEditorWidget": [ + "The number of cursors has been limited to {0}. Consider using [find and replace](https://code.visualstudio.com/docs/editor/codebasics#_find-and-replace) for larger changes or increase the editor multi cursor limit setting.", + "Increase Multi Cursor Limit" + ], "vs/editor/common/core/editorColorRegistry": [ "Background color for the highlight of line at the cursor position.", "Background color for the border around the line at the cursor position.", @@ -21294,9 +21510,23 @@ "Color of the editor cursor.", "The background color of the editor cursor. Allows customizing the color of a character overlapped by a block cursor.", "Color of whitespace characters in the editor.", + "Color of editor line numbers.", "Color of the editor indentation guides.", + "'editorIndentGuide.background' is deprecated. Use 'editorIndentGuide.background1' instead.", "Color of the active editor indentation guides.", - "Color of editor line numbers.", + "'editorIndentGuide.activeBackground' is deprecated. Use 'editorIndentGuide.activeBackground1' instead.", + "Color of the editor indentation guides (1).", + "Color of the editor indentation guides (2).", + "Color of the editor indentation guides (3).", + "Color of the editor indentation guides (4).", + "Color of the editor indentation guides (5).", + "Color of the editor indentation guides (6).", + "Color of the active editor indentation guides (1).", + "Color of the active editor indentation guides (2).", + "Color of the active editor indentation guides (3).", + "Color of the active editor indentation guides (4).", + "Color of the active editor indentation guides (5).", + "Color of the active editor indentation guides (6).", "Color of editor active line number", "Id is deprecated. Use 'editorLineNumber.activeForeground' instead.", "Color of editor active line number", @@ -21339,22 +21569,6 @@ "Border color used to highlight unicode characters.", "Background color used to highlight unicode characters." ], - "vs/platform/contextkey/common/scanner": [ - "Did you mean {0}?", - "Did you mean {0} or {1}?", - "Did you mean {0}, {1} or {2}?", - "Did you forget to open or close the quote?", - "Did you forget to escape the '/' (slash) character? Put two backslashes before it to escape, e.g., '\\\\/'." - ], - "vs/editor/browser/coreCommands": [ - "Stick to the end even when going to longer lines", - "Stick to the end even when going to longer lines", - "Removed secondary cursors" - ], - "vs/editor/browser/widget/codeEditorWidget": [ - "The number of cursors has been limited to {0}. Consider using [find and replace](https://code.visualstudio.com/docs/editor/codebasics#_find-and-replace) for larger changes or increase the editor multi cursor limit setting.", - "Increase Multi Cursor Limit" - ], "vs/editor/contrib/anchorSelect/browser/anchorSelect": [ "Selection Anchor", "Anchor set at {0}:{1}", @@ -21363,12 +21577,12 @@ "Select from Anchor to Cursor", "Cancel Selection Anchor" ], - "vs/editor/contrib/bracketMatching/browser/bracketMatching": [ - "Overview ruler marker color for matching brackets.", - "Go to Bracket", - "Select to Bracket", - "Remove Brackets", - "Go to &&Bracket" + "vs/platform/contextkey/common/scanner": [ + "Did you mean {0}?", + "Did you mean {0} or {1}?", + "Did you mean {0}, {1} or {2}?", + "Did you forget to open or close the quote?", + "Did you forget to escape the '/' (slash) character? Put two backslashes before it to escape, e.g., '\\\\/'." ], "vs/editor/browser/widget/diffEditorWidget": [ "Line decoration for inserts in the diff editor.", @@ -21377,6 +21591,13 @@ "Cannot compare files because one file is too large.", "Click to revert change" ], + "vs/editor/contrib/bracketMatching/browser/bracketMatching": [ + "Overview ruler marker color for matching brackets.", + "Go to Bracket", + "Select to Bracket", + "Remove Brackets", + "Go to &&Bracket" + ], "vs/editor/contrib/caretOperations/browser/caretOperations": [ "Move Selected Text Left", "Move Selected Text Right" @@ -21465,6 +21686,11 @@ "Replace", "&&Replace" ], + "vs/editor/contrib/fontZoom/browser/fontZoom": [ + "Editor Font Zoom In", + "Editor Font Zoom Out", + "Editor Font Zoom Reset" + ], "vs/editor/contrib/folding/browser/folding": [ "Unfold", "Unfold Recursively", @@ -21489,11 +21715,6 @@ "Format Document", "Format Selection" ], - "vs/editor/contrib/fontZoom/browser/fontZoom": [ - "Editor Font Zoom In", - "Editor Font Zoom Out", - "Editor Font Zoom Reset" - ], "vs/editor/contrib/gotoSymbol/browser/goToCommands": [ "Peek", "Definitions", @@ -21535,6 +21756,9 @@ "No results for '{0}'", "References" ], + "vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition": [ + "Click to show {0} definitions." + ], "vs/editor/contrib/gotoError/browser/gotoError": [ "Go to Next Problem (Error, Warning, Info)", "Icon for goto next marker.", @@ -21545,11 +21769,10 @@ "Go to Previous Problem in Files (Error, Warning, Info)", "Previous &&Problem" ], - "vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition": [ - "Click to show {0} definitions." - ], "vs/editor/contrib/hover/browser/hover": [ "Show or Focus Hover", + "Inspect this in the accessible view with {0}", + "Inspect this in the accessible view via the command Open Accessible View which is currently not triggerable via keybinding", "Show Definition Preview Hover", "Scroll Up Hover", "Scroll Down Hover", @@ -21558,8 +21781,7 @@ "Page Up Hover", "Page Down Hover", "Go To Top Hover", - "Go To Bottom Hover", - "Escape Focus Hover" + "Go To Bottom Hover" ], "vs/editor/contrib/indentation/browser/indentation": [ "Convert Indentation to Spaces", @@ -21752,10 +21974,12 @@ "You are in a pane of a diff editor.", "You are in a read-only code editor", "You are in a code editor", - "To configure the editor to be optimized for usage with a Screen Reader press Command+E now.", - "To configure the editor to be optimized for usage with a Screen Reader press Control+E now.", - "The editor is configured to be optimized for usage with a Screen Reader.", - "The editor is configured to never be optimized for usage with a Screen Reader", + "To configure the application to be optimized for usage with a Screen Reader press Command+E now.", + "To configure the application to be optimized for usage with a Screen Reader press Control+E now.", + "The application is configured to be optimized for usage with a Screen Reader.", + "The application is configured to never be optimized for usage with a Screen Reader", + "Screen Reader Optimized Mode enabled.", + "Screen Reader Optimized Mode disabled.", "Pressing Tab in the current editor will move focus to the next focusable element. Toggle this behavior by pressing {0}.", "Pressing Tab in the current editor will move focus to the next focusable element. The command {0} is currently not triggerable by a keybinding.", "Pressing Tab in the current editor will insert the tab character. Toggle this behavior by pressing {0}.", @@ -21843,20 +22067,6 @@ "'configuration.semanticTokenScopes.scopes' values must be an array of strings", "configuration.semanticTokenScopes.scopes': Problems parsing selector {0}." ], - "vs/workbench/api/browser/statusBarExtensionPoint": [ - "The identifier of the status bar entry. Must be unique within the extension. The same value must be used when calling the `vscode.window.createStatusBarItem(id, ...)`-API", - "The name of the entry, like 'Python Language Indicator', 'Git Status' etc. Try to keep the length of the name short, yet descriptive enough that users can understand what the status bar item is about.", - "The text to show for the entry. You can embed icons in the text by leveraging the `$()`-syntax, like 'Hello $(globe)!'", - "The tooltip text for the entry.", - "The command to execute when the status bar entry is clicked.", - "The alignment of the status bar entry.", - "The priority of the status bar entry. Higher value means the item should be shown more to the left.", - "Defines the role and aria label to be used when the status bar entry is focused.", - "The role of the status bar entry which defines how a screen reader interacts with it. More about aria roles can be found here https://w3c.github.io/aria/#widget_roles", - "The aria label of the status bar entry. Defaults to the entry's text.", - "Contributes items to the status bar.", - "Invalid status bar item contribution." - ], "vs/workbench/contrib/codeEditor/browser/languageConfigurationExtensionPoint": [ "Errors parsing {0}: {1}", "{0}: Invalid format, JSON object expected.", @@ -21922,6 +22132,20 @@ "Describes text to be appended after the new line and after the indentation.", "Describes the number of characters to remove from the new line's indentation." ], + "vs/workbench/api/browser/statusBarExtensionPoint": [ + "The identifier of the status bar entry. Must be unique within the extension. The same value must be used when calling the `vscode.window.createStatusBarItem(id, ...)`-API", + "The name of the entry, like 'Python Language Indicator', 'Git Status' etc. Try to keep the length of the name short, yet descriptive enough that users can understand what the status bar item is about.", + "The text to show for the entry. You can embed icons in the text by leveraging the `$()`-syntax, like 'Hello $(globe)!'", + "The tooltip text for the entry.", + "The command to execute when the status bar entry is clicked.", + "The alignment of the status bar entry.", + "The priority of the status bar entry. Higher value means the item should be shown more to the left.", + "Defines the role and aria label to be used when the status bar entry is focused.", + "The role of the status bar entry which defines how a screen reader interacts with it. More about aria roles can be found here https://w3c.github.io/aria/#widget_roles", + "The aria label of the status bar entry. Defaults to the entry's text.", + "Contributes items to the status bar.", + "Invalid status bar item contribution." + ], "vs/workbench/api/browser/mainThreadCLICommands": [ "Cannot install the '{0}' extension because it is declared to not run in this setup." ], @@ -21960,9 +22184,6 @@ "Running 'File Write' participants...", "Reset choice for 'File operation needs preview'" ], - "vs/workbench/api/browser/mainThreadProgress": [ - "Manage Extension" - ], "vs/workbench/api/browser/mainThreadMessageService": [ "{0} (Extension)", "Extension", @@ -21970,6 +22191,9 @@ "Cancel", "&&OK" ], + "vs/workbench/api/browser/mainThreadProgress": [ + "Manage Extension" + ], "vs/workbench/api/browser/mainThreadSaveParticipant": [ "Aborted onWillSaveTextDocument-event after 1750ms" ], @@ -21996,10 +22220,6 @@ "vs/workbench/api/browser/mainThreadTask": [ "{0}: {1}" ], - "vs/workbench/api/browser/mainThreadTunnelService": [ - "The extension {0} has forwarded port {1}. You'll need to run as superuser to use port {2} locally.", - "Use Port {0} as Sudo..." - ], "vs/workbench/api/browser/mainThreadAuthentication": [ "This account has not been used by any extensions.", "Cancel", @@ -22015,60 +22235,9 @@ "The extension '{0}' wants to sign in using {1}.", "&&Allow" ], - "vs/workbench/browser/parts/auxiliarybar/auxiliaryBarActions": [ - "Icon to toggle the auxiliary bar off in its right position.", - "Icon to toggle the auxiliary bar on in its right position.", - "Icon to toggle the auxiliary bar in its left position.", - "Icon to toggle the auxiliary bar on in its left position.", - "Toggle Secondary Side Bar Visibility", - "Secondary Side Bar", - "Secondary Si&&de Bar", - "Focus into Secondary Side Bar", - "Toggle Secondary Side Bar", - "Toggle Secondary Side Bar", - "Hide Secondary Side Bar" - ], - "vs/workbench/browser/parts/panel/panelActions": [ - "Icon to maximize a panel.", - "Icon to restore a panel.", - "Icon to close a panel.", - "Icon to toggle the panel off when it is on.", - "Icon to toggle the panel on when it is off.", - "Toggle Panel Visibility", - "Panel", - "&&Panel", - "Focus into Panel", - "Focus into Panel", - "Move Panel Left", - "Left", - "Move Panel Right", - "Right", - "Move Panel To Bottom", - "Bottom", - "Set Panel Alignment to Left", - "Left", - "Set Panel Alignment to Right", - "Right", - "Set Panel Alignment to Center", - "Center", - "Set Panel Alignment to Justify", - "Justify", - "Panel Position", - "Align Panel", - "Previous Panel View", - "Next Panel View", - "Toggle Maximized Panel", - "Maximize Panel Size", - "Restore Panel Size", - "Maximizing the panel is only supported when it is center aligned.", - "Close Panel", - "Close Secondary Side Bar", - "Toggle Panel", - "Hide Panel", - "Move Panel Views To Secondary Side Bar", - "Move Panel Views To Secondary Side Bar", - "Move Secondary Side Bar Views To Panel", - "Move Secondary Side Bar Views To Panel" + "vs/workbench/api/browser/mainThreadTunnelService": [ + "The extension {0} has forwarded port {1}. You'll need to run as superuser to use port {2} locally.", + "Use Port {0} as Sudo..." ], "vs/workbench/browser/quickaccess": [ "Whether keyboard focus is inside the quick open control" @@ -22153,15 +22322,6 @@ "The relative path to a folder containing localization (bundle.l10n.*.json) files. Must be specified if you are using the vscode.l10n API.", "API proposals that the respective extensions can freely use." ], - "vs/workbench/browser/parts/views/treeView": [ - "There is no data provider registered that can provide view data.", - "Whether the the tree view with id {0} enables collapse all.", - "Whether the tree view with id {0} enables refresh.", - "Refresh", - "Collapse All", - "Whether collapse all is toggled for the tree view with id {0}.", - "Error running command {1}: {0}. This is likely caused by the extension that contributes {1}." - ], "vs/workbench/browser/parts/views/viewPaneContainer": [ "Views", "Move View Up", @@ -22225,6 +22385,70 @@ "Configured debug type '{0}' is installed but not supported in this environment.", "Controls when the internal Debug Console should open." ], + "vs/workbench/browser/parts/views/treeView": [ + "There is no data provider registered that can provide view data.", + "Whether the the tree view with id {0} enables collapse all.", + "Whether the tree view with id {0} enables refresh.", + "Refresh", + "Collapse All", + "Whether collapse all is toggled for the tree view with id {0}.", + "Error running command {1}: {0}. This is likely caused by the extension that contributes {1}." + ], + "vs/workbench/contrib/remote/browser/remoteExplorer": [ + "Ports", + "1 forwarded port", + "{0} forwarded ports", + "No Ports Forwarded", + "Forwarded Ports: {0}", + "Forwarded Ports", + "Your application running on port {0} is available. ", + "[See all forwarded ports]({0})", + "You'll need to run as superuser to use port {0} locally. ", + "Make Public", + "Use Port {0} as Sudo..." + ], + "vs/workbench/browser/parts/panel/panelActions": [ + "Icon to maximize a panel.", + "Icon to restore a panel.", + "Icon to close a panel.", + "Icon to toggle the panel off when it is on.", + "Icon to toggle the panel on when it is off.", + "Toggle Panel Visibility", + "Panel", + "&&Panel", + "Focus into Panel", + "Focus into Panel", + "Move Panel Left", + "Left", + "Move Panel Right", + "Right", + "Move Panel To Bottom", + "Bottom", + "Set Panel Alignment to Left", + "Left", + "Set Panel Alignment to Right", + "Right", + "Set Panel Alignment to Center", + "Center", + "Set Panel Alignment to Justify", + "Justify", + "Panel Position", + "Align Panel", + "Previous Panel View", + "Next Panel View", + "Toggle Maximized Panel", + "Maximize Panel Size", + "Restore Panel Size", + "Maximizing the panel is only supported when it is center aligned.", + "Close Panel", + "Close Secondary Side Bar", + "Toggle Panel", + "Hide Panel", + "Move Panel Views To Secondary Side Bar", + "Move Panel Views To Secondary Side Bar", + "Move Secondary Side Bar Views To Panel", + "Move Secondary Side Bar Views To Panel" + ], "vs/workbench/contrib/files/common/files": [ "True when the EXPLORER viewlet is visible.", "True when the FOLDERS view (the file tree within the explorer view container) is visible.", @@ -22241,19 +22465,6 @@ "True when the focus is inside a compact item's last part in the EXPLORER view.", "True when a workspace in the EXPLORER view has some collapsible root child." ], - "vs/workbench/contrib/remote/browser/remoteExplorer": [ - "Ports", - "1 forwarded port", - "{0} forwarded ports", - "No Ports Forwarded", - "Forwarded Ports: {0}", - "Forwarded Ports", - "Your application running on port {0} is available. ", - "[See all forwarded ports]({0})", - "You'll need to run as superuser to use port {0} locally. ", - "Make Public", - "Use Port {0} as Sudo..." - ], "vs/workbench/common/editor/sideBySideEditorInput": [ "{0} - {1}" ], @@ -22263,6 +22474,19 @@ "vs/workbench/common/editor/diffEditorInput": [ "{0} ↔ {1}" ], + "vs/workbench/browser/parts/auxiliarybar/auxiliaryBarActions": [ + "Icon to toggle the auxiliary bar off in its right position.", + "Icon to toggle the auxiliary bar on in its right position.", + "Icon to toggle the auxiliary bar in its left position.", + "Icon to toggle the auxiliary bar on in its left position.", + "Toggle Secondary Side Bar Visibility", + "Secondary Side Bar", + "Secondary Si&&de Bar", + "Focus into Secondary Side Bar", + "Toggle Secondary Side Bar", + "Toggle Secondary Side Bar", + "Hide Secondary Side Bar" + ], "vs/workbench/browser/parts/editor/textDiffEditor": [ "Text Diff Editor", "At least one file is not displayed in the text compare editor because it is very large ({0}).", @@ -22451,14 +22675,6 @@ "Toggle Editor Type", "Reopen Editor With Text Editor" ], - "vs/editor/browser/editorExtensions": [ - "&&Undo", - "Undo", - "&&Redo", - "Redo", - "&&Select All", - "Select All" - ], "vs/workbench/browser/parts/editor/editorCommands": [ "Move the active editor by tabs or groups", "Active editor move argument", @@ -22479,13 +22695,13 @@ "Lock Editor Group", "Unlock Editor Group" ], - "vs/workbench/browser/parts/editor/editorConfiguration": [ - "Interactive Window", - "Markdown Preview", - "If an editor matching one of the listed types is opened as the first in an editor group and more than one group is open, the group is automatically locked. Locked groups will only be used for opening editors when explicitly chosen by a user gesture (for example drag and drop), but not by default. Consequently, the active editor in a locked group is less likely to be replaced accidentally with a different editor.", - "The default editor for files detected as binary. If undefined, the user will be presented with a picker.", - "Configure [glob patterns](https://aka.ms/vscode-glob-patterns) to editors (for example `\"*.hex\": \"hexEditor.hexedit\"`). These have precedence over the default behavior.", - "Controls the minimum size of a file in MB before asking for confirmation when opening in the editor. Note that this setting may not apply to all editor types and environments." + "vs/editor/browser/editorExtensions": [ + "&&Undo", + "Undo", + "&&Redo", + "Redo", + "&&Select All", + "Select All" ], "vs/workbench/browser/parts/editor/editorQuickAccess": [ "No matching editors", @@ -22494,6 +22710,14 @@ "{0}, unsaved changes", "Close Editor" ], + "vs/workbench/browser/parts/editor/editorConfiguration": [ + "Interactive Window", + "Markdown Preview", + "If an editor matching one of the listed types is opened as the first in an editor group and more than one group is open, the group is automatically locked. Locked groups will only be used for opening editors when explicitly chosen by a user gesture (for example drag and drop), but not by default. Consequently, the active editor in a locked group is less likely to be replaced accidentally with a different editor.", + "The default editor for files detected as binary. If undefined, the user will be presented with a picker.", + "Configure [glob patterns](https://aka.ms/vscode-glob-patterns) to editors (for example `\"*.hex\": \"hexEditor.hexedit\"`). These have precedence over the default behavior.", + "Controls the minimum size of a file in MB before asking for confirmation when opening in the editor. Note that this setting may not apply to all editor types and environments." + ], "vs/workbench/browser/parts/editor/accessibilityStatus": [ "Are you using a screen reader to operate VS Code?", "Yes", @@ -22501,24 +22725,6 @@ "Screen Reader Optimized", "Screen Reader Mode" ], - "vs/editor/browser/widget/diffEditorWidget2/diffEditorWidget2.contribution": [ - "Toggle Collapse Unchanged Regions", - "Show Unchanged Regions", - "Collapse Unchanged Regions", - "Toggle Show Moved Code Blocks", - "Show Moves" - ], - "vs/workbench/browser/parts/editor/editorGroupView": [ - "Empty editor group actions", - "{0} (empty)", - "Group {0}", - "Editor Group {0}" - ], - "vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart": [ - "Move Secondary Side Bar Left", - "Move Secondary Side Bar Right", - "Hide Secondary Side Bar" - ], "vs/workbench/browser/parts/activitybar/activitybarPart": [ "Settings icon in the view bar.", "Accounts icon in the view bar.", @@ -22533,6 +22739,19 @@ "Accounts", "Accounts" ], + "vs/editor/browser/widget/diffEditorWidget2/diffEditorWidget2.contribution": [ + "Toggle Collapse Unchanged Regions", + "Show Unchanged Regions", + "Collapse Unchanged Regions", + "Toggle Show Moved Code Blocks", + "Diff Editor", + "Switch Side" + ], + "vs/workbench/browser/parts/auxiliarybar/auxiliaryBarPart": [ + "Move Secondary Side Bar Left", + "Move Secondary Side Bar Right", + "Hide Secondary Side Bar" + ], "vs/workbench/browser/parts/panel/panelPart": [ "Reset Location", "Reset Location", @@ -22542,6 +22761,12 @@ "Align Panel", "Hide Panel" ], + "vs/workbench/browser/parts/editor/editorGroupView": [ + "Empty editor group actions", + "{0} (empty)", + "Group {0}", + "Editor Group {0}" + ], "vs/workbench/browser/parts/editor/editorDropTarget": [ "Hold __{0}__ to drop into editor" ], @@ -22656,6 +22881,21 @@ "Problems parsing file icons file: {0}", "Invalid format for file icons theme file: Object expected." ], + "vs/workbench/services/themes/common/colorThemeSchema": [ + "Colors and styles for the token.", + "Foreground color for the token.", + "Token background colors are currently not supported.", + "Font style of the rule: 'italic', 'bold', 'underline', 'strikethrough' or a combination. The empty string unsets inherited settings.", + "Font style must be 'italic', 'bold', 'underline', 'strikethrough' or a combination or the empty string.", + "None (clear inherited style)", + "Description of the rule.", + "Scope selector against which this rule matches.", + "Colors in the workbench", + "Path to a tmTheme file (relative to the current file).", + "Colors for syntax highlighting", + "Whether semantic highlighting should be enabled for this theme.", + "Colors for semantic tokens" + ], "vs/workbench/services/themes/common/themeExtensionPoints": [ "Contributes textmate color themes.", "Id of the color theme as used in the user settings.", @@ -22675,21 +22915,6 @@ "Expected string in `contributes.{0}.id`. Provided value: {1}", "Expected `contributes.{0}.path` ({1}) to be included inside extension's folder ({2}). This might make the extension non-portable." ], - "vs/workbench/services/themes/common/colorThemeSchema": [ - "Colors and styles for the token.", - "Foreground color for the token.", - "Token background colors are currently not supported.", - "Font style of the rule: 'italic', 'bold', 'underline', 'strikethrough' or a combination. The empty string unsets inherited settings.", - "Font style must be 'italic', 'bold', 'underline', 'strikethrough' or a combination or the empty string.", - "None (clear inherited style)", - "Description of the rule.", - "Scope selector against which this rule matches.", - "Colors in the workbench", - "Path to a tmTheme file (relative to the current file).", - "Colors for syntax highlighting", - "Whether semantic highlighting should be enabled for this theme.", - "Colors for semantic tokens" - ], "vs/workbench/services/themes/common/themeConfiguration": [ "Specifies the color theme used in the workbench.", "Theme is unknown or not installed.", @@ -22784,7 +23009,8 @@ "Keyboard Shortcuts" ], "vs/workbench/services/userDataProfile/browser/snippetsResource": [ - "Snippets" + "Snippets", + "Select Snippet {0}" ], "vs/workbench/services/userDataProfile/browser/tasksResource": [ "User Tasks" @@ -22792,6 +23018,7 @@ "vs/workbench/services/userDataProfile/browser/extensionsResource": [ "Extensions", "Disabled", + "Select {0} Extension", "Select {0} Extension" ], "vs/workbench/services/userDataProfile/browser/globalStateResource": [ @@ -22819,12 +23046,6 @@ "Invalid value in `contributes.{0}.tokenTypes`. Must be an object map from scope name to token type. Provided value: {1}", "Expected `contributes.{0}.path` ({1}) to be included inside extension's folder ({2}). This might make the extension non-portable." ], - "vs/workbench/contrib/preferences/browser/keybindingWidgets": [ - "Press desired key combination and then press ENTER.", - "1 existing command has this keybinding", - "{0} existing commands have this keybinding", - "chord to" - ], "vs/editor/contrib/suggest/browser/suggest": [ "Whether any suggestion is focused", "Whether suggestion details are visible", @@ -22835,11 +23056,6 @@ "Whether the default behaviour is to insert or replace", "Whether the current suggestion supports to resolve further details" ], - "vs/workbench/contrib/preferences/browser/preferencesActions": [ - "Configure Language Specific Settings...", - "({0})", - "Select Language" - ], "vs/workbench/contrib/preferences/browser/keybindingsEditor": [ "Record Keys", "Sort by Precedence (Highest first)", @@ -22875,6 +23091,11 @@ "No when context", "use space or enter to change the keybinding." ], + "vs/workbench/contrib/preferences/browser/preferencesActions": [ + "Configure Language Specific Settings...", + "({0})", + "Select Language" + ], "vs/workbench/contrib/preferences/browser/preferencesIcons": [ "Icon for the folder dropdown button in the split JSON Settings editor.", "Icon for the 'more actions' action in the Settings UI.", @@ -22910,9 +23131,6 @@ "Turn on Settings Sync", "Last synced: {0}" ], - "vs/workbench/contrib/performance/browser/perfviewEditor": [ - "Startup Performance" - ], "vs/workbench/contrib/notebook/browser/notebookEditor": [ "Cannot open resource with notebook editor type '{0}', please check if you have the right extension installed and enabled.", "Cannot open resource with notebook editor type '{0}', please check if you have the right extension installed and enabled.", @@ -22933,14 +23151,14 @@ "vs/workbench/contrib/notebook/browser/services/notebookExecutionServiceImpl": [ "Executing a notebook cell will run code from this workspace." ], + "vs/editor/common/languages/modesRegistry": [ + "Plain Text" + ], "vs/workbench/contrib/notebook/browser/services/notebookKeymapServiceImpl": [ "Disable other keymaps ({0}) to avoid conflicts between keybindings?", "Yes", "No" ], - "vs/editor/common/languages/modesRegistry": [ - "Plain Text" - ], "vs/workbench/contrib/comments/browser/commentReply": [ "Reply...", "Type a new comment", @@ -22958,19 +23176,17 @@ "Provide information about how to access the terminal accessibility help menu when the terminal is focused", "Provide information about how to navigate changes in the diff editor when it is focused", "Provide information about how to access the chat help menu when the chat input is focused", - "Provide information about how to access the inline editor chat accessibility help menu when the input is focused", + "Provide information about how to access the inline editor chat accessibility help menu and alert with hints which describe how to use the feature when the input is focused", "Provide information about how to change a keybinding in the keybindings editor when a row is focused", "Provide information about how to focus the cell container or inner editor when a notebook cell is focused.", + "Provide information about how to open the hover in an accessible view.", + "Provide information about how to open the notification in an accessible view.", "Open Accessibility Help", - "Open Accessible View" - ], - "vs/workbench/contrib/notebook/browser/controller/coreActions": [ - "Notebook", - "Insert Cell", - "Notebook Cell", - "Share" + "Open Accessible View", + "Show Next in Accessible View", + "Show Previous in Accessible View" ], - "vs/workbench/contrib/notebook/browser/notebookAccessibilityHelp": [ + "vs/workbench/contrib/notebook/browser/notebookAccessibility": [ "The notebook view is a collection of code and markdown cells. Code cells can be executed and will produce output directly below the cell.", "The Edit Cell command ({0}) will focus on the cell input.", "The Edit Cell command will focus on the cell input and is currently not triggerable by a keybinding.", @@ -22982,7 +23198,26 @@ "The Execute Cell command ({0}) executes the cell that currently has focus.", "The Execute Cell command executes the cell that currently has focus and is currently not triggerable by a keybinding.", "The Insert Cell Above/Below commands will create new empty code cells", - "The Change Cell to Code/Markdown commands are used to switch between cell types." + "The Change Cell to Code/Markdown commands are used to switch between cell types.", + "Notebook Cell Output Accessible View" + ], + "vs/workbench/contrib/accessibility/browser/accessibleView": [ + "\nPress H now to open a browser window with more information related to accessibility.\n", + "\nTo disable the `accessibility.verbosity` hint for this feature, press D now.\n", + "Exit this dialog via the Escape key.", + "{0} {1}", + "{0}", + "{0} accessibility verbosity is now disabled", + "Show the next {0} or previous {1} item in the accessible view", + "Show the next or previous item in the accessible view by configuring keybindings for Show Next / Previous in Accessible View", + "Inspect this in the accessible view with {0}", + "Inspect this in the accessible view via the command Open Accessible View which is currently not triggerable via keybinding" + ], + "vs/workbench/contrib/notebook/browser/controller/coreActions": [ + "Notebook", + "Insert Cell", + "Notebook Cell", + "Share" ], "vs/workbench/contrib/notebook/browser/controller/insertCellActions": [ "Insert Code Cell Above", @@ -23033,45 +23268,6 @@ "Go to Most Recently Failed Cell", "Go To" ], - "vs/workbench/contrib/notebook/browser/controller/editActions": [ - "Edit Cell", - "Stop Editing Cell", - "Delete Cell", - "Delete", - "This cell is running, are you sure you want to delete it?", - "Do not ask me again", - "Clear Cell Outputs", - "Clear All Outputs", - "Change Cell Language", - "Change Cell Language", - "({0}) - Current Language", - "({0})", - "Auto Detect", - "languages (identifier)", - "Select Language Mode", - "Accept Detected Language for Cell", - "Unable to detect cell language" - ], - "vs/workbench/contrib/notebook/browser/controller/layoutActions": [ - "Select between Notebook Layouts", - "Customize Notebook Layout", - "Customize Notebook Layout", - "Customize Notebook...", - "Toggle Notebook Line Numbers", - "Notebook Line Numbers", - "Toggle Cell Toolbar Position", - "Toggle Breadcrumbs", - "Save Mimetype Display Order", - "Settings file to save in", - "User Settings", - "Workspace Settings", - "Reset Notebook Webview" - ], - "vs/workbench/contrib/notebook/browser/controller/foldingController": [ - "Fold Cell", - "Unfold Cell", - "Fold Cell" - ], "vs/workbench/contrib/notebook/browser/contrib/clipboard/notebookClipboard": [ "Copy Cell", "Cut Cell", @@ -23089,6 +23285,24 @@ "Format Cell", "Format Cells" ], + "vs/workbench/contrib/notebook/browser/controller/layoutActions": [ + "Select between Notebook Layouts", + "Customize Notebook Layout", + "Customize Notebook Layout", + "Customize Notebook...", + "Toggle Notebook Line Numbers", + "Notebook Line Numbers", + "Toggle Cell Toolbar Position", + "Toggle Breadcrumbs", + "Save Mimetype Display Order", + "Settings file to save in", + "User Settings", + "Workspace Settings", + "Reset Notebook Webview" + ], + "vs/workbench/contrib/notebook/browser/contrib/gettingStarted/notebookGettingStarted": [ + "Reset notebook getting started" + ], "vs/workbench/contrib/notebook/browser/contrib/saveParticipants/saveParticipants": [ "Formatting", "Format Notebook", @@ -23100,28 +23314,10 @@ "vs/workbench/contrib/notebook/browser/contrib/layout/layoutActions": [ "Toggle Cell Toolbar Position" ], - "vs/workbench/contrib/notebook/browser/contrib/navigation/arrow": [ - "Focus Next Cell Editor", - "Focus Previous Cell Editor", - "Focus First Cell", - "Focus Last Cell", - "Focus In Active Cell Output", - "Focus Out Active Cell Output", - "Center Active Cell", - "Cell Cursor Page Up", - "Cell Cursor Page Up Select", - "Cell Cursor Page Down", - "Cell Cursor Page Down Select", - "When enabled cursor can navigate to the next/previous cell when the current cursor in the cell editor is at the first/last line." - ], "vs/workbench/contrib/notebook/browser/contrib/outline/notebookOutline": [ - "empty cell", "When enabled notebook outline shows code cells.", "When enabled notebook breadcrumbs contain code cells." ], - "vs/workbench/contrib/notebook/browser/contrib/gettingStarted/notebookGettingStarted": [ - "Reset notebook getting started" - ], "vs/workbench/contrib/notebook/browser/contrib/profile/notebookProfile": [ "Set Profile" ], @@ -23137,6 +23333,11 @@ "Use the links above to file an issue using the issue reporter.", "**Last Execution** {0}\n\n**Execution Time** {1}\n\n**Overhead Time** {2}\n\n**Render Times**\n\n{3}" ], + "vs/workbench/contrib/notebook/browser/controller/foldingController": [ + "Fold Cell", + "Unfold Cell", + "Fold Cell" + ], "vs/workbench/contrib/notebook/browser/contrib/editorStatusBar/editorStatusBar": [ "Notebook Kernel Info", "{0} (suggestion)", @@ -23170,6 +23371,20 @@ "Expand All Cell Outputs", "Toggle Scroll Cell Output" ], + "vs/workbench/contrib/notebook/browser/contrib/navigation/arrow": [ + "Focus Next Cell Editor", + "Focus Previous Cell Editor", + "Focus First Cell", + "Focus Last Cell", + "Focus In Active Cell Output", + "Focus Out Active Cell Output", + "Center Active Cell", + "Cell Cursor Page Up", + "Cell Cursor Page Up Select", + "Cell Cursor Page Down", + "Cell Cursor Page Down Select", + "When enabled cursor can navigate to the next/previous cell when the current cursor in the cell editor is at the first/last line." + ], "vs/workbench/contrib/notebook/browser/contrib/troubleshoot/layout": [ "Toggle Layout Troubleshoot", "Inspect Notebook Layout", @@ -23199,6 +23414,25 @@ "Delete", "Select a chat session to restore" ], + "vs/workbench/contrib/notebook/browser/controller/editActions": [ + "Edit Cell", + "Stop Editing Cell", + "Delete Cell", + "Delete", + "This cell is running, are you sure you want to delete it?", + "Do not ask me again", + "Clear Cell Outputs", + "Clear All Outputs", + "Change Cell Language", + "Change Cell Language", + "({0}) - Current Language", + "({0})", + "Auto Detect", + "languages (identifier)", + "Select Language Mode", + "Accept Detected Language for Cell", + "Unable to detect cell language" + ], "vs/workbench/contrib/chat/browser/actions/chatCodeblockActions": [ "Copy", "Insert at Cursor", @@ -23215,10 +23449,6 @@ "Submit", "Cancel" ], - "vs/workbench/contrib/chat/browser/actions/chatQuickInputActions": [ - "Ask Quick Question", - "Ask {0} a question..." - ], "vs/workbench/contrib/chat/browser/actions/chatTitleActions": [ "Helpful", "Unhelpful", @@ -23257,11 +23487,6 @@ "Clear", "Clear" ], - "vs/workbench/contrib/accessibility/browser/accessibleView": [ - "\nPress H now to open a browser window with more information related to accessibility.\n", - "\nTo disable the `accessibility.verbosity` hint for this feature, press D now.\n", - "Exit this menu via the Escape key." - ], "vs/workbench/contrib/chat/common/chatViewModel": [ "Thinking" ], @@ -23276,14 +23501,14 @@ "True when focus is in the chat widget, false otherwise.", "True when some chat provider has been registered." ], - "vs/workbench/contrib/chat/browser/contrib/chatInputEditorContrib": [ - "Ask a question or type '/' for topics", - "Ask a question" - ], "vs/workbench/contrib/chat/common/chatColors": [ "The background color of a chat request.", "The border color of a chat request." ], + "vs/workbench/contrib/chat/browser/contrib/chatInputEditorContrib": [ + "Ask a question or type '/' for topics", + "Ask a question" + ], "vs/workbench/contrib/inlineChat/browser/inlineChatController": [ "AI-generated code may be incorrect", "Getting ready...", @@ -23318,8 +23543,10 @@ "Discard to New File", "Helpful", "Unhelpful", - "Toggle Diff", - "Show Inline Diff", + "Show Diff", + "&&Show Diff", + "Show Diff", + "&&Show Diff", "Accept Changes", "Accept", "Cancel", @@ -23333,14 +23560,16 @@ "Whether a provider for interactive editors exists", "Whether the interactive editor input is visible", "Whether the interactive editor input is focused", + "Whether the interactive widget's response is focused", "Whether the interactive editor input is empty", "Whether the cursor of the iteractive editor input is on the first line", "Whether the cursor of the iteractive editor input is on the last line", + "Whether the cursor of the iteractive editor input is on the start of the input", + "Whether the cursor of the iteractive editor input is on the end of the input", "Whether the interactive editor message is cropped, not cropped or expanded", "Whether the cursor of the outer editor is above or below the interactive editor input", "Whether interactive editor has an active request", "Whether interactive editor has kept a session for quick restore", - "Whether interactive editor show diffs for changes", "What type was the last response of the current interactive editor session", "What type was the responses have been receieved", "Whether interactive editor did change any code", @@ -23360,7 +23589,8 @@ "Configure if changes crafted in the interactive editor are applied directly to the document or are previewed first.", "Changes are applied directly to the document and are highlighted visually via inline or side-by-side diffs. Ending a session will keep the changes.", "Changes are previewed only and need to be accepted via the apply button. Ending a session will discard the changes.", - "Changes are applied directly to the document but can be highlighted via inline diffs. Ending a session will keep the changes." + "Changes are applied directly to the document but can be highlighted via inline diffs. Ending a session will keep the changes.", + "Enable/disable showing the diff when edits are generated. Works only with inlineChat.mode equal to live or livePreview." ], "vs/editor/contrib/peekView/browser/peekView": [ "Whether the current code editor is embedded inside peek", @@ -23472,6 +23702,13 @@ "{0}, outdated result", "Test Explorer" ], + "vs/workbench/contrib/testing/browser/testingProgressUiService": [ + "Running tests...", + "Running tests, {0}/{1} passed ({2}%)", + "Running tests, {0}/{1} tests passed ({2}%, {3} skipped)", + "{0}/{1} tests passed ({2}%)", + "{0}/{1} tests passed ({2}%, {3} skipped)" + ], "vs/workbench/contrib/testing/browser/testingOutputPeek": [ "Could not open markdown preview: {0}.\n\nPlease make sure the markdown extension is enabled.", "Test Output", @@ -23488,7 +23725,7 @@ "Show Result Output", "Rerun Test Run", "Debug Test Run", - "Go to File", + "Go to Source", "Reveal in Test Explorer", "Run Test", "Debug Test", @@ -23498,12 +23735,32 @@ "Open in Editor", "Toggle Test History in Peek" ], - "vs/workbench/contrib/testing/browser/testingProgressUiService": [ - "Running tests...", - "Running tests, {0}/{1} passed ({2}%)", - "Running tests, {0}/{1} tests passed ({2}%, {3} skipped)", - "{0}/{1} tests passed ({2}%)", - "{0}/{1} tests passed ({2}%, {3} skipped)" + "vs/workbench/contrib/testing/common/configuration": [ + "Testing", + "How long to wait, in milliseconds, after a test is marked as outdated and starting a new run.", + "Configures when the error Peek view is automatically opened.", + "Open automatically no matter where the failure is.", + "Open automatically when a test fails in a visible document.", + "Never automatically open.", + "Controls whether to show messages from all test runs.", + "Controls whether to automatically open the Peek view during continuous run mode.", + "Controls the count badge on the Testing icon on the Activity Bar.", + "Show the number of failed tests", + "Disable the testing count badge", + "Show the number of passed tests", + "Show the number of skipped tests", + "Controls whether the running test should be followed in the Test Explorer view.", + "Controls the action to take when left-clicking on a test decoration in the gutter.", + "Run the test.", + "Debug the test.", + "Open the context menu for more options.", + "Controls whether test decorations are shown in the editor gutter.", + "Control whether save all dirty editors before running a test.", + "Never automatically open the testing view", + "Open the testing view when tests start", + "Open the testing view on any test failure", + "Controls when the testing view should open.", + "Always reveal the executed test when `#testing.followRunningTest#` is on. If this setting is turned off, only failed tests will be revealed." ], "vs/workbench/contrib/testing/browser/testingViewPaneContainer": [ "Testing" @@ -23535,6 +23792,10 @@ "Boolean indicating whether the test item has a URI defined", "Boolean indicating whether the test item is hidden" ], + "vs/workbench/contrib/testing/browser/testingConfigurationUi": [ + "Pick a test profile to use", + "Update Test Configuration" + ], "vs/workbench/contrib/testing/browser/testExplorerActions": [ "Hide Test", "Unhide Test", @@ -23587,37 +23848,6 @@ "Refresh Tests", "Cancel Test Refresh" ], - "vs/workbench/contrib/testing/browser/testingConfigurationUi": [ - "Pick a test profile to use", - "Update Test Configuration" - ], - "vs/workbench/contrib/testing/common/configuration": [ - "Testing", - "How long to wait, in milliseconds, after a test is marked as outdated and starting a new run.", - "Configures when the error Peek view is automatically opened.", - "Open automatically no matter where the failure is.", - "Open automatically when a test fails in a visible document.", - "Never automatically open.", - "Controls whether to show messages from all test runs.", - "Controls whether to automatically open the Peek view during continuous run mode.", - "Controls the count badge on the Testing icon on the Activity Bar.", - "Show the number of failed tests", - "Disable the testing count badge", - "Show the number of passed tests", - "Show the number of skipped tests", - "Controls whether the running test should be followed in the Test Explorer view.", - "Controls the action to take when left-clicking on a test decoration in the gutter.", - "Run the test.", - "Debug the test.", - "Open the context menu for more options.", - "Controls whether test decorations are shown in the editor gutter.", - "Control whether save all dirty editors before running a test.", - "Never automatically open the testing view", - "Open the testing view when tests start", - "Open the testing view on any test failure", - "Controls when the testing view should open.", - "Always reveal the executed test when `#testing.followRunningTest#` is on. If this setting is turned off, only failed tests will be revealed." - ], "vs/workbench/contrib/logs/common/logsActions": [ "Set Log Level...", "All", @@ -23639,8 +23869,30 @@ "Select Session", "Select Log file" ], - "vs/platform/quickinput/browser/helpQuickAccess": [ - "{0}, {1}" + "vs/workbench/contrib/preferences/browser/keybindingWidgets": [ + "Press desired key combination and then press ENTER.", + "1 existing command has this keybinding", + "{0} existing commands have this keybinding", + "chord to" + ], + "vs/workbench/contrib/files/browser/views/explorerView": [ + "Explorer Section: {0}", + "New File...", + "New Folder...", + "Refresh Explorer", + "Collapse Folders in Explorer" + ], + "vs/workbench/contrib/files/browser/views/openEditorsView": [ + "Open Editors", + "{0} unsaved", + "Open Editors", + "Toggle Vertical/Horizontal Editor Layout", + "Flip Layout", + "Flip &&Layout", + "New Untitled Text File" + ], + "vs/workbench/contrib/files/browser/views/emptyView": [ + "No Folder Opened" ], "vs/workbench/contrib/quickaccess/browser/viewQuickAccess": [ "No matching views", @@ -23654,6 +23906,9 @@ "Open View", "Quick Open View" ], + "vs/platform/quickinput/browser/helpQuickAccess": [ + "{0}, {1}" + ], "vs/workbench/contrib/quickaccess/browser/commandsQuickAccess": [ "No matching commands", "Configure Keybinding", @@ -23666,25 +23921,6 @@ "This action is irreversible!", "&&Clear" ], - "vs/workbench/contrib/files/browser/views/explorerView": [ - "Explorer Section: {0}", - "New File...", - "New Folder...", - "Refresh Explorer", - "Collapse Folders in Explorer" - ], - "vs/workbench/contrib/files/browser/views/emptyView": [ - "No Folder Opened" - ], - "vs/workbench/contrib/files/browser/views/openEditorsView": [ - "Open Editors", - "{0} unsaved", - "Open Editors", - "Toggle Vertical/Horizontal Editor Layout", - "Flip Layout", - "Flip &&Layout", - "New Untitled Text File" - ], "vs/workbench/contrib/files/browser/fileActions": [ "New File...", "New Folder...", @@ -23851,6 +24087,10 @@ "Controls whether the diff editor uses the new or the old implementation.", "Controls whether the diff editor shows empty decorations to see where characters got inserted or deleted." ], + "vs/workbench/contrib/files/common/dirtyFilesIndicator": [ + "1 unsaved file", + "{0} unsaved files" + ], "vs/workbench/contrib/files/browser/editors/textFileEditor": [ "Text File Editor", "Open Folder", @@ -23861,13 +24101,6 @@ "The editor could not be opened because the file was not found.", "Create File" ], - "vs/workbench/contrib/files/common/dirtyFilesIndicator": [ - "1 unsaved file", - "{0} unsaved files" - ], - "vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPreview": [ - "Other" - ], "vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess": [ "Open a text editor first to go to a line.", "Go to line {0} and character {1}.", @@ -23875,18 +24108,6 @@ "Current Line: {0}, Character: {1}. Type a line number between 1 and {2} to navigate to.", "Current Line: {0}, Character: {1}. Type a line number to navigate to." ], - "vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPane": [ - "Apply", - "Discard", - "Invoke a code action, like rename, to see a preview of its changes here.", - "Cannot apply refactoring because '{0}' has changed in the meantime.", - "Cannot apply refactoring because {0} other files have changed in the meantime.", - "{0} (delete, refactor preview)", - "rename", - "create", - "{0} ({1}, refactor preview)", - "{0} (refactor preview)" - ], "vs/workbench/contrib/codeEditor/browser/quickaccess/gotoSymbolQuickAccess": [ "No matching entries", "Go to Symbol in Editor...", @@ -23924,6 +24145,11 @@ "View icon of the search view.", "Icon for the action to open a new search editor." ], + "vs/workbench/contrib/search/browser/symbolsQuickAccess": [ + "No matching workspace symbols", + "Open to the Side", + "Open to the Bottom" + ], "vs/workbench/contrib/search/browser/searchWidget": [ "Replace All (Submit Search to Enable)", "Replace All", @@ -23934,11 +24160,6 @@ "Replace: Type replace term and press Enter to preview", "Replace" ], - "vs/workbench/contrib/search/browser/symbolsQuickAccess": [ - "No matching workspace symbols", - "Open to the Side", - "Open to the Bottom" - ], "vs/workbench/contrib/search/browser/searchActionsCopy": [ "Copy", "Copy Path", @@ -23995,6 +24216,21 @@ "View as Tree", "View as List" ], + "vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPane": [ + "Apply", + "Discard", + "Invoke a code action, like rename, to see a preview of its changes here.", + "Cannot apply refactoring because '{0}' has changed in the meantime.", + "Cannot apply refactoring because {0} other files have changed in the meantime.", + "{0} (delete, refactor preview)", + "rename", + "create", + "{0} ({1}, refactor preview)", + "{0} (refactor preview)" + ], + "vs/workbench/contrib/bulkEdit/browser/preview/bulkEditPreview": [ + "Other" + ], "vs/workbench/contrib/search/browser/searchActionsBase": [ "Search" ], @@ -24019,15 +24255,15 @@ "Icon for a collapsed view pane container.", "{0} actions" ], - "vs/workbench/contrib/search/browser/searchMessage": [ - "Unable to open command link from untrusted source: {0}", - "Unable to open unknown link: {0}" - ], "vs/workbench/contrib/search/browser/patternInputWidget": [ "input", "Search only in Open Editors", "Use Exclude Settings and Ignore Files" ], + "vs/workbench/contrib/search/browser/searchMessage": [ + "Unable to open command link from untrusted source: {0}", + "Unable to open unknown link: {0}" + ], "vs/workbench/contrib/search/browser/searchResultsView": [ "Other files", "Other files", @@ -24076,6 +24312,13 @@ "vs/workbench/contrib/scm/browser/scmViewPaneContainer": [ "Source Control" ], + "vs/workbench/contrib/scm/browser/scmRepositoriesViewPane": [ + "Source Control Repositories" + ], + "vs/workbench/contrib/workspace/common/workspace": [ + "Whether the workspace trust feature is enabled.", + "Whether the current workspace has been trusted by the user." + ], "vs/workbench/contrib/scm/browser/scmViewPane": [ "Source Control Management", "Source Control Input", @@ -24094,12 +24337,38 @@ "Close", "SCM Provider separator border." ], - "vs/workbench/contrib/scm/browser/scmRepositoriesViewPane": [ - "Source Control Repositories" + "vs/workbench/contrib/debug/browser/callStackView": [ + "Running", + "Show More Stack Frames", + "Session", + "Running", + "Restart Frame", + "Load More Stack Frames", + "Show {0} More: {1}", + "Show {0} More Stack Frames", + "Paused on {0}", + "Paused", + "Debug Call Stack", + "Thread {0} {1}", + "Stack Frame {0}, line {1}, {2}", + "Running", + "Session {0} {1}", + "Show {0} More Stack Frames", + "Collapse All" ], - "vs/workbench/contrib/workspace/common/workspace": [ - "Whether the workspace trust feature is enabled.", - "Whether the current workspace has been trusted by the user." + "vs/workbench/contrib/debug/browser/debugColors": [ + "Debug toolbar background color.", + "Debug toolbar border color.", + "Debug toolbar icon for start debugging.", + "Debug toolbar icon for pause.", + "Debug toolbar icon for stop.", + "Debug toolbar icon for disconnect.", + "Debug toolbar icon for restart.", + "Debug toolbar icon for step over.", + "Debug toolbar icon for step into.", + "Debug toolbar icon for step over.", + "Debug toolbar icon for continue.", + "Debug toolbar icon for step back." ], "vs/workbench/contrib/debug/browser/breakpointsView": [ "Unverified Exception Breakpoint", @@ -24155,72 +24424,6 @@ "Edit Function Breakpoint...", "Edit Hit Count..." ], - "vs/workbench/contrib/debug/browser/debugColors": [ - "Debug toolbar background color.", - "Debug toolbar border color.", - "Debug toolbar icon for start debugging.", - "Debug toolbar icon for pause.", - "Debug toolbar icon for stop.", - "Debug toolbar icon for disconnect.", - "Debug toolbar icon for restart.", - "Debug toolbar icon for step over.", - "Debug toolbar icon for step into.", - "Debug toolbar icon for step over.", - "Debug toolbar icon for continue.", - "Debug toolbar icon for step back." - ], - "vs/workbench/contrib/debug/browser/callStackView": [ - "Running", - "Show More Stack Frames", - "Session", - "Running", - "Restart Frame", - "Load More Stack Frames", - "Show {0} More: {1}", - "Show {0} More Stack Frames", - "Paused on {0}", - "Paused", - "Debug Call Stack", - "Thread {0} {1}", - "Stack Frame {0}, line {1}, {2}", - "Running", - "Session {0} {1}", - "Show {0} More Stack Frames", - "Collapse All" - ], - "vs/workbench/contrib/debug/browser/debugCommands": [ - "Debug", - "Restart", - "Step Over", - "Step Into", - "Step Into Target", - "Step Out", - "Pause", - "Disconnect", - "Disconnect and Suspend", - "Stop", - "Continue", - "Focus Session", - "Select and Start Debugging", - "Open '{0}'", - "Start Debugging", - "Start Without Debugging", - "Focus Next Debug Console", - "Focus Previous Debug Console", - "Open Loaded Script...", - "Navigate to Top of Call Stack", - "Navigate to Bottom of Call Stack", - "Navigate Up Call Stack", - "Navigate Down Call Stack", - "Select Debug Console", - "Select Debug Session", - "Choose the specific location", - "No executable code is associated at the current cursor position.", - "Jump to Cursor", - "No step targets available", - "Add Configuration...", - "Add Inline Breakpoint" - ], "vs/workbench/contrib/debug/browser/debugConsoleQuickAccess": [ "Start a New Debug Session" ], @@ -24314,6 +24517,39 @@ "Add Config ({0})...", "Add Configuration..." ], + "vs/workbench/contrib/debug/browser/debugCommands": [ + "Debug", + "Restart", + "Step Over", + "Step Into", + "Step Into Target", + "Step Out", + "Pause", + "Disconnect", + "Disconnect and Suspend", + "Stop", + "Continue", + "Focus Session", + "Select and Start Debugging", + "Open '{0}'", + "Start Debugging", + "Start Without Debugging", + "Focus Next Debug Console", + "Focus Previous Debug Console", + "Open Loaded Script...", + "Navigate to Top of Call Stack", + "Navigate to Bottom of Call Stack", + "Navigate Up Call Stack", + "Navigate Down Call Stack", + "Select Debug Console", + "Select Debug Session", + "Choose the specific location", + "No executable code is associated at the current cursor position.", + "Jump to Cursor", + "No step targets available", + "Add Configuration...", + "Add Inline Breakpoint" + ], "vs/workbench/contrib/debug/browser/debugStatus": [ "Debug", "Debug: {0}", @@ -24391,20 +24627,20 @@ "Add Expression", "Remove All Expressions" ], + "vs/workbench/contrib/debug/common/debugContentProvider": [ + "Unable to resolve the resource without a debug session", + "Could not load source '{0}': {1}.", + "Could not load source '{0}'." + ], "vs/workbench/contrib/debug/browser/welcomeView": [ "Run", "[Open a file](command:{0}) which can be debugged or run.", - "[Run and Debug{0}](command:{1})", - "[Show all automatic debug configurations](command:{0}).", + "Run and Debug", + "Show all automatic debug configurations", "To customize Run and Debug [create a launch.json file](command:{0}).", "To customize Run and Debug, [open a folder](command:{0}) and create a launch.json file.", "All debug extensions are disabled. Enable a debug extension or install a new one from the Marketplace." ], - "vs/workbench/contrib/debug/common/debugContentProvider": [ - "Unable to resolve the resource without a debug session", - "Could not load source '{0}': {1}.", - "Could not load source '{0}'." - ], "vs/workbench/contrib/debug/common/debugLifecycle": [ "There is an active debug session, are you sure you want to stop it?", "There are active debug sessions, are you sure you want to stop them?", @@ -24435,17 +24671,14 @@ "Unverified breakpoint. File is modified, please restart debug session." ], "vs/workbench/contrib/debug/browser/breakpointWidget": [ - "Message to log when breakpoint is hit. Expressions within {} are interpolated. 'Enter' to accept, 'esc' to cancel.", - "Break when hit count condition is met. 'Enter' to accept, 'esc' to cancel.", - "Break when expression evaluates to true. 'Enter' to accept, 'esc' to cancel.", + "Message to log when breakpoint is hit. Expressions within {} are interpolated. '{0}' to accept, '{1}' to cancel.", + "Break when hit count condition is met. '{0}' to accept, '{1}' to cancel.", + "Break when expression evaluates to true. '{0}' to accept, '{1}' to cancel.", "Expression", "Hit Count", "Log Message", "Breakpoint Type" ], - "vs/platform/history/browser/contextScopedHistoryWidget": [ - "Whether suggestion are visible" - ], "vs/workbench/contrib/debug/browser/debugActionViewItems": [ "Debug Launch Configurations", "No Configurations", @@ -24453,6 +24686,9 @@ "Add Configuration...", "Debug Session" ], + "vs/platform/history/browser/contextScopedHistoryWidget": [ + "Whether suggestion are visible" + ], "vs/workbench/contrib/debug/browser/linkDetector": [ "follow link using forwarded port", "follow link", @@ -24526,14 +24762,53 @@ "{0} at line {1} and character {2} in {3}", "Show Errors and Warnings" ], - "vs/workbench/browser/parts/views/viewFilter": [ - "More Filters..." + "vs/workbench/browser/parts/views/viewFilter": [ + "More Filters..." + ], + "vs/workbench/contrib/markers/browser/markersFileDecorations": [ + "Problems", + "1 problem in this file", + "{0} problems in this file", + "Show Errors & Warnings on files and folder." + ], + "vs/workbench/contrib/performance/browser/perfviewEditor": [ + "Startup Performance" + ], + "vs/workbench/contrib/comments/browser/commentService": [ + "Whether the open workspace has either comments or commenting ranges." + ], + "vs/workbench/contrib/comments/browser/commentsEditorContribution": [ + "Go to Next Comment Thread", + "Go to Previous Comment Thread", + "Toggle Editor Commenting", + "Add Comment on Current Selection", + "Collapse All Comments", + "Expand All Comments", + "Expand Unresolved Comments" + ], + "vs/workbench/contrib/url/browser/trustedDomains": [ + "Manage Trusted Domains", + "Trust {0}", + "Trust {0} on all ports", + "Trust {0} and all its subdomains", + "Trust all domains (disables link protection)", + "Manage Trusted Domains" ], - "vs/workbench/contrib/markers/browser/markersFileDecorations": [ - "Problems", - "1 problem in this file", - "{0} problems in this file", - "Show Errors & Warnings on files and folder." + "vs/workbench/contrib/url/browser/trustedDomainsValidator": [ + "Do you want {0} to open the external website?", + "&&Open", + "&&Copy", + "Configure &&Trusted Domains" + ], + "vs/workbench/contrib/webviewPanel/browser/webviewCommands": [ + "Show find", + "Stop find", + "Find next", + "Find previous", + "Reload Webviews" + ], + "vs/workbench/contrib/webviewPanel/browser/webviewEditor": [ + "The viewType of the currently active webview panel." ], "vs/workbench/contrib/mergeEditor/browser/commands/commands": [ "Open Merge Editor", @@ -24586,42 +24861,6 @@ "vs/workbench/contrib/mergeEditor/browser/view/mergeEditor": [ "Text Merge Editor" ], - "vs/workbench/contrib/comments/browser/commentsEditorContribution": [ - "Go to Next Comment Thread", - "Go to Previous Comment Thread", - "Toggle Editor Commenting", - "Add Comment on Current Selection", - "Collapse All Comments", - "Expand All Comments", - "Expand Unresolved Comments" - ], - "vs/workbench/contrib/comments/browser/commentService": [ - "Whether the open workspace has either comments or commenting ranges." - ], - "vs/workbench/contrib/url/browser/trustedDomains": [ - "Manage Trusted Domains", - "Trust {0}", - "Trust {0} on all ports", - "Trust {0} and all its subdomains", - "Trust all domains (disables link protection)", - "Manage Trusted Domains" - ], - "vs/workbench/contrib/url/browser/trustedDomainsValidator": [ - "Do you want {0} to open the external website?", - "&&Open", - "&&Copy", - "Configure &&Trusted Domains" - ], - "vs/workbench/contrib/webviewPanel/browser/webviewEditor": [ - "The viewType of the currently active webview panel." - ], - "vs/workbench/contrib/webviewPanel/browser/webviewCommands": [ - "Show find", - "Stop find", - "Find next", - "Find previous", - "Reload Webviews" - ], "vs/workbench/contrib/customEditor/common/customEditor": [ "The viewType of the currently active custom editor." ], @@ -24631,6 +24870,12 @@ "Map URI pattern to an opener id.\nExample patterns: \n{0}", "Open using VS Code's standard opener." ], + "vs/workbench/contrib/externalUriOpener/common/externalUriOpenerService": [ + "Open in new browser window", + "Open in default browser", + "Configure default opener...", + "How would you like to open: {0}" + ], "vs/workbench/contrib/extensions/common/extensionsInput": [ "Extension: {0}" ], @@ -24644,8 +24889,6 @@ "Cancel", "Error while updating '{0}' extension.", "Error while installing '{0}' extension.", - "Would you like to install the release version?", - "Install Release Version", "Please check the [log]({0}) for more details.", "Try Downloading Manually...", "Once downloaded, please manually install the downloaded VSIX of '{0}'.", @@ -24797,54 +25040,6 @@ "Button foreground color for extension actions that stand out (e.g. install button).", "Button background hover color for extension actions that stand out (e.g. install button)." ], - "vs/workbench/contrib/extensions/browser/extensionsViews": [ - "Extensions", - "Unable to search the Marketplace when offline, please check your network connection.", - "Error while fetching extensions. {0}", - "No extensions found.", - "Marketplace returned 'ECONNREFUSED'. Please check the 'http.proxy' setting.", - "Open User Settings", - "There are no extensions to install.", - "Verified Publisher {0}", - "Publisher {0}", - "Deprecated", - "Rated {0} out of 5 stars by {1} users" - ], - "vs/workbench/contrib/externalUriOpener/common/externalUriOpenerService": [ - "Open in new browser window", - "Open in default browser", - "Configure default opener...", - "How would you like to open: {0}" - ], - "vs/workbench/contrib/extensions/browser/extensionsIcons": [ - "View icon of the extensions view.", - "Icon for the 'Manage' action in the extensions view.", - "Icon for the 'Clear Search Result' action in the extensions view.", - "Icon for the 'Refresh' action in the extensions view.", - "Icon for the 'Filter' action in the extensions view.", - "Icon for the 'Install Local Extension in Remote' action in the extensions view.", - "Icon for the 'Install Workspace Recommended Extensions' action in the extensions view.", - "Icon for the 'Configure Recommended Extensions' action in the extensions view.", - "Icon to indicate that an extension is synced.", - "Icon to indicate that an extension is ignored when syncing.", - "Icon to indicate that an extension is remote in the extensions view and editor.", - "Icon shown along with the install count in the extensions view and editor.", - "Icon shown along with the rating in the extensions view and editor.", - "Icon used for the verified extension publisher in the extensions view and editor.", - "Icon shown for extensions having pre-release versions in extensions view and editor.", - "Icon used for sponsoring extensions in the extensions view and editor.", - "Full star icon used for the rating in the extensions editor.", - "Half star icon used for the rating in the extensions editor.", - "Empty star icon used for the rating in the extensions editor.", - "Icon shown with a error message in the extensions editor.", - "Icon shown with a warning message in the extensions editor.", - "Icon shown with an info message in the extensions editor.", - "Icon shown with a workspace trust message in the extension editor.", - "Icon shown with a activation time message in the extension editor." - ], - "vs/platform/dnd/browser/dnd": [ - "File is too large to open as untitled editor. Please upload it first into the file explorer and then try again." - ], "vs/workbench/contrib/extensions/common/extensionsFileTemplate": [ "Extensions", "List of extensions which should be recommended for users of this workspace. The identifier of an extension is always '${publisher}.${name}'. For example: 'vscode.csharp'.", @@ -24852,11 +25047,6 @@ "List of extensions recommended by VS Code that should not be recommended for users of this workspace. The identifier of an extension is always '${publisher}.${name}'. For example: 'vscode.csharp'.", "Expected format '${publisher}.${name}'. Example: 'vscode.csharp'." ], - "vs/workbench/contrib/extensions/common/extensionsUtils": [ - "Disable other keymaps ({0}) to avoid conflicts between keybindings?", - "Yes", - "No" - ], "vs/workbench/contrib/extensions/browser/extensionEditor": [ "Extension Version", "Pre-Release", @@ -24972,22 +25162,14 @@ "Find Next", "Find Previous" ], + "vs/workbench/contrib/extensions/common/extensionsUtils": [ + "Disable other keymaps ({0}) to avoid conflicts between keybindings?", + "Yes", + "No" + ], "vs/workbench/contrib/extensions/browser/extensionsActivationProgress": [ "Activating Extensions..." ], - "vs/workbench/contrib/extensions/browser/extensionsDependencyChecker": [ - "Extensions", - "Install Missing Dependencies", - "Finished installing missing dependencies. Please reload the window now.", - "Reload Window", - "There are no missing dependencies to install." - ], - "vs/workbench/contrib/extensions/browser/extensionsQuickAccess": [ - "Type an extension name to install or search.", - "Press Enter to search for extension '{0}'.", - "Press Enter to install extension '{0}'.", - "Press Enter to manage your extensions." - ], "vs/workbench/contrib/extensions/browser/extensionsWorkbenchService": [ "Manifest is not found", "Please reload Visual Studio Code to complete the uninstallation of this extension.", @@ -25026,36 +25208,145 @@ "Install (Do not sync)", "Show Recommendations" ], - "vs/workbench/contrib/extensions/browser/abstractRuntimeExtensionsEditor": [ - "Activated by {0} on start-up", - "Activated by {1} because a file matching {0} exists in your workspace", - "Activated by {1} because file {0} exists in your workspace", - "Activated by {1} because searching for {0} took too long", - "Activated by {0} after start-up finished", - "Activated by {1} because you opened a {0} file", - "Activated by {1} on {0}", - "Extension is activating...", - "Extension has caused the extension host to freeze.", - "{0} uncaught errors", - "Runtime Extensions", - "Copy id ({0})", - "Disable (Workspace)", - "Disable", - "Show Running Extensions" + "vs/workbench/contrib/extensions/browser/abstractRuntimeExtensionsEditor": [ + "Activated by {0} on start-up", + "Activated by {1} because a file matching {0} exists in your workspace", + "Activated by {1} because file {0} exists in your workspace", + "Activated by {1} because searching for {0} took too long", + "Activated by {0} after start-up finished", + "Activated by {1} because you opened a {0} file", + "Activated by {1} on {0}", + "Extension is activating...", + "Extension has caused the extension host to freeze.", + "{0} uncaught errors", + "Runtime Extensions", + "Copy id ({0})", + "Disable (Workspace)", + "Disable", + "Show Running Extensions" + ], + "vs/workbench/contrib/extensions/browser/extensionEnablementWorkspaceTrustTransitionParticipant": [ + "Restarting extension host due to workspace trust change." + ], + "vs/workbench/contrib/extensions/browser/extensionsDependencyChecker": [ + "Extensions", + "Install Missing Dependencies", + "Finished installing missing dependencies. Please reload the window now.", + "Reload Window", + "There are no missing dependencies to install." + ], + "vs/workbench/contrib/extensions/browser/extensionsIcons": [ + "View icon of the extensions view.", + "Icon for the 'Manage' action in the extensions view.", + "Icon for the 'Clear Search Result' action in the extensions view.", + "Icon for the 'Refresh' action in the extensions view.", + "Icon for the 'Filter' action in the extensions view.", + "Icon for the 'Install Local Extension in Remote' action in the extensions view.", + "Icon for the 'Install Workspace Recommended Extensions' action in the extensions view.", + "Icon for the 'Configure Recommended Extensions' action in the extensions view.", + "Icon to indicate that an extension is synced.", + "Icon to indicate that an extension is ignored when syncing.", + "Icon to indicate that an extension is remote in the extensions view and editor.", + "Icon shown along with the install count in the extensions view and editor.", + "Icon shown along with the rating in the extensions view and editor.", + "Icon used for the verified extension publisher in the extensions view and editor.", + "Icon shown for extensions having pre-release versions in extensions view and editor.", + "Icon used for sponsoring extensions in the extensions view and editor.", + "Full star icon used for the rating in the extensions editor.", + "Half star icon used for the rating in the extensions editor.", + "Empty star icon used for the rating in the extensions editor.", + "Icon shown with a error message in the extensions editor.", + "Icon shown with a warning message in the extensions editor.", + "Icon shown with an info message in the extensions editor.", + "Icon shown with a workspace trust message in the extension editor.", + "Icon shown with a activation time message in the extension editor." + ], + "vs/workbench/contrib/extensions/browser/extensionsCompletionItemsProvider": [ + "Example" + ], + "vs/workbench/contrib/extensions/browser/deprecatedExtensionsChecker": [ + "You have deprecated extensions installed. We recommend to review them and migrate to alternatives.", + "Show Deprecated Extensions", + "Don't Show Again" + ], + "vs/platform/dnd/browser/dnd": [ + "File is too large to open as untitled editor. Please upload it first into the file explorer and then try again." + ], + "vs/workbench/contrib/extensions/browser/extensionsViews": [ + "Extensions", + "Unable to search the Marketplace when offline, please check your network connection.", + "Error while fetching extensions. {0}", + "No extensions found.", + "Marketplace returned 'ECONNREFUSED'. Please check the 'http.proxy' setting.", + "Open User Settings", + "There are no extensions to install.", + "Verified Publisher {0}", + "Publisher {0}", + "Deprecated", + "Rated {0} out of 5 stars by {1} users" + ], + "vs/workbench/contrib/output/browser/logViewer": [ + "Log viewer" + ], + "vs/workbench/contrib/terminal/browser/terminal.contribution": [ + "Type the name of a terminal to open.", + "Show All Opened Terminals", + "Terminal", + "Terminal", + "&&Terminal" + ], + "vs/workbench/contrib/extensions/browser/extensionsQuickAccess": [ + "Type an extension name to install or search.", + "Press Enter to search for extension '{0}'.", + "Press Enter to install extension '{0}'.", + "Press Enter to manage your extensions." + ], + "vs/workbench/contrib/terminal/browser/terminalView": [ + "Use 'monospace'", + "The terminal only supports monospace fonts. Be sure to restart VS Code if this is a newly installed font.", + "Open Terminals.", + "Starting..." + ], + "vs/workbench/contrib/terminalContrib/developer/browser/terminal.developer.contribution": [ + "Show Terminal Texture Atlas", + "Write Data to Terminal", + "Enter data to write directly to the terminal, bypassing the pty", + "Restart Pty Host" + ], + "vs/workbench/contrib/terminalContrib/environmentChanges/browser/terminal.environmentChanges.contribution": [ + "Show Environment Contributions", + "Terminal Environment Changes", + "Extension: {0}", + "workspace" + ], + "vs/workbench/contrib/terminalContrib/find/browser/terminal.find.contribution": [ + "Focus Find", + "Hide Find", + "Toggle Find Using Regex", + "Toggle Find Using Whole Word", + "Toggle Find Using Case Sensitive", + "Find Next", + "Find Previous", + "Search Workspace" ], - "vs/workbench/contrib/extensions/browser/extensionEnablementWorkspaceTrustTransitionParticipant": [ - "Restarting extension host due to workspace trust change." + "vs/workbench/contrib/terminalContrib/accessibility/browser/terminal.accessibility.contribution": [ + "Focus Accessible Buffer", + "Navigate Accessible Buffer", + "Accessible Buffer Go to Next Command", + "Accessible Buffer Go to Previous Command" ], - "vs/workbench/contrib/extensions/browser/extensionsCompletionItemsProvider": [ - "Example" + "vs/workbench/contrib/terminalContrib/links/browser/terminal.links.contribution": [ + "Open Detected Link...", + "Open Last URL Link", + "Open Last Local File Link" ], - "vs/workbench/contrib/extensions/browser/deprecatedExtensionsChecker": [ - "You have deprecated extensions installed. We recommend to review them and migrate to alternatives.", - "Show Deprecated Extensions", - "Don't Show Again" + "vs/workbench/contrib/terminalContrib/quickFix/browser/terminal.quickFix.contribution": [ + "Show Terminal Quick Fixes" ], - "vs/workbench/contrib/output/browser/logViewer": [ - "Log viewer" + "vs/workbench/contrib/tasks/browser/runAutomaticTasks": [ + "Manage Automatic Tasks", + "Allow Automatic Tasks", + "Disallow Automatic Tasks" ], "vs/workbench/contrib/tasks/common/problemMatcher": [ "The problem pattern is missing a regular expression.", @@ -25127,11 +25418,6 @@ "ESLint stylish problems", "Go problems" ], - "vs/workbench/contrib/tasks/browser/runAutomaticTasks": [ - "Manage Automatic Tasks", - "Allow Automatic Tasks", - "Disallow Automatic Tasks" - ], "vs/workbench/contrib/tasks/common/jsonSchema_v1": [ "Task version 0.1.0 is deprecated. Please use 2.0.0", "The config's version number", @@ -25268,6 +25554,10 @@ "Cannot reconnect. Please reload the window.", "&&Reload Window" ], + "vs/workbench/contrib/emmet/browser/actions/expandAbbreviation": [ + "Emmet: Expand Abbreviation", + "Emmet: E&&xpand Abbreviation" + ], "vs/workbench/contrib/remote/browser/remoteIndicator": [ "Status bar background color when the workbench is offline. The status bar is shown in the bottom of the window", "Status bar foreground color when the workbench is offline. The status bar is shown in the bottom of the window", @@ -25287,92 +25577,25 @@ "Remote Host", "Network appears to be offline, certain features might be unavailable.", "Network appears to have high latency ({0}ms last, {1}ms average), certain features may be slow to respond.", + "Learn More", + "Install", "Close Remote Connection", "Reload Window", "Close Remote Workspace", - "Learn More", - "Install", "Select an option to open a Remote Window", "Installing extension... " ], - "vs/workbench/contrib/terminal/browser/terminal.contribution": [ - "Type the name of a terminal to open.", - "Show All Opened Terminals", - "Terminal", - "Terminal", - "&&Terminal" - ], - "vs/workbench/contrib/terminalContrib/accessibility/browser/terminal.accessibility.contribution": [ - "Focus Accessible Buffer", - "Navigate Accessible Buffer", - "Accessible Buffer Go to Next Command", - "Accessible Buffer Go to Previous Command" - ], - "vs/workbench/contrib/terminal/browser/terminalView": [ - "Use 'monospace'", - "The terminal only supports monospace fonts. Be sure to restart VS Code if this is a newly installed font.", - "Open Terminals.", - "Starting..." - ], - "vs/workbench/contrib/terminalContrib/developer/browser/terminal.developer.contribution": [ - "Show Terminal Texture Atlas", - "Write Data to Terminal", - "Enter data to write directly to the terminal, bypassing the pty", - "Restart Pty Host" - ], - "vs/workbench/contrib/terminalContrib/environmentChanges/browser/terminal.environmentChanges.contribution": [ - "Show Environment Contributions", - "Terminal Environment Changes", - "Extension: {0}" - ], - "vs/workbench/contrib/terminalContrib/quickFix/browser/terminal.quickFix.contribution": [ - "Show Terminal Quick Fixes" - ], - "vs/workbench/contrib/emmet/browser/actions/expandAbbreviation": [ - "Emmet: Expand Abbreviation", - "Emmet: E&&xpand Abbreviation" - ], "vs/workbench/contrib/codeEditor/browser/accessibility/accessibility": [ - "Accessibility Help", - "Now changing the setting `editor.accessibilitySupport` to 'on'.", - "Now opening the VS Code Accessibility documentation page.", - "Thank you for trying out VS Code's accessibility options.", - "Status:", - "To configure the editor to be permanently optimized for usage with a Screen Reader press Command+E now.", - "To configure the editor to be permanently optimized for usage with a Screen Reader press Control+E now.", - "The editor is configured to use platform APIs to detect when a Screen Reader is attached, but the current runtime does not support this.", - "The editor has automatically detected a Screen Reader is attached.", - "The editor is configured to automatically detect when a Screen Reader is attached, which is not the case at this time.", - "The editor is configured to be permanently optimized for usage with a Screen Reader - you can change this via the command `Toggle Screen Reader Accessibility Mode` or by editing the setting `editor.accessibilitySupport`", - "The editor is configured to never be optimized for usage with a Screen Reader.", - "Pressing Tab in the current editor will move focus to the next focusable element. Toggle this behavior by pressing {0}.", - "Pressing Tab in the current editor will move focus to the next focusable element. The command {0} is currently not triggerable by a keybinding.", - "Pressing Tab in the current editor will insert the tab character. Toggle this behavior by pressing {0}.", - "Pressing Tab in the current editor will insert the tab character. The command {0} is currently not triggerable by a keybinding.", - "Press Command+H now to open a browser window with more VS Code information related to Accessibility.", - "Press Control+H now to open a browser window with more VS Code information related to Accessibility.", - "You can dismiss this tooltip and return to the editor by pressing Escape or Shift+Escape.", "Toggle Screen Reader Accessibility Mode" ], - "vs/workbench/contrib/terminalContrib/links/browser/terminal.links.contribution": [ - "Open Detected Link...", - "Open Last URL Link", - "Open Last Local File Link" - ], "vs/workbench/contrib/codeEditor/browser/diffEditorHelper": [ + "Show Whitespace Differences", "The diff algorithm was stopped early (after {0} ms.)", "Remove Limit", - "Show Whitespace Differences" - ], - "vs/workbench/contrib/terminalContrib/find/browser/terminal.find.contribution": [ - "Focus Find", - "Hide Find", - "Toggle Find Using Regex", - "Toggle Find Using Whole Word", - "Toggle Find Using Case Sensitive", - "Find Next", - "Find Previous", - "Search Workspace" + "You are in a diff editor.", + "Press {0} or {1} to view the next or previous diff in the diff review mode that is optimized for screen readers.", + "To control which audio cues should be played, the following settings can be configured: {0}.", + "Diff editor accessibility help" ], "vs/workbench/contrib/codeEditor/browser/inspectKeybindings": [ "Inspect Key Mappings", @@ -25412,14 +25635,6 @@ "Switch to Cmd+Click for Multi-Cursor", "Switch to Ctrl+Click for Multi-Cursor" ], - "vs/workbench/contrib/codeEditor/browser/toggleRenderControlCharacter": [ - "Toggle Control Characters", - "Render &&Control Characters" - ], - "vs/workbench/contrib/codeEditor/browser/toggleRenderWhitespace": [ - "Toggle Render Whitespace", - "&&Render Whitespace" - ], "vs/workbench/contrib/codeEditor/browser/toggleWordWrap": [ "Whether the editor is currently using word wrapping.", "View: Toggle Word Wrap", @@ -25427,9 +25642,17 @@ "Enable wrapping for this file", "&&Word Wrap" ], + "vs/workbench/contrib/codeEditor/browser/toggleRenderControlCharacter": [ + "Toggle Control Characters", + "Render &&Control Characters" + ], "vs/workbench/contrib/codeEditor/browser/untitledTextEditorHint/untitledTextEditorHint": [ "[[Select a language]], or [[fill with template]], or [[open a different editor]] to get started.\nStart typing to dismiss or [[don't show]] this again." ], + "vs/workbench/contrib/codeEditor/browser/toggleRenderWhitespace": [ + "Toggle Render Whitespace", + "&&Render Whitespace" + ], "vs/workbench/contrib/snippets/browser/commands/configureSnippets": [ "(global)", "({0})", @@ -25460,22 +25683,6 @@ "vs/workbench/contrib/snippets/browser/commands/surroundWithSnippet": [ "Surround With Snippet..." ], - "vs/workbench/contrib/snippets/browser/snippetCodeActionProvider": [ - "Surround With: {0}", - "Start with Snippet", - "Start with: {0}" - ], - "vs/workbench/contrib/snippets/browser/snippetsService": [ - "Expected string in `contributes.{0}.path`. Provided value: {1}", - "When omitting the language, the value of `contributes.{0}.path` must be a `.code-snippets`-file. Provided value: {1}", - "Unknown language in `contributes.{0}.language`. Provided value: {1}", - "Expected `contributes.{0}.path` ({1}) to be included inside extension's folder ({2}). This might make the extension non-portable.", - "Contributes snippets.", - "Language identifier for which this snippet is contributed to.", - "Path of the snippets file. The path is relative to the extension folder and typically starts with './snippets/'.", - "One or more snippets from the extension '{0}' very likely confuse snippet-variables and snippet-placeholders (see https://code.visualstudio.com/docs/editor/userdefinedsnippets#_snippet-syntax for more details)", - "The snippet file \"{0}\" could not be read." - ], "vs/workbench/contrib/format/browser/formatActionsMultiple": [ "None", "None", @@ -25510,6 +25717,8 @@ "This version of {0} does not have release notes online", "Welcome to {0} v{1}! Would you like to read the Release Notes?", "Release Notes", + "Updates are disabled because you are running the user-scope installation of {0} as Administrator.", + "Learn More", "New {0} update available.", "Checking for Updates...", "Downloading...", @@ -25534,6 +25743,7 @@ "Downloading Update...", "Install Update... (1)", "Installing Update...", + "Show Update Release Notes", "Restart to Update (1)", "Switch to Insiders Version...", "Switch to Stable Version...", @@ -25546,8 +25756,10 @@ "&&Insiders", "&&Stable (current)" ], - "vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedInput": [ - "Welcome" + "vs/workbench/contrib/snippets/browser/snippetCodeActionProvider": [ + "Surround With: {0}", + "Start with Snippet", + "Start with: {0}" ], "vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedService": [ "Built-In", @@ -25587,6 +25799,20 @@ "opt out", "{0} collects usage data. Read our {1} and learn how to {2}." ], + "vs/workbench/contrib/snippets/browser/snippetsService": [ + "Expected string in `contributes.{0}.path`. Provided value: {1}", + "When omitting the language, the value of `contributes.{0}.path` must be a `.code-snippets`-file. Provided value: {1}", + "Unknown language in `contributes.{0}.language`. Provided value: {1}", + "Expected `contributes.{0}.path` ({1}) to be included inside extension's folder ({2}). This might make the extension non-portable.", + "Contributes snippets.", + "Language identifier for which this snippet is contributed to.", + "Path of the snippets file. The path is relative to the extension folder and typically starts with './snippets/'.", + "One or more snippets from the extension '{0}' very likely confuse snippet-variables and snippet-placeholders (see https://code.visualstudio.com/docs/editor/userdefinedsnippets#_snippet-syntax for more details)", + "The snippet file \"{0}\" could not be read." + ], + "vs/workbench/contrib/welcomeGettingStarted/browser/gettingStartedInput": [ + "Welcome" + ], "vs/workbench/contrib/welcomeGettingStarted/browser/startupPage": [ "Welcome Page", "Could not open markdown preview: {0}.\n\nPlease make sure the markdown extension is enabled." @@ -25634,33 +25860,7 @@ "{0} ({1})", "1 problem in this element", "{0} problems in this element", - "Contains elements with problems", - "array", - "boolean", - "class", - "constant", - "constructor", - "enumeration", - "enumeration member", - "event", - "field", - "file", - "function", - "interface", - "key", - "method", - "module", - "namespace", - "null", - "number", - "object", - "operator", - "package", - "property", - "string", - "struct", - "type parameter", - "variable" + "Contains elements with problems" ], "vs/workbench/contrib/outline/browser/outlinePane": [ "The active editor cannot provide outline information.", @@ -25762,39 +25962,28 @@ "Clear Data in Cloud..." ], "vs/workbench/contrib/userDataProfile/browser/userDataProfile": [ - "Create an Empty Profile...", - "Create from Current Profile...", "Profiles ({0})", "Switch Profile...", "Select Profile", - "Rename...", - "Show Contents...", + "Edit Profile...", + "Show Profile Contents", "Export Profile...", "Export Profile ({0})...", "Import Profile...", - "Create from profile template file", - "Create from profile template URL", - "Create Profile from Profile Template...", - "Provide profile template URL or select profile template file", + "Import from URL", + "Select File...", + "Profile Templates", + "Import from Profile Template...", + "Provide Profile Template URL", "Error while creating profile: {0}", "Select Profile Template File", "Import Profile...", - "Profile name", - "Create from Current Profile...", - "Create an Empty Profile...", - "Profile with name {0} already exists.", - "Create Profile...", - "Empty Profile", - "Using Current Profile", - "Profile Templates", + "Save Current Profile As...", "Create Profile...", "Delete Profile...", "Current", "Delete Profile...", - "Select Profiles to Delete", - "Create Profile from Templates...", - "{0}: Create...", - "There are no templates to create from" + "Select Profiles to Delete" ], "vs/workbench/contrib/userDataProfile/browser/userDataProfileActions": [ "Create a Temporary Profile", @@ -25814,6 +26003,7 @@ "View icon of the cloud changes view." ], "vs/workbench/contrib/editSessions/browser/editSessionsStorageService": [ + "Select an account to restore your working changes from the cloud", "Select an account to store your working changes in the cloud", "Signed In", "Others", @@ -25843,13 +26033,6 @@ "Cloud Changes", "Open File" ], - "vs/workbench/contrib/codeActions/common/codeActionsExtensionPoint": [ - "Configure which editor to use for a resource.", - "Language modes that the code actions are enabled for.", - "`CodeActionKind` of the contributed code action.", - "Label for the code action used in the UI.", - "Description of what the code action does." - ], "vs/workbench/contrib/codeActions/common/documentationExtensionPoint": [ "Contributed documentation.", "Contributed documentation for refactorings.", @@ -25858,6 +26041,13 @@ "When clause.", "Command executed." ], + "vs/workbench/contrib/codeActions/common/codeActionsExtensionPoint": [ + "Configure which editor to use for a resource.", + "Language modes that the code actions are enabled for.", + "`CodeActionKind` of the contributed code action.", + "Label for the code action used in the UI.", + "Description of what the code action does." + ], "vs/workbench/contrib/codeActions/browser/codeActionsContribution": [ "Controls whether auto fix action should be run on file save.", "Code Action kinds to be run on save.", @@ -26038,13 +26228,68 @@ "vs/workbench/services/workingCopy/common/workingCopyHistoryTracker": [ "Undo / Redo" ], - "vs/workbench/services/extensions/common/extensionHostManager": [ - "Measure Extension Host Latency" + "vs/workbench/services/extensions/common/extensionHostManager": [ + "Measure Extension Host Latency" + ], + "vs/workbench/services/extensions/common/extensionsUtil": [ + "Overwriting extension {0} with {1}.", + "Overwriting extension {0} with {1}.", + "Loading development extension at {0}" + ], + "vs/workbench/contrib/extensions/common/reportExtensionIssueAction": [ + "Report Issue" + ], + "vs/workbench/contrib/extensions/electron-sandbox/extensionsSlowActions": [ + "Performance Issue", + "Report Issue", + "Did you attach the CPU-Profile?", + "This is a reminder to make sure that you have not forgotten to attach '{0}' to the issue you have just created.", + "Show Issues", + "Did you attach the CPU-Profile?", + "This is a reminder to make sure that you have not forgotten to attach '{0}' to an existing performance issue." + ], + "vs/workbench/contrib/terminal/electron-sandbox/terminalRemote": [ + "Create New Integrated Terminal (Local)" + ], + "vs/workbench/contrib/terminal/browser/baseTerminalBackend": [ + "Pty Host Status", + "Pty Host", + "The connection to the terminal's pty host process is unresponsive, terminals may stop working. Click to manually restart the pty host.", + "Pty Host is unresponsive" + ], + "vs/workbench/contrib/tasks/browser/taskTerminalStatus": [ + "Task is running", + "Task succeeded", + "Task succeeded and waiting...", + "Task has errors", + "Task has errors and is waiting...", + "Task has warnings", + "Task has warnings and is waiting...", + "Task has infos", + "Task has infos and is waiting...", + "Beginning of detected errors for this run" + ], + "vs/workbench/contrib/tasks/common/taskConfiguration": [ + "Warning: options.cwd must be of type string. Ignoring value {0}\n", + "Error: command argument must either be a string or a quoted string. Provided value is:\n{0}", + "Warning: shell configuration is only supported when executing tasks in the terminal.", + "Error: Problem Matcher in declare scope must have a name:\n{0}\n", + "Warning: the defined problem matcher is unknown. Supported types are string | ProblemMatcher | Array.\n{0}\n", + "Error: Invalid problemMatcher reference: {0}\n", + "Error: tasks configuration must have a type property. The configuration will be ignored.\n{0}\n", + "Error: there is no registered task type '{0}'. Did you miss installing an extension that provides a corresponding task provider?", + "Error: the task configuration '{0}' is missing the required property 'type'. The task configuration will be ignored.", + "Error: the task configuration '{0}' is using an unknown type. The task configuration will be ignored.", + "Error: tasks is not declared as a custom task. The configuration will be ignored.\n{0}\n", + "Error: a task must provide a label property. The task will be ignored.\n{0}\n", + "Warning: {0} tasks are unavailable in the current environment.\n", + "Error: the task '{0}' neither specifies a command nor a dependsOn property. The task will be ignored. Its definition is:\n{1}", + "Error: the task '{0}' doesn't define a command. The task will be ignored. Its definition is:\n{1}", + "Task version 2.0.0 doesn't support global OS specific tasks. Convert them to a task with a OS specific command. Affected tasks are:\n{0}" ], - "vs/workbench/services/extensions/common/extensionsUtil": [ - "Overwriting extension {0} with {1}.", - "Overwriting extension {0} with {1}.", - "Loading development extension at {0}" + "vs/workbench/contrib/localHistory/browser/localHistory": [ + "Icon for a local history entry in the timeline view.", + "Icon for restoring contents of a local history entry." ], "vs/workbench/contrib/localization/common/localizationsActions": [ "Configure Display Language", @@ -26054,21 +26299,6 @@ "More Info", "Clear Display Language Preference" ], - "vs/workbench/contrib/extensions/electron-sandbox/extensionsSlowActions": [ - "Performance Issue", - "Report Issue", - "Did you attach the CPU-Profile?", - "This is a reminder to make sure that you have not forgotten to attach '{0}' to the issue you have just created.", - "Show Issues", - "Did you attach the CPU-Profile?", - "This is a reminder to make sure that you have not forgotten to attach '{0}' to an existing performance issue." - ], - "vs/workbench/contrib/extensions/common/reportExtensionIssueAction": [ - "Report Issue" - ], - "vs/workbench/contrib/terminal/electron-sandbox/terminalRemote": [ - "Create New Integrated Terminal (Local)" - ], "vs/workbench/contrib/tasks/common/taskTemplates": [ "Executes .NET Core build command", "Executes the build target", @@ -26094,46 +26324,6 @@ "No {0} tasks found. Go back ↩", "There is no task provider registered for tasks of type \"{0}\"." ], - "vs/workbench/contrib/tasks/common/taskConfiguration": [ - "Warning: options.cwd must be of type string. Ignoring value {0}\n", - "Error: command argument must either be a string or a quoted string. Provided value is:\n{0}", - "Warning: shell configuration is only supported when executing tasks in the terminal.", - "Error: Problem Matcher in declare scope must have a name:\n{0}\n", - "Warning: the defined problem matcher is unknown. Supported types are string | ProblemMatcher | Array.\n{0}\n", - "Error: Invalid problemMatcher reference: {0}\n", - "Error: tasks configuration must have a type property. The configuration will be ignored.\n{0}\n", - "Error: there is no registered task type '{0}'. Did you miss installing an extension that provides a corresponding task provider?", - "Error: the task configuration '{0}' is missing the required property 'type'. The task configuration will be ignored.", - "Error: the task configuration '{0}' is using an unknown type. The task configuration will be ignored.", - "Error: tasks is not declared as a custom task. The configuration will be ignored.\n{0}\n", - "Error: a task must provide a label property. The task will be ignored.\n{0}\n", - "Warning: {0} tasks are unavailable in the current environment.\n", - "Error: the task '{0}' neither specifies a command nor a dependsOn property. The task will be ignored. Its definition is:\n{1}", - "Error: the task '{0}' doesn't define a command. The task will be ignored. Its definition is:\n{1}", - "Task version 2.0.0 doesn't support global OS specific tasks. Convert them to a task with a OS specific command. Affected tasks are:\n{0}" - ], - "vs/workbench/contrib/terminal/browser/baseTerminalBackend": [ - "Pty Host Status", - "Pty Host", - "The connection to the terminal's pty host process is unresponsive, terminals may stop working. Click to manually restart the pty host.", - "Pty Host is unresponsive" - ], - "vs/workbench/contrib/tasks/browser/taskTerminalStatus": [ - "Task is running", - "Task succeeded", - "Task succeeded and waiting...", - "Task has errors", - "Task has errors and is waiting...", - "Task has warnings", - "Task has warnings and is waiting...", - "Task has infos", - "Task has infos and is waiting...", - "Beginning of detected errors for this run" - ], - "vs/workbench/contrib/localHistory/browser/localHistory": [ - "Icon for a local history entry in the timeline view.", - "Icon for restoring contents of a local history entry." - ], "vs/workbench/contrib/debug/common/abstractDebugAdapter": [ "Timeout after {0} ms for '{1}'" ], @@ -26242,7 +26432,11 @@ "Cleared Input" ], "vs/workbench/browser/parts/notifications/notificationsList": [ + "Inspect the response in the accessible view with {0}", + "Inspect the response in the accessible view via the command Open Accessible View which is currently not triggerable via keybinding", + "{0}, notification, {1}", "{0}, notification", + "{0}, source: {1}, notification, {2}", "{0}, source: {1}, notification", "Notifications List" ], @@ -26269,6 +26463,17 @@ "vs/base/browser/ui/actionbar/actionViewItems": [ "{0} ({1})" ], + "vs/editor/browser/widget/inlineDiffMargin": [ + "Copy deleted lines", + "Copy deleted line", + "Copy changed lines", + "Copy changed line", + "Copy deleted line ({0})", + "Copy changed line ({0})", + "Revert this change", + "Copy deleted line ({0})", + "Copy changed line ({0})" + ], "vs/editor/browser/widget/diffReview": [ "Icon for 'Insert' in diff review.", "Icon for 'Remove' in diff review.", @@ -26284,17 +26489,6 @@ "+ {0} modified line {1}", "- {0} original line {1}" ], - "vs/editor/browser/widget/inlineDiffMargin": [ - "Copy deleted lines", - "Copy deleted line", - "Copy changed lines", - "Copy changed line", - "Copy deleted line ({0})", - "Copy changed line ({0})", - "Revert this change", - "Copy deleted line ({0})", - "Copy changed line ({0})" - ], "vs/editor/common/viewLayout/viewLineRenderer": [ "Show more ({0})", "{0} chars" @@ -26329,21 +26523,14 @@ "Auto Fix...", "No auto fixes available" ], - "vs/editor/contrib/codeAction/browser/codeActionController": [ - "Hide Disabled", - "Show Disabled" - ], "vs/editor/contrib/codeAction/browser/lightBulbWidget": [ "Show Code Actions. Preferred Quick Fix Available ({0})", "Show Code Actions ({0})", "Show Code Actions" ], - "vs/editor/contrib/dropOrPasteInto/browser/copyPasteController": [ - "Whether the paste widget is showing", - "Show paste options...", - "Running paste handlers. Click to cancel", - "Select Paste Action", - "Running paste handlers" + "vs/editor/contrib/codeAction/browser/codeActionController": [ + "Hide Disabled", + "Show Disabled" ], "vs/editor/contrib/dropOrPasteInto/browser/defaultProviders": [ "Built-in", @@ -26355,6 +26542,13 @@ "Insert Relative Paths", "Insert Relative Path" ], + "vs/editor/contrib/dropOrPasteInto/browser/copyPasteController": [ + "Whether the paste widget is showing", + "Show paste options...", + "Running paste handlers. Click to cancel", + "Select Paste Action", + "Running paste handlers" + ], "vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController": [ "Whether the drop widget is showing", "Show drop options...", @@ -26498,17 +26692,6 @@ "Overview ruler marker color for write-access symbol highlights. The color must not be opaque so as not to hide underlying decorations.", "Overview ruler marker color of a textual occurrence for a symbol. The color must not be opaque so as not to hide underlying decorations." ], - "vs/editor/contrib/parameterHints/browser/parameterHintsWidget": [ - "Icon for show next parameter hint.", - "Icon for show previous parameter hint.", - "{0}, hint", - "Foreground color of the active item in the parameter hint." - ], - "vs/editor/contrib/rename/browser/renameInputField": [ - "Whether the rename input widget is visible", - "Rename input. Type new name and press Enter to commit.", - "{0} to Rename, {1} to Preview" - ], "vs/editor/contrib/stickyScroll/browser/stickyScrollActions": [ "Toggle Sticky Scroll", "&&Toggle Sticky Scroll", @@ -26534,11 +26717,17 @@ "Loading...", "No suggestions.", "Suggest", - "{0}{1}, {2}", - "{0}{1}", + "{0} {1}, {2}", + "{0} {1}", "{0}, {1}", "{0}, docs: {1}" ], + "vs/editor/contrib/parameterHints/browser/parameterHintsWidget": [ + "Icon for show next parameter hint.", + "Icon for show previous parameter hint.", + "{0}, hint", + "Foreground color of the active item in the parameter hint." + ], "vs/platform/theme/common/tokenClassificationRegistry": [ "Colors and styles for the token.", "Foreground color for the token.", @@ -26611,6 +26800,11 @@ "Collapse All", "Expand All" ], + "vs/editor/contrib/rename/browser/renameInputField": [ + "Whether the rename input widget is visible", + "Rename input. Type new name and press Enter to commit.", + "{0} to Rename, {1} to Preview" + ], "vs/workbench/contrib/comments/browser/commentsTreeViewer": [ "Comments", "{0} comments", @@ -26621,32 +26815,6 @@ "[Ln {0}-{1}]", "Last reply from {0}" ], - "vs/workbench/contrib/testing/common/testResult": [ - "Test run at {0}" - ], - "vs/workbench/browser/parts/compositeBarActions": [ - "{0} ({1})", - "{0} - {1}", - "Additional Views", - "{0} ({1})", - "Manage Extension", - "Hide '{0}'", - "Keep '{0}'", - "Hide Badge", - "Show Badge", - "Toggle View Pinned", - "Toggle View Badge" - ], - "vs/base/browser/ui/tree/treeDefaults": [ - "Collapse All" - ], - "vs/workbench/browser/parts/views/checkbox": [ - "Checked", - "Unchecked" - ], - "vs/base/browser/ui/splitview/paneview": [ - "{0} Section" - ], "vs/workbench/contrib/remote/browser/tunnelView": [ "Whether the Ports view is enabled.", "Add Port", @@ -26708,6 +26876,32 @@ "Change Port Protocol", "The color of the icon for a port that has an associated running process." ], + "vs/workbench/contrib/testing/common/testResult": [ + "Test run at {0}" + ], + "vs/workbench/browser/parts/compositeBarActions": [ + "{0} ({1})", + "{0} - {1}", + "Additional Views", + "{0} ({1})", + "Manage Extension", + "Hide '{0}'", + "Keep '{0}'", + "Hide Badge", + "Show Badge", + "Toggle View Pinned", + "Toggle View Badge" + ], + "vs/base/browser/ui/splitview/paneview": [ + "{0} Section" + ], + "vs/base/browser/ui/tree/treeDefaults": [ + "Collapse All" + ], + "vs/workbench/browser/parts/views/checkbox": [ + "Checked", + "Unchecked" + ], "vs/workbench/contrib/remote/browser/remoteIcons": [ "Getting started icon in the remote explorer view.", "Documentation icon in the remote explorer view.", @@ -26735,30 +26929,6 @@ "The file is not displayed in the text editor because it is either binary or uses an unsupported text encoding.", "Open Anyway" ], - "vs/editor/browser/widget/diffEditorWidget2/colors": [ - "The border color for text that got moved in the diff editor." - ], - "vs/workbench/browser/parts/editor/editorPanes": [ - "Unable to open '{0}'", - "&&OK" - ], - "vs/workbench/browser/parts/editor/tabsTitleControl": [ - "Tab actions" - ], - "vs/workbench/browser/parts/editor/editorGroupWatermark": [ - "Show All Commands", - "Go to File", - "Open File", - "Open Folder", - "Open File or Folder", - "Open Recent", - "New Untitled Text File", - "Find in Files", - "Toggle Terminal", - "Start Debugging", - "Toggle Full Screen", - "Show Settings" - ], "vs/workbench/browser/parts/activitybar/activitybarActions": [ "Loading...", "{0} is currently unavailable", @@ -26794,6 +26964,12 @@ "Installing Update...", "Restart to &&Update" ], + "vs/editor/browser/widget/diffEditor.contribution": [ + "Accessible Diff Viewer", + "Go to Next Difference", + "Open Accessible Diff Viewer", + "Go to Previous Difference" + ], "vs/workbench/browser/parts/compositePart": [ "{0} actions", "Views and More Actions...", @@ -26805,6 +26981,27 @@ "vs/workbench/browser/parts/sidebar/sidebarActions": [ "Focus into Primary Side Bar" ], + "vs/workbench/browser/parts/editor/tabsTitleControl": [ + "Tab actions" + ], + "vs/workbench/browser/parts/editor/editorPanes": [ + "Unable to open '{0}'", + "&&OK" + ], + "vs/workbench/browser/parts/editor/editorGroupWatermark": [ + "Show All Commands", + "Go to File", + "Open File", + "Open Folder", + "Open File or Folder", + "Open Recent", + "New Untitled Text File", + "Find in Files", + "Toggle Terminal", + "Start Debugging", + "Toggle Full Screen", + "Show Settings" + ], "vs/base/browser/ui/iconLabel/iconLabelHover": [ "Loading..." ], @@ -26850,6 +27047,9 @@ "vs/editor/common/model/editStack": [ "Typing" ], + "vs/base/browser/ui/selectBox/selectBoxCustom": [ + "Select Box" + ], "vs/platform/quickinput/browser/quickInput": [ "Back", "Press 'Enter' to confirm your input or 'Escape' to cancel", @@ -26875,18 +27075,6 @@ "Defines which scope names contain balanced brackets.", "Defines which scope names do not contain balanced brackets." ], - "vs/workbench/contrib/preferences/browser/preferencesWidgets": [ - "User", - "Remote", - "Workspace", - "Folder", - "Settings Switcher", - "User", - "Remote", - "Workspace", - "User", - "Workspace" - ], "vs/base/browser/ui/keybindingLabel/keybindingLabel": [ "Unbound" ], @@ -26920,6 +27108,7 @@ "This setting cannot be applied because it is configured in the system policy.", "This setting cannot be applied because it is not registered as language override setting.", "This setting cannot be applied while a non-default profile is active. It will be applied when the default profile is active.", + "This setting cannot be applied because it is configured to be applied in all profiles using setting {0}. Value from the default profile will be used instead.", "This setting cannot be applied in this window. It will be applied when you open a local window.", "This setting cannot be applied in this workspace. It will be applied when you open the containing workspace folder directly.", "This setting has an application scope and can be set only in the user settings file.", @@ -26980,9 +27169,17 @@ "Security", "Workspace" ], - "vs/workbench/contrib/preferences/browser/tocTree": [ - "Settings Table of Contents", - "{0}, group" + "vs/workbench/contrib/preferences/browser/preferencesWidgets": [ + "User", + "Remote", + "Workspace", + "Folder", + "Settings Switcher", + "User", + "Remote", + "Workspace", + "User", + "Workspace" ], "vs/workbench/contrib/preferences/browser/settingsTree": [ "Extensions", @@ -27001,7 +27198,12 @@ "Settings", "Copy Setting ID", "Copy Setting as JSON", - "Sync This Setting" + "Sync This Setting", + "Apply Setting to all Profiles" + ], + "vs/workbench/contrib/preferences/browser/tocTree": [ + "Settings Table of Contents", + "{0}, group" ], "vs/workbench/contrib/preferences/browser/settingsSearchMenu": [ "Modified", @@ -27053,6 +27255,8 @@ "Paths to additional resources that should be allowed in the webview." ], "vs/workbench/contrib/notebook/browser/notebookEditorWidget": [ + "Notebook\nUse {0} for accessibility help", + "Notebook\nRun the Open Accessibility Help command for more information", "Notebook", "The border color for notebook cells.", "The color of the notebook cell editor border.", @@ -27101,7 +27305,7 @@ "{0} - Currently Selected", "Change kernel for '{0}'", "Select kernel for '{0}'", - "Install suggested extensions", + "Install/Enable suggested extensions", "Browse marketplace for kernel extensions", "Select Another Kernel...", "Select Kernel", @@ -27133,9 +27337,14 @@ "vs/editor/contrib/codeAction/browser/codeAction": [ "An unknown error occurred while applying the code action" ], + "vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineProvider": [ + "empty cell" + ], "vs/workbench/contrib/chat/browser/actions/chatAccessibilityHelp": [ "The chat view is comprised of an input box and a request/response list. The input box is used to make requests and the list is used to display responses.", "In the input box, use up and down arrows to navigate your request history. Edit input and use enter or the submit button to run a new request.", + "In the input box, inspect the last response in the accessible view via {0}", + "With the input box focused, inspect the last response in the accessible view via the Open Accessible View command, which is currently not triggerable by a keybinding.", "Chat responses will be announced as they come in. A response will indicate the number of code blocks, if any, and then the rest of the response.", "To focus the chat request/response list, which can be navigated with up and down arrows, invoke The Focus Chat command ({0}).", "To focus the chat request/response list, which can be navigated with up and down arrows, invoke The Focus Chat List command, which is currently not triggerable by a keybinding.", @@ -27148,29 +27357,47 @@ "Inline chat occurs within a code editor and takes into account the current selection. It is useful for making changes to the current editor. For example, fixing diagnostics, documenting or refactoring code. Keep in mind that AI generated code may be incorrect.", "It can be activated via code actions or directly using the command: Inline Chat: Start Code Chat ({0}).", "In the input box, use {0} and {1} to navigate your request history. Edit input and use enter or the submit button to run a new request.", - "Context menu actions may run a request prefixed with /fix or /explain. Type / to discover more ready-made commands.", - "When a request is prefixed with /fix, a response will indicate the problem with the current code. A diff editor will be rendered and can be reached by tabbing.", + "In the input box, inspect the response in the accessible view via {0}", + "With the input box focused, inspect the response in the accessible view via the Open Accessible View command, which is currently not triggerable by a keybinding.", + "Context menu actions may run a request prefixed with a /. Type / to discover such ready-made commands.", + "If a fix action is invoked, a response will indicate the problem with the current code. A diff editor will be rendered and can be reached by tabbing.", "Once in the diff editor, enter review mode with ({0}). Use up and down arrows to navigate lines with the proposed changes.", "Tab again to enter the Diff editor with the changes and enter review mode with the Go to Next Difference Command. Use Up/DownArrow to navigate lines with the proposed changes.", - "When a request is prefixed with /explain, a response will explain the code in the current selection and the chat view will be focused.", "Use tab to reach conditional parts like commands, status, message responses and more.", "Audio cues can be changed via settings with a prefix of audioCues.chat. By default, if a request takes more than 4 seconds, you will hear an audio cue indicating that progress is still occurring.", "Chat accessibility help", "Inline chat accessibility help" ], + "vs/workbench/contrib/chat/browser/actions/quickQuestionActions/quickQuestionAction": [ + "Chat" + ], + "vs/workbench/contrib/chat/browser/actions/quickQuestionActions/multipleByScrollQuickQuestionAction": [ + "Clear", + "Open In Chat View" + ], + "vs/workbench/contrib/chat/browser/actions/quickQuestionActions/singleQuickQuestionAction": [ + "Ask {0} a question..." + ], + "vs/workbench/contrib/chat/browser/chatInputPart": [ + "Chat Input, Type to ask questions or type / for topics, press enter to send out the request. Use {0} for Chat Accessibility Help.", + "Chat Input, Type code here and press Enter to run. Use the Chat Accessibility Help command for more information.", + "Chat Input" + ], "vs/workbench/contrib/chat/browser/chatListRenderer": [ "Chat", + "{0} {1}", + "{0}", + "1 code block: {0} {1}", "1 code block: {0}", "{0} code blocks: {1}", + "{0} code blocks", "Code block", "Toolbar for code block which can be reached via tab", "Code block toolbar", "Code block {0}" ], - "vs/workbench/contrib/chat/browser/chatInputPart": [ - "Chat Input, Type to ask questions or type / for topics, press enter to send out the request. Use {0} for Chat Accessibility Help.", - "Chat Input, Type code here and press Enter to run. Use the Chat Accessibility Help command for more information.", - "Chat Input" + "vs/workbench/contrib/chat/browser/chatSlashCommandContentWidget": [ + "Exited {0} mode" ], "vs/workbench/contrib/inlineChat/browser/inlineChatStrategies": [ "Nothing changed", @@ -27255,13 +27482,6 @@ "Border on the side of the terminal tab in the panel. This defaults to tab.activeBorder.", "'{0}' ANSI color in the terminal." ], - "vs/platform/quickinput/browser/commandsQuickAccess": [ - "recently used", - "commonly used", - "other commands", - "{0}, {1}", - "Command '{0}' resulted in an error" - ], "vs/workbench/contrib/files/browser/views/explorerDecorationsProvider": [ "Unable to resolve workspace folder ({0})", "Symbolic Link", @@ -27284,6 +27504,13 @@ "{0} folders", "{0} files" ], + "vs/platform/quickinput/browser/commandsQuickAccess": [ + "recently used", + "commonly used", + "other commands", + "{0}, {1}", + "Command '{0}' resulted in an error" + ], "vs/workbench/contrib/files/browser/fileImportExport": [ "Uploading", "Overwrite {0}", @@ -27319,24 +27546,6 @@ "This action is irreversible!", "&&Replace" ], - "vs/workbench/contrib/bulkEdit/browser/preview/bulkEditTree": [ - "Bulk Edit", - "Renaming {0} to {1}, also making text edits", - "Creating {0}, also making text edits", - "Deleting {0}, also making text edits", - "{0}, making text edits", - "Renaming {0} to {1}", - "Creating {0}", - "Deleting {0}", - "line {0}, replacing {1} with {2}", - "line {0}, removing {1}", - "line {0}, inserting {1}", - "{0} → {1}", - "(renaming)", - "(creating)", - "(deleting)", - "{0} - {1}" - ], "vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess": [ "To go to a symbol, first open a text editor with symbol information.", "The active text editor does not provide symbol information.", @@ -27379,6 +27588,24 @@ "vs/workbench/contrib/search/browser/searchFindInput": [ "Notebook Find Filters" ], + "vs/workbench/contrib/bulkEdit/browser/preview/bulkEditTree": [ + "Bulk Edit", + "Renaming {0} to {1}, also making text edits", + "Creating {0}, also making text edits", + "Deleting {0}, also making text edits", + "{0}, making text edits", + "Renaming {0} to {1}", + "Creating {0}", + "Deleting {0}", + "line {0}, replacing {1} with {2}", + "line {0}, removing {1}", + "line {0}, inserting {1}", + "{0} → {1}", + "(renaming)", + "(creating)", + "(deleting)", + "{0} - {1}" + ], "vs/workbench/contrib/searchEditor/browser/searchEditorSerialization": [ "All backslashes in Query string must be escaped (\\\\)", "{0} files", @@ -27448,6 +27675,9 @@ "The task '{0}' cannot be tracked. Make sure to have a problem matcher defined.", "The task '{0}' cannot be tracked. Make sure to have a problem matcher defined." ], + "vs/workbench/contrib/debug/common/debugSource": [ + "Unknown Source" + ], "vs/workbench/contrib/debug/browser/debugSession": [ "No debugger available, can not send '{0}'", "No debugger available, can not send '{0}'", @@ -27489,9 +27719,6 @@ "Debugging started.", "Debugging stopped." ], - "vs/workbench/contrib/debug/common/debugSource": [ - "Unknown Source" - ], "vs/base/browser/ui/findinput/replaceInput": [ "input", "Preserve Case" @@ -27509,6 +27736,10 @@ "File", "Source" ], + "vs/workbench/contrib/comments/browser/commentsController": [ + "Whether the position at the active cursor has a commenting range", + "Select Comment Provider" + ], "vs/workbench/contrib/mergeEditor/common/mergeEditor": [ "The editor is a merge editor", "The editor is a the result editor of a merge editor.", @@ -27550,11 +27781,6 @@ "&&Close", "Don't ask again" ], - "vs/workbench/contrib/mergeEditor/browser/view/editors/baseCodeEditorView": [ - "Base", - "Comparing with {0}", - "Differences are highlighted with a background color." - ], "vs/workbench/contrib/mergeEditor/browser/view/viewModel": [ "There is currently no conflict focused that can be toggled." ], @@ -27593,17 +27819,9 @@ "The background color of decorations in input 1.", "The background color of decorations in input 2." ], - "vs/workbench/contrib/comments/browser/commentsController": [ - "Whether the position at the active cursor has a commenting range", - "Select Comment Provider" - ], "vs/workbench/contrib/customEditor/common/contributedCustomEditors": [ "Built-in" ], - "vs/platform/files/browser/htmlFileSystemProvider": [ - "Rename is only supported for files.", - "Insufficient permissions. Please retry and allow the operation." - ], "vs/workbench/contrib/extensions/browser/extensionsWidgets": [ "Average rating: {0} out of 5", "Sponsor", @@ -27630,11 +27848,20 @@ "The icon color for pre-release extension.", "The icon color for extension sponsor." ], + "vs/workbench/contrib/mergeEditor/browser/view/editors/baseCodeEditorView": [ + "Base", + "Comparing with {0}", + "Differences are highlighted with a background color." + ], "vs/workbench/contrib/extensions/browser/extensionsViewer": [ "Error", "Unknown Extension:", "Extensions" ], + "vs/platform/files/browser/htmlFileSystemProvider": [ + "Rename is only supported for files.", + "Insufficient permissions. Please retry and allow the operation." + ], "vs/workbench/contrib/extensions/browser/exeBasedRecommendations": [ "This extension is recommended because you have {0} installed." ], @@ -27648,79 +27875,16 @@ "The Marketplace has extensions that can help with '.{0}' files", "Don't Show Again for '.{0}' files" ], - "vs/workbench/contrib/extensions/browser/configBasedRecommendations": [ - "This extension is recommended because of the current workspace configuration" - ], "vs/workbench/contrib/extensions/browser/webRecommendations": [ "This extension is recommended for {0} for the Web" ], - "vs/workbench/contrib/tasks/common/jsonSchemaCommon": [ - "Additional command options", - "The current working directory of the executed program or script. If omitted Code's current workspace root is used.", - "The environment of the executed program or shell. If omitted the parent process' environment is used.", - "Unrecognized problem matcher. Is the extension that contributes this problem matcher installed?", - "Unrecognized problem matcher. Is the extension that contributes this problem matcher installed?", - "Configures the shell to be used.", - "The shell to be used.", - "The shell arguments.", - "The command to be executed. Can be an external program or a shell command.", - "Arguments passed to the command when this task is invoked.", - "The task's name", - "The command to be executed. Can be an external program or a shell command.", - "Arguments passed to the command when this task is invoked.", - "Windows specific command configuration", - "The problem matcher(s) to use. Can either be a string or a problem matcher definition or an array of strings and problem matchers.", - "Mac specific command configuration", - "The problem matcher(s) to use. Can either be a string or a problem matcher definition or an array of strings and problem matchers.", - "Linux specific command configuration", - "The problem matcher(s) to use. Can either be a string or a problem matcher definition or an array of strings and problem matchers.", - "Controls whether the task name is added as an argument to the command. If omitted the globally defined value is used.", - "Controls whether the output of the running task is shown or not. If omitted the globally defined value is used.", - "Controls whether the executed command is echoed to the output. Default is false.", - "Deprecated. Use isBackground instead.", - "Whether the executed task is kept alive and is watching the file system.", - "Whether the executed task is kept alive and is running in the background.", - "Whether the user is prompted when VS Code closes with a running task.", - "Maps this task to Code's default build command.", - "Maps this task to Code's default test command.", - "The problem matcher(s) to use. Can either be a string or a problem matcher definition or an array of strings and problem matchers.", - "The command to be executed. Can be an external program or a shell command.", - "Additional arguments passed to the command.", - "Controls whether the output of the running task is shown or not. If omitted 'always' is used.", - "Deprecated. Use isBackground instead.", - "Whether the executed task is kept alive and is watching the file system.", - "Whether the executed task is kept alive and is running in the background.", - "Whether the user is prompted when VS Code closes with a running background task.", - "Controls whether the executed command is echoed to the output. Default is false.", - "Controls whether the task name is added as an argument to the command. Default is false.", - "Prefix to indicate that an argument is task.", - "The problem matcher(s) to use. Can either be a string or a problem matcher definition or an array of strings and problem matchers.", - "The task configurations. Usually these are enrichments of task already defined in the external task runner." - ], - "vs/workbench/services/configurationResolver/common/configurationResolverUtils": [ - "'env.', 'config.' and 'command.' are deprecated, use 'env:', 'config:' and 'command:' instead." - ], - "vs/workbench/services/configurationResolver/common/configurationResolverSchema": [ - "The input's id is used to associate an input with a variable of the form ${input:id}.", - "The type of user input prompt to use.", - "The description is shown when the user is prompted for input.", - "The default value for the input.", - "User inputs. Used for defining user input prompts, such as free string input or a choice from several options.", - "The 'promptString' type opens an input box to ask the user for input.", - "Controls if a password input is shown. Password input hides the typed text.", - "The 'pickString' type shows a selection list.", - "An array of strings that defines the options for a quick pick.", - "Label for the option.", - "Value for the option.", - "The 'command' type executes a command.", - "The command to execute for this input variable.", - "Optional arguments passed to the command.", - "Optional arguments passed to the command.", - "Optional arguments passed to the command." + "vs/workbench/contrib/extensions/browser/configBasedRecommendations": [ + "This extension is recommended because of the current workspace configuration" ], - "vs/workbench/contrib/remote/browser/explorerViewItems": [ - "Switch Remote", - "Switch Remote" + "vs/workbench/contrib/terminal/browser/terminalQuickAccess": [ + "Create New Terminal", + "Create New Terminal With Profile", + "Rename Terminal" ], "vs/workbench/contrib/terminal/browser/terminalActions": [ "Show Tabs", @@ -27804,18 +27968,6 @@ "Select current working directory for new terminal", "Enter terminal name" ], - "vs/workbench/contrib/terminal/browser/terminalService": [ - "Do you want to terminate the active terminal session?", - "Do you want to terminate the {0} active terminal sessions?", - "&&Terminate", - "This shell is open to a {0}local{1} folder, NOT to the virtual folder", - "This shell is running on your {0}local{1} machine, NOT on the connected remote machine" - ], - "vs/workbench/contrib/terminal/browser/terminalQuickAccess": [ - "Create New Terminal", - "Create New Terminal With Profile", - "Rename Terminal" - ], "vs/workbench/contrib/terminal/common/terminalConfiguration": [ "the terminal's current working directory", "the terminal's current working directory, displayed for multi-root workspaces or in a single root workspace when the value differs from the initial working directory. On Windows, this will only be displayed when shell integration is enabled.", @@ -27926,7 +28078,7 @@ "A new split terminal will use the working directory that the parent terminal started with.", "On macOS and Linux, a new split terminal will use the working directory of the parent terminal. On Windows, this behaves the same as initial.", "Whether to use ConPTY for Windows terminal process communication (requires Windows 10 build number 18309+). Winpty will be used if this is false.", - "A string containing all characters to be considered word separators by the double-click to select word feature.", + "A string containing all characters to be considered word separators when double-clicking to select word and in the fallback 'word' link detection. Since this is used for link detection, including characters such as `:` that are used when detecting links will cause the line and column part of links like `file:10:5` to be ignored.", "Whether to enable file links in terminals. Links can be slow when working on a network drive in particular because each file link is verified against the file system. Changing this will take effect only in new terminals.", "Always off.", "Always on.", @@ -27960,6 +28112,13 @@ "Controls whether the terminal will scroll using an animation.", "Enables image support in the terminal, this will only work when {0} is enabled. Both sixel and iTerm's inline image protocol are supported on Linux and macOS, Windows support will light up automatically when ConPTY passes through the sequences. Images will currently not be restored between window reloads/reconnects." ], + "vs/workbench/contrib/terminal/browser/terminalService": [ + "Do you want to terminate the active terminal session?", + "Do you want to terminate the {0} active terminal sessions?", + "&&Terminate", + "This shell is open to a {0}local{1} folder, NOT to the virtual folder", + "This shell is running on your {0}local{1} machine, NOT on the connected remote machine" + ], "vs/workbench/contrib/terminal/browser/terminalIcons": [ "View icon of the terminal view.", "Icon for rename in the terminal quick menu.", @@ -28037,6 +28196,11 @@ "vs/platform/terminal/common/terminalLogService": [ "Terminal" ], + "vs/workbench/contrib/terminal/browser/terminalTabbedView": [ + "Move Tabs Right", + "Move Tabs Left", + "Hide Tabs" + ], "vs/workbench/contrib/terminal/browser/terminalTooltip": [ "Shell integration activated", "The terminal process failed to launch. Disabling shell integration with terminal.integrated.shellIntegration.enabled might help.", @@ -28044,11 +28208,6 @@ "Process ID ({0}): {1}", "Command line: {0}" ], - "vs/workbench/contrib/terminal/browser/terminalTabbedView": [ - "Move Tabs Right", - "Move Tabs Left", - "Hide Tabs" - ], "vs/workbench/contrib/terminalContrib/accessibility/browser/terminalAccessibilityHelp": [ "terminal accessibility help", "The Focus Accessible Buffer ({0}) command enables screen readers to read terminal contents.", @@ -28077,15 +28236,31 @@ "Terminal buffer", "{0}" ], - "vs/workbench/contrib/terminalContrib/quickFix/browser/terminalQuickFixBuiltinActions": [ - "Free port {0}", - "Create PR {0}" + "vs/workbench/contrib/terminalContrib/links/browser/terminalLinkManager": [ + "option + click", + "alt + click", + "cmd + click", + "ctrl + click", + "Follow link", + "Follow link using forwarded port", + "Link" + ], + "vs/workbench/contrib/terminalContrib/links/browser/terminalLinkQuickpick": [ + "Select the link to open", + "Url", + "Local File", + "Workspace Search", + "Show more links" ], "vs/workbench/contrib/terminalContrib/quickFix/browser/quickFixAddon": [ "Run: {0}", "Open: {0}", "Quick Fix" ], + "vs/workbench/contrib/terminalContrib/quickFix/browser/terminalQuickFixBuiltinActions": [ + "Free port {0}", + "Create PR {0}" + ], "vs/workbench/contrib/terminalContrib/quickFix/browser/terminalQuickFixService": [ "Contributes terminal quick fixes.", "The ID of the quick fix provider", @@ -28093,25 +28268,82 @@ "A regular expression or string to match a single line of the output against, which provides groups to be referenced in terminalCommand and uri.\n\nFor example:\n\n `lineMatcher: /git push --set-upstream origin (?[^s]+)/;`\n\n`terminalCommand: 'git push --set-upstream origin ${group:branchName}';`\n", "The command exit result to match on" ], - "vs/workbench/contrib/terminalContrib/links/browser/terminalLinkManager": [ - "option + click", - "alt + click", - "cmd + click", - "ctrl + click", - "Follow link", - "Follow link using forwarded port", - "Link" + "vs/workbench/contrib/tasks/common/jsonSchemaCommon": [ + "Additional command options", + "The current working directory of the executed program or script. If omitted Code's current workspace root is used.", + "The environment of the executed program or shell. If omitted the parent process' environment is used.", + "Unrecognized problem matcher. Is the extension that contributes this problem matcher installed?", + "Unrecognized problem matcher. Is the extension that contributes this problem matcher installed?", + "Configures the shell to be used.", + "The shell to be used.", + "The shell arguments.", + "The command to be executed. Can be an external program or a shell command.", + "Arguments passed to the command when this task is invoked.", + "The task's name", + "The command to be executed. Can be an external program or a shell command.", + "Arguments passed to the command when this task is invoked.", + "Windows specific command configuration", + "The problem matcher(s) to use. Can either be a string or a problem matcher definition or an array of strings and problem matchers.", + "Mac specific command configuration", + "The problem matcher(s) to use. Can either be a string or a problem matcher definition or an array of strings and problem matchers.", + "Linux specific command configuration", + "The problem matcher(s) to use. Can either be a string or a problem matcher definition or an array of strings and problem matchers.", + "Controls whether the task name is added as an argument to the command. If omitted the globally defined value is used.", + "Controls whether the output of the running task is shown or not. If omitted the globally defined value is used.", + "Controls whether the executed command is echoed to the output. Default is false.", + "Deprecated. Use isBackground instead.", + "Whether the executed task is kept alive and is watching the file system.", + "Whether the executed task is kept alive and is running in the background.", + "Whether the user is prompted when VS Code closes with a running task.", + "Maps this task to Code's default build command.", + "Maps this task to Code's default test command.", + "The problem matcher(s) to use. Can either be a string or a problem matcher definition or an array of strings and problem matchers.", + "The command to be executed. Can be an external program or a shell command.", + "Additional arguments passed to the command.", + "Controls whether the output of the running task is shown or not. If omitted 'always' is used.", + "Deprecated. Use isBackground instead.", + "Whether the executed task is kept alive and is watching the file system.", + "Whether the executed task is kept alive and is running in the background.", + "Whether the user is prompted when VS Code closes with a running background task.", + "Controls whether the executed command is echoed to the output. Default is false.", + "Controls whether the task name is added as an argument to the command. Default is false.", + "Prefix to indicate that an argument is task.", + "The problem matcher(s) to use. Can either be a string or a problem matcher definition or an array of strings and problem matchers.", + "The task configurations. Usually these are enrichments of task already defined in the external task runner." ], - "vs/workbench/contrib/terminalContrib/links/browser/terminalLinkQuickpick": [ - "Select the link to open", - "Url", - "Local File", - "Workspace Search", - "Show more links" + "vs/workbench/services/configurationResolver/common/configurationResolverUtils": [ + "'env.', 'config.' and 'command.' are deprecated, use 'env:', 'config:' and 'command:' instead." + ], + "vs/workbench/services/configurationResolver/common/configurationResolverSchema": [ + "The input's id is used to associate an input with a variable of the form ${input:id}.", + "The type of user input prompt to use.", + "The description is shown when the user is prompted for input.", + "The default value for the input.", + "User inputs. Used for defining user input prompts, such as free string input or a choice from several options.", + "The 'promptString' type opens an input box to ask the user for input.", + "Controls if a password input is shown. Password input hides the typed text.", + "The 'pickString' type shows a selection list.", + "An array of strings that defines the options for a quick pick.", + "Label for the option.", + "Value for the option.", + "The 'command' type executes a command.", + "The command to execute for this input variable.", + "Optional arguments passed to the command.", + "Optional arguments passed to the command.", + "Optional arguments passed to the command." + ], + "vs/workbench/contrib/remote/browser/explorerViewItems": [ + "Switch Remote", + "Switch Remote" ], "vs/workbench/contrib/snippets/browser/commands/abstractSnippetsActions": [ "Snippets" ], + "vs/workbench/contrib/snippets/browser/snippetsFile": [ + "Workspace Snippet", + "Global User Snippet", + "User Snippet" + ], "vs/workbench/contrib/snippets/browser/snippetPicker": [ "User Snippets", "Workspace Snippets", @@ -28121,11 +28353,6 @@ "Select a snippet", "No snippet available" ], - "vs/workbench/contrib/snippets/browser/snippetsFile": [ - "Workspace Snippet", - "Global User Snippet", - "User Snippet" - ], "vs/workbench/contrib/snippets/browser/snippetCompletionProvider": [ "{0} ({1})", "{0}, {1}", @@ -28463,24 +28690,24 @@ "vs/platform/terminal/common/terminalProfiles": [ "Automatically detect the default" ], + "vs/workbench/contrib/webview/browser/webviewElement": [ + "Error loading webview: {0}" + ], "vs/platform/quickinput/browser/quickPickPin": [ "pinned", "Pin command", "Pinned command" ], - "vs/workbench/contrib/webview/browser/webviewElement": [ - "Error loading webview: {0}" - ], "vs/workbench/api/common/extHostDiagnostics": [ "Not showing {0} further errors and warnings." ], - "vs/workbench/api/common/extHostProgress": [ - "{0} (Extension)" - ], "vs/workbench/api/common/extHostLanguageFeatures": [ "Paste using '{0}' extension", "Drop using '{0}' extension" ], + "vs/workbench/api/common/extHostProgress": [ + "{0} (Extension)" + ], "vs/workbench/api/common/extHostStatusBar": [ "{0} (Extension)", "Extension Status" @@ -28488,6 +28715,10 @@ "vs/workbench/api/common/extHostTreeViews": [ "Element with id {0} is already registered" ], + "vs/workbench/api/common/extHostNotebook": [ + "Unable to modify read-only file '{0}'", + "File Modified Since" + ], "vs/workbench/api/common/extHostChat": [ "Provider returned null response", "Error from provider: {0}" @@ -28507,14 +28738,6 @@ "close", "find" ], - "vs/editor/browser/controller/textAreaHandler": [ - "editor", - "The editor is not accessible at this time. Press {0} for options." - ], - "vs/editor/browser/widget/diffEditor.contribution": [ - "Go to Next Difference", - "Go to Previous Difference" - ], "vs/editor/contrib/codeAction/browser/codeActionMenu": [ "More Actions...", "Quick Fix...", @@ -28594,14 +28817,21 @@ "vs/editor/contrib/suggest/browser/suggestWidgetStatus": [ "{0} ({1})" ], - "vs/editor/contrib/suggest/browser/suggestWidgetDetails": [ - "Close", - "Loading..." - ], "vs/editor/contrib/suggest/browser/suggestWidgetRenderer": [ "Icon for more information in the suggest widget.", "Read More" ], + "vs/editor/browser/controller/textAreaHandler": [ + "editor", + "The editor is not accessible at this time.", + "{0} To enable screen reader optimized mode, use {1}", + "{0} To enable screen reader optimized mode, open the quick pick with {1} and run the command Toggle Screen Reader Accessibility Mode, which is currently not triggerable via keyboard.", + "{0} Please assign a keybinding for the command Toggle Screen Reader Accessibility Mode by accessing the keybindings editor with {1} and run it." + ], + "vs/editor/contrib/suggest/browser/suggestWidgetDetails": [ + "Close", + "Loading..." + ], "vs/workbench/contrib/comments/common/commentModel": [ "There are no comments in this workspace yet." ], @@ -28626,11 +28856,18 @@ "Color of background for currently selected or hovered comment range.", "Color of border for currently selected or hovered comment range." ], - "vs/editor/browser/widget/diffEditorWidget2/diffReview": [ - "Icon for 'Insert' in diff review.", - "Icon for 'Remove' in diff review.", - "Icon for 'Close' in diff review.", + "vs/editor/browser/widget/diffEditorWidget2/unchangedRanges": [ + "Fold Unchanged Region" + ], + "vs/editor/browser/widget/diffEditorWidget2/diffEditorEditors": [ + " use {0} to open the accessibility help." + ], + "vs/editor/browser/widget/diffEditorWidget2/accessibleDiffViewer": [ + "Icon for 'Insert' in accessible diff viewer.", + "Icon for 'Remove' in accessible diff viewer.", + "Icon for 'Close' in accessible diff viewer.", "Close", + "Accessible Diff Viewer. Use arrow up and down to navigate.", "no lines changed", "1 line changed", "{0} lines changed", @@ -28641,11 +28878,8 @@ "+ {0} modified line {1}", "- {0} original line {1}" ], - "vs/editor/browser/widget/diffEditorWidget2/unchangedRanges": [ - "Fold Unchanged Region" - ], - "vs/editor/browser/widget/diffEditorWidget2/diffEditorEditors": [ - " use Shift + F7 to navigate changes" + "vs/editor/browser/widget/diffEditorWidget2/colors": [ + "The border color for text that got moved in the diff editor." ], "vs/workbench/browser/parts/editor/editorPlaceholder": [ "Workspace Trust Required", @@ -28658,6 +28892,10 @@ "The editor could not be opened due to an unexpected error.", "Try Again" ], + "vs/base/browser/ui/menu/menubar": [ + "Application Menu", + "More" + ], "vs/workbench/browser/parts/editor/titleControl": [ "Editor actions", "{0} (+{1})" @@ -28675,16 +28913,12 @@ "Focus and Select Breadcrumbs", "Focus Breadcrumbs" ], - "vs/base/browser/ui/menu/menubar": [ - "Application Menu", - "More" + "vs/platform/quickinput/browser/quickInputList": [ + "Quick Input" ], "vs/platform/quickinput/browser/quickInputUtils": [ "Click to execute command '{0}'" ], - "vs/platform/quickinput/browser/quickInputList": [ - "Quick Input" - ], "vs/workbench/contrib/preferences/browser/settingsEditorSettingIndicators": [ "Setting value not applied", "The setting value can only be applied in a trusted workspace.", @@ -28771,6 +29005,12 @@ "vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer": [ "Execution Order" ], + "vs/workbench/contrib/notebook/browser/viewParts/notebookEditorStickyScroll": [ + "Toggle Notebook Sticky Scroll", + "&&Toggle Notebook Sticky Scroll", + "Notebook Sticky Scroll", + "&&Notebook Sticky Scroll" + ], "vs/workbench/services/workingCopy/common/storedFileWorkingCopyManager": [ "Saving working copies" ], @@ -28874,24 +29114,44 @@ "No debugger available found. Can not send '{0}'.", "More Info" ], - "vs/base/browser/ui/selectBox/selectBoxCustom": [ - "Select Box" + "vs/workbench/contrib/comments/browser/commentGlyphWidget": [ + "Editor gutter decoration color for commenting ranges. This color should be opaque.", + "Editor overview ruler decoration color for resolved comments. This color should be opaque.", + "Editor overview ruler decoration color for unresolved comments. This color should be opaque.", + "Editor gutter decoration color for commenting glyphs.", + "Editor gutter decoration color for commenting glyphs for unresolved comment threads." ], "vs/workbench/contrib/mergeEditor/browser/mergeMarkers/mergeMarkersController": [ "1 Conflicting Line", "{0} Conflicting Lines" ], + "vs/workbench/contrib/mergeEditor/browser/view/conflictActions": [ + "Accept {0}", + "Accept {0} in the result document.", + "Accept Combination ({0} First)", + "Accept Combination", + "Accept an automatic combination of both sides in the result document.", + "Append {0}", + "Append {0} to the result document.", + "Accept Combination", + "Accept an automatic combination of both sides in the result document.", + "Ignore", + "Don't take this side of the conflict.", + "Manual Resolution", + "This conflict has been resolved manually.", + "No Changes Accepted", + "The current resolution of this conflict equals the common ancestor of both the right and left changes.", + "Remove {0}", + "Remove {0} from the result document.", + "Remove {0}", + "Remove {0} from the result document.", + "Reset to base", + "Reset this conflict to the common ancestor of both the right and left changes." + ], "vs/workbench/contrib/mergeEditor/browser/model/mergeEditorModel": [ "Set Input Handled", "Undo Mark As Handled" ], - "vs/workbench/contrib/comments/browser/commentGlyphWidget": [ - "Editor gutter decoration color for commenting ranges. This color should be opaque.", - "Editor overview ruler decoration color for resolved comments. This color should be opaque.", - "Editor overview ruler decoration color for unresolved comments. This color should be opaque.", - "Editor gutter decoration color for commenting glyphs.", - "Editor gutter decoration color for commenting glyphs for unresolved comment threads." - ], "vs/workbench/contrib/customEditor/common/extensionPoint": [ "Contributed custom editors.", "Identifier for the custom editor. This must be unique across all custom editors, so we recommend including your extension id as part of `viewType`. The `viewType` is used when registering custom editors with `vscode.registerCustomEditorProvider` and in the `onCustomEditor:${id}` [activation event](https://code.visualstudio.com/api/references/activation-events).", @@ -28919,29 +29179,6 @@ "Cancel", "Configure Terminal Profile" ], - "vs/workbench/contrib/mergeEditor/browser/view/conflictActions": [ - "Accept {0}", - "Accept {0} in the result document.", - "Accept Combination ({0} First)", - "Accept Combination", - "Accept an automatic combination of both sides in the result document.", - "Append {0}", - "Append {0} to the result document.", - "Accept Combination", - "Accept an automatic combination of both sides in the result document.", - "Ignore", - "Don't take this side of the conflict.", - "Manual Resolution", - "This conflict has been resolved manually.", - "No Changes Accepted", - "The current resolution of this conflict equals the common ancestor of both the right and left changes.", - "Remove {0}", - "Remove {0} from the result document.", - "Remove {0}", - "Remove {0} from the result document.", - "Reset to base", - "Reset this conflict to the common ancestor of both the right and left changes." - ], "vs/workbench/contrib/terminal/browser/terminalInstance": [ "Task", "Local", @@ -28982,12 +29219,6 @@ "Terminal {0} {1}", "Terminal" ], - "vs/workbench/contrib/terminal/browser/xterm/decorationStyles": [ - "Show Command Actions", - "Command executed {0} and failed", - "Command executed {0} and failed (Exit Code {1})", - "Command executed {0}" - ], "vs/workbench/contrib/terminalContrib/links/browser/terminalLinkDetectorAdapter": [ "Search workspace", "Open file in editor", @@ -29006,6 +29237,12 @@ "{0} found for '{1}'", "{0} found for '{1}'" ], + "vs/workbench/contrib/terminal/browser/xterm/decorationStyles": [ + "Show Command Actions", + "Command executed {0} and failed", + "Command executed {0} and failed (Exit Code {1})", + "Command executed {0}" + ], "vs/workbench/contrib/welcomeGettingStarted/common/media/theme_picker": [ "Dark Modern", "Light Modern", @@ -29013,6 +29250,11 @@ "Light High Contrast", "See More Themes..." ], + "vs/workbench/contrib/welcomeGettingStarted/common/media/notebookProfile": [ + "Default", + "Jupyter", + "Colab" + ], "vs/workbench/contrib/userDataSync/browser/userDataSyncConflictsView": [ "Please go through each entry and merge to resolve conflicts.", "Show Conflicts", @@ -29023,11 +29265,6 @@ "Theirs", "Yours" ], - "vs/workbench/contrib/welcomeGettingStarted/common/media/notebookProfile": [ - "Default", - "Jupyter", - "Colab" - ], "vs/platform/actionWidget/browser/actionList": [ "{0} to apply, {1} to preview", "{0} to apply", @@ -29154,6 +29391,12 @@ "Select a directory to go to (hold Option-key to edit the command)", "Select a directory to go to (hold Alt-key to edit the command)" ], + "vs/workbench/contrib/notebook/browser/view/cellParts/codeCellExecutionIcon": [ + "Success", + "Failed", + "Pending", + "Executing" + ], "vs/workbench/contrib/notebook/browser/view/cellParts/cellOutput": [ "Cell has no output", "No renderer could be found for output. It has the following mimetypes: {0}", @@ -29164,22 +29407,11 @@ "Select mimetype to render for current output", "renderer not available" ], - "vs/workbench/contrib/notebook/browser/view/cellParts/codeCellExecutionIcon": [ - "Success", - "Failed", - "Pending", - "Executing" - ], "vs/workbench/contrib/comments/browser/commentThreadBody": [ "Comment thread with {0} comments on lines {1} through {2}. {3}.", "Comment thread with {0} comments on the entire document. {1}.", "Comment thread with {0} comments. {1}." ], - "vs/workbench/contrib/comments/browser/commentThreadHeader": [ - "Icon to collapse a review comment.", - "Collapse", - "Start discussion" - ], "vs/workbench/contrib/terminal/browser/environmentVariableInfo": [ "The following extensions want to relaunch the terminal to contribute to its environment:", "Relaunch terminal", @@ -29187,6 +29419,11 @@ "Show environment contributions", "workspace" ], + "vs/workbench/contrib/comments/browser/commentThreadHeader": [ + "Icon to collapse a review comment.", + "Collapse", + "Start discussion" + ], "vs/workbench/contrib/comments/browser/commentNode": [ "Toggle Reaction", "Toggling the comment reaction failed: {0}.", @@ -29234,11 +29471,11 @@ "vs/editor/browser/widget/codeEditorWidget", "vs/editor/browser/widget/diffEditor.contribution", "vs/editor/browser/widget/diffEditorWidget", + "vs/editor/browser/widget/diffEditorWidget2/accessibleDiffViewer", "vs/editor/browser/widget/diffEditorWidget2/colors", "vs/editor/browser/widget/diffEditorWidget2/decorations", "vs/editor/browser/widget/diffEditorWidget2/diffEditorEditors", "vs/editor/browser/widget/diffEditorWidget2/diffEditorWidget2.contribution", - "vs/editor/browser/widget/diffEditorWidget2/diffReview", "vs/editor/browser/widget/diffEditorWidget2/inlineDiffDeletedCodeMargin", "vs/editor/browser/widget/diffEditorWidget2/unchangedRanges", "vs/editor/browser/widget/diffReview", @@ -29247,6 +29484,7 @@ "vs/editor/common/config/editorOptions", "vs/editor/common/core/editorColorRegistry", "vs/editor/common/editorContextKeys", + "vs/editor/common/languages", "vs/editor/common/languages/modesRegistry", "vs/editor/common/model/editStack", "vs/editor/common/standaloneStrings", @@ -29406,6 +29644,7 @@ "vs/workbench/api/browser/statusBarExtensionPoint", "vs/workbench/api/browser/viewsExtensionPoint", "vs/workbench/api/common/configurationExtensionPoint", + "vs/workbench/api/common/extHostTunnelService", "vs/workbench/api/common/jsonValidationExtensionPoint", "vs/workbench/browser/actions/developerActions", "vs/workbench/browser/actions/helpActions", @@ -29504,13 +29743,16 @@ "vs/workbench/contrib/chat/browser/actions/chatExecuteActions", "vs/workbench/contrib/chat/browser/actions/chatImportExport", "vs/workbench/contrib/chat/browser/actions/chatMoveActions", - "vs/workbench/contrib/chat/browser/actions/chatQuickInputActions", "vs/workbench/contrib/chat/browser/actions/chatTitleActions", + "vs/workbench/contrib/chat/browser/actions/quickQuestionActions/multipleByScrollQuickQuestionAction", + "vs/workbench/contrib/chat/browser/actions/quickQuestionActions/quickQuestionAction", + "vs/workbench/contrib/chat/browser/actions/quickQuestionActions/singleQuickQuestionAction", "vs/workbench/contrib/chat/browser/chat.contribution", "vs/workbench/contrib/chat/browser/chatContributionServiceImpl", "vs/workbench/contrib/chat/browser/chatEditorInput", "vs/workbench/contrib/chat/browser/chatInputPart", "vs/workbench/contrib/chat/browser/chatListRenderer", + "vs/workbench/contrib/chat/browser/chatSlashCommandContentWidget", "vs/workbench/contrib/chat/browser/chatWidget", "vs/workbench/contrib/chat/browser/contrib/chatInputEditorContrib", "vs/workbench/contrib/chat/common/chatColors", @@ -29679,6 +29921,7 @@ "vs/workbench/contrib/format/browser/formatActionsNone", "vs/workbench/contrib/format/browser/formatModified", "vs/workbench/contrib/inlayHints/browser/inlayHintsAccessibilty", + "vs/workbench/contrib/inlineChat/browser/inlineChat.contribution", "vs/workbench/contrib/inlineChat/browser/inlineChatActions", "vs/workbench/contrib/inlineChat/browser/inlineChatController", "vs/workbench/contrib/inlineChat/browser/inlineChatStrategies", @@ -29752,7 +29995,7 @@ "vs/workbench/contrib/notebook/browser/diff/notebookDiffActions", "vs/workbench/contrib/notebook/browser/diff/notebookDiffEditor", "vs/workbench/contrib/notebook/browser/notebook.contribution", - "vs/workbench/contrib/notebook/browser/notebookAccessibilityHelp", + "vs/workbench/contrib/notebook/browser/notebookAccessibility", "vs/workbench/contrib/notebook/browser/notebookEditor", "vs/workbench/contrib/notebook/browser/notebookEditorWidget", "vs/workbench/contrib/notebook/browser/notebookExtensionPoint", @@ -29772,6 +30015,8 @@ "vs/workbench/contrib/notebook/browser/view/cellParts/markupCell", "vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView", "vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer", + "vs/workbench/contrib/notebook/browser/viewModel/notebookOutlineProvider", + "vs/workbench/contrib/notebook/browser/viewParts/notebookEditorStickyScroll", "vs/workbench/contrib/notebook/browser/viewParts/notebookKernelQuickPickStrategy", "vs/workbench/contrib/notebook/browser/viewParts/notebookKernelView", "vs/workbench/contrib/notebook/common/notebookEditorInput", @@ -30091,7 +30336,8 @@ "vs/workbench/services/workspaces/electron-sandbox/workspaceEditingService" ], "vs/editor/common/services/editorSimpleWorker": [ - "vs/base/common/platform" + "vs/base/common/platform", + "vs/editor/common/languages" ], "vs/base/common/worker/simpleWorker": [ "vs/base/common/platform" @@ -30115,11 +30361,13 @@ "vs/workbench/api/common/extHostExtensionService", "vs/workbench/api/common/extHostLanguageFeatures", "vs/workbench/api/common/extHostLogService", + "vs/workbench/api/common/extHostNotebook", "vs/workbench/api/common/extHostProgress", "vs/workbench/api/common/extHostStatusBar", "vs/workbench/api/common/extHostTelemetry", "vs/workbench/api/common/extHostTerminalService", "vs/workbench/api/common/extHostTreeViews", + "vs/workbench/api/common/extHostTunnelService", "vs/workbench/api/common/extHostWorkspace", "vs/workbench/common/editor", "vs/workbench/common/views", @@ -30161,6 +30409,7 @@ "vs/base/common/errorMessage", "vs/base/common/platform", "vs/editor/common/config/editorOptions", + "vs/editor/common/languages", "vs/platform/configuration/common/configurationRegistry", "vs/platform/contextkey/common/contextkey", "vs/platform/contextkey/common/scanner", @@ -30178,14 +30427,15 @@ "vs/workbench/api/common/extHostExtensionService", "vs/workbench/api/common/extHostLanguageFeatures", "vs/workbench/api/common/extHostLogService", + "vs/workbench/api/common/extHostNotebook", "vs/workbench/api/common/extHostProgress", "vs/workbench/api/common/extHostStatusBar", "vs/workbench/api/common/extHostTelemetry", "vs/workbench/api/common/extHostTerminalService", "vs/workbench/api/common/extHostTreeViews", + "vs/workbench/api/common/extHostTunnelService", "vs/workbench/api/common/extHostWorkspace", "vs/workbench/api/node/extHostDebugService", - "vs/workbench/api/node/extHostTunnelService", "vs/workbench/common/editor", "vs/workbench/common/views", "vs/workbench/contrib/debug/common/abstractDebugAdapter", diff --git a/packages/debug/src/browser/editor/debug-breakpoint-widget.tsx b/packages/debug/src/browser/editor/debug-breakpoint-widget.tsx index bd8c145ee2537..75a734e1edc63 100644 --- a/packages/debug/src/browser/editor/debug-breakpoint-widget.tsx +++ b/packages/debug/src/browser/editor/debug-breakpoint-widget.tsx @@ -274,13 +274,17 @@ export class DebugBreakpointWidget implements Disposable { .setDecorationsByType('Debug breakpoint placeholder', DebugBreakpointWidget.PLACEHOLDER_DECORATION, decorations); } protected get placeholder(): string { + const acceptString = 'Enter'; + const closeString = 'Escape'; if (this.context === 'logMessage') { - return nls.localizeByDefault("Message to log when breakpoint is hit. Expressions within {} are interpolated. 'Enter' to accept, 'esc' to cancel."); + return nls.localizeByDefault( + "Message to log when breakpoint is hit. Expressions within {} are interpolated. '{0}' to accept, '{1}' to cancel.", acceptString, closeString + ); } if (this.context === 'hitCondition') { - return nls.localizeByDefault("Break when hit count condition is met. 'Enter' to accept, 'esc' to cancel."); + return nls.localizeByDefault("Break when hit count condition is met. '{0}' to accept, '{1}' to cancel.", acceptString, closeString); } - return nls.localizeByDefault("Break when expression evaluates to true. 'Enter' to accept, 'esc' to cancel."); + return nls.localizeByDefault("Break when expression evaluates to true. '{0}' to accept, '{1}' to cancel.", acceptString, closeString); } } diff --git a/packages/getting-started/src/browser/getting-started-preferences.ts b/packages/getting-started/src/browser/getting-started-preferences.ts index 2621402d1756f..3a025115e6e6e 100644 --- a/packages/getting-started/src/browser/getting-started-preferences.ts +++ b/packages/getting-started/src/browser/getting-started-preferences.ts @@ -35,8 +35,8 @@ export const GettingStartedPreferenceSchema: PreferenceSchema = { nls.localizeByDefault('Start without an editor.'), nls.localize('theia/getting-started/startup-editor/welcomePage', 'Open the Welcome page, with content to aid in getting started with {0} and extensions.', FrontendApplicationConfigProvider.get().applicationName), - nls.localizeByDefault(`Open the README when opening a folder that contains one, fallback to \'welcomePage\' otherwise. - Note: This is only observed as a global configuration, it will be ignored if set in a workspace or folder configuration.`), + // eslint-disable-next-line max-len + nls.localizeByDefault("Open the README when opening a folder that contains one, fallback to 'welcomePage' otherwise. Note: This is only observed as a global configuration, it will be ignored if set in a workspace or folder configuration."), nls.localizeByDefault('Open a new untitled text file (only applies when opening an empty window).'), nls.localizeByDefault('Open the Welcome page when opening an empty workbench.'), ], diff --git a/packages/terminal/src/browser/terminal-frontend-contribution.ts b/packages/terminal/src/browser/terminal-frontend-contribution.ts index 5ca103b796db7..ed0da8067e938 100644 --- a/packages/terminal/src/browser/terminal-frontend-contribution.ts +++ b/packages/terminal/src/browser/terminal-frontend-contribution.ts @@ -103,7 +103,7 @@ export namespace TerminalCommands { export const TERMINAL_CONTEXT = Command.toDefaultLocalizedCommand({ id: 'terminal:context', category: TERMINAL_CATEGORY, - label: 'Open in Terminal' + label: 'Open in Integrated Terminal' }); export const SPLIT = Command.toDefaultLocalizedCommand({ id: 'terminal:split', From 45a0953d7eed19cd311840281f17999d268ba7cf Mon Sep 17 00:00:00 2001 From: Philip Langer Date: Tue, 12 Sep 2023 15:15:04 +0200 Subject: [PATCH 65/79] Open initial electron window early and reuse it later This avoids having a rather long pause from Theia start until something is visibly coming up. In my initial experiment, I observe the empty window showing up ~1.5s earlier than usual. This behavior can be controlled via the application config in the application's package.json. For instance, to turn off, use: ``` "theia": { "target": "electron", "frontend": { "config": { "applicationName": "Theia Electron Example", "electron": { "showWindowEarly": false } } } } ``` Also, we store the background color of the current color theme to be able to show the correct background color in the initial window. Contributed on behalf of STMicroelectronics. Change-Id: Ib8a6e8221c4f48605c865afc120d62adf6eef902 --- CHANGELOG.md | 1 + .../src/application-props.ts | 15 ++++++- .../preload/theme-preload-contribution.ts | 5 +-- .../menu/electron-menu-contribution.ts | 13 ++++++ packages/core/src/electron-browser/preload.ts | 5 ++- .../core/src/electron-common/electron-api.ts | 2 + .../src/electron-main/electron-api-main.ts | 5 ++- .../electron-main-application.ts | 44 +++++++++++++++++-- 8 files changed, 80 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 114bac6cc5d07..e6bd88ca18685 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ - [vscode] stub TestController invalidateTestResults [#12944](https://github.com/eclipse-theia/theia/pull/12944) - Contributed by STMicroelectronics - [vscode] support iconPath in QuickPickItem [#12945](https://github.com/eclipse-theia/theia/pull/12945) - Contributed by STMicroelectronics - [vsx-registry] added a hint to extension fetching ENOTFOUND errors [#12858](https://github.com/eclipse-theia/theia/pull/12858) - Contributed by STMicroelectronics +- [electron] Open initial electron window early to improve perceived performance [#12897](https://github.com/eclipse-theia/theia/pull/12897) - Contributed on behalf of STMicroelectronics. ## v1.41.0 - 08/31/2023 diff --git a/dev-packages/application-package/src/application-props.ts b/dev-packages/application-package/src/application-props.ts index 64ee7ba448001..e0c9ffca031fa 100644 --- a/dev-packages/application-package/src/application-props.ts +++ b/dev-packages/application-package/src/application-props.ts @@ -32,7 +32,8 @@ export interface ApplicationConfig { export type ElectronFrontendApplicationConfig = RequiredRecursive; export namespace ElectronFrontendApplicationConfig { export const DEFAULT: ElectronFrontendApplicationConfig = { - windowOptions: {} + windowOptions: {}, + showWindowEarly: true }; export interface Partial { @@ -42,6 +43,13 @@ export namespace ElectronFrontendApplicationConfig { * Defaults to `{}`. */ readonly windowOptions?: BrowserWindowConstructorOptions; + + /** + * Whether or not to show an empty Electron window as early as possible. + * + * Defaults to `true`. + */ + readonly showWindowEarly?: boolean; } } @@ -60,6 +68,11 @@ export namespace DefaultTheme { } return theme.light; } + export function defaultBackgroundColor(dark?: boolean): string { + // The default light background color is based on the `colors#editor.background` value from + // `packages/monaco/data/monaco-themes/vscode/dark_vs.json` and the dark background comes from the `light_vs.json`. + return dark ? '#1E1E1E' : '#FFFFFF'; + } } /** diff --git a/packages/core/src/browser/preload/theme-preload-contribution.ts b/packages/core/src/browser/preload/theme-preload-contribution.ts index d6a99e18dc949..a8df2463407ea 100644 --- a/packages/core/src/browser/preload/theme-preload-contribution.ts +++ b/packages/core/src/browser/preload/theme-preload-contribution.ts @@ -17,15 +17,14 @@ import { PreloadContribution } from './preloader'; import { DEFAULT_BACKGROUND_COLOR_STORAGE_KEY } from '../frontend-application-config-provider'; import { injectable } from 'inversify'; +import { DefaultTheme } from '@theia/application-package'; @injectable() export class ThemePreloadContribution implements PreloadContribution { initialize(): void { - // The default light background color is based on the `colors#editor.background` value from - // `packages/monaco/data/monaco-themes/vscode/dark_vs.json` and the dark background comes from the `light_vs.json`. const dark = window.matchMedia?.('(prefers-color-scheme: dark)').matches; - const value = window.localStorage.getItem(DEFAULT_BACKGROUND_COLOR_STORAGE_KEY) || (dark ? '#1E1E1E' : '#FFFFFF'); + const value = window.localStorage.getItem(DEFAULT_BACKGROUND_COLOR_STORAGE_KEY) || DefaultTheme.defaultBackgroundColor(dark); document.documentElement.style.setProperty('--theia-editor-background', value); } diff --git a/packages/core/src/electron-browser/menu/electron-menu-contribution.ts b/packages/core/src/electron-browser/menu/electron-menu-contribution.ts index 30a997fc70ce0..199757021dfbd 100644 --- a/packages/core/src/electron-browser/menu/electron-menu-contribution.ts +++ b/packages/core/src/electron-browser/menu/electron-menu-contribution.ts @@ -30,6 +30,8 @@ import { WindowTitleService } from '../../browser/window/window-title-service'; import '../../../src/electron-browser/menu/electron-menu-style.css'; import { MenuDto } from '../../electron-common/electron-api'; +import { ThemeService } from '../../browser/theming'; +import { ThemeChangeEvent } from '../../common/theme'; export namespace ElectronCommands { export const TOGGLE_DEVELOPER_TOOLS = Command.toDefaultLocalizedCommand({ @@ -88,6 +90,9 @@ export class ElectronMenuContribution extends BrowserMenuBarContribution impleme @inject(WindowService) protected readonly windowService: WindowService; + @inject(ThemeService) + protected readonly themeService: ThemeService; + @inject(CustomTitleWidgetFactory) protected readonly customTitleWidgetFactory: CustomTitleWidgetFactory; @@ -123,6 +128,9 @@ export class ElectronMenuContribution extends BrowserMenuBarContribution impleme this.handleToggleMaximized(); }); this.attachMenuBarVisibilityListener(); + this.themeService.onDidColorThemeChange(e => { + this.handleThemeChange(e); + }); } protected attachWindowFocusListener(app: FrontendApplication): void { @@ -414,6 +422,11 @@ export class ElectronMenuContribution extends BrowserMenuBarContribution impleme } } + protected handleThemeChange(e: ThemeChangeEvent): void { + const backgroundColor = window.getComputedStyle(document.body).backgroundColor; + window.electronTheiaCore.setBackgroundColor(backgroundColor); + } + } @injectable() diff --git a/packages/core/src/electron-browser/preload.ts b/packages/core/src/electron-browser/preload.ts index 829e66c55c97f..b9c05e337f34b 100644 --- a/packages/core/src/electron-browser/preload.ts +++ b/packages/core/src/electron-browser/preload.ts @@ -25,7 +25,7 @@ import { CHANNEL_ON_WINDOW_EVENT, CHANNEL_GET_ZOOM_LEVEL, CHANNEL_SET_ZOOM_LEVEL, CHANNEL_IS_FULL_SCREENABLE, CHANNEL_TOGGLE_FULL_SCREEN, CHANNEL_IS_FULL_SCREEN, CHANNEL_SET_MENU_BAR_VISIBLE, CHANNEL_REQUEST_CLOSE, CHANNEL_SET_TITLE_STYLE, CHANNEL_RESTART, CHANNEL_REQUEST_RELOAD, CHANNEL_APP_STATE_CHANGED, CHANNEL_SHOW_ITEM_IN_FOLDER, CHANNEL_READ_CLIPBOARD, CHANNEL_WRITE_CLIPBOARD, - CHANNEL_KEYBOARD_LAYOUT_CHANGED, CHANNEL_IPC_CONNECTION, InternalMenuDto, CHANNEL_REQUEST_SECONDARY_CLOSE + CHANNEL_KEYBOARD_LAYOUT_CHANGED, CHANNEL_IPC_CONNECTION, InternalMenuDto, CHANNEL_REQUEST_SECONDARY_CLOSE, CHANNEL_SET_BACKGROUND_COLOR } from '../electron-common/electron-api'; // eslint-disable-next-line import/no-extraneous-dependencies @@ -101,6 +101,9 @@ const api: TheiaCoreAPI = { setTitleBarStyle: function (style): void { ipcRenderer.send(CHANNEL_SET_TITLE_STYLE, style); }, + setBackgroundColor: function (backgroundColor): void { + ipcRenderer.send(CHANNEL_SET_BACKGROUND_COLOR, backgroundColor); + }, minimize: function (): void { ipcRenderer.send(CHANNEL_MINIMIZE); }, diff --git a/packages/core/src/electron-common/electron-api.ts b/packages/core/src/electron-common/electron-api.ts index ac6e991cf6da8..64fa5625a309c 100644 --- a/packages/core/src/electron-common/electron-api.ts +++ b/packages/core/src/electron-common/electron-api.ts @@ -56,6 +56,7 @@ export interface TheiaCoreAPI { getTitleBarStyleAtStartup(): Promise; setTitleBarStyle(style: string): void; + setBackgroundColor(backgroundColor: string): void; minimize(): void; isMaximized(): boolean; // TODO: this should really be async, since it blocks the renderer process maximize(): void; @@ -109,6 +110,7 @@ export const CHANNEL_ATTACH_SECURITY_TOKEN = 'AttachSecurityToken'; export const CHANNEL_GET_TITLE_STYLE_AT_STARTUP = 'GetTitleStyleAtStartup'; export const CHANNEL_SET_TITLE_STYLE = 'SetTitleStyle'; +export const CHANNEL_SET_BACKGROUND_COLOR = 'SetBackgroundColor'; export const CHANNEL_CLOSE = 'Close'; export const CHANNEL_MINIMIZE = 'Minimize'; export const CHANNEL_MAXIMIZE = 'Maximize'; diff --git a/packages/core/src/electron-main/electron-api-main.ts b/packages/core/src/electron-main/electron-api-main.ts index 6e1d469276ee0..4eeff065ad556 100644 --- a/packages/core/src/electron-main/electron-api-main.ts +++ b/packages/core/src/electron-main/electron-api-main.ts @@ -50,7 +50,8 @@ import { CHANNEL_SET_MENU_BAR_VISIBLE, CHANNEL_TOGGLE_FULL_SCREEN, CHANNEL_IS_MAXIMIZED, - CHANNEL_REQUEST_SECONDARY_CLOSE + CHANNEL_REQUEST_SECONDARY_CLOSE, + CHANNEL_SET_BACKGROUND_COLOR } from '../electron-common/electron-api'; import { ElectronMainApplication, ElectronMainApplicationContribution } from './electron-main-application'; import { Disposable, DisposableCollection, isOSX, MaybePromise } from '../common'; @@ -152,6 +153,8 @@ export class TheiaMainApi implements ElectronMainApplicationContribution { ipcMain.on(CHANNEL_SET_TITLE_STYLE, (event, style) => application.setTitleBarStyle(event.sender, style)); + ipcMain.on(CHANNEL_SET_BACKGROUND_COLOR, (event, backgroundColor) => application.setBackgroundColor(event.sender, backgroundColor)); + ipcMain.on(CHANNEL_MINIMIZE, event => { BrowserWindow.fromWebContents(event.sender)?.minimize(); }); diff --git a/packages/core/src/electron-main/electron-main-application.ts b/packages/core/src/electron-main/electron-main-application.ts index a9db290a14b99..4faaade6461e6 100644 --- a/packages/core/src/electron-main/electron-main-application.ts +++ b/packages/core/src/electron-main/electron-main-application.ts @@ -15,13 +15,13 @@ // ***************************************************************************** import { inject, injectable, named } from 'inversify'; -import { screen, app, BrowserWindow, WebContents, Event as ElectronEvent, BrowserWindowConstructorOptions, nativeImage } from '../../electron-shared/electron'; +import { screen, app, BrowserWindow, WebContents, Event as ElectronEvent, BrowserWindowConstructorOptions, nativeImage, nativeTheme } from '../../electron-shared/electron'; import * as path from 'path'; import { Argv } from 'yargs'; import { AddressInfo } from 'net'; import { promises as fs } from 'fs'; import { fork, ForkOptions } from 'child_process'; -import { FrontendApplicationConfig } from '@theia/application-package/lib/application-props'; +import { DefaultTheme, FrontendApplicationConfig } from '@theia/application-package/lib/application-props'; import URI from '../common/uri'; import { FileUri } from '../node/file-uri'; import { Deferred } from '../common/promise-util'; @@ -180,10 +180,13 @@ export class ElectronMainApplication { protected _config: FrontendApplicationConfig | undefined; protected useNativeWindowFrame: boolean = true; + protected customBackgroundColor?: string; protected didUseNativeWindowFrameOnStart = new Map(); protected windows = new Map(); protected restarting = false; + protected initialWindow?: BrowserWindow; + get config(): FrontendApplicationConfig { if (!this._config) { throw new Error('You have to start the application first.'); @@ -195,6 +198,7 @@ export class ElectronMainApplication { this.useNativeWindowFrame = this.getTitleBarStyle(config) === 'native'; this._config = config; this.hookApplicationEvents(); + this.showInitialWindow(); const port = await this.startBackend(); this._backendPort.resolve(port); await app.whenReady(); @@ -226,6 +230,15 @@ export class ElectronMainApplication { public setTitleBarStyle(webContents: WebContents, style: string): void { this.useNativeWindowFrame = isOSX || style === 'native'; + this.saveState(webContents); + } + + setBackgroundColor(webContents: WebContents, backgroundColor: string): void { + this.customBackgroundColor = backgroundColor; + this.saveState(webContents); + } + + protected saveState(webContents: Electron.WebContents): void { const browserWindow = BrowserWindow.fromWebContents(webContents); if (browserWindow) { this.saveWindowState(browserWindow); @@ -242,6 +255,16 @@ export class ElectronMainApplication { return this.didUseNativeWindowFrameOnStart.get(webContents.id) ? 'native' : 'custom'; } + protected showInitialWindow(): void { + if (this.config.electron.showWindowEarly) { + app.whenReady().then(async () => { + const options = await this.getLastWindowOptions(); + this.initialWindow = await this.createWindow({ ...options }); + this.initialWindow.show(); + }); + } + } + protected async launch(params: ElectronMainExecutionParams): Promise { createYargs(params.argv, params.cwd) .command('$0 [file]', false, @@ -303,6 +326,7 @@ export class ElectronMainApplication { return { show: false, title: this.config.applicationName, + backgroundColor: DefaultTheme.defaultBackgroundColor(this.config.electron.windowOptions?.darkTheme || nativeTheme.shouldUseDarkColors), minWidth: 200, minHeight: 120, webPreferences: { @@ -320,18 +344,29 @@ export class ElectronMainApplication { } async openDefaultWindow(): Promise { - const [uri, electronWindow] = await Promise.all([this.createWindowUri(), this.createWindow()]); + const options = this.getDefaultTheiaWindowOptions(); + const [uri, electronWindow] = await Promise.all([this.createWindowUri(), this.reuseOrCreateWindow(options)]); electronWindow.loadURL(uri.withFragment(DEFAULT_WINDOW_HASH).toString(true)); return electronWindow; } protected async openWindowWithWorkspace(workspacePath: string): Promise { const options = await this.getLastWindowOptions(); - const [uri, electronWindow] = await Promise.all([this.createWindowUri(), this.createWindow(options)]); + const [uri, electronWindow] = await Promise.all([this.createWindowUri(), this.reuseOrCreateWindow(options)]); electronWindow.loadURL(uri.withFragment(encodeURI(workspacePath)).toString(true)); return electronWindow; } + protected async reuseOrCreateWindow(asyncOptions: MaybePromise): Promise { + if (!this.initialWindow) { + return this.createWindow(asyncOptions); + } + // reset initial window after having it re-used once + const window = this.initialWindow; + this.initialWindow = undefined; + return window; + } + /** Configures native window creation, i.e. using window.open or links with target "_blank" in the frontend. */ protected configureNativeSecondaryWindowCreation(electronWindow: BrowserWindow): void { electronWindow.webContents.setWindowOpenHandler(() => { @@ -455,6 +490,7 @@ export class ElectronMainApplication { y: bounds.y, frame: this.useNativeWindowFrame, screenLayout: this.getCurrentScreenLayout(), + backgroundColor: this.customBackgroundColor }; this.electronStore.set('windowstate', options); } catch (e) { From a86295bedd61de134f0fc7069ccd43c49bed9511 Mon Sep 17 00:00:00 2001 From: Remi Schnekenburger Date: Thu, 28 Sep 2023 17:09:20 +0200 Subject: [PATCH 66/79] dialogs - Allow multiple selection on Open... (#12923) fixes #12905 - allow multiple selection in doOpen dialog - handle an array or a single URI or undefined when closing dialog Contributed on behalf of ST Microelectronics Signed-off-by: Remi Schnekenburger --- CHANGELOG.md | 1 + .../workspace-frontend-contribution.ts | 76 +++++++++++++------ 2 files changed, 52 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6bd88ca18685..816453cba1e0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ - [core] fixed logger level propagation when log config file changes at runtime [#12566](https://github.com/eclipse-theia/theia/pull/12566) - Contributed on behalf of STMicroelectronics - [core] improve frontend startup time [#12936](https://github.com/eclipse-theia/theia/pull/12936) - Contributed on behalf of STMicroelectronics - [dev-packages] restore src-gen frontend production behavior [12950](https://github.com/eclipse-theia/theia/pull/12950) - Contributed on behalf of STMicroelectronics +- [dialogs] allow multiple selection on Open... [#12923](https://github.com/eclipse-theia/theia/pull/12923) - Contributed on behalf of STMicroelectronics. - [vscode] stub TestController invalidateTestResults [#12944](https://github.com/eclipse-theia/theia/pull/12944) - Contributed by STMicroelectronics - [vscode] support iconPath in QuickPickItem [#12945](https://github.com/eclipse-theia/theia/pull/12945) - Contributed by STMicroelectronics - [vsx-registry] added a hint to extension fetching ENOTFOUND errors [#12858](https://github.com/eclipse-theia/theia/pull/12858) - Contributed by STMicroelectronics diff --git a/packages/workspace/src/browser/workspace-frontend-contribution.ts b/packages/workspace/src/browser/workspace-frontend-contribution.ts index 765c5aeae90ac..43e652511044a 100644 --- a/packages/workspace/src/browser/workspace-frontend-contribution.ts +++ b/packages/workspace/src/browser/workspace-frontend-contribution.ts @@ -262,50 +262,76 @@ export class WorkspaceFrontendContribution implements CommandContribution, Keybi * This is the generic `Open` method. Opens files and directories too. Resolves to the opened URI. * Except when you are on either Windows or Linux `AND` running in electron. If so, it opens a file. */ - protected async doOpen(): Promise { + protected async doOpen(): Promise { if (!isOSX && this.isElectron()) { return this.doOpenFile(); } const [rootStat] = await this.workspaceService.roots; - const destinationUri = await this.fileDialogService.showOpenDialog({ + let selectedUris = await this.fileDialogService.showOpenDialog({ title: WorkspaceCommands.OPEN.dialogLabel, canSelectFolders: true, - canSelectFiles: true + canSelectFiles: true, + canSelectMany: true }, rootStat); - if (destinationUri && this.getCurrentWorkspaceUri()?.toString() !== destinationUri.toString()) { - const destination = await this.fileService.resolve(destinationUri); - if (destination.isDirectory) { - this.workspaceService.open(destinationUri); - } else { - await open(this.openerService, destinationUri); + if (selectedUris) { + if (!Array.isArray(selectedUris)) { + selectedUris = [selectedUris]; + } + const folders: URI[] = []; + // Only open files then open all folders in a new workspace, as done with Electron see doOpenFolder. + for (const uri of selectedUris) { + const destination = await this.fileService.resolve(uri); + if (destination.isDirectory) { + if (this.getCurrentWorkspaceUri()?.toString() !== uri.toString()) { + folders.push(uri); + } + } else { + await open(this.openerService, uri); + } } - return destinationUri; + if (folders.length > 0) { + const openableURI = await this.getOpenableWorkspaceUri(folders); + if (openableURI && (!this.workspaceService.workspace || !openableURI.isEqual(this.workspaceService.workspace.resource))) { + this.workspaceService.open(openableURI); + } + } + + return selectedUris; } return undefined; } /** - * Opens a file after prompting the `Open File` dialog. Resolves to `undefined`, if + * Opens a set of files after prompting the `Open File` dialog. Resolves to `undefined`, if * - the workspace root is not set, * - the file to open does not exist, or * - it was not a file, but a directory. * - * Otherwise, resolves to the URI of the file. + * Otherwise, resolves to the set of URIs of the files. */ - protected async doOpenFile(): Promise { + protected async doOpenFile(): Promise { const props: OpenFileDialogProps = { title: WorkspaceCommands.OPEN_FILE.dialogLabel, canSelectFolders: false, - canSelectFiles: true + canSelectFiles: true, + canSelectMany: true }; const [rootStat] = await this.workspaceService.roots; - const destinationFileUri = await this.fileDialogService.showOpenDialog(props, rootStat); - if (destinationFileUri) { - const destinationFile = await this.fileService.resolve(destinationFileUri); - if (!destinationFile.isDirectory) { - await open(this.openerService, destinationFileUri); - return destinationFileUri; + let selectedFilesUris: MaybeArray | undefined = await this.fileDialogService.showOpenDialog(props, rootStat); + if (selectedFilesUris) { + if (!Array.isArray(selectedFilesUris)) { + selectedFilesUris = [selectedFilesUris]; } + + const result = []; + for (const uri of selectedFilesUris) { + const destination = await this.fileService.resolve(uri); + if (destination.isFile) { + await open(this.openerService, uri); + result.push(uri); + } + } + return result; } return undefined; } @@ -329,11 +355,11 @@ export class WorkspaceFrontendContribution implements CommandContribution, Keybi const [rootStat] = await this.workspaceService.roots; const targetFolders = await this.fileDialogService.showOpenDialog(props, rootStat); if (targetFolders) { - const openableURI = await this.getOpenableWorkspaceUri(targetFolders); - if (openableURI) { - if (!this.workspaceService.workspace || !openableURI.isEqual(this.workspaceService.workspace.resource)) { - this.workspaceService.open(openableURI); - return openableURI; + const openableUri = await this.getOpenableWorkspaceUri(targetFolders); + if (openableUri) { + if (!this.workspaceService.workspace || !openableUri.isEqual(this.workspaceService.workspace.resource)) { + this.workspaceService.open(openableUri); + return openableUri; } }; } From c5e1b9071aed360dc5d0e58eae0aa690adc98568 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 28 Sep 2023 13:50:50 -0400 Subject: [PATCH 67/79] nls: translation update for version `1.42.0` (#12956) Co-authored-by: vince-fugnitto --- packages/core/i18n/nls.cs.json | 1 + packages/core/i18n/nls.de.json | 1 + packages/core/i18n/nls.es.json | 1 + packages/core/i18n/nls.fr.json | 1 + packages/core/i18n/nls.hu.json | 1 + packages/core/i18n/nls.it.json | 1 + packages/core/i18n/nls.ja.json | 1 + packages/core/i18n/nls.json | 1 + packages/core/i18n/nls.pl.json | 1 + packages/core/i18n/nls.pt-br.json | 1 + packages/core/i18n/nls.pt-pt.json | 1 + packages/core/i18n/nls.ru.json | 1 + packages/core/i18n/nls.zh-cn.json | 1 + 13 files changed, 13 insertions(+) diff --git a/packages/core/i18n/nls.cs.json b/packages/core/i18n/nls.cs.json index e0d8b2b52153f..368b8cb7bcd5c 100644 --- a/packages/core/i18n/nls.cs.json +++ b/packages/core/i18n/nls.cs.json @@ -434,6 +434,7 @@ "vsx-registry": { "downloadCount": "Počet stažení: {0}", "errorFetching": "Chyba při načítání rozšíření.", + "errorFetchingConfigurationHint": "To může být způsobeno problémy s konfigurací sítě.", "failedInstallingVSIX": "Nepodařilo se nainstalovat {0} z VSIX.", "invalidVSIX": "Vybraný soubor není platný zásuvný modul \"*.vsix\".", "license": "Licence: {0}", diff --git a/packages/core/i18n/nls.de.json b/packages/core/i18n/nls.de.json index 34d5a7362f35f..a2c703e98fa04 100644 --- a/packages/core/i18n/nls.de.json +++ b/packages/core/i18n/nls.de.json @@ -434,6 +434,7 @@ "vsx-registry": { "downloadCount": "Anzahl der Downloads: {0}", "errorFetching": "Fehler beim Abrufen von Erweiterungen.", + "errorFetchingConfigurationHint": "Dies könnte auf Probleme bei der Netzwerkkonfiguration zurückzuführen sein.", "failedInstallingVSIX": "Die Installation von {0} aus VSIX ist fehlgeschlagen.", "invalidVSIX": "Die ausgewählte Datei ist kein gültiges \"*.vsix\"-Plugin.", "license": "Lizenz: {0}", diff --git a/packages/core/i18n/nls.es.json b/packages/core/i18n/nls.es.json index 65d859b89606a..2aa770203c5fd 100644 --- a/packages/core/i18n/nls.es.json +++ b/packages/core/i18n/nls.es.json @@ -434,6 +434,7 @@ "vsx-registry": { "downloadCount": "Descargue el recuento: {0}", "errorFetching": "Error en la búsqueda de extensiones.", + "errorFetchingConfigurationHint": "Esto podría deberse a problemas de configuración de la red.", "failedInstallingVSIX": "Fallo en la instalación de {0} desde VSIX.", "invalidVSIX": "El archivo seleccionado no es un plugin válido \"*.vsix\".", "license": "License: {0}", diff --git a/packages/core/i18n/nls.fr.json b/packages/core/i18n/nls.fr.json index b413bee55a210..bb2482ada7cda 100644 --- a/packages/core/i18n/nls.fr.json +++ b/packages/core/i18n/nls.fr.json @@ -434,6 +434,7 @@ "vsx-registry": { "downloadCount": "Compte de téléchargement : {0}", "errorFetching": "Erreur de récupération des extensions.", + "errorFetchingConfigurationHint": "Cela peut être dû à des problèmes de configuration du réseau.", "failedInstallingVSIX": "Échec de l'installation de {0} à partir de VSIX.", "invalidVSIX": "Le fichier sélectionné n'est pas un plugin \"*.vsix\" valide.", "license": "Licence : {0}", diff --git a/packages/core/i18n/nls.hu.json b/packages/core/i18n/nls.hu.json index 8ba8f8f86b7ad..258a37d51fffb 100644 --- a/packages/core/i18n/nls.hu.json +++ b/packages/core/i18n/nls.hu.json @@ -434,6 +434,7 @@ "vsx-registry": { "downloadCount": "Letöltési szám: {0}", "errorFetching": "Hiba a kiterjesztések lekérdezésében.", + "errorFetchingConfigurationHint": "Ezt hálózati konfigurációs problémák okozhatják.", "failedInstallingVSIX": "Nem sikerült telepíteni a {0} oldalt a VSIX-ből.", "invalidVSIX": "A kiválasztott fájl nem érvényes \"*.vsix\" bővítmény.", "license": "Engedély: {0}", diff --git a/packages/core/i18n/nls.it.json b/packages/core/i18n/nls.it.json index aa2675385919b..39fc32d41ec96 100644 --- a/packages/core/i18n/nls.it.json +++ b/packages/core/i18n/nls.it.json @@ -434,6 +434,7 @@ "vsx-registry": { "downloadCount": "Conteggio dei download: {0}", "errorFetching": "Errore nel recupero delle estensioni.", + "errorFetchingConfigurationHint": "Questo potrebbe essere causato da problemi di configurazione della rete.", "failedInstallingVSIX": "Impossibile installare {0} da VSIX.", "invalidVSIX": "Il file selezionato non è un plugin \"*.vsix\" valido.", "license": "Licenza: {0}", diff --git a/packages/core/i18n/nls.ja.json b/packages/core/i18n/nls.ja.json index 116d64ac3e773..53a993611c8ce 100644 --- a/packages/core/i18n/nls.ja.json +++ b/packages/core/i18n/nls.ja.json @@ -434,6 +434,7 @@ "vsx-registry": { "downloadCount": "ダウンロード回数{0}", "errorFetching": "拡張機能の取得にエラーが発生しました。", + "errorFetchingConfigurationHint": "これは、ネットワーク設定の問題が原因である可能性がある。", "failedInstallingVSIX": "VSIXから{0} のインストールに失敗しました。", "invalidVSIX": "選択されたファイルは、有効な \"*.vsix \"プラグインではありません。", "license": "ライセンス{0}", diff --git a/packages/core/i18n/nls.json b/packages/core/i18n/nls.json index 95ae993bae157..82549d0a9a9be 100644 --- a/packages/core/i18n/nls.json +++ b/packages/core/i18n/nls.json @@ -434,6 +434,7 @@ "vsx-registry": { "downloadCount": "Download count: {0}", "errorFetching": "Error fetching extensions.", + "errorFetchingConfigurationHint": "This could be caused by network configuration issues.", "failedInstallingVSIX": "Failed to install {0} from VSIX.", "invalidVSIX": "The selected file is not a valid \"*.vsix\" plugin.", "license": "License: {0}", diff --git a/packages/core/i18n/nls.pl.json b/packages/core/i18n/nls.pl.json index 640659eca3e00..813215b4578fe 100644 --- a/packages/core/i18n/nls.pl.json +++ b/packages/core/i18n/nls.pl.json @@ -434,6 +434,7 @@ "vsx-registry": { "downloadCount": "Pobierz licz: {0}", "errorFetching": "Błąd pobierania rozszerzeń.", + "errorFetchingConfigurationHint": "Może to być spowodowane problemami z konfiguracją sieci.", "failedInstallingVSIX": "Nie udało się zainstalować {0} z VSIX.", "invalidVSIX": "Wybrany plik nie jest prawidłowym pluginem \"*.vsix\".", "license": "Licencja: {0}", diff --git a/packages/core/i18n/nls.pt-br.json b/packages/core/i18n/nls.pt-br.json index a40cf7e360bef..3bab2eb1e068a 100644 --- a/packages/core/i18n/nls.pt-br.json +++ b/packages/core/i18n/nls.pt-br.json @@ -434,6 +434,7 @@ "vsx-registry": { "downloadCount": "Contagem de downloads: {0}", "errorFetching": "Extensões de erro de busca.", + "errorFetchingConfigurationHint": "Isso pode ser causado por problemas de configuração de rede.", "failedInstallingVSIX": "Falha na instalação {0} da VSIX.", "invalidVSIX": "O arquivo selecionado não é um plugin \"*.vsix\" válido.", "license": "Licença: {0}", diff --git a/packages/core/i18n/nls.pt-pt.json b/packages/core/i18n/nls.pt-pt.json index fe68dffcec6da..b98868359bff2 100644 --- a/packages/core/i18n/nls.pt-pt.json +++ b/packages/core/i18n/nls.pt-pt.json @@ -434,6 +434,7 @@ "vsx-registry": { "downloadCount": "Contagem de downloads: {0}", "errorFetching": "Extensões de erro de busca.", + "errorFetchingConfigurationHint": "Isto pode ser causado por problemas de configuração da rede.", "failedInstallingVSIX": "Falha na instalação {0} da VSIX.", "invalidVSIX": "O ficheiro seleccionado não é um plugin \"*.vsix\" válido.", "license": "Licença: {0}", diff --git a/packages/core/i18n/nls.ru.json b/packages/core/i18n/nls.ru.json index a5481326708a5..1dda2f1114bba 100644 --- a/packages/core/i18n/nls.ru.json +++ b/packages/core/i18n/nls.ru.json @@ -434,6 +434,7 @@ "vsx-registry": { "downloadCount": "Скачать граф: {0}", "errorFetching": "Ошибка при получении расширений.", + "errorFetchingConfigurationHint": "Это может быть вызвано проблемами конфигурации сети.", "failedInstallingVSIX": "Не удалось установить {0} из VSIX.", "invalidVSIX": "Выбранный файл не является действительным плагином \"*.vsix\".", "license": "Лицензия: {0}", diff --git a/packages/core/i18n/nls.zh-cn.json b/packages/core/i18n/nls.zh-cn.json index 270301cf676b8..231acd2612478 100644 --- a/packages/core/i18n/nls.zh-cn.json +++ b/packages/core/i18n/nls.zh-cn.json @@ -434,6 +434,7 @@ "vsx-registry": { "downloadCount": "下载次数: {0}", "errorFetching": "取出扩展程序时出错。", + "errorFetchingConfigurationHint": "这可能是网络配置问题造成的。", "failedInstallingVSIX": "从VSIX安装{0} ,失败了。", "invalidVSIX": "所选文件不是有效的 \"*.vsix \"插件。", "license": "许可证: {0}", From caf9429694cfefd1881c5559a82611b8860c5885 Mon Sep 17 00:00:00 2001 From: Vincent Fugnitto Date: Thu, 28 Sep 2023 13:51:14 -0400 Subject: [PATCH 68/79] docs: update changelog for 1.42.0 (#12955) The commit updates the changelog for the `v1.42.0` release. The changes include: - updating the changelog to reflect notable new features, bug fixes. - updating misc typos. Signed-off-by: vince-fugnitto --- CHANGELOG.md | 34 ++++++++++++------- .../notebook-kernel-quick-pick-service.ts | 2 +- .../view/notebook-markdown-cell-view.tsx | 2 +- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 816453cba1e0b..2f420d1b1c7de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,20 +4,30 @@ - [Previous Changelogs](https://github.com/eclipse-theia/theia/tree/master/doc/changelogs/) -## v1.42.0 - -- [core] fixed logger level propagation when log config file changes at runtime [#12566](https://github.com/eclipse-theia/theia/pull/12566) - Contributed on behalf of STMicroelectronics -- [core] improve frontend startup time [#12936](https://github.com/eclipse-theia/theia/pull/12936) - Contributed on behalf of STMicroelectronics -- [dev-packages] restore src-gen frontend production behavior [12950](https://github.com/eclipse-theia/theia/pull/12950) - Contributed on behalf of STMicroelectronics -- [dialogs] allow multiple selection on Open... [#12923](https://github.com/eclipse-theia/theia/pull/12923) - Contributed on behalf of STMicroelectronics. -- [vscode] stub TestController invalidateTestResults [#12944](https://github.com/eclipse-theia/theia/pull/12944) - Contributed by STMicroelectronics -- [vscode] support iconPath in QuickPickItem [#12945](https://github.com/eclipse-theia/theia/pull/12945) - Contributed by STMicroelectronics -- [vsx-registry] added a hint to extension fetching ENOTFOUND errors [#12858](https://github.com/eclipse-theia/theia/pull/12858) - Contributed by STMicroelectronics -- [electron] Open initial electron window early to improve perceived performance [#12897](https://github.com/eclipse-theia/theia/pull/12897) - Contributed on behalf of STMicroelectronics. +## v1.42.0 - 09/28/2023 + +- [core] added `inversify` support in the frontend preload script [#12590](https://github.com/eclipse-theia/theia/pull/12590) +- [core] added missing localizations for keybinding error messages [#12889](https://github.com/eclipse-theia/theia/pull/12889) +- [core] fixed logger level propagation when log config changes at runtime [#12566](https://github.com/eclipse-theia/theia/pull/12566) - Contributed on behalf of STMicroelectronics +- [core] improved the frontend startup time [#12936](https://github.com/eclipse-theia/theia/pull/12936) - Contributed on behalf of STMicroelectronics +- [core] updated `nls.metadata.json` for `1.81.0` [#12951](https://github.com/eclipse-theia/theia/pull/12951) +- [core] upgraded `ws` from `7.1.2` to `8.14.1` [#12909](https://github.com/eclipse-theia/theia/pull/12909) +- [debug] fixed erroneous inline breakpoints [#12832](https://github.com/eclipse-theia/theia/pull/12832) +- [dev-packages] bumped the default supported API version from `1.80.0` to `1.81.0` [#12949](https://github.com/eclipse-theia/theia/pull/12949) +- [dev-packages] restored src-gen frontend production behavior [12950](https://github.com/eclipse-theia/theia/pull/12950) - Contributed on behalf of STMicroelectronics +- [dialogs] added functionality to allow multiple selection in open dialogs [#12923](https://github.com/eclipse-theia/theia/pull/12923) - Contributed on behalf of STMicroelectronics +- [documentation] added follow-up section to the pull-request template [#12901](https://github.com/eclipse-theia/theia/pull/12901) +- [editor] added functionality to create untitled files when double-clicking the tabbar [#12867](https://github.com/eclipse-theia/theia/pull/12867) +- [electron] improved responsiveness of the initial electron window [#12897](https://github.com/eclipse-theia/theia/pull/12897) - Contributed on behalf of STMicroelectronics. +- [plugin] added stubbing for the `TestController#invalidateTestResults` VS Code API [#12944](https://github.com/eclipse-theia/theia/pull/12944) - Contributed by STMicroelectronics +- [plugin] added support for `iconPath` in the `QuickPickItem` VS Code API [#12945](https://github.com/eclipse-theia/theia/pull/12945) - Contributed by STMicroelectronics +- [repo] updated deprecated instances of `context` in favor of `when` clauses [#12830](https://github.com/eclipse-theia/theia/pull/12830) +- [search-in-workspace] added support for multiline searches [#12868](https://github.com/eclipse-theia/theia/pull/12868) +- [vsx-registry] added a hint in `ENOTFOUND` errors when failing to fetch extensions [#12858](https://github.com/eclipse-theia/theia/pull/12858) - Contributed by STMicroelectronics ## v1.41.0 - 08/31/2023 -- [application-package] added handling to quit the electron app when the backend fails to start [#12778](https://github.com/eclipse-theia/theia/pull/12778) - Contributed on behalf of STMicroelectronics. +- [application-package] added handling to quit the electron app when the backend fails to start [#12778](https://github.com/eclipse-theia/theia/pull/12778) - Contributed on behalf of STMicroelectronics - [core] added `--dnsDefaultResultOrder ` CLI argument where `value` is one of `ipv4first`, `verbatim` or `nodeDefault`. It controls how domain names are resolved [#12711](https://github.com/eclipse-theia/theia/pull/12711) - [core] added functionality to capture stopwatch results [#12812](https://github.com/eclipse-theia/theia/pull/12812) - [core] added support for `file/newFile` menu path [#12819](https://github.com/eclipse-theia/theia/pull/12819) @@ -65,7 +75,7 @@ ## v1.40.0 - 07/27/2023 -- [application-package] bumped the default supported VS Code API from `1.78.0` to `1.79.0` [#12764](https://github.com/eclipse-theia/theia/pull/12764) - Contributed on behalf of STMicroelectronics. +- [application-package] bumped the default supported VS Code API from `1.78.0` to `1.79.0` [#12764](https://github.com/eclipse-theia/theia/pull/12764) - Contributed on behalf of STMicroelectronics - [application-package] fixed ignored resource in backend bundling [#12681](https://github.com/eclipse-theia/theia/pull/12681) - [cli] added `check:theia-extensions` to facilitate checking the uniqueness of `@theia` extension versions [#12596](https://github.com/eclipse-theia/theia/pull/12596) - Contributed on behalf of STMicroelectronics - [core] added functionality to display command shortcuts in toolbar item tooltips [#12660](https://github.com/eclipse-theia/theia/pull/12660) - Contributed on behalf of STMicroelectronics diff --git a/packages/notebook/src/browser/service/notebook-kernel-quick-pick-service.ts b/packages/notebook/src/browser/service/notebook-kernel-quick-pick-service.ts index 14777243002ea..5461d99bb47e1 100644 --- a/packages/notebook/src/browser/service/notebook-kernel-quick-pick-service.ts +++ b/packages/notebook/src/browser/service/notebook-kernel-quick-pick-service.ts @@ -384,7 +384,7 @@ export class KernelPickerMRUStrategy extends NotebookKernelQuickPickServiceImpl await this.selectOneKernel(notebook, selectedKernelPickItem.source, selectedKernelPickItem.kernels); return true; } else if (isSourcePick(selectedKernelPickItem)) { - // selected explicilty, it should trigger the execution? + // selected explicitly, it should trigger the execution? try { await selectedKernelPickItem.action.run(); return true; diff --git a/packages/notebook/src/browser/view/notebook-markdown-cell-view.tsx b/packages/notebook/src/browser/view/notebook-markdown-cell-view.tsx index 3b48767a987ae..af84d9fe361fc 100644 --- a/packages/notebook/src/browser/view/notebook-markdown-cell-view.tsx +++ b/packages/notebook/src/browser/view/notebook-markdown-cell-view.tsx @@ -67,7 +67,7 @@ function MarkdownCell({ markdownRenderer, monacoServices, cell, notebookModel }: onDoubleClick={() => cell.requestEdit()} // This sets the non React HTML node from the markdown renderers output as a child node to this react component // This is currently sadly the best way we have to combine React (Virtual Nodes) and normal dom nodes - // the HTML is allready sanitized by the markdown renderer, so we don't need to sanitize it again + // the HTML is already sanitized by the markdown renderer, so we don't need to sanitize it again dangerouslySetInnerHTML={{ __html: markdownContent }} // eslint-disable-line react/no-danger />; } From f2d9688502752d401b22b39b59388bba2ee2a5a2 Mon Sep 17 00:00:00 2001 From: vince-fugnitto Date: Thu, 28 Sep 2023 14:11:02 -0400 Subject: [PATCH 69/79] v1.42.0 Signed-off-by: vince-fugnitto --- dev-packages/application-manager/package.json | 10 +- dev-packages/application-package/package.json | 6 +- dev-packages/cli/package.json | 14 +-- dev-packages/ffmpeg/package.json | 2 +- .../localization-manager/package.json | 4 +- .../native-webpack-plugin/package.json | 2 +- dev-packages/ovsx-client/package.json | 4 +- .../private-eslint-plugin/package.json | 8 +- dev-packages/private-ext-scripts/package.json | 2 +- dev-packages/private-re-exports/package.json | 2 +- dev-packages/request/package.json | 2 +- examples/api-samples/package.json | 24 ++--- examples/api-tests/package.json | 4 +- examples/browser/package.json | 92 +++++++++---------- examples/electron/package.json | 92 +++++++++---------- examples/playwright/package.json | 2 +- lerna.json | 2 +- packages/bulk-edit/package.json | 14 +-- packages/callhierarchy/package.json | 8 +- packages/console/package.json | 8 +- packages/core/package.json | 10 +- packages/debug/package.json | 28 +++--- packages/editor-preview/package.json | 10 +- packages/editor/package.json | 8 +- packages/electron/package.json | 6 +- packages/external-terminal/package.json | 10 +- packages/file-search/package.json | 14 +-- packages/filesystem/package.json | 6 +- packages/getting-started/package.json | 16 ++-- packages/git/package.json | 18 ++-- packages/keymaps/package.json | 12 +-- packages/markers/package.json | 10 +- packages/memory-inspector/package.json | 6 +- packages/messages/package.json | 6 +- packages/metrics/package.json | 6 +- packages/mini-browser/package.json | 8 +- packages/monaco/package.json | 14 +-- packages/navigator/package.json | 10 +- packages/notebook/package.json | 12 +-- packages/outline-view/package.json | 6 +- packages/output/package.json | 10 +- packages/plugin-dev/package.json | 16 ++-- packages/plugin-ext-vscode/package.json | 28 +++--- packages/plugin-ext/package.json | 54 +++++------ packages/plugin-metrics/package.json | 12 +-- packages/plugin/package.json | 4 +- packages/preferences/package.json | 16 ++-- packages/preview/package.json | 12 +-- packages/process/package.json | 6 +- packages/property-view/package.json | 8 +- packages/scm-extra/package.json | 14 +-- packages/scm/package.json | 10 +- packages/search-in-workspace/package.json | 16 ++-- packages/secondary-window/package.json | 6 +- packages/task/package.json | 24 ++--- packages/terminal/package.json | 16 ++-- packages/timeline/package.json | 8 +- packages/toolbar/package.json | 18 ++-- packages/typehierarchy/package.json | 8 +- packages/userstorage/package.json | 8 +- packages/variable-resolver/package.json | 6 +- packages/vsx-registry/package.json | 18 ++-- packages/workspace/package.json | 10 +- .../sample-namespace/plugin-a/package.json | 2 +- .../sample-namespace/plugin-b/package.json | 2 +- 65 files changed, 425 insertions(+), 425 deletions(-) diff --git a/dev-packages/application-manager/package.json b/dev-packages/application-manager/package.json index 77047ec8db909..d8f31550fe6dc 100644 --- a/dev-packages/application-manager/package.json +++ b/dev-packages/application-manager/package.json @@ -1,6 +1,6 @@ { "name": "@theia/application-manager", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia application manager API.", "publishConfig": { "access": "public" @@ -33,9 +33,9 @@ "@babel/plugin-transform-classes": "^7.10.0", "@babel/plugin-transform-runtime": "^7.10.0", "@babel/preset-env": "^7.10.0", - "@theia/application-package": "1.41.0", - "@theia/ffmpeg": "1.41.0", - "@theia/native-webpack-plugin": "1.41.0", + "@theia/application-package": "1.42.0", + "@theia/ffmpeg": "1.42.0", + "@theia/native-webpack-plugin": "1.42.0", "@types/fs-extra": "^4.0.2", "@types/semver": "^7.5.0", "babel-loader": "^8.2.2", @@ -73,7 +73,7 @@ } }, "devDependencies": { - "@theia/ext-scripts": "1.41.0", + "@theia/ext-scripts": "1.42.0", "@types/node-abi": "*" }, "nyc": { diff --git a/dev-packages/application-package/package.json b/dev-packages/application-package/package.json index 3399da385ed23..b062736077084 100644 --- a/dev-packages/application-package/package.json +++ b/dev-packages/application-package/package.json @@ -1,6 +1,6 @@ { "name": "@theia/application-package", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia application package API.", "publishConfig": { "access": "public" @@ -29,7 +29,7 @@ "watch": "theiaext watch" }, "dependencies": { - "@theia/request": "1.41.0", + "@theia/request": "1.42.0", "@types/fs-extra": "^4.0.2", "@types/semver": "^7.5.0", "@types/write-json-file": "^2.2.1", @@ -42,7 +42,7 @@ "write-json-file": "^2.2.0" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/dev-packages/cli/package.json b/dev-packages/cli/package.json index a14ea3ccae310..9e681dbdeb060 100644 --- a/dev-packages/cli/package.json +++ b/dev-packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@theia/cli", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia CLI.", "publishConfig": { "access": "public" @@ -30,12 +30,12 @@ "clean": "theiaext clean" }, "dependencies": { - "@theia/application-manager": "1.41.0", - "@theia/application-package": "1.41.0", - "@theia/ffmpeg": "1.41.0", - "@theia/localization-manager": "1.41.0", - "@theia/ovsx-client": "1.41.0", - "@theia/request": "1.41.0", + "@theia/application-manager": "1.42.0", + "@theia/application-package": "1.42.0", + "@theia/ffmpeg": "1.42.0", + "@theia/localization-manager": "1.42.0", + "@theia/ovsx-client": "1.42.0", + "@theia/request": "1.42.0", "@types/chai": "^4.2.7", "@types/mocha": "^10.0.0", "@types/node-fetch": "^2.5.7", diff --git a/dev-packages/ffmpeg/package.json b/dev-packages/ffmpeg/package.json index c0a8f03607d6a..6d00847ff1216 100644 --- a/dev-packages/ffmpeg/package.json +++ b/dev-packages/ffmpeg/package.json @@ -1,6 +1,6 @@ { "name": "@theia/ffmpeg", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia FFMPEG reader utility.", "publishConfig": { "access": "public" diff --git a/dev-packages/localization-manager/package.json b/dev-packages/localization-manager/package.json index 3a2abf11da7ca..0c4c89de36ee5 100644 --- a/dev-packages/localization-manager/package.json +++ b/dev-packages/localization-manager/package.json @@ -1,6 +1,6 @@ { "name": "@theia/localization-manager", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia localization manager API.", "publishConfig": { "access": "public" @@ -39,7 +39,7 @@ "typescript": "~4.5.5" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/dev-packages/native-webpack-plugin/package.json b/dev-packages/native-webpack-plugin/package.json index fcc877e50732d..801a6a2581924 100644 --- a/dev-packages/native-webpack-plugin/package.json +++ b/dev-packages/native-webpack-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@theia/native-webpack-plugin", - "version": "1.41.0", + "version": "1.42.0", "description": "Webpack Plugin for native dependencies of Theia.", "publishConfig": { "access": "public" diff --git a/dev-packages/ovsx-client/package.json b/dev-packages/ovsx-client/package.json index d2e08c2176a74..7b3606e5b99f1 100644 --- a/dev-packages/ovsx-client/package.json +++ b/dev-packages/ovsx-client/package.json @@ -1,6 +1,6 @@ { "name": "@theia/ovsx-client", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia Open-VSX Client", "publishConfig": { "access": "public" @@ -29,7 +29,7 @@ "watch": "theiaext watch" }, "dependencies": { - "@theia/request": "1.41.0", + "@theia/request": "1.42.0", "semver": "^7.5.4" } } diff --git a/dev-packages/private-eslint-plugin/package.json b/dev-packages/private-eslint-plugin/package.json index ad21605572265..7743edb579fac 100644 --- a/dev-packages/private-eslint-plugin/package.json +++ b/dev-packages/private-eslint-plugin/package.json @@ -1,16 +1,16 @@ { "private": true, "name": "@theia/eslint-plugin", - "version": "1.41.0", + "version": "1.42.0", "description": "Custom ESLint rules for developing Theia extensions and applications", "main": "index.js", "scripts": { "prepare": "tsc -b" }, "dependencies": { - "@theia/core": "1.41.0", - "@theia/ext-scripts": "1.41.0", - "@theia/re-exports": "1.41.0", + "@theia/core": "1.42.0", + "@theia/ext-scripts": "1.42.0", + "@theia/re-exports": "1.42.0", "js-levenshtein": "^1.1.6" } } diff --git a/dev-packages/private-ext-scripts/package.json b/dev-packages/private-ext-scripts/package.json index f24c849c012bf..0ff0df1464dc4 100644 --- a/dev-packages/private-ext-scripts/package.json +++ b/dev-packages/private-ext-scripts/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "@theia/ext-scripts", - "version": "1.41.0", + "version": "1.42.0", "license": "EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0", "description": "NPM scripts for Theia packages.", "bin": { diff --git a/dev-packages/private-re-exports/package.json b/dev-packages/private-re-exports/package.json index eedbd4110d20f..b286b6c2e78e2 100644 --- a/dev-packages/private-re-exports/package.json +++ b/dev-packages/private-re-exports/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "@theia/re-exports", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia re-export helper functions and scripts.", "main": "lib/index.js", "engines": { diff --git a/dev-packages/request/package.json b/dev-packages/request/package.json index 1e1cfd301927a..d9837533edc5e 100644 --- a/dev-packages/request/package.json +++ b/dev-packages/request/package.json @@ -1,6 +1,6 @@ { "name": "@theia/request", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia Proxy-Aware Request Service", "publishConfig": { "access": "public" diff --git a/examples/api-samples/package.json b/examples/api-samples/package.json index 8a832638ab2c7..21ce62ce748c5 100644 --- a/examples/api-samples/package.json +++ b/examples/api-samples/package.json @@ -1,20 +1,20 @@ { "private": true, "name": "@theia/api-samples", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Example code to demonstrate Theia API", "dependencies": { - "@theia/core": "1.41.0", - "@theia/file-search": "1.41.0", - "@theia/filesystem": "1.41.0", - "@theia/monaco": "1.41.0", + "@theia/core": "1.42.0", + "@theia/file-search": "1.42.0", + "@theia/filesystem": "1.42.0", + "@theia/monaco": "1.42.0", "@theia/monaco-editor-core": "1.72.3", - "@theia/output": "1.41.0", - "@theia/ovsx-client": "1.41.0", - "@theia/search-in-workspace": "1.41.0", - "@theia/toolbar": "1.41.0", - "@theia/vsx-registry": "1.41.0", - "@theia/workspace": "1.41.0" + "@theia/output": "1.42.0", + "@theia/ovsx-client": "1.42.0", + "@theia/search-in-workspace": "1.42.0", + "@theia/toolbar": "1.42.0", + "@theia/vsx-registry": "1.42.0", + "@theia/workspace": "1.42.0" }, "theiaExtensions": [ { @@ -53,6 +53,6 @@ "clean": "theiaext clean" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" } } diff --git a/examples/api-tests/package.json b/examples/api-tests/package.json index f8ee941c97dff..961e4c7d4a77c 100644 --- a/examples/api-tests/package.json +++ b/examples/api-tests/package.json @@ -1,9 +1,9 @@ { "name": "@theia/api-tests", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia API tests", "dependencies": { - "@theia/core": "1.41.0" + "@theia/core": "1.42.0" }, "license": "EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0", "repository": { diff --git a/examples/browser/package.json b/examples/browser/package.json index 72bf5bc5f3be4..f6f11f9022459 100644 --- a/examples/browser/package.json +++ b/examples/browser/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "@theia/example-browser", - "version": "1.41.0", + "version": "1.42.0", "license": "EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0", "theia": { "frontend": { @@ -14,50 +14,50 @@ } }, "dependencies": { - "@theia/api-samples": "1.41.0", - "@theia/bulk-edit": "1.41.0", - "@theia/callhierarchy": "1.41.0", - "@theia/console": "1.41.0", - "@theia/core": "1.41.0", - "@theia/debug": "1.41.0", - "@theia/editor": "1.41.0", - "@theia/editor-preview": "1.41.0", - "@theia/file-search": "1.41.0", - "@theia/filesystem": "1.41.0", - "@theia/getting-started": "1.41.0", - "@theia/git": "1.41.0", - "@theia/keymaps": "1.41.0", - "@theia/markers": "1.41.0", - "@theia/memory-inspector": "1.41.0", - "@theia/messages": "1.41.0", - "@theia/metrics": "1.41.0", - "@theia/mini-browser": "1.41.0", - "@theia/monaco": "1.41.0", - "@theia/navigator": "1.41.0", - "@theia/notebook": "1.41.0", - "@theia/outline-view": "1.41.0", - "@theia/output": "1.41.0", - "@theia/plugin-dev": "1.41.0", - "@theia/plugin-ext": "1.41.0", - "@theia/plugin-ext-vscode": "1.41.0", - "@theia/plugin-metrics": "1.41.0", - "@theia/preferences": "1.41.0", - "@theia/preview": "1.41.0", - "@theia/process": "1.41.0", - "@theia/property-view": "1.41.0", - "@theia/scm": "1.41.0", - "@theia/scm-extra": "1.41.0", - "@theia/search-in-workspace": "1.41.0", - "@theia/secondary-window": "1.41.0", - "@theia/task": "1.41.0", - "@theia/terminal": "1.41.0", - "@theia/timeline": "1.41.0", - "@theia/toolbar": "1.41.0", - "@theia/typehierarchy": "1.41.0", - "@theia/userstorage": "1.41.0", - "@theia/variable-resolver": "1.41.0", - "@theia/vsx-registry": "1.41.0", - "@theia/workspace": "1.41.0" + "@theia/api-samples": "1.42.0", + "@theia/bulk-edit": "1.42.0", + "@theia/callhierarchy": "1.42.0", + "@theia/console": "1.42.0", + "@theia/core": "1.42.0", + "@theia/debug": "1.42.0", + "@theia/editor": "1.42.0", + "@theia/editor-preview": "1.42.0", + "@theia/file-search": "1.42.0", + "@theia/filesystem": "1.42.0", + "@theia/getting-started": "1.42.0", + "@theia/git": "1.42.0", + "@theia/keymaps": "1.42.0", + "@theia/markers": "1.42.0", + "@theia/memory-inspector": "1.42.0", + "@theia/messages": "1.42.0", + "@theia/metrics": "1.42.0", + "@theia/mini-browser": "1.42.0", + "@theia/monaco": "1.42.0", + "@theia/navigator": "1.42.0", + "@theia/notebook": "1.42.0", + "@theia/outline-view": "1.42.0", + "@theia/output": "1.42.0", + "@theia/plugin-dev": "1.42.0", + "@theia/plugin-ext": "1.42.0", + "@theia/plugin-ext-vscode": "1.42.0", + "@theia/plugin-metrics": "1.42.0", + "@theia/preferences": "1.42.0", + "@theia/preview": "1.42.0", + "@theia/process": "1.42.0", + "@theia/property-view": "1.42.0", + "@theia/scm": "1.42.0", + "@theia/scm-extra": "1.42.0", + "@theia/search-in-workspace": "1.42.0", + "@theia/secondary-window": "1.42.0", + "@theia/task": "1.42.0", + "@theia/terminal": "1.42.0", + "@theia/timeline": "1.42.0", + "@theia/toolbar": "1.42.0", + "@theia/typehierarchy": "1.42.0", + "@theia/userstorage": "1.42.0", + "@theia/variable-resolver": "1.42.0", + "@theia/vsx-registry": "1.42.0", + "@theia/workspace": "1.42.0" }, "scripts": { "clean": "theia clean", @@ -78,6 +78,6 @@ "watch:compile": "tsc -b -w" }, "devDependencies": { - "@theia/cli": "1.41.0" + "@theia/cli": "1.42.0" } } diff --git a/examples/electron/package.json b/examples/electron/package.json index 5a0dd1c27d76a..ef1fd825b7ae0 100644 --- a/examples/electron/package.json +++ b/examples/electron/package.json @@ -2,7 +2,7 @@ "private": true, "name": "@theia/example-electron", "productName": "Theia Electron Example", - "version": "1.41.0", + "version": "1.42.0", "main": "lib/backend/electron-main.js", "license": "EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0", "theia": { @@ -14,50 +14,50 @@ } }, "dependencies": { - "@theia/api-samples": "1.41.0", - "@theia/bulk-edit": "1.41.0", - "@theia/callhierarchy": "1.41.0", - "@theia/console": "1.41.0", - "@theia/core": "1.41.0", - "@theia/debug": "1.41.0", - "@theia/editor": "1.41.0", - "@theia/editor-preview": "1.41.0", - "@theia/electron": "1.41.0", - "@theia/external-terminal": "1.41.0", - "@theia/file-search": "1.41.0", - "@theia/filesystem": "1.41.0", - "@theia/getting-started": "1.41.0", - "@theia/git": "1.41.0", - "@theia/keymaps": "1.41.0", - "@theia/markers": "1.41.0", - "@theia/memory-inspector": "1.41.0", - "@theia/messages": "1.41.0", - "@theia/metrics": "1.41.0", - "@theia/mini-browser": "1.41.0", - "@theia/monaco": "1.41.0", - "@theia/navigator": "1.41.0", - "@theia/outline-view": "1.41.0", - "@theia/output": "1.41.0", - "@theia/plugin-dev": "1.41.0", - "@theia/plugin-ext": "1.41.0", - "@theia/plugin-ext-vscode": "1.41.0", - "@theia/preferences": "1.41.0", - "@theia/preview": "1.41.0", - "@theia/process": "1.41.0", - "@theia/property-view": "1.41.0", - "@theia/scm": "1.41.0", - "@theia/scm-extra": "1.41.0", - "@theia/search-in-workspace": "1.41.0", - "@theia/secondary-window": "1.41.0", - "@theia/task": "1.41.0", - "@theia/terminal": "1.41.0", - "@theia/timeline": "1.41.0", - "@theia/toolbar": "1.41.0", - "@theia/typehierarchy": "1.41.0", - "@theia/userstorage": "1.41.0", - "@theia/variable-resolver": "1.41.0", - "@theia/vsx-registry": "1.41.0", - "@theia/workspace": "1.41.0" + "@theia/api-samples": "1.42.0", + "@theia/bulk-edit": "1.42.0", + "@theia/callhierarchy": "1.42.0", + "@theia/console": "1.42.0", + "@theia/core": "1.42.0", + "@theia/debug": "1.42.0", + "@theia/editor": "1.42.0", + "@theia/editor-preview": "1.42.0", + "@theia/electron": "1.42.0", + "@theia/external-terminal": "1.42.0", + "@theia/file-search": "1.42.0", + "@theia/filesystem": "1.42.0", + "@theia/getting-started": "1.42.0", + "@theia/git": "1.42.0", + "@theia/keymaps": "1.42.0", + "@theia/markers": "1.42.0", + "@theia/memory-inspector": "1.42.0", + "@theia/messages": "1.42.0", + "@theia/metrics": "1.42.0", + "@theia/mini-browser": "1.42.0", + "@theia/monaco": "1.42.0", + "@theia/navigator": "1.42.0", + "@theia/outline-view": "1.42.0", + "@theia/output": "1.42.0", + "@theia/plugin-dev": "1.42.0", + "@theia/plugin-ext": "1.42.0", + "@theia/plugin-ext-vscode": "1.42.0", + "@theia/preferences": "1.42.0", + "@theia/preview": "1.42.0", + "@theia/process": "1.42.0", + "@theia/property-view": "1.42.0", + "@theia/scm": "1.42.0", + "@theia/scm-extra": "1.42.0", + "@theia/search-in-workspace": "1.42.0", + "@theia/secondary-window": "1.42.0", + "@theia/task": "1.42.0", + "@theia/terminal": "1.42.0", + "@theia/timeline": "1.42.0", + "@theia/toolbar": "1.42.0", + "@theia/typehierarchy": "1.42.0", + "@theia/userstorage": "1.42.0", + "@theia/variable-resolver": "1.42.0", + "@theia/vsx-registry": "1.42.0", + "@theia/workspace": "1.42.0" }, "scripts": { "build": "yarn -s compile && yarn -s bundle", @@ -75,7 +75,7 @@ "watch:compile": "tsc -b -w" }, "devDependencies": { - "@theia/cli": "1.41.0", + "@theia/cli": "1.42.0", "electron": "^23.2.4" } } diff --git a/examples/playwright/package.json b/examples/playwright/package.json index 9e8c0d76c28c7..c915253fdf353 100644 --- a/examples/playwright/package.json +++ b/examples/playwright/package.json @@ -1,6 +1,6 @@ { "name": "@theia/playwright", - "version": "1.41.0", + "version": "1.42.0", "description": "System tests for Theia", "license": "EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0", "repository": { diff --git a/lerna.json b/lerna.json index 3143eb58b7c7c..5f1332ae47d87 100644 --- a/lerna.json +++ b/lerna.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/lerna.json", "npmClient": "yarn", - "version": "1.41.0", + "version": "1.42.0", "command": { "run": { "stream": true diff --git a/packages/bulk-edit/package.json b/packages/bulk-edit/package.json index 1bc551d5a6bd2..7f7fed51faaf0 100644 --- a/packages/bulk-edit/package.json +++ b/packages/bulk-edit/package.json @@ -1,14 +1,14 @@ { "name": "@theia/bulk-edit", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Bulk Edit Extension", "dependencies": { - "@theia/core": "1.41.0", - "@theia/editor": "1.41.0", - "@theia/filesystem": "1.41.0", - "@theia/monaco": "1.41.0", + "@theia/core": "1.42.0", + "@theia/editor": "1.42.0", + "@theia/filesystem": "1.42.0", + "@theia/monaco": "1.42.0", "@theia/monaco-editor-core": "1.72.3", - "@theia/workspace": "1.41.0" + "@theia/workspace": "1.42.0" }, "publishConfig": { "access": "public" @@ -43,7 +43,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/callhierarchy/package.json b/packages/callhierarchy/package.json index 825bde0e0a7ac..b99d91b578057 100644 --- a/packages/callhierarchy/package.json +++ b/packages/callhierarchy/package.json @@ -1,10 +1,10 @@ { "name": "@theia/callhierarchy", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Call Hierarchy Extension", "dependencies": { - "@theia/core": "1.41.0", - "@theia/editor": "1.41.0", + "@theia/core": "1.42.0", + "@theia/editor": "1.42.0", "ts-md5": "^1.2.2" }, "publishConfig": { @@ -40,7 +40,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/console/package.json b/packages/console/package.json index 8d1510693b36e..7eb8dc0494491 100644 --- a/packages/console/package.json +++ b/packages/console/package.json @@ -1,10 +1,10 @@ { "name": "@theia/console", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Console Extension", "dependencies": { - "@theia/core": "1.41.0", - "@theia/monaco": "1.41.0", + "@theia/core": "1.42.0", + "@theia/monaco": "1.42.0", "@theia/monaco-editor-core": "1.72.3", "anser": "^2.0.1" }, @@ -41,7 +41,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/core/package.json b/packages/core/package.json index c9a86c2c1ed52..b11b4c87047f3 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@theia/core", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia is a cloud & desktop IDE framework implemented in TypeScript.", "main": "lib/common/index.js", "typings": "lib/common/index.d.ts", @@ -16,8 +16,8 @@ "@phosphor/signaling": "1", "@phosphor/virtualdom": "1", "@phosphor/widgets": "1", - "@theia/application-package": "1.41.0", - "@theia/request": "1.41.0", + "@theia/application-package": "1.42.0", + "@theia/request": "1.42.0", "@types/body-parser": "^1.16.4", "@types/cookie": "^0.3.3", "@types/dompurify": "^2.2.2", @@ -200,8 +200,8 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0", - "@theia/re-exports": "1.41.0", + "@theia/ext-scripts": "1.42.0", + "@theia/re-exports": "1.42.0", "minimist": "^1.2.0" }, "nyc": { diff --git a/packages/debug/package.json b/packages/debug/package.json index 7e22a95fb8ca0..d8021ba7f8a85 100644 --- a/packages/debug/package.json +++ b/packages/debug/package.json @@ -1,21 +1,21 @@ { "name": "@theia/debug", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Debug Extension", "dependencies": { - "@theia/console": "1.41.0", - "@theia/core": "1.41.0", - "@theia/editor": "1.41.0", - "@theia/filesystem": "1.41.0", - "@theia/markers": "1.41.0", - "@theia/monaco": "1.41.0", + "@theia/console": "1.42.0", + "@theia/core": "1.42.0", + "@theia/editor": "1.42.0", + "@theia/filesystem": "1.42.0", + "@theia/markers": "1.42.0", + "@theia/monaco": "1.42.0", "@theia/monaco-editor-core": "1.72.3", - "@theia/output": "1.41.0", - "@theia/process": "1.41.0", - "@theia/task": "1.41.0", - "@theia/terminal": "1.41.0", - "@theia/variable-resolver": "1.41.0", - "@theia/workspace": "1.41.0", + "@theia/output": "1.42.0", + "@theia/process": "1.42.0", + "@theia/task": "1.42.0", + "@theia/terminal": "1.42.0", + "@theia/variable-resolver": "1.42.0", + "@theia/workspace": "1.42.0", "@vscode/debugprotocol": "^1.51.0", "fast-deep-equal": "^3.1.3", "jsonc-parser": "^2.2.0", @@ -56,7 +56,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/editor-preview/package.json b/packages/editor-preview/package.json index 0c4af3164bddb..7b1896e1c53e6 100644 --- a/packages/editor-preview/package.json +++ b/packages/editor-preview/package.json @@ -1,11 +1,11 @@ { "name": "@theia/editor-preview", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Editor Preview Extension", "dependencies": { - "@theia/core": "1.41.0", - "@theia/editor": "1.41.0", - "@theia/navigator": "1.41.0" + "@theia/core": "1.42.0", + "@theia/editor": "1.42.0", + "@theia/navigator": "1.42.0" }, "publishConfig": { "access": "public" @@ -40,7 +40,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/editor/package.json b/packages/editor/package.json index dc369512e41c5..1a07566c8fe90 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -1,10 +1,10 @@ { "name": "@theia/editor", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Editor Extension", "dependencies": { - "@theia/core": "1.41.0", - "@theia/variable-resolver": "1.41.0" + "@theia/core": "1.42.0", + "@theia/variable-resolver": "1.42.0" }, "publishConfig": { "access": "public" @@ -39,7 +39,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/electron/package.json b/packages/electron/package.json index fa429d7f5558d..3615ed47de3b3 100644 --- a/packages/electron/package.json +++ b/packages/electron/package.json @@ -1,6 +1,6 @@ { "name": "@theia/electron", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Electron utility package", "dependencies": { "electron-store": "^8.0.0", @@ -8,8 +8,8 @@ "native-keymap": "^2.2.1" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0", - "@theia/re-exports": "1.41.0" + "@theia/ext-scripts": "1.42.0", + "@theia/re-exports": "1.42.0" }, "peerDependencies": { "electron": "^23.2.4" diff --git a/packages/external-terminal/package.json b/packages/external-terminal/package.json index 1b3c75691792d..3653fdeec7ece 100644 --- a/packages/external-terminal/package.json +++ b/packages/external-terminal/package.json @@ -1,11 +1,11 @@ { "name": "@theia/external-terminal", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - External Terminal Extension", "dependencies": { - "@theia/core": "1.41.0", - "@theia/editor": "1.41.0", - "@theia/workspace": "1.41.0" + "@theia/core": "1.42.0", + "@theia/editor": "1.42.0", + "@theia/workspace": "1.42.0" }, "publishConfig": { "access": "public" @@ -41,7 +41,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/file-search/package.json b/packages/file-search/package.json index 13603a6927181..34ade21a26ec5 100644 --- a/packages/file-search/package.json +++ b/packages/file-search/package.json @@ -1,13 +1,13 @@ { "name": "@theia/file-search", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - File Search Extension", "dependencies": { - "@theia/core": "1.41.0", - "@theia/editor": "1.41.0", - "@theia/filesystem": "1.41.0", - "@theia/process": "1.41.0", - "@theia/workspace": "1.41.0", + "@theia/core": "1.42.0", + "@theia/editor": "1.42.0", + "@theia/filesystem": "1.42.0", + "@theia/process": "1.42.0", + "@theia/workspace": "1.42.0", "@vscode/ripgrep": "^1.14.2" }, "publishConfig": { @@ -44,7 +44,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/filesystem/package.json b/packages/filesystem/package.json index 09a5d76cb76d6..c7d2ad782c88b 100644 --- a/packages/filesystem/package.json +++ b/packages/filesystem/package.json @@ -1,9 +1,9 @@ { "name": "@theia/filesystem", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - FileSystem Extension", "dependencies": { - "@theia/core": "1.41.0", + "@theia/core": "1.42.0", "@types/body-parser": "^1.17.0", "@types/multer": "^1.4.7", "@types/rimraf": "^2.0.2", @@ -68,7 +68,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/getting-started/package.json b/packages/getting-started/package.json index 99fa988732cc0..1ab2e27e40dad 100644 --- a/packages/getting-started/package.json +++ b/packages/getting-started/package.json @@ -1,14 +1,14 @@ { "name": "@theia/getting-started", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - GettingStarted Extension", "dependencies": { - "@theia/core": "1.41.0", - "@theia/editor": "1.41.0", - "@theia/filesystem": "1.41.0", - "@theia/keymaps": "1.41.0", - "@theia/preview": "1.41.0", - "@theia/workspace": "1.41.0" + "@theia/core": "1.42.0", + "@theia/editor": "1.42.0", + "@theia/filesystem": "1.42.0", + "@theia/keymaps": "1.42.0", + "@theia/preview": "1.42.0", + "@theia/workspace": "1.42.0" }, "publishConfig": { "access": "public" @@ -44,7 +44,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/git/package.json b/packages/git/package.json index eb1d43075f3e7..b552c83e26a36 100644 --- a/packages/git/package.json +++ b/packages/git/package.json @@ -1,16 +1,16 @@ { "name": "@theia/git", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Git Integration", "dependencies": { - "@theia/core": "1.41.0", - "@theia/editor": "1.41.0", - "@theia/filesystem": "1.41.0", + "@theia/core": "1.42.0", + "@theia/editor": "1.42.0", + "@theia/filesystem": "1.42.0", "@theia/monaco-editor-core": "1.72.3", - "@theia/navigator": "1.41.0", - "@theia/scm": "1.41.0", - "@theia/scm-extra": "1.41.0", - "@theia/workspace": "1.41.0", + "@theia/navigator": "1.42.0", + "@theia/scm": "1.42.0", + "@theia/scm-extra": "1.42.0", + "@theia/workspace": "1.42.0", "@types/diff": "^3.2.2", "@types/p-queue": "^2.3.1", "diff": "^3.4.0", @@ -66,7 +66,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0", + "@theia/ext-scripts": "1.42.0", "@types/luxon": "^2.3.2", "upath": "^1.0.2" }, diff --git a/packages/keymaps/package.json b/packages/keymaps/package.json index ce5ed10f7f912..afe927887f9ff 100644 --- a/packages/keymaps/package.json +++ b/packages/keymaps/package.json @@ -1,17 +1,17 @@ { "name": "@theia/keymaps", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Custom Keymaps Extension", "dependencies": { - "@theia/core": "1.41.0", - "@theia/monaco": "1.41.0", + "@theia/core": "1.42.0", + "@theia/monaco": "1.42.0", "@theia/monaco-editor-core": "1.72.3", - "@theia/preferences": "1.41.0", - "@theia/userstorage": "1.41.0", + "@theia/preferences": "1.42.0", + "@theia/userstorage": "1.42.0", "jsonc-parser": "^2.2.0" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "publishConfig": { "access": "public" diff --git a/packages/markers/package.json b/packages/markers/package.json index b7ae02ca85806..437466bb9d088 100644 --- a/packages/markers/package.json +++ b/packages/markers/package.json @@ -1,11 +1,11 @@ { "name": "@theia/markers", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Markers Extension", "dependencies": { - "@theia/core": "1.41.0", - "@theia/filesystem": "1.41.0", - "@theia/workspace": "1.41.0" + "@theia/core": "1.42.0", + "@theia/filesystem": "1.42.0", + "@theia/workspace": "1.42.0" }, "publishConfig": { "access": "public" @@ -40,7 +40,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/memory-inspector/package.json b/packages/memory-inspector/package.json index 34243a7618662..886cfcf2e57d8 100644 --- a/packages/memory-inspector/package.json +++ b/packages/memory-inspector/package.json @@ -1,6 +1,6 @@ { "name": "@theia/memory-inspector", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Memory Inspector", "keywords": [ "theia-extension" @@ -27,8 +27,8 @@ "watch": "theiaext watch" }, "dependencies": { - "@theia/core": "1.41.0", - "@theia/debug": "1.41.0", + "@theia/core": "1.42.0", + "@theia/debug": "1.42.0", "@vscode/debugprotocol": "^1.51.0", "long": "^4.0.0" }, diff --git a/packages/messages/package.json b/packages/messages/package.json index 89e18bb33d394..7f516a3fc10d3 100644 --- a/packages/messages/package.json +++ b/packages/messages/package.json @@ -1,9 +1,9 @@ { "name": "@theia/messages", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Messages Extension", "dependencies": { - "@theia/core": "1.41.0", + "@theia/core": "1.42.0", "react-perfect-scrollbar": "^1.5.3", "ts-md5": "^1.2.2" }, @@ -40,7 +40,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/metrics/package.json b/packages/metrics/package.json index 1df9745f8e4c2..b4e699265044d 100644 --- a/packages/metrics/package.json +++ b/packages/metrics/package.json @@ -1,9 +1,9 @@ { "name": "@theia/metrics", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Metrics Extension", "dependencies": { - "@theia/core": "1.41.0", + "@theia/core": "1.42.0", "prom-client": "^10.2.0" }, "publishConfig": { @@ -40,7 +40,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/mini-browser/package.json b/packages/mini-browser/package.json index 71350d9ef65ee..dd9c9660eb998 100644 --- a/packages/mini-browser/package.json +++ b/packages/mini-browser/package.json @@ -1,10 +1,10 @@ { "name": "@theia/mini-browser", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Mini-Browser Extension", "dependencies": { - "@theia/core": "1.41.0", - "@theia/filesystem": "1.41.0", + "@theia/core": "1.42.0", + "@theia/filesystem": "1.42.0", "@types/mime-types": "^2.1.0", "mime-types": "^2.1.18", "pdfobject": "^2.0.201604172", @@ -49,7 +49,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/monaco/package.json b/packages/monaco/package.json index ff6c0edb7b663..f6646feee7a00 100644 --- a/packages/monaco/package.json +++ b/packages/monaco/package.json @@ -1,14 +1,14 @@ { "name": "@theia/monaco", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Monaco Extension", "dependencies": { - "@theia/core": "1.41.0", - "@theia/editor": "1.41.0", - "@theia/filesystem": "1.41.0", - "@theia/markers": "1.41.0", + "@theia/core": "1.42.0", + "@theia/editor": "1.42.0", + "@theia/filesystem": "1.42.0", + "@theia/markers": "1.42.0", "@theia/monaco-editor-core": "1.72.3", - "@theia/outline-view": "1.41.0", + "@theia/outline-view": "1.42.0", "fast-plist": "^0.1.2", "idb": "^4.0.5", "jsonc-parser": "^2.2.0", @@ -49,7 +49,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/navigator/package.json b/packages/navigator/package.json index 6ba90ed29a2bd..23f6126249ebd 100644 --- a/packages/navigator/package.json +++ b/packages/navigator/package.json @@ -1,11 +1,11 @@ { "name": "@theia/navigator", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Navigator Extension", "dependencies": { - "@theia/core": "1.41.0", - "@theia/filesystem": "1.41.0", - "@theia/workspace": "1.41.0", + "@theia/core": "1.42.0", + "@theia/filesystem": "1.42.0", + "@theia/workspace": "1.42.0", "minimatch": "^5.1.0" }, "publishConfig": { @@ -44,7 +44,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/notebook/package.json b/packages/notebook/package.json index b8c3ef9d21f6c..0b8dfd4d6e2f4 100644 --- a/packages/notebook/package.json +++ b/packages/notebook/package.json @@ -1,12 +1,12 @@ { "name": "@theia/notebook", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Notebook Extension", "dependencies": { - "@theia/core": "1.41.0", - "@theia/editor": "1.41.0", - "@theia/filesystem": "1.41.0", - "@theia/monaco": "1.41.0", + "@theia/core": "1.42.0", + "@theia/editor": "1.42.0", + "@theia/filesystem": "1.42.0", + "@theia/monaco": "1.42.0", "uuid": "^8.3.2" }, "publishConfig": { @@ -42,7 +42,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0", + "@theia/ext-scripts": "1.42.0", "@types/vscode-notebook-renderer": "^1.72.0" }, "nyc": { diff --git a/packages/outline-view/package.json b/packages/outline-view/package.json index dcf9876c1bb51..928467ab01235 100644 --- a/packages/outline-view/package.json +++ b/packages/outline-view/package.json @@ -1,9 +1,9 @@ { "name": "@theia/outline-view", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Outline View Extension", "dependencies": { - "@theia/core": "1.41.0" + "@theia/core": "1.42.0" }, "publishConfig": { "access": "public" @@ -38,7 +38,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/output/package.json b/packages/output/package.json index 285a0f7a965c6..e2c7ba1244ab7 100644 --- a/packages/output/package.json +++ b/packages/output/package.json @@ -1,11 +1,11 @@ { "name": "@theia/output", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Output Extension", "dependencies": { - "@theia/core": "1.41.0", - "@theia/editor": "1.41.0", - "@theia/monaco": "1.41.0", + "@theia/core": "1.42.0", + "@theia/editor": "1.42.0", + "@theia/monaco": "1.42.0", "@theia/monaco-editor-core": "1.72.3", "@types/p-queue": "^2.3.1", "p-queue": "^2.4.2" @@ -43,7 +43,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/plugin-dev/package.json b/packages/plugin-dev/package.json index cb53fd3f248c6..b1a2594910a41 100644 --- a/packages/plugin-dev/package.json +++ b/packages/plugin-dev/package.json @@ -1,16 +1,16 @@ { "name": "@theia/plugin-dev", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Plugin Development Extension", "main": "lib/common/index.js", "typings": "lib/common/index.d.ts", "dependencies": { - "@theia/core": "1.41.0", - "@theia/debug": "1.41.0", - "@theia/filesystem": "1.41.0", - "@theia/output": "1.41.0", - "@theia/plugin-ext": "1.41.0", - "@theia/workspace": "1.41.0", + "@theia/core": "1.42.0", + "@theia/debug": "1.42.0", + "@theia/filesystem": "1.42.0", + "@theia/output": "1.42.0", + "@theia/plugin-ext": "1.42.0", + "@theia/workspace": "1.42.0", "ps-tree": "^1.2.0" }, "publishConfig": { @@ -48,7 +48,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/plugin-ext-vscode/package.json b/packages/plugin-ext-vscode/package.json index c9d08a06cff44..f2950639c0381 100644 --- a/packages/plugin-ext-vscode/package.json +++ b/packages/plugin-ext-vscode/package.json @@ -1,21 +1,21 @@ { "name": "@theia/plugin-ext-vscode", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Plugin Extension for VsCode", "dependencies": { - "@theia/callhierarchy": "1.41.0", - "@theia/core": "1.41.0", - "@theia/editor": "1.41.0", - "@theia/filesystem": "1.41.0", - "@theia/monaco": "1.41.0", + "@theia/callhierarchy": "1.42.0", + "@theia/core": "1.42.0", + "@theia/editor": "1.42.0", + "@theia/filesystem": "1.42.0", + "@theia/monaco": "1.42.0", "@theia/monaco-editor-core": "1.72.3", - "@theia/navigator": "1.41.0", - "@theia/plugin": "1.41.0", - "@theia/plugin-ext": "1.41.0", - "@theia/terminal": "1.41.0", - "@theia/typehierarchy": "1.41.0", - "@theia/userstorage": "1.41.0", - "@theia/workspace": "1.41.0", + "@theia/navigator": "1.42.0", + "@theia/plugin": "1.42.0", + "@theia/plugin-ext": "1.42.0", + "@theia/terminal": "1.42.0", + "@theia/typehierarchy": "1.42.0", + "@theia/userstorage": "1.42.0", + "@theia/workspace": "1.42.0", "filenamify": "^4.1.0" }, "publishConfig": { @@ -52,7 +52,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/plugin-ext/package.json b/packages/plugin-ext/package.json index 951091e0da1e3..fb37372ac14c1 100644 --- a/packages/plugin-ext/package.json +++ b/packages/plugin-ext/package.json @@ -1,36 +1,36 @@ { "name": "@theia/plugin-ext", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Plugin Extension", "main": "lib/common/index.js", "typings": "lib/common/index.d.ts", "dependencies": { - "@theia/bulk-edit": "1.41.0", - "@theia/callhierarchy": "1.41.0", - "@theia/console": "1.41.0", - "@theia/core": "1.41.0", - "@theia/debug": "1.41.0", - "@theia/editor": "1.41.0", - "@theia/editor-preview": "1.41.0", - "@theia/file-search": "1.41.0", - "@theia/filesystem": "1.41.0", - "@theia/markers": "1.41.0", - "@theia/messages": "1.41.0", - "@theia/monaco": "1.41.0", + "@theia/bulk-edit": "1.42.0", + "@theia/callhierarchy": "1.42.0", + "@theia/console": "1.42.0", + "@theia/core": "1.42.0", + "@theia/debug": "1.42.0", + "@theia/editor": "1.42.0", + "@theia/editor-preview": "1.42.0", + "@theia/file-search": "1.42.0", + "@theia/filesystem": "1.42.0", + "@theia/markers": "1.42.0", + "@theia/messages": "1.42.0", + "@theia/monaco": "1.42.0", "@theia/monaco-editor-core": "1.72.3", - "@theia/navigator": "1.41.0", - "@theia/notebook": "1.41.0", - "@theia/output": "1.41.0", - "@theia/plugin": "1.41.0", - "@theia/preferences": "1.41.0", - "@theia/scm": "1.41.0", - "@theia/search-in-workspace": "1.41.0", - "@theia/task": "1.41.0", - "@theia/terminal": "1.41.0", - "@theia/timeline": "1.41.0", - "@theia/typehierarchy": "1.41.0", - "@theia/variable-resolver": "1.41.0", - "@theia/workspace": "1.41.0", + "@theia/navigator": "1.42.0", + "@theia/notebook": "1.42.0", + "@theia/output": "1.42.0", + "@theia/plugin": "1.42.0", + "@theia/preferences": "1.42.0", + "@theia/scm": "1.42.0", + "@theia/search-in-workspace": "1.42.0", + "@theia/task": "1.42.0", + "@theia/terminal": "1.42.0", + "@theia/timeline": "1.42.0", + "@theia/typehierarchy": "1.42.0", + "@theia/variable-resolver": "1.42.0", + "@theia/workspace": "1.42.0", "@types/mime": "^2.0.1", "@vscode/debugprotocol": "^1.51.0", "@vscode/proxy-agent": "^0.13.2", @@ -87,7 +87,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0", + "@theia/ext-scripts": "1.42.0", "@types/decompress": "^4.2.2", "@types/escape-html": "^0.0.20", "@types/lodash.clonedeep": "^4.5.3", diff --git a/packages/plugin-metrics/package.json b/packages/plugin-metrics/package.json index 49a39b251e7c8..994066d60155b 100644 --- a/packages/plugin-metrics/package.json +++ b/packages/plugin-metrics/package.json @@ -1,13 +1,13 @@ { "name": "@theia/plugin-metrics", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Plugin Metrics", "dependencies": { - "@theia/core": "1.41.0", - "@theia/metrics": "1.41.0", + "@theia/core": "1.42.0", + "@theia/metrics": "1.42.0", "@theia/monaco-editor-core": "1.72.3", - "@theia/plugin": "1.41.0", - "@theia/plugin-ext": "1.41.0" + "@theia/plugin": "1.42.0", + "@theia/plugin-ext": "1.42.0" }, "publishConfig": { "access": "public" @@ -43,7 +43,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/plugin/package.json b/packages/plugin/package.json index e54c52f5d9591..3fe83bab93f4c 100644 --- a/packages/plugin/package.json +++ b/packages/plugin/package.json @@ -1,6 +1,6 @@ { "name": "@theia/plugin", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Plugin API", "types": "./src/theia.d.ts", "publishConfig": { @@ -27,7 +27,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/preferences/package.json b/packages/preferences/package.json index 6677ab4d69268..05f5d74b55d7a 100644 --- a/packages/preferences/package.json +++ b/packages/preferences/package.json @@ -1,15 +1,15 @@ { "name": "@theia/preferences", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Preferences Extension", "dependencies": { - "@theia/core": "1.41.0", - "@theia/editor": "1.41.0", - "@theia/filesystem": "1.41.0", - "@theia/monaco": "1.41.0", + "@theia/core": "1.42.0", + "@theia/editor": "1.42.0", + "@theia/filesystem": "1.42.0", + "@theia/monaco": "1.42.0", "@theia/monaco-editor-core": "1.72.3", - "@theia/userstorage": "1.41.0", - "@theia/workspace": "1.41.0", + "@theia/userstorage": "1.42.0", + "@theia/workspace": "1.42.0", "async-mutex": "^0.3.1", "fast-deep-equal": "^3.1.3", "jsonc-parser": "^2.2.0", @@ -48,7 +48,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/preview/package.json b/packages/preview/package.json index 40c3c500dedf0..c510a6fab5f0e 100644 --- a/packages/preview/package.json +++ b/packages/preview/package.json @@ -1,12 +1,12 @@ { "name": "@theia/preview", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Preview Extension", "dependencies": { - "@theia/core": "1.41.0", - "@theia/editor": "1.41.0", - "@theia/mini-browser": "1.41.0", - "@theia/monaco": "1.41.0", + "@theia/core": "1.42.0", + "@theia/editor": "1.42.0", + "@theia/mini-browser": "1.42.0", + "@theia/monaco": "1.42.0", "@types/highlight.js": "^10.1.0", "@types/markdown-it-anchor": "^4.0.1", "highlight.js": "10.4.1", @@ -45,7 +45,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/process/package.json b/packages/process/package.json index af23ff866f193..d9acb7124ef28 100644 --- a/packages/process/package.json +++ b/packages/process/package.json @@ -1,9 +1,9 @@ { "name": "@theia/process", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia process support.", "dependencies": { - "@theia/core": "1.41.0", + "@theia/core": "1.42.0", "node-pty": "0.11.0-beta17", "string-argv": "^0.1.1" }, @@ -44,7 +44,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/property-view/package.json b/packages/property-view/package.json index 9569c2bcac5f2..b7746c9c08966 100644 --- a/packages/property-view/package.json +++ b/packages/property-view/package.json @@ -1,10 +1,10 @@ { "name": "@theia/property-view", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Property View Extension", "dependencies": { - "@theia/core": "1.41.0", - "@theia/filesystem": "1.41.0" + "@theia/core": "1.42.0", + "@theia/filesystem": "1.42.0" }, "publishConfig": { "access": "public" @@ -39,7 +39,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/scm-extra/package.json b/packages/scm-extra/package.json index 7b3c0dc641f92..19b94f30479ce 100644 --- a/packages/scm-extra/package.json +++ b/packages/scm-extra/package.json @@ -1,13 +1,13 @@ { "name": "@theia/scm-extra", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Source control extras Extension", "dependencies": { - "@theia/core": "1.41.0", - "@theia/editor": "1.41.0", - "@theia/filesystem": "1.41.0", - "@theia/navigator": "1.41.0", - "@theia/scm": "1.41.0" + "@theia/core": "1.42.0", + "@theia/editor": "1.42.0", + "@theia/filesystem": "1.42.0", + "@theia/navigator": "1.42.0", + "@theia/scm": "1.42.0" }, "publishConfig": { "access": "public" @@ -42,7 +42,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/scm/package.json b/packages/scm/package.json index 29d1393540911..43d29ac7ef207 100644 --- a/packages/scm/package.json +++ b/packages/scm/package.json @@ -1,11 +1,11 @@ { "name": "@theia/scm", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Source control Extension", "dependencies": { - "@theia/core": "1.41.0", - "@theia/editor": "1.41.0", - "@theia/filesystem": "1.41.0", + "@theia/core": "1.42.0", + "@theia/editor": "1.42.0", + "@theia/filesystem": "1.42.0", "@types/diff": "^3.2.2", "diff": "^3.4.0", "p-debounce": "^2.1.0", @@ -45,7 +45,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/search-in-workspace/package.json b/packages/search-in-workspace/package.json index 17be748fcc3c5..8bf2cf8ffdd0a 100644 --- a/packages/search-in-workspace/package.json +++ b/packages/search-in-workspace/package.json @@ -1,14 +1,14 @@ { "name": "@theia/search-in-workspace", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Search in workspace", "dependencies": { - "@theia/core": "1.41.0", - "@theia/editor": "1.41.0", - "@theia/filesystem": "1.41.0", - "@theia/navigator": "1.41.0", - "@theia/process": "1.41.0", - "@theia/workspace": "1.41.0", + "@theia/core": "1.42.0", + "@theia/editor": "1.42.0", + "@theia/filesystem": "1.42.0", + "@theia/navigator": "1.42.0", + "@theia/process": "1.42.0", + "@theia/workspace": "1.42.0", "@vscode/ripgrep": "^1.14.2", "minimatch": "^5.1.0", "react-autosize-textarea": "^7.0.0" @@ -47,6 +47,6 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" } } diff --git a/packages/secondary-window/package.json b/packages/secondary-window/package.json index 46db72ace00c2..3e0d675bb8a33 100644 --- a/packages/secondary-window/package.json +++ b/packages/secondary-window/package.json @@ -1,9 +1,9 @@ { "name": "@theia/secondary-window", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Secondary Window Extension", "dependencies": { - "@theia/core": "1.41.0" + "@theia/core": "1.42.0" }, "publishConfig": { "access": "public" @@ -38,6 +38,6 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" } } diff --git a/packages/task/package.json b/packages/task/package.json index 78b6ee0512420..437e6d7158b8b 100644 --- a/packages/task/package.json +++ b/packages/task/package.json @@ -1,19 +1,19 @@ { "name": "@theia/task", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Task extension. This extension adds support for executing raw or terminal processes in the backend.", "dependencies": { - "@theia/core": "1.41.0", - "@theia/editor": "1.41.0", - "@theia/filesystem": "1.41.0", - "@theia/markers": "1.41.0", - "@theia/monaco": "1.41.0", + "@theia/core": "1.42.0", + "@theia/editor": "1.42.0", + "@theia/filesystem": "1.42.0", + "@theia/markers": "1.42.0", + "@theia/monaco": "1.42.0", "@theia/monaco-editor-core": "1.72.3", - "@theia/process": "1.41.0", - "@theia/terminal": "1.41.0", - "@theia/userstorage": "1.41.0", - "@theia/variable-resolver": "1.41.0", - "@theia/workspace": "1.41.0", + "@theia/process": "1.42.0", + "@theia/terminal": "1.42.0", + "@theia/userstorage": "1.42.0", + "@theia/variable-resolver": "1.42.0", + "@theia/workspace": "1.42.0", "async-mutex": "^0.3.1", "jsonc-parser": "^2.2.0", "p-debounce": "^2.1.0" @@ -52,7 +52,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/terminal/package.json b/packages/terminal/package.json index 7589f52eb3f8f..5a35a53bf7b87 100644 --- a/packages/terminal/package.json +++ b/packages/terminal/package.json @@ -1,14 +1,14 @@ { "name": "@theia/terminal", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Terminal Extension", "dependencies": { - "@theia/core": "1.41.0", - "@theia/editor": "1.41.0", - "@theia/filesystem": "1.41.0", - "@theia/process": "1.41.0", - "@theia/variable-resolver": "1.41.0", - "@theia/workspace": "1.41.0", + "@theia/core": "1.42.0", + "@theia/editor": "1.42.0", + "@theia/filesystem": "1.42.0", + "@theia/process": "1.42.0", + "@theia/variable-resolver": "1.42.0", + "@theia/workspace": "1.42.0", "xterm": "^4.16.0", "xterm-addon-fit": "^0.5.0", "xterm-addon-search": "^0.8.2" @@ -48,7 +48,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/timeline/package.json b/packages/timeline/package.json index 58d898a5546b1..6543d047ff68c 100644 --- a/packages/timeline/package.json +++ b/packages/timeline/package.json @@ -1,10 +1,10 @@ { "name": "@theia/timeline", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Timeline Extension", "dependencies": { - "@theia/core": "1.41.0", - "@theia/navigator": "1.41.0" + "@theia/core": "1.42.0", + "@theia/navigator": "1.42.0" }, "publishConfig": { "access": "public" @@ -39,7 +39,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/toolbar/package.json b/packages/toolbar/package.json index 9e326bac17d3a..7d33564e5e83c 100644 --- a/packages/toolbar/package.json +++ b/packages/toolbar/package.json @@ -1,6 +1,6 @@ { "name": "@theia/toolbar", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Toolbar", "keywords": [ "theia-extension" @@ -27,15 +27,15 @@ "watch": "theiaext watch" }, "dependencies": { - "@theia/core": "1.41.0", - "@theia/editor": "1.41.0", - "@theia/file-search": "1.41.0", - "@theia/filesystem": "1.41.0", - "@theia/monaco": "1.41.0", + "@theia/core": "1.42.0", + "@theia/editor": "1.42.0", + "@theia/file-search": "1.42.0", + "@theia/filesystem": "1.42.0", + "@theia/monaco": "1.42.0", "@theia/monaco-editor-core": "1.72.3", - "@theia/search-in-workspace": "1.41.0", - "@theia/userstorage": "1.41.0", - "@theia/workspace": "1.41.0", + "@theia/search-in-workspace": "1.42.0", + "@theia/userstorage": "1.42.0", + "@theia/workspace": "1.42.0", "ajv": "^6.5.3", "jsonc-parser": "^2.2.0", "perfect-scrollbar": "^1.3.0" diff --git a/packages/typehierarchy/package.json b/packages/typehierarchy/package.json index 91ec9dfea66fd..4f22a3293d8ca 100644 --- a/packages/typehierarchy/package.json +++ b/packages/typehierarchy/package.json @@ -1,10 +1,10 @@ { "name": "@theia/typehierarchy", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Type Hierarchy Extension", "dependencies": { - "@theia/core": "1.41.0", - "@theia/editor": "1.41.0", + "@theia/core": "1.42.0", + "@theia/editor": "1.42.0", "@types/uuid": "^7.0.3", "uuid": "^8.0.0" }, @@ -41,7 +41,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/userstorage/package.json b/packages/userstorage/package.json index e3220348460ee..3f09225efc42d 100644 --- a/packages/userstorage/package.json +++ b/packages/userstorage/package.json @@ -1,10 +1,10 @@ { "name": "@theia/userstorage", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - User Storage Extension", "dependencies": { - "@theia/core": "1.41.0", - "@theia/filesystem": "1.41.0" + "@theia/core": "1.42.0", + "@theia/filesystem": "1.42.0" }, "publishConfig": { "access": "public" @@ -39,7 +39,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/variable-resolver/package.json b/packages/variable-resolver/package.json index b913566c99ac8..fdec3d4e5d76e 100644 --- a/packages/variable-resolver/package.json +++ b/packages/variable-resolver/package.json @@ -1,9 +1,9 @@ { "name": "@theia/variable-resolver", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Variable Resolver Extension", "dependencies": { - "@theia/core": "1.41.0" + "@theia/core": "1.42.0" }, "publishConfig": { "access": "public" @@ -44,7 +44,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/vsx-registry/package.json b/packages/vsx-registry/package.json index 27709557b0e6c..8b90ec0e8395e 100644 --- a/packages/vsx-registry/package.json +++ b/packages/vsx-registry/package.json @@ -1,15 +1,15 @@ { "name": "@theia/vsx-registry", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - VSX Registry", "dependencies": { - "@theia/core": "1.41.0", - "@theia/filesystem": "1.41.0", - "@theia/ovsx-client": "1.41.0", - "@theia/plugin-ext": "1.41.0", - "@theia/plugin-ext-vscode": "1.41.0", - "@theia/preferences": "1.41.0", - "@theia/workspace": "1.41.0", + "@theia/core": "1.42.0", + "@theia/filesystem": "1.42.0", + "@theia/ovsx-client": "1.42.0", + "@theia/plugin-ext": "1.42.0", + "@theia/plugin-ext-vscode": "1.42.0", + "@theia/preferences": "1.42.0", + "@theia/workspace": "1.42.0", "luxon": "^2.4.0", "p-debounce": "^2.1.0", "semver": "^7.5.4", @@ -53,7 +53,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0", + "@theia/ext-scripts": "1.42.0", "@types/luxon": "^2.3.2" }, "nyc": { diff --git a/packages/workspace/package.json b/packages/workspace/package.json index 1dc21c5db50e1..07f33666f7135 100644 --- a/packages/workspace/package.json +++ b/packages/workspace/package.json @@ -1,12 +1,12 @@ { "name": "@theia/workspace", - "version": "1.41.0", + "version": "1.42.0", "description": "Theia - Workspace Extension", "dependencies": { - "@theia/core": "1.41.0", - "@theia/filesystem": "1.41.0", + "@theia/core": "1.42.0", + "@theia/filesystem": "1.42.0", "@theia/monaco-editor-core": "1.72.3", - "@theia/variable-resolver": "1.41.0", + "@theia/variable-resolver": "1.42.0", "jsonc-parser": "^2.2.0", "valid-filename": "^2.0.1" }, @@ -44,7 +44,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.41.0" + "@theia/ext-scripts": "1.42.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/sample-plugins/sample-namespace/plugin-a/package.json b/sample-plugins/sample-namespace/plugin-a/package.json index 032dcd7ab2f32..bf77846aa81b9 100644 --- a/sample-plugins/sample-namespace/plugin-a/package.json +++ b/sample-plugins/sample-namespace/plugin-a/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "plugin-a", - "version": "1.41.0", + "version": "1.42.0", "main": "extension.js", "license": "EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0", "repository": { diff --git a/sample-plugins/sample-namespace/plugin-b/package.json b/sample-plugins/sample-namespace/plugin-b/package.json index 27b378da57a89..41f1243979cef 100644 --- a/sample-plugins/sample-namespace/plugin-b/package.json +++ b/sample-plugins/sample-namespace/plugin-b/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "plugin-b", - "version": "1.41.0", + "version": "1.42.0", "main": "extension.js", "license": "EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0", "repository": { From bb7cdbbb46dc14cc9db093756243bc94571bb1c6 Mon Sep 17 00:00:00 2001 From: vince-fugnitto Date: Thu, 28 Sep 2023 14:15:16 -0400 Subject: [PATCH 70/79] core: update re-exports for 1.42.0 Signed-off-by: vince-fugnitto --- packages/core/README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/core/README.md b/packages/core/README.md index 529bd1473ec86..ba65cbd4653d8 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -84,12 +84,12 @@ export class SomeClass { - `@phosphor/signaling` (from [`@phosphor/signaling@1`](https://www.npmjs.com/package/@phosphor/signaling)) - `@phosphor/virtualdom` (from [`@phosphor/virtualdom@1`](https://www.npmjs.com/package/@phosphor/virtualdom)) - `@phosphor/widgets` (from [`@phosphor/widgets@1`](https://www.npmjs.com/package/@phosphor/widgets)) - - `@theia/application-package` (from [`@theia/application-package@1.41.0`](https://www.npmjs.com/package/@theia/application-package/v/1.41.0)) - - `@theia/application-package/lib/api` (from [`@theia/application-package@1.41.0`](https://www.npmjs.com/package/@theia/application-package/v/1.41.0)) - - `@theia/application-package/lib/environment` (from [`@theia/application-package@1.41.0`](https://www.npmjs.com/package/@theia/application-package/v/1.41.0)) - - `@theia/request` (from [`@theia/request@1.41.0`](https://www.npmjs.com/package/@theia/request/v/1.41.0)) - - `@theia/request/lib/proxy` (from [`@theia/request@1.41.0`](https://www.npmjs.com/package/@theia/request/v/1.41.0)) - - `@theia/request/lib/node-request-service` (from [`@theia/request@1.41.0`](https://www.npmjs.com/package/@theia/request/v/1.41.0)) + - `@theia/application-package` (from [`@theia/application-package@1.42.0`](https://www.npmjs.com/package/@theia/application-package/v/1.42.0)) + - `@theia/application-package/lib/api` (from [`@theia/application-package@1.42.0`](https://www.npmjs.com/package/@theia/application-package/v/1.42.0)) + - `@theia/application-package/lib/environment` (from [`@theia/application-package@1.42.0`](https://www.npmjs.com/package/@theia/application-package/v/1.42.0)) + - `@theia/request` (from [`@theia/request@1.42.0`](https://www.npmjs.com/package/@theia/request/v/1.42.0)) + - `@theia/request/lib/proxy` (from [`@theia/request@1.42.0`](https://www.npmjs.com/package/@theia/request/v/1.42.0)) + - `@theia/request/lib/node-request-service` (from [`@theia/request@1.42.0`](https://www.npmjs.com/package/@theia/request/v/1.42.0)) - `fs-extra` (from [`fs-extra@^4.0.2`](https://www.npmjs.com/package/fs-extra)) - `fuzzy` (from [`fuzzy@^0.1.3`](https://www.npmjs.com/package/fuzzy)) - `inversify` (from [`inversify@^6.0.1`](https://www.npmjs.com/package/inversify)) From ab4627e4ffe15aec236793f98daab534c4e77f40 Mon Sep 17 00:00:00 2001 From: Mark Sujew Date: Sat, 30 Sep 2023 22:01:47 +0200 Subject: [PATCH 71/79] Fix preload application package import (#12964) --- packages/core/src/browser/preload/theme-preload-contribution.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/browser/preload/theme-preload-contribution.ts b/packages/core/src/browser/preload/theme-preload-contribution.ts index a8df2463407ea..3a4f430915dde 100644 --- a/packages/core/src/browser/preload/theme-preload-contribution.ts +++ b/packages/core/src/browser/preload/theme-preload-contribution.ts @@ -17,7 +17,7 @@ import { PreloadContribution } from './preloader'; import { DEFAULT_BACKGROUND_COLOR_STORAGE_KEY } from '../frontend-application-config-provider'; import { injectable } from 'inversify'; -import { DefaultTheme } from '@theia/application-package'; +import { DefaultTheme } from '@theia/application-package/lib/application-props'; @injectable() export class ThemePreloadContribution implements PreloadContribution { From 525b3b11ebc42adc986acb0e5c1b33513e5e4ad5 Mon Sep 17 00:00:00 2001 From: vatsal-uppal-1997 Date: Mon, 2 Oct 2023 15:20:40 +0530 Subject: [PATCH 72/79] Fix symlinks should be resolved when initializing plugins (#12841) - Added symlink resolution to HostedPluginReader --- packages/plugin-ext/src/hosted/node/plugin-reader.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/plugin-ext/src/hosted/node/plugin-reader.ts b/packages/plugin-ext/src/hosted/node/plugin-reader.ts index a9ba83ef0afdb..b137673a3acfd 100644 --- a/packages/plugin-ext/src/hosted/node/plugin-reader.ts +++ b/packages/plugin-ext/src/hosted/node/plugin-reader.ts @@ -17,6 +17,7 @@ import * as path from 'path'; import * as express from '@theia/core/shared/express'; import * as escape_html from 'escape-html'; +import { realpath } from 'fs/promises'; import { ILogger } from '@theia/core'; import { inject, injectable, optional, multiInject } from '@theia/core/shared/inversify'; import { BackendApplicationContribution } from '@theia/core/lib/node/backend-application'; @@ -93,11 +94,12 @@ export class HostedPluginReader implements BackendApplicationContribution { if (!pluginPath) { return undefined; } - const manifest = await loadManifest(pluginPath); + const resolvedPluginPath = await realpath(pluginPath); + const manifest = await loadManifest(resolvedPluginPath); if (!manifest) { return undefined; } - manifest.packagePath = pluginPath; + manifest.packagePath = resolvedPluginPath; return manifest; } From 4c8a64df0441d6ed0e72452b3b6bc2d0ebb59222 Mon Sep 17 00:00:00 2001 From: Mark Sujew Date: Tue, 3 Oct 2023 15:07:24 +0200 Subject: [PATCH 73/79] Update `vscode-textmate` dependency (#12963) --- packages/monaco/package.json | 2 +- .../src/browser/textmate/textmate-tokenizer.ts | 16 ++++++++-------- packages/plugin-ext/package.json | 2 +- yarn.lock | 8 ++++---- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/monaco/package.json b/packages/monaco/package.json index f6646feee7a00..2b95858769917 100644 --- a/packages/monaco/package.json +++ b/packages/monaco/package.json @@ -13,7 +13,7 @@ "idb": "^4.0.5", "jsonc-parser": "^2.2.0", "vscode-oniguruma": "1.6.1", - "vscode-textmate": "^7.0.3" + "vscode-textmate": "^9.0.0" }, "publishConfig": { "access": "public" diff --git a/packages/monaco/src/browser/textmate/textmate-tokenizer.ts b/packages/monaco/src/browser/textmate/textmate-tokenizer.ts index 526e71615d88d..7fb7951f985bd 100644 --- a/packages/monaco/src/browser/textmate/textmate-tokenizer.ts +++ b/packages/monaco/src/browser/textmate/textmate-tokenizer.ts @@ -14,21 +14,21 @@ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0 // ***************************************************************************** -import { INITIAL, IGrammar, StackElement } from 'vscode-textmate'; +import { INITIAL, IGrammar, StateStack } from 'vscode-textmate'; import * as monaco from '@theia/monaco-editor-core'; export class TokenizerState implements monaco.languages.IState { constructor( - public readonly stackElement: StackElement + public readonly stateStack: StateStack ) { } clone(): monaco.languages.IState { - return new TokenizerState(this.stackElement); + return new TokenizerState(this.stateStack); } equals(other: monaco.languages.IState): boolean { - return other instanceof TokenizerState && (other === this || other.stackElement === this.stackElement); + return other instanceof TokenizerState && (other === this || other.stateStack === this.stateStack); } } @@ -58,9 +58,9 @@ export function createTextmateTokenizer(grammar: IGrammar, options: TokenizerOpt tokenizeEncoded(line: string, state: TokenizerState): monaco.languages.IEncodedLineTokens { if (options.lineLimit !== undefined && line.length > options.lineLimit) { // Skip tokenizing the line if it exceeds the line limit. - return { endState: state.stackElement, tokens: new Uint32Array() }; + return { endState: state.stateStack, tokens: new Uint32Array() }; } - const result = grammar.tokenizeLine2(line, state.stackElement, 500); + const result = grammar.tokenizeLine2(line, state.stateStack, 500); return { endState: new TokenizerState(result.ruleStack), tokens: result.tokens @@ -69,9 +69,9 @@ export function createTextmateTokenizer(grammar: IGrammar, options: TokenizerOpt tokenize(line: string, state: TokenizerState): monaco.languages.ILineTokens { if (options.lineLimit !== undefined && line.length > options.lineLimit) { // Skip tokenizing the line if it exceeds the line limit. - return { endState: state.stackElement, tokens: [] }; + return { endState: state.stateStack, tokens: [] }; } - const result = grammar.tokenizeLine(line, state.stackElement, 500); + const result = grammar.tokenizeLine(line, state.stateStack, 500); return { endState: new TokenizerState(result.ruleStack), tokens: result.tokens.map(t => ({ diff --git a/packages/plugin-ext/package.json b/packages/plugin-ext/package.json index fb37372ac14c1..56036eef0e1a6 100644 --- a/packages/plugin-ext/package.json +++ b/packages/plugin-ext/package.json @@ -47,7 +47,7 @@ "semver": "^7.5.4", "uuid": "^8.0.0", "vhost": "^3.0.2", - "vscode-textmate": "^7.0.3" + "vscode-textmate": "^9.0.0" }, "publishConfig": { "access": "public" diff --git a/yarn.lock b/yarn.lock index 843003f79c8a5..610bef7ea435e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11220,10 +11220,10 @@ vscode-textmate@5.2.0: resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-5.2.0.tgz#01f01760a391e8222fe4f33fbccbd1ad71aed74e" integrity sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ== -vscode-textmate@^7.0.3: - version "7.0.4" - resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-7.0.4.tgz#a30df59ce573e998e4e2ffbca5ab82d57bc3126f" - integrity sha512-9hJp0xL7HW1Q5OgGe03NACo7yiCTMEk3WU/rtKXUbncLtdg6rVVNJnHwD88UhbIYU2KoxY0Dih0x+kIsmUKn2A== +vscode-textmate@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-9.0.0.tgz#313c6c8792b0507aef35aeb81b6b370b37c44d6c" + integrity sha512-Cl65diFGxz7gpwbav10HqiY/eVYTO1sjQpmRmV991Bj7wAoOAjGQ97PpQcXorDE2Uc4hnGWLY17xme+5t6MlSg== vscode-uri@^2.1.1: version "2.1.2" From 3e9d59356cbc72414b64ea422a7532f93b328e2d Mon Sep 17 00:00:00 2001 From: Tobias Ortmayr Date: Tue, 10 Oct 2023 00:49:29 -0700 Subject: [PATCH 74/79] Remove unnecessary try-catch from `RpcProtocol` (#12961) --- .../core/src/common/message-rpc/rpc-protocol.ts | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/packages/core/src/common/message-rpc/rpc-protocol.ts b/packages/core/src/common/message-rpc/rpc-protocol.ts index 672639b0c607b..9ebd529c4a3ed 100644 --- a/packages/core/src/common/message-rpc/rpc-protocol.ts +++ b/packages/core/src/common/message-rpc/rpc-protocol.ts @@ -134,16 +134,12 @@ export class RpcProtocol { } protected handleReplyErr(id: number, error: any): void { - try { - const replyHandler = this.pendingRequests.get(id); - if (replyHandler) { - this.pendingRequests.delete(id); - replyHandler.reject(error); - } else { - throw new Error(`No reply handler for error reply with id: ${id}`); - } - } catch (err) { - throw err; + const replyHandler = this.pendingRequests.get(id); + if (replyHandler) { + this.pendingRequests.delete(id); + replyHandler.reject(error); + } else { + throw new Error(`No reply handler for error reply with id: ${id}`); } } From 99cab352c0bb83b99c5c07540f205837a2d37b82 Mon Sep 17 00:00:00 2001 From: Vincent Fugnitto Date: Tue, 10 Oct 2023 09:17:14 -0400 Subject: [PATCH 75/79] deps: upgrade `chai` (#12958) The commit upgrades our `chai` dependency in order to resolve a known security vulnerability. Signed-off-by: vince-fugnitto --- dev-packages/cli/package.json | 2 +- package.json | 2 +- yarn.lock | 61 +++++++++++++---------------------- 3 files changed, 24 insertions(+), 41 deletions(-) diff --git a/dev-packages/cli/package.json b/dev-packages/cli/package.json index 9e681dbdeb060..ad161227b2422 100644 --- a/dev-packages/cli/package.json +++ b/dev-packages/cli/package.json @@ -39,7 +39,7 @@ "@types/chai": "^4.2.7", "@types/mocha": "^10.0.0", "@types/node-fetch": "^2.5.7", - "chai": "^4.2.0", + "chai": "^4.3.10", "chalk": "4.0.0", "decompress": "^4.2.1", "escape-string-regexp": "4.0.0", diff --git a/package.json b/package.json index 929fb05554183..a3ea4050b234a 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "@typescript-eslint/eslint-plugin-tslint": "^4.8.1", "@typescript-eslint/parser": "^4.8.1", "@vscode/vsce": "^2.15.0", - "chai": "4.3.4", + "chai": "4.3.10", "chai-spies": "1.0.0", "chai-string": "^1.4.0", "chalk": "4.0.0", diff --git a/yarn.lock b/yarn.lock index 610bef7ea435e..56e297965e736 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3499,30 +3499,18 @@ chai-string@^1.4.0: resolved "https://registry.yarnpkg.com/chai-string/-/chai-string-1.5.0.tgz#0bdb2d8a5f1dbe90bc78ec493c1c1c180dd4d3d2" integrity sha512-sydDC3S3pNAQMYwJrs6dQX0oBQ6KfIPuOZ78n7rocW0eJJlsHPh2t3kwW7xfwYA/1Bf6/arGtSUo16rxR2JFlw== -chai@4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49" - integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA== +chai@4.3.10, chai@^4.3.10: + version "4.3.10" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.10.tgz#d784cec635e3b7e2ffb66446a63b4e33bd390384" + integrity sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g== dependencies: assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^3.0.1" - get-func-name "^2.0.0" + check-error "^1.0.3" + deep-eql "^4.1.3" + get-func-name "^2.0.2" + loupe "^2.3.6" pathval "^1.1.1" - type-detect "^4.0.5" - -chai@^4.2.0: - version "4.3.7" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" - integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^4.1.2" - get-func-name "^2.0.0" - loupe "^2.3.1" - pathval "^1.1.1" - type-detect "^4.0.5" + type-detect "^4.0.8" chainsaw@~0.1.0: version "0.1.0" @@ -3569,10 +3557,12 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== +check-error@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" + integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== + dependencies: + get-func-name "^2.0.2" cheerio-select@^2.1.0: version "2.1.0" @@ -4290,14 +4280,7 @@ dedent@0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== -deep-eql@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== - dependencies: - type-detect "^4.0.0" - -deep-eql@^4.1.2: +deep-eql@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== @@ -5675,10 +5658,10 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== +get-func-name@^2.0.0, get-func-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: version "1.2.1" @@ -7291,7 +7274,7 @@ loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -loupe@^2.3.1: +loupe@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== @@ -10835,7 +10818,7 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: +type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== From e32a0f3a37872a2ad828ebcf7e4b4f42e789bf60 Mon Sep 17 00:00:00 2001 From: Vincent Fugnitto Date: Tue, 10 Oct 2023 09:49:47 -0400 Subject: [PATCH 76/79] core: refactor `manage` sidebar menu (#12803) The commit refactors the `manage` sidebar menu (previously settings) to the same organization present in vscode with similar commands. Signed-off-by: vince-fugnitto --- CHANGELOG.md | 7 +++++ .../browser/common-frontend-contribution.ts | 28 +++++++++++-------- .../quick-command-frontend-contribution.ts | 5 ++++ packages/core/src/common/menu/menu-types.ts | 2 +- .../browser/keymaps-frontend-contribution.ts | 4 +-- .../src/browser/preferences-contribution.ts | 2 +- .../src/browser/task-frontend-contribution.ts | 8 +++++- .../browser/vsx-extensions-contribution.ts | 17 +++++++++-- 8 files changed, 54 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f420d1b1c7de..0476d4bd1bdff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,13 @@ - [Previous Changelogs](https://github.com/eclipse-theia/theia/tree/master/doc/changelogs/) +## v1.43.0 - Unreleased + +[Breaking Changes:](#breaking_changes_1.43.0) + +- [core] removed `SETTINGS_OPEN` menupath constant - replaced by `MANAGE_GENERAL` [#12803](https://github.com/eclipse-theia/theia/pull/12803) +- [core] removed `SETTINGS__THEME` menupath constant - replaced by `MANAGE_SETTINGS` [#12803](https://github.com/eclipse-theia/theia/pull/12803) + ## v1.42.0 - 09/28/2023 - [core] added `inversify` support in the frontend preload script [#12590](https://github.com/eclipse-theia/theia/pull/12590) diff --git a/packages/core/src/browser/common-frontend-contribution.ts b/packages/core/src/browser/common-frontend-contribution.ts index c446f1e88c729..c3e13398731cd 100644 --- a/packages/core/src/browser/common-frontend-contribution.ts +++ b/packages/core/src/browser/common-frontend-contribution.ts @@ -18,7 +18,7 @@ import debounce = require('lodash.debounce'); import { injectable, inject, optional } from 'inversify'; -import { MAIN_MENU_BAR, SETTINGS_MENU, MenuContribution, MenuModelRegistry, ACCOUNTS_MENU } from '../common/menu'; +import { MAIN_MENU_BAR, MANAGE_MENU, MenuContribution, MenuModelRegistry, ACCOUNTS_MENU } from '../common/menu'; import { KeybindingContribution, KeybindingRegistry } from './keybinding'; import { FrontendApplication, FrontendApplicationContribution, OnWillStopAction } from './frontend-application'; import { CommandContribution, CommandRegistry, Command } from '../common/command'; @@ -100,8 +100,10 @@ export namespace CommonMenus { export const VIEW_LAYOUT = [...VIEW, '3_layout']; export const VIEW_TOGGLE = [...VIEW, '4_toggle']; - export const SETTINGS_OPEN = [...SETTINGS_MENU, '1_settings_open']; - export const SETTINGS__THEME = [...SETTINGS_MENU, '2_settings_theme']; + export const MANAGE_GENERAL = [...MANAGE_MENU, '1_manage_general']; + export const MANAGE_SETTINGS = [...MANAGE_MENU, '2_manage_settings']; + export const MANAGE_SETTINGS_THEMES = [...MANAGE_SETTINGS, '1_manage_settings_themes']; + // last menu item export const HELP = [...MAIN_MENU_BAR, '9_help']; @@ -113,6 +115,7 @@ export namespace CommonCommands { export const VIEW_CATEGORY = 'View'; export const CREATE_CATEGORY = 'Create'; export const PREFERENCES_CATEGORY = 'Preferences'; + export const MANAGE_CATEGORY = 'Manage'; export const FILE_CATEGORY_KEY = nls.getDefaultKey(FILE_CATEGORY); export const VIEW_CATEGORY_KEY = nls.getDefaultKey(VIEW_CATEGORY); export const PREFERENCES_CATEGORY_KEY = nls.getDefaultKey(PREFERENCES_CATEGORY); @@ -455,16 +458,16 @@ export class CommonFrontendContribution implements FrontendApplicationContributi app.shell.leftPanelHandler.addBottomMenu({ id: 'settings-menu', iconClass: 'codicon codicon-settings-gear', - title: nls.localizeByDefault(CommonCommands.PREFERENCES_CATEGORY), - menuPath: SETTINGS_MENU, - order: 0, + title: nls.localizeByDefault(CommonCommands.MANAGE_CATEGORY), + menuPath: MANAGE_MENU, + order: 1, }); const accountsMenu = { id: 'accounts-menu', iconClass: 'codicon codicon-person', title: nls.localizeByDefault('Accounts'), menuPath: ACCOUNTS_MENU, - order: 1, + order: 0, }; this.authenticationService.onDidRegisterAuthenticationProvider(() => { app.shell.leftPanelHandler.addBottomMenu(accountsMenu); @@ -700,11 +703,14 @@ export class CommonFrontendContribution implements FrontendApplicationContributi commandId: CommonCommands.SELECT_ICON_THEME.id }); - registry.registerMenuAction(CommonMenus.SETTINGS__THEME, { - commandId: CommonCommands.SELECT_COLOR_THEME.id + registry.registerSubmenu(CommonMenus.MANAGE_SETTINGS_THEMES, nls.localizeByDefault('Themes'), { order: 'a50' }); + registry.registerMenuAction(CommonMenus.MANAGE_SETTINGS_THEMES, { + commandId: CommonCommands.SELECT_COLOR_THEME.id, + order: '0' }); - registry.registerMenuAction(CommonMenus.SETTINGS__THEME, { - commandId: CommonCommands.SELECT_ICON_THEME.id + registry.registerMenuAction(CommonMenus.MANAGE_SETTINGS_THEMES, { + commandId: CommonCommands.SELECT_ICON_THEME.id, + order: '1' }); registry.registerSubmenu(CommonMenus.VIEW_APPEARANCE_SUBMENU, nls.localizeByDefault('Appearance')); diff --git a/packages/core/src/browser/quick-input/quick-command-frontend-contribution.ts b/packages/core/src/browser/quick-input/quick-command-frontend-contribution.ts index 8316c1d6ab485..5582487ed2df6 100644 --- a/packages/core/src/browser/quick-input/quick-command-frontend-contribution.ts +++ b/packages/core/src/browser/quick-input/quick-command-frontend-contribution.ts @@ -59,6 +59,11 @@ export class QuickCommandFrontendContribution implements CommandContribution, Ke commandId: quickCommand.id, label: nls.localizeByDefault('Command Palette...') }); + menus.registerMenuAction(CommonMenus.MANAGE_GENERAL, { + commandId: quickCommand.id, + label: nls.localizeByDefault('Command Palette...'), + order: '0' + }); } registerKeybindings(keybindings: KeybindingRegistry): void { diff --git a/packages/core/src/common/menu/menu-types.ts b/packages/core/src/common/menu/menu-types.ts index 6d2e8d6dc3bcb..23081a88e3ad1 100644 --- a/packages/core/src/common/menu/menu-types.ts +++ b/packages/core/src/common/menu/menu-types.ts @@ -19,7 +19,7 @@ import { isObject } from '../types'; export type MenuPath = string[]; export const MAIN_MENU_BAR: MenuPath = ['menubar']; -export const SETTINGS_MENU: MenuPath = ['settings_menu']; +export const MANAGE_MENU: MenuPath = ['manage_menu']; export const ACCOUNTS_MENU: MenuPath = ['accounts_menu']; export const ACCOUNTS_SUBMENU = [...ACCOUNTS_MENU, '1_accounts_submenu']; diff --git a/packages/keymaps/src/browser/keymaps-frontend-contribution.ts b/packages/keymaps/src/browser/keymaps-frontend-contribution.ts index 9e737063931c4..f828fb73b940f 100644 --- a/packages/keymaps/src/browser/keymaps-frontend-contribution.ts +++ b/packages/keymaps/src/browser/keymaps-frontend-contribution.ts @@ -94,10 +94,10 @@ export class KeymapsFrontendContribution extends AbstractViewContribution implements ColorContribution, FrontendApplicationContribution { @@ -59,7 +65,7 @@ export class VSXExtensionsContribution extends AbstractViewContribution Date: Wed, 11 Oct 2023 17:21:41 +0200 Subject: [PATCH 77/79] Ensure ApplicationShellOptions are properly used for shell init (#12983) Fixes https://github.com/eclipse-theia/theia/issues/12982 --- .../src/browser/shell/application-shell.ts | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/packages/core/src/browser/shell/application-shell.ts b/packages/core/src/browser/shell/application-shell.ts index 16fbf1663f114..b93858eccdb54 100644 --- a/packages/core/src/browser/shell/application-shell.ts +++ b/packages/core/src/browser/shell/application-shell.ts @@ -272,6 +272,22 @@ export class ApplicationShell extends Widget { @inject(SecondaryWindowHandler) protected readonly secondaryWindowHandler: SecondaryWindowHandler, ) { super(options as Widget.IOptions); + + // Merge the user-defined application options with the default options + this.options = { + bottomPanel: { + ...ApplicationShell.DEFAULT_OPTIONS.bottomPanel, + ...options?.bottomPanel || {} + }, + leftPanel: { + ...ApplicationShell.DEFAULT_OPTIONS.leftPanel, + ...options?.leftPanel || {} + }, + rightPanel: { + ...ApplicationShell.DEFAULT_OPTIONS.rightPanel, + ...options?.rightPanel || {} + } + }; } @postConstruct() @@ -303,21 +319,6 @@ export class ApplicationShell extends Widget { protected initializeShell(): void { this.addClass(APPLICATION_SHELL_CLASS); this.id = 'theia-app-shell'; - // Merge the user-defined application options with the default options - this.options = { - bottomPanel: { - ...ApplicationShell.DEFAULT_OPTIONS.bottomPanel, - ...this.options?.bottomPanel || {} - }, - leftPanel: { - ...ApplicationShell.DEFAULT_OPTIONS.leftPanel, - ...this.options?.leftPanel || {} - }, - rightPanel: { - ...ApplicationShell.DEFAULT_OPTIONS.rightPanel, - ...this.options?.rightPanel || {} - } - }; this.mainPanel = this.createMainPanel(); this.topPanel = this.createTopPanel(); From c625ba1e0e48e6e086dc874b4067c36bad6bfaaa Mon Sep 17 00:00:00 2001 From: Jonah Iden Date: Thu, 12 Oct 2023 12:23:41 +0200 Subject: [PATCH 78/79] Fix URL path for output renderer scripts (#12976) * fixed path for downloading output renderer scripts from Signed-off-by: Jonah Iden * fixed importing of renderer script Signed-off-by: Jonah Iden --------- Signed-off-by: Jonah Iden --- .../browser/notebooks/renderers/output-webview-internal.ts | 4 ++-- .../src/main/browser/plugin-contribution-handler.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/plugin-ext/src/main/browser/notebooks/renderers/output-webview-internal.ts b/packages/plugin-ext/src/main/browser/notebooks/renderers/output-webview-internal.ts index 17e18d2a48f17..81c87f1b6d622 100644 --- a/packages/plugin-ext/src/main/browser/notebooks/renderers/output-webview-internal.ts +++ b/packages/plugin-ext/src/main/browser/notebooks/renderers/output-webview-internal.ts @@ -160,8 +160,8 @@ export async function outputWebviewPreload(ctx: PreloadContext): Promise { if (this.rendererApi) { return this.rendererApi; } - - const rendererModule = await __import(this.data.entrypoint.uri) as { activate: rendererApi.ActivationFunction }; + const baseUri = window.location.href.replace(/\/webview\/index\.html.*/, ''); + const rendererModule = await __import(`${baseUri}/${this.data.entrypoint.uri}`) as { activate: rendererApi.ActivationFunction }; this.rendererApi = await rendererModule.activate(this.createRendererContext()); return this.rendererApi; } diff --git a/packages/plugin-ext/src/main/browser/plugin-contribution-handler.ts b/packages/plugin-ext/src/main/browser/plugin-contribution-handler.ts index b96302b16ff7c..1b499d6cdaa82 100644 --- a/packages/plugin-ext/src/main/browser/plugin-contribution-handler.ts +++ b/packages/plugin-ext/src/main/browser/plugin-contribution-handler.ts @@ -23,7 +23,7 @@ import { PluginViewRegistry } from './view/plugin-view-registry'; import { PluginCustomEditorRegistry } from './custom-editors/plugin-custom-editor-registry'; import { PluginContribution, IndentationRules, FoldingRules, ScopeMap, DeployedPlugin, - GrammarsContribution, EnterAction, OnEnterRule, RegExpOptions, getPluginId + GrammarsContribution, EnterAction, OnEnterRule, RegExpOptions, PluginPackage } from '../../common'; import { DefaultUriLabelProviderContribution, @@ -416,7 +416,7 @@ export class PluginContributionHandler { if (contributions.notebookRenderer) { for (const renderer of contributions.notebookRenderer) { pushContribution(`notebookRenderer.${renderer.id}`, - () => this.notebookRendererRegistry.registerNotebookRenderer(renderer, `/hostedPlugin/${getPluginId(plugin.metadata.model)}`) + () => this.notebookRendererRegistry.registerNotebookRenderer(renderer, PluginPackage.toPluginUrl(plugin.metadata.model, '')) ); } } From ff1ee2b6fcce32fac4384fb1cbf64aa7c9638172 Mon Sep 17 00:00:00 2001 From: Mark Sujew Date: Thu, 12 Oct 2023 12:36:51 +0200 Subject: [PATCH 79/79] Improve language quick pick responsiveness (#12992) --- .../browser/i18n/language-quick-pick-service.ts | 1 + .../browser/vsx-language-quick-pick-service.ts | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/packages/core/src/browser/i18n/language-quick-pick-service.ts b/packages/core/src/browser/i18n/language-quick-pick-service.ts index 88210abbb4660..d0b2fc9af5f27 100644 --- a/packages/core/src/browser/i18n/language-quick-pick-service.ts +++ b/packages/core/src/browser/i18n/language-quick-pick-service.ts @@ -80,6 +80,7 @@ export class LanguageQuickPickService { } else { resolve(undefined); } + quickInput.hide(); }); quickInput.onDidHide(() => { resolve(undefined); diff --git a/packages/vsx-registry/src/browser/vsx-language-quick-pick-service.ts b/packages/vsx-registry/src/browser/vsx-language-quick-pick-service.ts index adc765f7df79b..35af7885c4465 100644 --- a/packages/vsx-registry/src/browser/vsx-language-quick-pick-service.ts +++ b/packages/vsx-registry/src/browser/vsx-language-quick-pick-service.ts @@ -22,6 +22,8 @@ import { PluginPackage, PluginServer } from '@theia/plugin-ext'; import { OVSXClientProvider } from '../common/ovsx-client-provider'; import { VSXSearchEntry } from '@theia/ovsx-client'; import { VSCodeExtensionUri } from '@theia/plugin-ext-vscode/lib/common/plugin-vscode-uri'; +import { nls } from '@theia/core/lib/common/nls'; +import { MessageService } from '@theia/core/lib/common/message-service'; @injectable() export class VSXLanguageQuickPickService extends LanguageQuickPickService { @@ -35,6 +37,9 @@ export class VSXLanguageQuickPickService extends LanguageQuickPickService { @inject(PluginServer) protected readonly pluginServer: PluginServer; + @inject(MessageService) + protected readonly messageService: MessageService; + protected override async getAvailableLanguages(): Promise { const client = await this.clientProvider(); const searchResult = await client.search({ @@ -62,8 +67,16 @@ export class VSXLanguageQuickPickService extends LanguageQuickPickService { languages.set(localizationContribution.languageId, { ...this.createLanguageQuickPickItem(localizationContribution), execute: async () => { - const extensionUri = VSCodeExtensionUri.toUri(extension.extension.name, extension.extension.namespace).toString(); - await this.pluginServer.deploy(extensionUri); + const progress = await this.messageService.showProgress({ + text: nls.localizeByDefault('Installing {0} language support...', + localizationContribution.localizedLanguageName ?? localizationContribution.languageName ?? localizationContribution.languageId), + }); + try { + const extensionUri = VSCodeExtensionUri.toUri(extension.extension.name, extension.extension.namespace).toString(); + await this.pluginServer.deploy(extensionUri); + } finally { + progress.cancel(); + } } }); }