diff --git a/.github/workflows/translation.yml b/.github/workflows/translation.yml new file mode 100644 index 0000000000000..2887fff231fcf --- /dev/null +++ b/.github/workflows/translation.yml @@ -0,0 +1,63 @@ +name: Automatic Translation + +on: workflow_dispatch + +jobs: + translation: + name: Translation Update + runs-on: ubuntu-latest + timeout-minutes: 60 + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Use Node.js 16.x + uses: actions/setup-node@v1 + with: + node-version: 16.x + registry-url: "https://registry.npmjs.org" + + - name: Use Python 3.x + uses: actions/setup-python@v2 + with: + python-version: "3.x" + + - name: Install and Build + shell: bash + run: | + yarn --skip-integrity-check --network-timeout 100000 + env: + NODE_OPTIONS: --max_old_space_size=4096 + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # https://github.com/microsoft/vscode-ripgrep/issues/9 + + - id: compute-next-version + run: | + export THEIA_CORE_VERSION=$(node -p "require(\"./packages/core/package.json\").version") + echo "NEXT_VERSION_NUMBER=$(npx -q semver@7 --increment minor $THEIA_CORE_VERSION)" >> $GITHUB_ENV + + - name: Perform Automatic Translation + run: | + node ./scripts/translation-update.js + env: + DEEPL_API_TOKEN: ${{ secrets.DEEPL_API_TOKEN }} + + - name: Get Actor User Data + uses: octokit/request-action@v2.x + id: actor_user_data + with: + route: GET /users/{user} + user: ${{ github.actor }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v4 + with: + commiter: ${{ github.actor }} <${{ fromJson(steps.actor_user_data.outputs.data).email }}> + author: ${{ github.actor }} <${{ fromJson(steps.actor_user_data.outputs.data).email }}> + branch: bot/translation-update + title: Translation update for version ${{ env.NEXT_VERSION_NUMBER }} + commit-message: Translation update for version ${{ env.NEXT_VERSION_NUMBER }} + body: Automated translation update for Theia version ${{ env.NEXT_VERSION_NUMBER }}. Triggered by @${{ github.actor }}. + labels: localization diff --git a/CHANGELOG.md b/CHANGELOG.md index aae495d0f2434..66cd3e891066a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,16 +4,63 @@ - [Previous Changelogs](https://github.com/eclipse-theia/theia/tree/master/doc/changelogs/) -## v1.28.0 - Unreleased - -- [plugin] added support for property `SourceControlInputBox#visible` [#11412](https://github.com/eclipse-theia/theia/pull/11412) - Contributed on behalf of STMicroelectronics +## v1.29.0 - unreleased + +- [plugin] added support for `EvaluatableExpressions` [#11484](https://github.com/eclipse-theia/theia/pull/11484) - Contributed on behalf of STMicroelectronics + +[Breaking Changes:](#breaking_changes_1.29.0) + +- [core] `updateThemePreference` and `updateThemeFromPreference` removed from `CommonFrontendContribution`. Corresponding functionality as been moved to the respective theme service. `load` removed from `IconThemeService` [#11473](https://github.com/eclipse-theia/theia/issues/11473) +- [core] updated `react` and `react-dom` dependencies to version 18, which introduce new root API for rendering (replaces ReactDOM.render). Since React no longer supports render callbacks, the `onRender` field from `ReactDialog` and `ReactWidget` was removed. [#11455](https://github.com/eclipse-theia/theia/pull/11455) - Contributed on behalf of STMicroelectronics + +## v1.28.0 - 7/28/2022 + +- [cli] improved error handling when interacting with the API [#11454](https://github.com/eclipse-theia/theia/issues/11454) +- [core] added better support when unloading language packs [#11338](https://github.com/eclipse-theia/theia/pull/11338) +- [core] added proper support for null-value RPC encoding [#11396](https://github.com/eclipse-theia/theia/pull/11396) +- [core] updated `WidgetManager` to compare keys using deep equal [#11450](https://github.com/eclipse-theia/theia/issues/11450) +- [core] updated handling to pass `StopReason` to `OnWillStopAction` [#11428](https://github.com/eclipse-theia/theia/issues/11428) +- [core] updated the `caption` rendering for `ViewContainer` [#11422](https://github.com/eclipse-theia/theia/pull/11422) +- [debug] added support for `InstructionBreakpoints` [#111866](https://github.com/eclipse-theia/theia/pull/11186) +- [debug] added support for the `Disassembly` view [#11186](https://github.com/eclipse-theia/theia/pull/11186) +- [debug] added the ability to dismiss exception widgets [#11441](https://github.com/eclipse-theia/theia/issues/11441) +- [debug] fixed an issue causing an infinite loop with child debug sessions [#11388](https://github.com/eclipse-theia/theia/pull/11388) +- [file-search] updated `vscode-ripgrep` to `@vscode-ripgrep@1.14.2` [#11389](https://github.com/eclipse-theia/theia/pull/11389) +- [filesystem] fixed implementation of `FileChangeEvent#contains` [#11409](https://github.com/eclipse-theia/theia/pull/11409) +- [git] upgraded `dugite-extra` to `v0.1.16` [#11445](https://github.com/eclipse-theia/theia/issues/11445) +- [keymaps] added handling for multiple keybindings for a given command [#11363](https://github.com/eclipse-theia/theia/pull/11363) +- [markers] updated rendering of markers [#11408](https://github.com/eclipse-theia/theia/pull/11408) +- [monaco] added localization support for commands contributed by monaco [#11434](https://github.com/eclipse-theia/theia/pull/11434) +- [monaco] fixed `activeItem` handling in the `QuickPick` menu [#11438](https://github.com/eclipse-theia/theia/pull/11438) +- [monaco] improved `tokenization` performance [#11416](https://github.com/eclipse-theia/theia/pull/11416) +- [monaco] upgraded monaco to VS Code `v1.67.2` [#11331](https://github.com/eclipse-theia/theia/pull/11331) +- [navigator] updated `New File` and `New Folder` to only appear for folders [#11453](https://github.com/eclipse-theia/theia/issues/11453) +- [navigator] updated explorer toolbar items [#11429](https://github.com/eclipse-theia/theia/pull/11429) +- [plugin] added support for `activeParameter` in the `SignatureInformation` VS Code API [#11426](https://github.com/eclipse-theia/theia/pull/11426) +- [plugin] added support for `title` in the `QuickPickOptions` VS Code API [#11418](https://github.com/eclipse-theia/theia/pull/11418) +- [plugin] added support for `vscode.env` VS Code API namespace [#11446](https://github.com/eclipse-theia/theia/issues/11446) +- [plugin] added support for all selected URIs in command execution [#11433](https://github.com/eclipse-theia/theia/pull/11433) +- [plugin] added support for the `DebugProtocolBreakpoint` and `DebugProtocolSource` VS Code API [#10011](https://github.com/eclipse-theia/theia/issues/10011) - Contributed on behalf of STMicroelectronics +- [plugin] added support for the `TerminalOptions#message` VS Code API [#11385](https://github.com/eclipse-theia/theia/pull/11835) +- [plugin] added support for the `workbench.action.saveWorkspaceAs` command [#11395](https://github.com/eclipse-theia/theia/pull/11395) +- [plugin] added support for the property `SourceControlInputBox#visible` [#11412](https://github.com/eclipse-theia/theia/pull/11412) - Contributed on behalf of STMicroelectronics +- [plugin] updated `LocationLink` definition [#11465](https://github.com/eclipse-theia/theia/issues/11456) +- [preferences] added handling to properly dispose the model after saving [#11410](https://github.com/eclipse-theia/theia/pull/11410) +- [process] improved performance of `lsof` on `macOS` [#11411](https://github.com/eclipse-theia/theia/pull/11411) +- [search-in-workspace] updated `Find in Folder` to only apply for folders [#11456](https://github.com/eclipse-theia/theia/issues/11456) +- [search-in-workspace] updated `vscode-ripgrep` to `@vscode-ripgrep@1.14.2` [#11389](https://github.com/eclipse-theia/theia/pull/11389) +- [terminal] added output buffering support [#11449](https://github.com/eclipse-theia/theia/issues/11449) +- [variable-resolver] added handling for user cancellation of variables [#11406](https://github.com/eclipse-theia/theia/pull/11406) +- [vsx-registry] updated the extensions view to display a message when failing to fetch extensions [#11457](https://github.com/eclipse-theia/theia/issues/11457) [Breaking Changes:](#breaking_changes_1.28.0) - [core] `handleDefault`, `handleElectronDefault` method no longer called in `BrowserMainMenuFactory.registerMenu()`, `DynamicMenuWidget.buildSubMenus()` or `ElectronMainMenuFactory.fillSubmenus()`. Override the respective calling function rather than `handleDefault`. The argument to each of the three methods listed above is now `MenuNode` and not `CompositeMenuNode`, and the methods are truly recursive and called on entire menu tree. `ActionMenuNode.action` removed; access relevant field on `ActionMenuNode.command`, `.when` etc. [#11290](https://github.com/eclipse-theia/theia/pull/11290) - [core] renamed `CommonCommands.NEW_FILE` to `CommonCommands.NEW_UNTITLED_FILE` [#11429](https://github.com/eclipse-theia/theia/pull/11429) -- [plugin-ext] `CodeEditorWidgetUtil` moved to `packages/plugin-ext/src/main/browser/menus/vscode-theia-menu-mappings.ts`. `MenusContributionPointHandler` extensively refactored. See PR description for details. [#11290](https://github.com/eclipse-theia/theia/pull/11290) -- [plugin] added support for `DebugProtocolBreakpoint` and `DebugProtocolSource` [#10011](https://github.com/eclipse-theia/theia/issues/10011) - Contributed on behalf of STMicroelectronics +- [plugin] `CodeEditorWidgetUtil` moved to `packages/plugin-ext/src/main/browser/menus/vscode-theia-menu-mappings.ts`. `MenusContributionPointHandler` extensively refactored. See PR description for details. [#11290](https://github.com/eclipse-theia/theia/pull/11290) +- [plugin] `LocalFilePluginDeployerResolver` moved to `plugin-ext` `local-vsix-file-plugin-deployer-resolver.ts`. [#11466](https://github.com/eclipse-theia/theia/issues/11466) +- [plugin] removed `Plugin: Deploy Plugin by Id` command [#11417](https://github.com/eclipse-theia/theia/pull/11417) +- [vsx-registry] removed `downloadPath` field from `VSXExtensionResolver`. Plugins are now placed directly in user plugin directory. [#11466](https://github.com/eclipse-theia/theia/issues/11466) ## v1.27.0 - 6/30/2022 @@ -273,7 +320,7 @@ - [core] fixed tail decoration rendering for the `TreeWidget` [#10898](https://github.com/eclipse-theia/theia/pull/10898) - [core] improved tabbar styling [#10822](https://github.com/eclipse-theia/theia/pull/10822) - [core] updated sash visibility handling [#10941](https://github.com/eclipse-theia/theia/pull/10941) -- [core] updated type check for `TreeContainerPRops` [#10881](https://github.com/eclipse-theia/theia/pull/10881) +- [core] updated type check for `TreeContainerProps` [#10881](https://github.com/eclipse-theia/theia/pull/10881) - [core] updated validation warning for `undefined` preference values [#10887](https://github.com/eclipse-theia/theia/pull/10887) - [core] updated view container styling [#10854](https://github.com/eclipse-theia/theia/pull/10854) - [debug] fixed issue where the current debug configuration was not updated [#10917](https://github.com/eclipse-theia/theia/pull/10917) @@ -389,7 +436,7 @@ [Breaking Changes:](#breaking_changes_1.23.0) -- [core] moved methods `attachReadyToShow`, `restoreMaximizedState`, `attachCloseListeners`, `handleStopRequest`, `checkSafeToStop`, `handleReload`, `reload` from `ElectronMainAPplication` into new class `TheiaElectronWindow` [#10600](https://github.com/eclipse-theia/theia/pull/10600) +- [core] moved methods `attachReadyToShow`, `restoreMaximizedState`, `attachCloseListeners`, `handleStopRequest`, `checkSafeToStop`, `handleReload`, `reload` from `ElectronMainApplication` into new class `TheiaElectronWindow` [#10600](https://github.com/eclipse-theia/theia/pull/10600) - [core] removed all of our own custom HTTP Polling implementation [#10514](https://github.com/eclipse-theia/theia/pull/10514) - [core] removed method `attachGlobalShortcuts` from `ElectronMainApplication`. Attaching shortcuts in that way interfered with internal shortcuts. Use internal keybindings instead of global shortcuts. [#10704](https://github.com/eclipse-theia/theia/pull/10704) - [core] removed the `Event.maxListeners` field; The feature still exists but please use `Event.getMaxListeners(event)` and `Event.setMaxListeners(event, maxListeners)` instead. diff --git a/configs/errors.eslintrc.json b/configs/errors.eslintrc.json index 02b9ecbe16a30..f61b8bd10287a 100644 --- a/configs/errors.eslintrc.json +++ b/configs/errors.eslintrc.json @@ -62,6 +62,7 @@ "no-throw-literal": "error", "no-trailing-spaces": "error", "no-underscore-dangle": "off", + "no-unreachable": "error", "no-unused-expressions": "error", "no-var": "error", "no-void": "error", diff --git a/dev-packages/application-manager/package.json b/dev-packages/application-manager/package.json index 999e5afa1d088..adc73a00ca6e5 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.27.0", + "version": "1.28.0", "description": "Theia application manager API.", "publishConfig": { "access": "public" @@ -33,8 +33,8 @@ "@babel/plugin-transform-classes": "^7.10.0", "@babel/plugin-transform-runtime": "^7.10.0", "@babel/preset-env": "^7.10.0", - "@theia/application-package": "1.27.0", - "@theia/ffmpeg": "1.27.0", + "@theia/application-package": "1.28.0", + "@theia/ffmpeg": "1.28.0", "@types/fs-extra": "^4.0.2", "@types/semver": "^7.3.8", "babel-loader": "^8.2.2", @@ -70,7 +70,7 @@ } }, "devDependencies": { - "@theia/ext-scripts": "1.27.0", + "@theia/ext-scripts": "1.28.0", "@types/node-abi": "*" }, "nyc": { diff --git a/dev-packages/application-package/package.json b/dev-packages/application-package/package.json index a975cb546d612..0682611ee97aa 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.27.0", + "version": "1.28.0", "description": "Theia application package API.", "publishConfig": { "access": "public" @@ -42,7 +42,7 @@ "write-json-file": "^2.2.0" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0" + "@theia/ext-scripts": "1.28.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/dev-packages/cli/package.json b/dev-packages/cli/package.json index 6c5ac2d7469de..37bfc761030b1 100644 --- a/dev-packages/cli/package.json +++ b/dev-packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@theia/cli", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia CLI.", "publishConfig": { "access": "public" @@ -30,12 +30,12 @@ "clean": "theiaext clean" }, "dependencies": { - "@theia/application-manager": "1.27.0", - "@theia/application-package": "1.27.0", - "@theia/ffmpeg": "1.27.0", - "@theia/localization-manager": "1.27.0", - "@theia/ovsx-client": "1.27.0", - "@theia/request": "1.27.0", + "@theia/application-manager": "1.28.0", + "@theia/application-package": "1.28.0", + "@theia/ffmpeg": "1.28.0", + "@theia/localization-manager": "1.28.0", + "@theia/ovsx-client": "1.28.0", + "@theia/request": "1.28.0", "@types/chai": "^4.2.7", "@types/mocha": "^5.2.7", "@types/node-fetch": "^2.5.7", diff --git a/dev-packages/cli/src/download-plugins.ts b/dev-packages/cli/src/download-plugins.ts index 9a0cee36b730c..9216a1071688e 100644 --- a/dev-packages/cli/src/download-plugins.ts +++ b/dev-packages/cli/src/download-plugins.ts @@ -147,13 +147,17 @@ export default async function downloadPlugins(options: DownloadPluginsOptions = // De-duplicate extension ids to only download each once: const ids = new Set(dependencies.flat()); await parallelOrSequence(...Array.from(ids, id => async () => { - const extension = await client.getLatestCompatibleExtensionVersion(id); - const version = extension?.version; - const downloadUrl = extension?.files.download; - if (downloadUrl) { - await downloadPlugin({ id, downloadUrl, version }); - } else { - failures.push(`No download url for extension pack ${id} (${version})`); + try { + const extension = await client.getLatestCompatibleExtensionVersion(id); + const version = extension?.version; + const downloadUrl = extension?.files.download; + if (downloadUrl) { + await downloadPlugin({ id, downloadUrl, version }); + } else { + failures.push(`No download url for extension pack ${id} (${version})`); + } + } catch (err) { + failures.push(err.message); } })); }; diff --git a/dev-packages/ffmpeg/package.json b/dev-packages/ffmpeg/package.json index 7bec284246e17..3a4ce1e0cc5b0 100644 --- a/dev-packages/ffmpeg/package.json +++ b/dev-packages/ffmpeg/package.json @@ -1,6 +1,6 @@ { "name": "@theia/ffmpeg", - "version": "1.27.0", + "version": "1.28.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 405d0d211bd79..f00ceeb069909 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.27.0", + "version": "1.28.0", "description": "Theia localization manager API.", "publishConfig": { "access": "public" @@ -39,7 +39,7 @@ "typescript": "~4.5.5" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0" + "@theia/ext-scripts": "1.28.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/dev-packages/localization-manager/src/localization-manager.spec.ts b/dev-packages/localization-manager/src/localization-manager.spec.ts index 41202ea4f7215..afc9c6d07a537 100644 --- a/dev-packages/localization-manager/src/localization-manager.spec.ts +++ b/dev-packages/localization-manager/src/localization-manager.spec.ts @@ -77,4 +77,15 @@ describe('localization-manager#translateLanguage', () => { a: 'b' }); }); + + it('should keep placeholders intact', async () => { + const input = { + key: '{1} {0}' + }; + const target = {}; + await manager.translateLanguage(input, target, 'EN', defaultOptions); + assert.deepStrictEqual(target, { + key: '[{1} {0}]' + }); + }); }); diff --git a/dev-packages/localization-manager/src/localization-manager.ts b/dev-packages/localization-manager/src/localization-manager.ts index 67fe17d004300..fabedebf973fa 100644 --- a/dev-packages/localization-manager/src/localization-manager.ts +++ b/dev-packages/localization-manager/src/localization-manager.ts @@ -92,10 +92,12 @@ export class LocalizationManager { free_api: options.freeApi, target_lang: targetLanguage.toUpperCase() as DeeplLanguage, source_lang: options.sourceLanguage?.toUpperCase() as DeeplLanguage, - text: map.text + text: map.text.map(e => this.addIgnoreTags(e)), + tag_handling: ['xml'], + ignore_tags: ['x'] }); translationResponse.translations.forEach(({ text }, i) => { - map.localize(i, text); + map.localize(i, this.removeIgnoreTags(text)); }); console.log(chalk.green(`Successfully translated ${map.text.length} value${map.text.length > 1 ? 's' : ''} for language "${targetLanguage}"`)); } catch (e) { @@ -106,6 +108,14 @@ export class LocalizationManager { } } + protected addIgnoreTags(text: string): string { + return text.replace(/(\{\d*\})/g, '$1'); + } + + protected removeIgnoreTags(text: string): string { + return text.replace(/(\{\d+\})<\/x>/g, '$1'); + } + protected buildLocalizationMap(source: Localization, target: Localization): LocalizationMap { const functionMap = new Map void>(); const text: string[] = []; diff --git a/dev-packages/ovsx-client/package.json b/dev-packages/ovsx-client/package.json index 38f719b60b146..dbebe487a0421 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.27.0", + "version": "1.28.0", "description": "Theia Open-VSX Client", "publishConfig": { "access": "public" @@ -29,7 +29,7 @@ "watch": "theiaext watch" }, "dependencies": { - "@theia/request": "1.27.0", + "@theia/request": "1.28.0", "semver": "^5.4.1" } } diff --git a/dev-packages/ovsx-client/src/ovsx-types.ts b/dev-packages/ovsx-client/src/ovsx-types.ts index 17e9d596fa4a4..b260fc7ec4271 100644 --- a/dev-packages/ovsx-client/src/ovsx-types.ts +++ b/dev-packages/ovsx-client/src/ovsx-types.ts @@ -164,10 +164,8 @@ export interface VSXResponseError extends Error { } export namespace VSXResponseError { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function is(error: any): error is VSXResponseError { - return !!error && typeof error === 'object' - && 'statusCode' in error && typeof error['statusCode'] === 'number'; + export function is(error: unknown): error is VSXResponseError { + return !!error && typeof error === 'object' && typeof (error as VSXResponseError).statusCode === 'number'; } } diff --git a/dev-packages/private-eslint-plugin/package.json b/dev-packages/private-eslint-plugin/package.json index 716fc323a1d63..d295b1168330c 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.27.0", + "version": "1.28.0", "description": "Custom ESLint rules for developing Theia extensions and applications", "main": "index.js", "scripts": { "prepare": "tsc -b" }, "dependencies": { - "@theia/core": "1.27.0", - "@theia/ext-scripts": "1.27.0", - "@theia/re-exports": "1.27.0", + "@theia/core": "1.28.0", + "@theia/ext-scripts": "1.28.0", + "@theia/re-exports": "1.28.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 6119b901c8fa5..4c9a0fcec91de 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.27.0", + "version": "1.28.0", "license": "EPL-2.0 OR GPL-2.0 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 f9376282d7739..eaa2a8d325ea3 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.27.0", + "version": "1.28.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 4f6b40b3de806..50d4e2cbcfd6b 100644 --- a/dev-packages/request/package.json +++ b/dev-packages/request/package.json @@ -1,6 +1,6 @@ { "name": "@theia/request", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia Proxy-Aware Request Service", "publishConfig": { "access": "public" diff --git a/dev-packages/request/src/common-request-service.ts b/dev-packages/request/src/common-request-service.ts index e56c0a05f1b01..3506fecb3702e 100644 --- a/dev-packages/request/src/common-request-service.ts +++ b/dev-packages/request/src/common-request-service.ts @@ -57,7 +57,7 @@ export namespace RequestContext { export function asText(context: RequestContext): string { if (!isSuccess(context)) { - throw new Error(`Server returned code ${context.res.statusCode} for request to '${context.url}'`); + throw new Error(`Server returned code ${context.res.statusCode}.`); } if (hasNoContent(context)) { return ''; diff --git a/doc/Migration.md b/doc/Migration.md index a7493f02aa72c..85439a2cc4be8 100644 --- a/doc/Migration.md +++ b/doc/Migration.md @@ -19,6 +19,26 @@ For example: } ``` +### v1.29.0 + +#### React 18 update + +The `react` and `react-dom` dependencies were upgraded to version 18. Some relevant changes include: + + - `ReactDOM.render` is now deprecated and is replaced by `createRoot` from `react-dom/client` + - the new API no longer supports render callbacks + - updates in promises, setTimeout, event handlers are automatically batched + + Because the currently used version of `react-virtualized` still depends on React 16, a `resolutions` block is needed in the `package.json` for the React 18 dependencies: + + ```json +"resolutions": { + "@types/react": "18.0.15", + "@types/react-dom": "18.0.6" + ... + } + ``` + ### v1.24.0 #### node-gyp 8.4.1 diff --git a/doc/Publishing.md b/doc/Publishing.md index 5762f4207cadf..c5593787be16d 100644 --- a/doc/Publishing.md +++ b/doc/Publishing.md @@ -46,6 +46,7 @@ Here is an [example](https://community.theia-ide.org/t/0-11-0-release/373). - 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 diff --git a/examples/api-samples/package.json b/examples/api-samples/package.json index ae90c9424bb90..485289a57ffd2 100644 --- a/examples/api-samples/package.json +++ b/examples/api-samples/package.json @@ -1,19 +1,19 @@ { "private": true, "name": "@theia/api-samples", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - Example code to demonstrate Theia API", "dependencies": { - "@theia/core": "1.27.0", - "@theia/file-search": "1.27.0", - "@theia/filesystem": "1.27.0", - "@theia/monaco": "1.27.0", + "@theia/core": "1.28.0", + "@theia/file-search": "1.28.0", + "@theia/filesystem": "1.28.0", + "@theia/monaco": "1.28.0", "@theia/monaco-editor-core": "1.67.2", - "@theia/output": "1.27.0", - "@theia/search-in-workspace": "1.27.0", - "@theia/toolbar": "1.27.0", - "@theia/vsx-registry": "1.27.0", - "@theia/workspace": "1.27.0" + "@theia/output": "1.28.0", + "@theia/search-in-workspace": "1.28.0", + "@theia/toolbar": "1.28.0", + "@theia/vsx-registry": "1.28.0", + "@theia/workspace": "1.28.0" }, "theiaExtensions": [ { @@ -52,6 +52,6 @@ "clean": "theiaext clean" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0" + "@theia/ext-scripts": "1.28.0" } } diff --git a/examples/api-tests/package.json b/examples/api-tests/package.json index d4e19b0fb358d..360ad1a96bdc1 100644 --- a/examples/api-tests/package.json +++ b/examples/api-tests/package.json @@ -1,9 +1,9 @@ { "name": "@theia/api-tests", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia API tests", "dependencies": { - "@theia/core": "1.27.0" + "@theia/core": "1.28.0" }, "license": "EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0", "repository": { diff --git a/examples/browser/package.json b/examples/browser/package.json index 2fb228a602e95..f7237671c5f17 100644 --- a/examples/browser/package.json +++ b/examples/browser/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "@theia/example-browser", - "version": "1.27.0", + "version": "1.28.0", "license": "EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0", "theia": { "frontend": { @@ -14,47 +14,47 @@ } }, "dependencies": { - "@theia/api-samples": "1.27.0", - "@theia/bulk-edit": "1.27.0", - "@theia/callhierarchy": "1.27.0", - "@theia/console": "1.27.0", - "@theia/core": "1.27.0", - "@theia/debug": "1.27.0", - "@theia/editor": "1.27.0", - "@theia/editor-preview": "1.27.0", - "@theia/file-search": "1.27.0", - "@theia/filesystem": "1.27.0", - "@theia/getting-started": "1.27.0", - "@theia/git": "1.27.0", - "@theia/keymaps": "1.27.0", - "@theia/markers": "1.27.0", - "@theia/messages": "1.27.0", - "@theia/metrics": "1.27.0", - "@theia/mini-browser": "1.27.0", - "@theia/monaco": "1.27.0", - "@theia/navigator": "1.27.0", - "@theia/outline-view": "1.27.0", - "@theia/output": "1.27.0", - "@theia/plugin-dev": "1.27.0", - "@theia/plugin-ext": "1.27.0", - "@theia/plugin-ext-vscode": "1.27.0", - "@theia/plugin-metrics": "1.27.0", - "@theia/preferences": "1.27.0", - "@theia/preview": "1.27.0", - "@theia/process": "1.27.0", - "@theia/property-view": "1.27.0", - "@theia/scm": "1.27.0", - "@theia/scm-extra": "1.27.0", - "@theia/search-in-workspace": "1.27.0", - "@theia/task": "1.27.0", - "@theia/terminal": "1.27.0", - "@theia/timeline": "1.27.0", - "@theia/toolbar": "1.27.0", - "@theia/typehierarchy": "1.27.0", - "@theia/userstorage": "1.27.0", - "@theia/variable-resolver": "1.27.0", - "@theia/vsx-registry": "1.27.0", - "@theia/workspace": "1.27.0" + "@theia/api-samples": "1.28.0", + "@theia/bulk-edit": "1.28.0", + "@theia/callhierarchy": "1.28.0", + "@theia/console": "1.28.0", + "@theia/core": "1.28.0", + "@theia/debug": "1.28.0", + "@theia/editor": "1.28.0", + "@theia/editor-preview": "1.28.0", + "@theia/file-search": "1.28.0", + "@theia/filesystem": "1.28.0", + "@theia/getting-started": "1.28.0", + "@theia/git": "1.28.0", + "@theia/keymaps": "1.28.0", + "@theia/markers": "1.28.0", + "@theia/messages": "1.28.0", + "@theia/metrics": "1.28.0", + "@theia/mini-browser": "1.28.0", + "@theia/monaco": "1.28.0", + "@theia/navigator": "1.28.0", + "@theia/outline-view": "1.28.0", + "@theia/output": "1.28.0", + "@theia/plugin-dev": "1.28.0", + "@theia/plugin-ext": "1.28.0", + "@theia/plugin-ext-vscode": "1.28.0", + "@theia/plugin-metrics": "1.28.0", + "@theia/preferences": "1.28.0", + "@theia/preview": "1.28.0", + "@theia/process": "1.28.0", + "@theia/property-view": "1.28.0", + "@theia/scm": "1.28.0", + "@theia/scm-extra": "1.28.0", + "@theia/search-in-workspace": "1.28.0", + "@theia/task": "1.28.0", + "@theia/terminal": "1.28.0", + "@theia/timeline": "1.28.0", + "@theia/toolbar": "1.28.0", + "@theia/typehierarchy": "1.28.0", + "@theia/userstorage": "1.28.0", + "@theia/variable-resolver": "1.28.0", + "@theia/vsx-registry": "1.28.0", + "@theia/workspace": "1.28.0" }, "scripts": { "clean": "theia clean", @@ -75,6 +75,6 @@ "watch:compile": "tsc -b -w" }, "devDependencies": { - "@theia/cli": "1.27.0" + "@theia/cli": "1.28.0" } } diff --git a/examples/electron/package.json b/examples/electron/package.json index ac618728fb0f1..02f3f8c14935c 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.27.0", + "version": "1.28.0", "main": "src-gen/frontend/electron-main.js", "license": "EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0", "theia": { @@ -14,48 +14,48 @@ } }, "dependencies": { - "@theia/api-samples": "1.27.0", - "@theia/bulk-edit": "1.27.0", - "@theia/callhierarchy": "1.27.0", - "@theia/console": "1.27.0", - "@theia/core": "1.27.0", - "@theia/debug": "1.27.0", - "@theia/editor": "1.27.0", - "@theia/editor-preview": "1.27.0", - "@theia/electron": "1.27.0", - "@theia/external-terminal": "1.27.0", - "@theia/file-search": "1.27.0", - "@theia/filesystem": "1.27.0", - "@theia/getting-started": "1.27.0", - "@theia/git": "1.27.0", - "@theia/keymaps": "1.27.0", - "@theia/markers": "1.27.0", - "@theia/messages": "1.27.0", - "@theia/metrics": "1.27.0", - "@theia/mini-browser": "1.27.0", - "@theia/monaco": "1.27.0", - "@theia/navigator": "1.27.0", - "@theia/outline-view": "1.27.0", - "@theia/output": "1.27.0", - "@theia/plugin-dev": "1.27.0", - "@theia/plugin-ext": "1.27.0", - "@theia/plugin-ext-vscode": "1.27.0", - "@theia/preferences": "1.27.0", - "@theia/preview": "1.27.0", - "@theia/process": "1.27.0", - "@theia/property-view": "1.27.0", - "@theia/scm": "1.27.0", - "@theia/scm-extra": "1.27.0", - "@theia/search-in-workspace": "1.27.0", - "@theia/task": "1.27.0", - "@theia/terminal": "1.27.0", - "@theia/timeline": "1.27.0", - "@theia/toolbar": "1.27.0", - "@theia/typehierarchy": "1.27.0", - "@theia/userstorage": "1.27.0", - "@theia/variable-resolver": "1.27.0", - "@theia/vsx-registry": "1.27.0", - "@theia/workspace": "1.27.0" + "@theia/api-samples": "1.28.0", + "@theia/bulk-edit": "1.28.0", + "@theia/callhierarchy": "1.28.0", + "@theia/console": "1.28.0", + "@theia/core": "1.28.0", + "@theia/debug": "1.28.0", + "@theia/editor": "1.28.0", + "@theia/editor-preview": "1.28.0", + "@theia/electron": "1.28.0", + "@theia/external-terminal": "1.28.0", + "@theia/file-search": "1.28.0", + "@theia/filesystem": "1.28.0", + "@theia/getting-started": "1.28.0", + "@theia/git": "1.28.0", + "@theia/keymaps": "1.28.0", + "@theia/markers": "1.28.0", + "@theia/messages": "1.28.0", + "@theia/metrics": "1.28.0", + "@theia/mini-browser": "1.28.0", + "@theia/monaco": "1.28.0", + "@theia/navigator": "1.28.0", + "@theia/outline-view": "1.28.0", + "@theia/output": "1.28.0", + "@theia/plugin-dev": "1.28.0", + "@theia/plugin-ext": "1.28.0", + "@theia/plugin-ext-vscode": "1.28.0", + "@theia/preferences": "1.28.0", + "@theia/preview": "1.28.0", + "@theia/process": "1.28.0", + "@theia/property-view": "1.28.0", + "@theia/scm": "1.28.0", + "@theia/scm-extra": "1.28.0", + "@theia/search-in-workspace": "1.28.0", + "@theia/task": "1.28.0", + "@theia/terminal": "1.28.0", + "@theia/timeline": "1.28.0", + "@theia/toolbar": "1.28.0", + "@theia/typehierarchy": "1.28.0", + "@theia/userstorage": "1.28.0", + "@theia/variable-resolver": "1.28.0", + "@theia/vsx-registry": "1.28.0", + "@theia/workspace": "1.28.0" }, "scripts": { "build": "yarn -s compile && yarn -s bundle", @@ -73,7 +73,7 @@ "watch:compile": "tsc -b -w" }, "devDependencies": { - "@theia/cli": "1.27.0", + "@theia/cli": "1.28.0", "electron": "^15.3.5" } } diff --git a/examples/playwright/package.json b/examples/playwright/package.json index cb119ebe8622b..3b7e3d05ac754 100644 --- a/examples/playwright/package.json +++ b/examples/playwright/package.json @@ -1,6 +1,6 @@ { "name": "@theia/playwright", - "version": "1.27.0", + "version": "1.28.0", "description": "System tests for Theia", "license": "EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0", "repository": { diff --git a/lerna.json b/lerna.json index 975a47942d260..be27009f2dfc3 100644 --- a/lerna.json +++ b/lerna.json @@ -2,7 +2,7 @@ "lerna": "2.2.0", "npmClient": "yarn", "useWorkspaces": true, - "version": "1.27.0", + "version": "1.28.0", "command": { "run": { "stream": true diff --git a/package.json b/package.json index 1c79f066d9484..a713dd5141c98 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,9 @@ "node": ">=14" }, "resolutions": { - "**/@types/node": "14" + "**/@types/node": "14", + "@types/react": "18.0.15", + "@types/react-dom": "18.0.6" }, "devDependencies": { "@types/chai": "4.3.0", diff --git a/packages/bulk-edit/package.json b/packages/bulk-edit/package.json index 7e322326ea30c..fb71a345f8500 100644 --- a/packages/bulk-edit/package.json +++ b/packages/bulk-edit/package.json @@ -1,14 +1,14 @@ { "name": "@theia/bulk-edit", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - Bulk Edit Extension", "dependencies": { - "@theia/core": "1.27.0", - "@theia/editor": "1.27.0", - "@theia/filesystem": "1.27.0", - "@theia/monaco": "1.27.0", + "@theia/core": "1.28.0", + "@theia/editor": "1.28.0", + "@theia/filesystem": "1.28.0", + "@theia/monaco": "1.28.0", "@theia/monaco-editor-core": "1.67.2", - "@theia/workspace": "1.27.0" + "@theia/workspace": "1.28.0" }, "publishConfig": { "access": "public" @@ -43,7 +43,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0" + "@theia/ext-scripts": "1.28.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/bulk-edit/src/browser/bulk-edit-tree/bulk-edit-node-selection.ts b/packages/bulk-edit/src/browser/bulk-edit-tree/bulk-edit-node-selection.ts index 9e139b644bcc6..179018ceacd42 100644 --- a/packages/bulk-edit/src/browser/bulk-edit-tree/bulk-edit-node-selection.ts +++ b/packages/bulk-edit/src/browser/bulk-edit-tree/bulk-edit-node-selection.ts @@ -22,8 +22,8 @@ export interface BulkEditNodeSelection { bulkEdit: ResourceFileEdit | ResourceTextEdit; } export namespace BulkEditNodeSelection { - export function is(arg: Object | undefined): arg is BulkEditNodeSelection { - return typeof arg === 'object' && ('bulkEdit' in arg); + export function is(arg: unknown): arg is BulkEditNodeSelection { + return !!arg && typeof arg === 'object' && ('bulkEdit' in arg); } export class CommandHandler extends SelectionCommandHandler { diff --git a/packages/bulk-edit/src/browser/bulk-edit-tree/bulk-edit-tree.ts b/packages/bulk-edit/src/browser/bulk-edit-tree/bulk-edit-tree.ts index 26dcdeb516645..b224da25a69d0 100644 --- a/packages/bulk-edit/src/browser/bulk-edit-tree/bulk-edit-tree.ts +++ b/packages/bulk-edit/src/browser/bulk-edit-tree/bulk-edit-tree.ts @@ -108,7 +108,7 @@ export interface BulkEditInfoNode extends UriSelection, SelectableTreeNode, Expa fileContents?: string; } export namespace BulkEditInfoNode { - export function is(node: Object | undefined): node is BulkEditInfoNode { + export function is(node: unknown): node is BulkEditInfoNode { return ExpandableTreeNode.is(node) && UriSelection.is(node) && 'fileContents' in node; } } diff --git a/packages/callhierarchy/package.json b/packages/callhierarchy/package.json index 35a81ad773596..183eedf56837a 100644 --- a/packages/callhierarchy/package.json +++ b/packages/callhierarchy/package.json @@ -1,10 +1,10 @@ { "name": "@theia/callhierarchy", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - Call Hierarchy Extension", "dependencies": { - "@theia/core": "1.27.0", - "@theia/editor": "1.27.0", + "@theia/core": "1.28.0", + "@theia/editor": "1.28.0", "ts-md5": "^1.2.2" }, "publishConfig": { @@ -40,7 +40,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0" + "@theia/ext-scripts": "1.28.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/console/package.json b/packages/console/package.json index 8eef9ecbe45fa..f048515fe92fe 100644 --- a/packages/console/package.json +++ b/packages/console/package.json @@ -1,10 +1,10 @@ { "name": "@theia/console", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - Console Extension", "dependencies": { - "@theia/core": "1.27.0", - "@theia/monaco": "1.27.0", + "@theia/core": "1.28.0", + "@theia/monaco": "1.28.0", "@theia/monaco-editor-core": "1.67.2", "anser": "^2.0.1" }, @@ -41,7 +41,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0" + "@theia/ext-scripts": "1.28.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/core/README.md b/packages/core/README.md index 8f9282a7d1e47..d9226e45e4c76 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -86,16 +86,17 @@ 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.27.0`](https://www.npmjs.com/package/@theia/application-package/v/1.27.0)) - - `@theia/application-package/lib/api` (from [`@theia/application-package@1.27.0`](https://www.npmjs.com/package/@theia/application-package/v/1.27.0)) - - `@theia/application-package/lib/environment` (from [`@theia/application-package@1.27.0`](https://www.npmjs.com/package/@theia/application-package/v/1.27.0)) - - `@theia/request` (from [`@theia/request@1.27.0`](https://www.npmjs.com/package/@theia/request/v/1.27.0)) - - `@theia/request/lib/proxy` (from [`@theia/request@1.27.0`](https://www.npmjs.com/package/@theia/request/v/1.27.0)) - - `@theia/request/lib/node-request-service` (from [`@theia/request@1.27.0`](https://www.npmjs.com/package/@theia/request/v/1.27.0)) + - `@theia/application-package` (from [`@theia/application-package@1.28.0`](https://www.npmjs.com/package/@theia/application-package/v/1.28.0)) + - `@theia/application-package/lib/api` (from [`@theia/application-package@1.28.0`](https://www.npmjs.com/package/@theia/application-package/v/1.28.0)) + - `@theia/application-package/lib/environment` (from [`@theia/application-package@1.28.0`](https://www.npmjs.com/package/@theia/application-package/v/1.28.0)) + - `@theia/request` (from [`@theia/request@1.28.0`](https://www.npmjs.com/package/@theia/request/v/1.28.0)) + - `@theia/request/lib/proxy` (from [`@theia/request@1.28.0`](https://www.npmjs.com/package/@theia/request/v/1.28.0)) + - `@theia/request/lib/node-request-service` (from [`@theia/request@1.28.0`](https://www.npmjs.com/package/@theia/request/v/1.28.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@^5.1.1`](https://www.npmjs.com/package/inversify)) - - `react-dom` (from [`react-dom@^16.8.0`](https://www.npmjs.com/package/react-dom)) + - `react-dom` (from [`react-dom@^18.2.0`](https://www.npmjs.com/package/react-dom)) + - `react-dom/client` (from [`react-dom@^18.2.0`](https://www.npmjs.com/package/react-dom)) - `react-virtualized` (from [`react-virtualized@^9.20.0`](https://www.npmjs.com/package/react-virtualized)) - `vscode-languageserver-protocol` (from [`vscode-languageserver-protocol@~3.15.3`](https://www.npmjs.com/package/vscode-languageserver-protocol)) - `vscode-uri` (from [`vscode-uri@^2.1.1`](https://www.npmjs.com/package/vscode-uri)) @@ -105,7 +106,7 @@ export class SomeClass { - `lodash.throttle` (from [`lodash.throttle@^4.1.1`](https://www.npmjs.com/package/lodash.throttle)) - `nsfw` (from [`nsfw@^2.1.2`](https://www.npmjs.com/package/nsfw)) - `markdown-it` (from [`markdown-it@^12.3.2`](https://www.npmjs.com/package/markdown-it)) - - `react` (from [`react@^16.8.0`](https://www.npmjs.com/package/react)) + - `react` (from [`react@^18.2.0`](https://www.npmjs.com/package/react)) - `ws` (from [`ws@^7.1.2`](https://www.npmjs.com/package/ws)) - `yargs` (from [`yargs@^15.3.1`](https://www.npmjs.com/package/yargs)) diff --git a/packages/core/i18n/nls.cs.json b/packages/core/i18n/nls.cs.json index 3a92710d5b06a..5515cd0c8ae66 100644 --- a/packages/core/i18n/nls.cs.json +++ b/packages/core/i18n/nls.cs.json @@ -1,4 +1,5 @@ { + "disassemblyView": "Pohled na demontáž", "theia": { "callhierarchy": { "noCallers": "Nebyl zjištěn žádný volající.", @@ -58,18 +59,31 @@ "addConfigurationPlaceholder": "Vyberte kořenový pracovní prostor, do kterého chcete přidat konfiguraci", "continueAll": "Pokračovat ve všem", "copyExpressionValue": "Kopírování hodnoty výrazu", + "disassembly-view": { + "show-source-code": "Zobrazení zdrojového kódu v zobrazení disassembleru." + }, + "instruction-breakpoint": "Bod přerušení instrukcí", + "instructionAddress": "Adresa", + "instructionBytes": "Byty", + "instructionNotAvailable": "Demontáž není k dispozici.", + "instructionText": "Pokyny", "missingConfiguration": "Dynamická konfigurace '{0}:{1}' chybí nebo není použitelná", + "open-disassembly-view": "Otevřený pohled na demontáž", "pauseAll": "Pozastavit vše", "reveal": "Odhalení", "threads": "Vlákna", "toggleTracing": "Povolení/zakázání sledování komunikace s ladicími adaptéry" }, + "disassembly-view": { + "disassemblyTableColumnLabel": "pokyny" + }, "editor": { "diffEditor.maxFileSize": "Maximální velikost souboru v MB, pro kterou se vypočítávají rozdíly. Použijte hodnotu 0 pro žádný limit.", "editor.accessibilityPageSize": "Řídí počet řádků v editoru, které může čtečka obrazovky přečíst najednou. Při detekci čtečky obrazovky automaticky nastavíme výchozí hodnotu na 500. Upozornění: Pro čísla větší než výchozí to má vliv na výkon.", "editor.autoClosingDelete": "Řídí, zda má editor při mazání odstranit sousední uzavírací uvozovky nebo závorky.", "editor.autoClosingDelete1": "Odstraňte sousední uzavírací uvozovky nebo závorky pouze v případě, že byly vloženy automaticky.", "editor.bracketPairColorization.enabled": "Ovládá, zda je obarvení dvojice závorek povoleno, nebo ne. Pro přepsání barev zvýraznění závorek použijte 'workbench.colorCustomizations'.", + "editor.bracketPairColorization.independentColorPoolPerBracketType": "Řídí, zda má každý typ závorky svůj vlastní nezávislý fond barev.", "editor.codeLensFontSize": "Ovládá velikost písma v pixelech pro CodeLens. Při nastavení na `0` se použije 90 % hodnoty `#editor.fontSize#`.", "editor.find.autoFindInSelection0": "Nikdy automaticky nezapínat funkci Najít ve výběru (výchozí nastavení).", "editor.find.autoFindInSelection1": "Vždy automaticky zapněte funkci Najít ve výběru.", @@ -88,13 +102,23 @@ "editor.guides.bracketPairsHorizontal1": "Povolí vodorovná vodítka pouze pro aktivní pár držáků.", "editor.guides.bracketPairsHorizontal2": "Zakáže vodítka vodorovných dvojic konzol.", "editor.guides.highlightActiveBracketPair": "Řídí, zda má editor zvýraznit aktivní dvojici závorek.", + "editor.guides.highlightActiveIndentation0": "Zvýrazní aktivního průvodce odsazením.", + "editor.guides.highlightActiveIndentation1": "Zvýrazní aktivní vodítko odsazení, i když jsou zvýrazněna vodítka závorek.", + "editor.guides.highlightActiveIndentation2": "Nezvýrazňujte aktivního průvodce odsazením.", "editor.hover.above": "Pokud je místo, raději se zobrazí nad řádkem.", "editor.inlayHints.enabled": "Povolí v editoru nápovědy pro vložení.", + "editor.inlayHints.enabled0": "Nápovědy pro vložení jsou povoleny", + "editor.inlayHints.enabled1": "Vložené nápovědy se zobrazují ve výchozím nastavení a skrývají se při podržení `Ctrl+Alt`", + "editor.inlayHints.enabled2": "Vložené nápovědy jsou ve výchozím nastavení skryté a zobrazí se při podržení `Ctrl+Alt`.", + "editor.inlayHints.enabled3": "Nápovědy pro vložení jsou zakázány", "editor.inlayHints.fontFamily": "Řídí rodinu písma vložených nápověd v editoru. Je-li nastaveno na prázdnou hodnotu, použije se `#editor.fontFamily#`.", "editor.inlayHints.fontSize": "Ovládá velikost písma vložených nápověd v editoru. Pokud je nakonfigurovaná hodnota menší než `5` nebo větší než velikost písma editoru, použije se výchozí hodnota 90 % z `#editor.fontSize#`.", "editor.inlineSuggest.enabled": "Ovládá, zda se mají v editoru automaticky zobrazovat návrhy na řádkování.", "editor.language.colorizedBracketPairs": "Definuje dvojice závorek, které jsou obarveny podle úrovně vnoření, pokud je obarvení dvojic závorek povoleno.", "editor.lineHeight": "Ovládá výšku čáry.\n - Chcete-li automaticky vypočítat výšku řádku z velikosti písma, použijte hodnotu 0.\n - Hodnoty mezi 0 a 8 se použijí jako násobitel s velikostí písma.\n - Hodnoty větší nebo rovné 8 budou použity jako efektivní hodnoty.", + "editor.quickSuggestions0": "Rychlé návrhy se zobrazují uvnitř widgetu pro navrhování", + "editor.quickSuggestions1": "Rychlé návrhy se zobrazují jako text duchů", + "editor.quickSuggestions2": "Rychlé návrhy jsou zakázány", "editor.renderLineHighlightOnlyWhenFocus": "Řídí, zda má editor vykreslovat zvýraznění aktuálního řádku pouze tehdy, když je editor zaměřen.", "editor.renderWhitespace3": "Vykresluje pouze koncové bílé znaky.", "editor.scrollbar.horizontal": "Ovládá viditelnost vodorovného posuvníku.", @@ -170,6 +194,7 @@ "newPlugin": "Vytvoření nového pluginu" }, "git": { + "aFewSecondsAgo": "před několika sekundami", "addSignedOff": "Přidat Signed-off-by", "amendReuseMessag": "Chcete-li znovu použít poslední zprávu o revizi, stiskněte klávesu \"Enter\" nebo klávesu \"Escape\" pro zrušení.", "amendRewrite": "Přepsání předchozí zprávy o revizi. Stisknutím klávesy 'Enter' potvrdíte nebo klávesou 'Escape' zrušíte.", @@ -203,7 +228,8 @@ "keybindingCollidesValidation": "vazba kláves v současné době koliduje", "requiredKeybindingValidation": "je vyžadována hodnota keybindingu", "resetKeybindingConfirmation": "Opravdu chcete obnovit výchozí hodnotu této vazby kláves?", - "resetKeybindingTitle": "Obnovení vazby kláves pro {0}" + "resetKeybindingTitle": "Obnovení vazby kláves pro {0}", + "resetMultipleKeybindingsWarning": "Pokud pro tento příkaz existuje více klávesových vazeb, budou resetovány všechny." }, "localize": { "offlineTooltip": "Nelze se připojit k backendu." @@ -354,10 +380,14 @@ "typeHierarchy": "Hierarchie typů" }, "vsx-registry": { - "openVSX": "Otevření registru VSX", + "errorFetching": "Chyba při načítání rozšíření.", "recommendedExtensions": "Seznam názvů rozšíření doporučených pro použití v tomto pracovním prostoru.", "searchPlaceholder": "Hledat rozšíření v {0}", - "showRecommendedExtensions": "Řídí, zda se mají zobrazovat oznámení pro doporučení rozšíření." + "showRecommendedExtensions": "Řídí, zda se mají zobrazovat oznámení pro doporučení rozšíření.", + "vsx-extensions-contribution": { + "update-version-uninstall-error": "Chyba při odstraňování rozšíření: {0}.", + "update-version-version-error": "Nepodařilo se nainstalovat verzi {0} {1} ." + } }, "webview": { "goToReadme": "Přejít na README", diff --git a/packages/core/i18n/nls.de.json b/packages/core/i18n/nls.de.json index 9eef589456049..fb181a394145b 100644 --- a/packages/core/i18n/nls.de.json +++ b/packages/core/i18n/nls.de.json @@ -1,4 +1,5 @@ { + "disassemblyView": "Demontage Ansicht", "theia": { "callhierarchy": { "noCallers": "Es wurden keine Anrufer entdeckt.", @@ -58,18 +59,31 @@ "addConfigurationPlaceholder": "Wählen Sie das Stammverzeichnis des Arbeitsbereichs, dem Sie die Konfiguration hinzufügen möchten", "continueAll": "Alle fortsetzen", "copyExpressionValue": "Ausdruckswert kopieren", + "disassembly-view": { + "show-source-code": "Quellcode in der Disassemblierungsansicht anzeigen." + }, + "instruction-breakpoint": "Anweisung Haltepunkt", + "instructionAddress": "Adresse", + "instructionBytes": "Bytes", + "instructionNotAvailable": "Demontage nicht möglich.", + "instructionText": "Anleitung", "missingConfiguration": "Die dynamische Konfiguration '{0}:{1}' fehlt oder ist nicht anwendbar", + "open-disassembly-view": "Demontageansicht öffnen", "pauseAll": "Pause Alle", "reveal": "Enthüllen", "threads": "Threads", "toggleTracing": "Aktivieren/Deaktivieren der Verfolgung der Kommunikation mit Debug-Adaptern" }, + "disassembly-view": { + "disassemblyTableColumnLabel": "Anweisungen" + }, "editor": { "diffEditor.maxFileSize": "Maximale Dateigröße in MB, für die Diffs berechnet werden sollen. Verwenden Sie 0 für keine Begrenzung.", "editor.accessibilityPageSize": "Steuert die Anzahl der Zeilen im Editor, die von einem Screenreader auf einmal vorgelesen werden können. Wenn wir einen Screenreader erkennen, setzen wir automatisch den Standardwert auf 500. Achtung: Dies hat Auswirkungen auf die Leistung, wenn die Zahl größer als der Standardwert ist.", "editor.autoClosingDelete": "Steuert, ob der Editor beim Löschen angrenzende schließende Anführungszeichen oder Klammern entfernen soll.", "editor.autoClosingDelete1": "Entfernen Sie angrenzende schließende Anführungszeichen oder Klammern nur, wenn sie automatisch eingefügt wurden.", "editor.bracketPairColorization.enabled": "Steuert, ob die Einfärbung von Klammerpaaren aktiviert ist oder nicht. Verwenden Sie 'workbench.colorCustomizations', um die Farben der Klammerhervorhebung zu überschreiben.", + "editor.bracketPairColorization.independentColorPoolPerBracketType": "Steuert, ob jeder Klammertyp seinen eigenen unabhängigen Farbpool hat.", "editor.codeLensFontSize": "Steuert die Schriftgröße in Pixeln für CodeLens. Bei Einstellung `0` werden 90% von `#editor.fontSize#` verwendet.", "editor.find.autoFindInSelection0": "Niemals die automatische Suche in der Auswahl aktivieren (Standard).", "editor.find.autoFindInSelection1": "Schalten Sie \"In Auswahl suchen\" immer automatisch ein.", @@ -88,13 +102,23 @@ "editor.guides.bracketPairsHorizontal1": "Aktiviert horizontale Hilfslinien nur für das aktive Halterungspaar.", "editor.guides.bracketPairsHorizontal2": "Deaktiviert die horizontalen Klammerpaarführungen.", "editor.guides.highlightActiveBracketPair": "Steuert, ob der Editor das aktive Klammerpaar hervorheben soll.", + "editor.guides.highlightActiveIndentation0": "Hebt die aktive Einzugshilfe hervor.", + "editor.guides.highlightActiveIndentation1": "Hebt die aktive Einzugshilfe hervor, auch wenn Klammerhilfen hervorgehoben sind.", + "editor.guides.highlightActiveIndentation2": "Markieren Sie nicht die aktive Einzugsschablone.", "editor.hover.above": "Bevorzugen Sie es, über der Linie zu schweben, wenn Platz vorhanden ist.", "editor.inlayHints.enabled": "Aktiviert die Inlay-Hinweise im Editor.", + "editor.inlayHints.enabled0": "Inlay-Hinweise sind aktiviert", + "editor.inlayHints.enabled1": "Inlay-Hinweise werden standardmäßig angezeigt und bei gedrückter Tastenkombination \"Strg+Alt\" ausgeblendet", + "editor.inlayHints.enabled2": "Inlay-Hinweise sind standardmäßig ausgeblendet und werden angezeigt, wenn die Tastenkombination \"Strg+Alt\" gedrückt wird.", + "editor.inlayHints.enabled3": "Inlay-Hinweise sind deaktiviert", "editor.inlayHints.fontFamily": "Steuert die Schriftfamilie der Inlay-Hinweise im Editor. Wenn leer, wird die `#editor.fontFamily#` verwendet.", "editor.inlayHints.fontSize": "Steuert die Schriftgröße von Inlay-Hinweisen im Editor. Eine Vorgabe von 90% von `#editor.fontSize#` wird verwendet, wenn der konfigurierte Wert kleiner als `5` oder größer als die Schriftgröße des Editors ist.", "editor.inlineSuggest.enabled": "Legt fest, ob automatisch Inline-Vorschläge im Editor angezeigt werden sollen.", "editor.language.colorizedBracketPairs": "Definiert die Klammerpaare, die nach ihrer Verschachtelungsebene eingefärbt werden, wenn die Einfärbung von Klammerpaaren aktiviert ist.", "editor.lineHeight": "Steuert die Zeilenhöhe.\n - Verwenden Sie 0, um die Zeilenhöhe automatisch anhand der Schriftgröße zu berechnen.\n - Werte zwischen 0 und 8 werden als Multiplikator mit der Schriftgröße verwendet.\n - Werte, die größer oder gleich 8 sind, werden als effektive Werte verwendet.", + "editor.quickSuggestions0": "Schnellvorschläge werden innerhalb des Vorschlags-Widgets angezeigt", + "editor.quickSuggestions1": "Schnellvorschläge werden als Geistertext angezeigt", + "editor.quickSuggestions2": "Schnellvorschläge sind deaktiviert", "editor.renderLineHighlightOnlyWhenFocus": "Steuert, ob der Editor die aktuelle Zeile nur dann hervorheben soll, wenn der Editor fokussiert ist.", "editor.renderWhitespace3": "Nur nachgestellte Leerzeichen werden wiedergegeben.", "editor.scrollbar.horizontal": "Steuert die Sichtbarkeit der horizontalen Bildlaufleiste.", @@ -170,6 +194,7 @@ "newPlugin": "Ein neues Plugin erstellen" }, "git": { + "aFewSecondsAgo": "vor ein paar Sekunden", "addSignedOff": "Abgezeichnet von hinzufügen", "amendReuseMessag": "Um die letzte Meldung wieder zu verwenden, drücken Sie \"Enter\" oder \"Escape\", um den Vorgang abzubrechen.", "amendRewrite": "Vorherige Übermittlungsnachricht neu schreiben. Bestätigen Sie mit \"Enter\" oder brechen Sie mit \"Escape\" ab.", @@ -203,7 +228,8 @@ "keybindingCollidesValidation": "Tastenkombinationen kollidieren", "requiredKeybindingValidation": "Schlüsselbindung Wert ist erforderlich", "resetKeybindingConfirmation": "Möchten Sie diese Tastaturbelegung wirklich auf den Standardwert zurücksetzen?", - "resetKeybindingTitle": "Tastaturbelegung für {0} zurücksetzen" + "resetKeybindingTitle": "Tastaturbelegung für {0} zurücksetzen", + "resetMultipleKeybindingsWarning": "Wenn mehrere Tastenkombinationen für diesen Befehl existieren, werden alle zurückgesetzt." }, "localize": { "offlineTooltip": "Kann keine Verbindung zum Backend herstellen." @@ -354,10 +380,14 @@ "typeHierarchy": "Typenhierarchie" }, "vsx-registry": { - "openVSX": "Open VSX Registry", + "errorFetching": "Fehler beim Abrufen von Erweiterungen.", "recommendedExtensions": "Eine Liste mit den Namen der Erweiterungen, die für die Verwendung in diesem Arbeitsbereich empfohlen werden.", "searchPlaceholder": "Erweiterungen suchen in {0}", - "showRecommendedExtensions": "Steuert, ob Benachrichtigungen für Erweiterungsempfehlungen angezeigt werden." + "showRecommendedExtensions": "Steuert, ob Benachrichtigungen für Erweiterungsempfehlungen angezeigt werden.", + "vsx-extensions-contribution": { + "update-version-uninstall-error": "Fehler beim Entfernen der Erweiterung: {0}.", + "update-version-version-error": "Die Installation der Version {0} von {1} ist fehlgeschlagen." + } }, "webview": { "goToReadme": "Zum README gehen", diff --git a/packages/core/i18n/nls.es.json b/packages/core/i18n/nls.es.json index cfc67ef26a7bb..2e492812de1c3 100644 --- a/packages/core/i18n/nls.es.json +++ b/packages/core/i18n/nls.es.json @@ -1,4 +1,5 @@ { + "disassemblyView": "Vista de desmontaje", "theia": { "callhierarchy": { "noCallers": "No se ha detectado ninguna llamada.", @@ -58,18 +59,31 @@ "addConfigurationPlaceholder": "Seleccione la raíz del espacio de trabajo para añadir la configuración", "continueAll": "Continuar todo", "copyExpressionValue": "Copiar el valor de la expresión", + "disassembly-view": { + "show-source-code": "Mostrar el código fuente en la vista de desensamblaje." + }, + "instruction-breakpoint": "Punto de interrupción de la instrucción", + "instructionAddress": "Dirección", + "instructionBytes": "Bytes", + "instructionNotAvailable": "Desmontaje no disponible.", + "instructionText": "Instrucción", "missingConfiguration": "La configuración dinámica '{0}:{1}' falta o no es aplicable", + "open-disassembly-view": "Vista de desmontaje abierta", "pauseAll": "Pausa Todo", "reveal": "Revelar", "threads": "Hilos", "toggleTracing": "Activar/desactivar las comunicaciones de rastreo con los adaptadores de depuración" }, + "disassembly-view": { + "disassemblyTableColumnLabel": "instrucciones" + }, "editor": { "diffEditor.maxFileSize": "Tamaño máximo del archivo en MB para el que se calculan los diffs. Utilice 0 para no tener límite.", "editor.accessibilityPageSize": "Controla el número de líneas del editor que pueden ser leídas por un lector de pantalla a la vez. Cuando detectamos un lector de pantalla, fijamos automáticamente el valor por defecto en 500. Advertencia: esto tiene una implicación de rendimiento para números mayores que el predeterminado.", "editor.autoClosingDelete": "Controla si el editor debe eliminar las comillas de cierre adyacentes o los corchetes al borrar.", "editor.autoClosingDelete1": "Elimine las comillas de cierre adyacentes o los corchetes sólo si se insertaron automáticamente.", "editor.bracketPairColorization.enabled": "Controla si la coloración del par de corchetes está activada o no. Utilice 'workbench.colorCustomizations' para anular los colores de resaltado de los corchetes.", + "editor.bracketPairColorization.independentColorPoolPerBracketType": "Controla si cada tipo de soporte tiene su propia reserva de color independiente.", "editor.codeLensFontSize": "Controla el tamaño de la fuente en píxeles para CodeLens. Cuando se establece en `0`, se utiliza el 90% de `#editor.fontSize#`.", "editor.find.autoFindInSelection0": "No activar nunca la función Buscar en la selección automáticamente (por defecto).", "editor.find.autoFindInSelection1": "Activar siempre automáticamente la función Buscar en la selección.", @@ -88,13 +102,23 @@ "editor.guides.bracketPairsHorizontal1": "Activa las guías horizontales sólo para el par de soportes activo.", "editor.guides.bracketPairsHorizontal2": "Desactiva las guías de pares de soportes horizontales.", "editor.guides.highlightActiveBracketPair": "Controla si el editor debe resaltar el par de corchetes activo.", + "editor.guides.highlightActiveIndentation0": "Resalta la guía de sangría activa.", + "editor.guides.highlightActiveIndentation1": "Resalta la guía de sangría activa incluso si las guías de corchetes están resaltadas.", + "editor.guides.highlightActiveIndentation2": "No resalte la guía de sangría activa.", "editor.hover.above": "Prefiere mostrar por encima de la línea, si hay espacio.", "editor.inlayHints.enabled": "Activa las sugerencias de incrustación en el editor.", + "editor.inlayHints.enabled0": "Se activan las sugerencias de incrustación", + "editor.inlayHints.enabled1": "Los consejos de incrustación se muestran por defecto y se ocultan cuando se mantiene `Ctrl+Alt`.", + "editor.inlayHints.enabled2": "Los consejos de incrustación están ocultos por defecto y se muestran cuando se mantiene pulsado `Ctrl+Alt`.", + "editor.inlayHints.enabled3": "Las sugerencias de incrustación están desactivadas", "editor.inlayHints.fontFamily": "Controla la familia de fuentes de las sugerencias de incrustación en el editor. Cuando se establece en vacío, se utiliza `#editor.fontFamily#`.", "editor.inlayHints.fontSize": "Controla el tamaño de la fuente de las sugerencias de incrustación en el editor. Se utiliza un valor por defecto del 90% de `#editor.fontSize#` cuando el valor configurado es menor que `5` o mayor que el tamaño de la fuente del editor.", "editor.inlineSuggest.enabled": "Controla si se muestran automáticamente las sugerencias en línea en el editor.", "editor.language.colorizedBracketPairs": "Define los pares de corchetes que se colorean por su nivel de anidamiento si la coloración de pares de corchetes está activada.", "editor.lineHeight": "Controla la altura de la línea.\n - Utilice 0 para calcular automáticamente la altura de la línea a partir del tamaño de la fuente.\n - Los valores entre 0 y 8 se utilizarán como un multiplicador con el tamaño de la fuente.\n - Los valores mayores o iguales a 8 se utilizarán como valores efectivos.", + "editor.quickSuggestions0": "Las sugerencias rápidas se muestran dentro del widget de sugerencias", + "editor.quickSuggestions1": "Las sugerencias rápidas se muestran como texto fantasma", + "editor.quickSuggestions2": "Las sugerencias rápidas están desactivadas", "editor.renderLineHighlightOnlyWhenFocus": "Controla si el editor debe mostrar el resaltado de la línea actual sólo cuando el editor está enfocado.", "editor.renderWhitespace3": "Renderiza sólo los caracteres de los espacios en blanco finales.", "editor.scrollbar.horizontal": "Controla la visibilidad de la barra de desplazamiento horizontal.", @@ -170,6 +194,7 @@ "newPlugin": "Creación de un nuevo plugin" }, "git": { + "aFewSecondsAgo": "hace unos segundos", "addSignedOff": "Agregar a la lista de firmas", "amendReuseMessag": "Para reutilizar el último mensaje de confirmación, pulse \"Enter\" o \"Escape\" para cancelar.", "amendRewrite": "Reescribir el mensaje de confirmación anterior. Pulse 'Enter' para confirmar o 'Escape' para cancelar.", @@ -203,7 +228,8 @@ "keybindingCollidesValidation": "la vinculación de teclas actualmente colisiona", "requiredKeybindingValidation": "se requiere el valor del keybinding", "resetKeybindingConfirmation": "¿Realmente quieres restablecer este keybinding a su valor por defecto?", - "resetKeybindingTitle": "Restablecer la unión de teclas para {0}" + "resetKeybindingTitle": "Restablecer la unión de teclas para {0}", + "resetMultipleKeybindingsWarning": "Si existen varias combinaciones de teclas para este comando, todas ellas se restablecerán." }, "localize": { "offlineTooltip": "No se puede conectar al backend." @@ -354,10 +380,14 @@ "typeHierarchy": "Jerarquía de tipos" }, "vsx-registry": { - "openVSX": "Abrir el registro de VSX", + "errorFetching": "Error en la búsqueda de extensiones.", "recommendedExtensions": "Una lista de los nombres de las extensiones recomendadas para su uso en este espacio de trabajo.", "searchPlaceholder": "Buscar extensiones en {0}", - "showRecommendedExtensions": "Controla si se muestran las notificaciones de las recomendaciones de extensión." + "showRecommendedExtensions": "Controla si se muestran las notificaciones de las recomendaciones de extensión.", + "vsx-extensions-contribution": { + "update-version-uninstall-error": "Error al eliminar la extensión: {0}.", + "update-version-version-error": "Fallo al instalar la versión {0} de {1}." + } }, "webview": { "goToReadme": "Ir al LÉAME", diff --git a/packages/core/i18n/nls.fr.json b/packages/core/i18n/nls.fr.json index a055dc7cacce8..1671ab6254ccd 100644 --- a/packages/core/i18n/nls.fr.json +++ b/packages/core/i18n/nls.fr.json @@ -1,4 +1,5 @@ { + "disassemblyView": "Vue du démontage", "theia": { "callhierarchy": { "noCallers": "Aucun appelant n'a été détecté.", @@ -58,18 +59,31 @@ "addConfigurationPlaceholder": "Sélectionnez la racine de l'espace de travail pour y ajouter la configuration", "continueAll": "Continuer tout", "copyExpressionValue": "Copier la valeur de l'expression", + "disassembly-view": { + "show-source-code": "Afficher le code source en vue du désassemblage." + }, + "instruction-breakpoint": "Point d'arrêt de l'instruction", + "instructionAddress": "Adresse", + "instructionBytes": "Octets", + "instructionNotAvailable": "Démontage non disponible.", + "instructionText": "Instruction", "missingConfiguration": "La configuration dynamique '{0}:{1}' est manquante ou non applicable.", + "open-disassembly-view": "Vue du démontage ouvert", "pauseAll": "Pause tout", "reveal": "Révéler", "threads": "Les fils", "toggleTracing": "Activer/désactiver le traçage des communications avec les adaptateurs de débogage" }, + "disassembly-view": { + "disassemblyTableColumnLabel": "instructions" + }, "editor": { "diffEditor.maxFileSize": "Taille maximale du fichier en Mo pour laquelle il faut calculer les différences. Utilisez 0 pour ne pas avoir de limite.", "editor.accessibilityPageSize": "Contrôle le nombre de lignes de l'éditeur qui peuvent être lues en une seule fois par un lecteur d'écran. Lorsque nous détectons un lecteur d'écran, nous fixons automatiquement la valeur par défaut à 500. Attention : ceci a une implication sur la performance pour les nombres plus grands que la valeur par défaut.", "editor.autoClosingDelete": "Contrôle si l'éditeur doit supprimer les guillemets fermants ou les parenthèses adjacentes lors de la suppression.", "editor.autoClosingDelete1": "Supprimez les guillemets fermants ou les parenthèses adjacentes uniquement s'ils ont été insérés automatiquement.", "editor.bracketPairColorization.enabled": "Contrôle si la colorisation des paires de crochets est activée ou non. Utilisez 'workbench.colorCustomizations' pour modifier les couleurs de surbrillance des crochets.", + "editor.bracketPairColorization.independentColorPoolPerBracketType": "Contrôle si chaque type de support a son propre pool de couleurs indépendant.", "editor.codeLensFontSize": "Contrôle la taille de la police en pixels pour CodeLens. Lorsqu'il a pour valeur `0`, 90% de `#editor.fontSize#` est utilisé.", "editor.find.autoFindInSelection0": "Ne jamais activer la recherche automatique dans la sélection (par défaut).", "editor.find.autoFindInSelection1": "Activez toujours la recherche automatique dans la sélection.", @@ -88,13 +102,23 @@ "editor.guides.bracketPairsHorizontal1": "Active les guides horizontaux uniquement pour la paire de supports active.", "editor.guides.bracketPairsHorizontal2": "Désactive les guides de paires de supports horizontaux.", "editor.guides.highlightActiveBracketPair": "Contrôle si l'éditeur doit mettre en évidence la paire de crochets active.", + "editor.guides.highlightActiveIndentation0": "Met en évidence le guide d'indentation actif.", + "editor.guides.highlightActiveIndentation1": "Met en évidence le guide d'indentation actif, même si les guides de support sont mis en évidence.", + "editor.guides.highlightActiveIndentation2": "Ne mettez pas en surbrillance le guide d'indentation actif.", "editor.hover.above": "Préférez l'affichage au-dessus de la ligne, s'il y a de la place.", "editor.inlayHints.enabled": "Active les indices d'incrustation dans l'éditeur.", + "editor.inlayHints.enabled0": "Les indices d'incrustation sont activés", + "editor.inlayHints.enabled1": "Les conseils d'incrustation sont affichés par défaut et sont masqués lorsque vous maintenez les touches `Ctrl+Alt`.", + "editor.inlayHints.enabled2": "Les indices d'incrustation sont cachés par défaut et s'affichent en maintenant les touches `Ctrl+Alt`.", + "editor.inlayHints.enabled3": "Les indices d'incrustation sont désactivés", "editor.inlayHints.fontFamily": "Contrôle la famille de polices des indices d'incrustation dans l'éditeur. Si la valeur est vide, la `#editor.fontFamily#` est utilisée.", "editor.inlayHints.fontSize": "Contrôle la taille de la police des indices d'incrustation dans l'éditeur. Une valeur par défaut de 90% de `#editor.fontSize#` est utilisée lorsque la valeur configurée est inférieure à `5` ou supérieure à la taille de la police de l'éditeur.", "editor.inlineSuggest.enabled": "Contrôle l'affichage automatique des suggestions en ligne dans l'éditeur.", "editor.language.colorizedBracketPairs": "Définit les paires de crochets qui sont colorisées par leur niveau d'imbrication si la colorisation des paires de crochets est activée.", "editor.lineHeight": "Contrôle la hauteur de la ligne.\n - Utilisez 0 pour calculer automatiquement la hauteur de ligne à partir de la taille de la police.\n - Les valeurs comprises entre 0 et 8 seront utilisées comme un multiplicateur avec la taille de la police.\n - Les valeurs supérieures ou égales à 8 seront utilisées comme valeurs effectives.", + "editor.quickSuggestions0": "Les suggestions rapides s'affichent dans le widget de suggestion", + "editor.quickSuggestions1": "Les suggestions rapides s'affichent sous forme de texte fantôme", + "editor.quickSuggestions2": "Les suggestions rapides sont désactivées", "editor.renderLineHighlightOnlyWhenFocus": "Contrôle si l'éditeur doit rendre la surbrillance de la ligne actuelle uniquement lorsque l'éditeur est focalisé.", "editor.renderWhitespace3": "Rendre uniquement les caractères d'espacement arrière.", "editor.scrollbar.horizontal": "Contrôle la visibilité de la barre de défilement horizontale.", @@ -170,6 +194,7 @@ "newPlugin": "Créer un nouveau plugin" }, "git": { + "aFewSecondsAgo": "il y a quelques secondes", "addSignedOff": "Ajouter Signé-par", "amendReuseMessag": "Pour réutiliser le dernier message de validation, appuyez sur 'Enter' ou 'Escape' pour annuler.", "amendRewrite": "Réécrire le message de livraison précédent. Appuyez sur 'Enter' pour confirmer ou 'Escape' pour annuler.", @@ -203,7 +228,8 @@ "keybindingCollidesValidation": "Les combinaisons de touches sont actuellement en conflit", "requiredKeybindingValidation": "la valeur du keybinding est requise", "resetKeybindingConfirmation": "Voulez-vous vraiment réinitialiser ce raccourci clavier à sa valeur par défaut ?", - "resetKeybindingTitle": "Réinitialiser le raccourci clavier pour {0}" + "resetKeybindingTitle": "Réinitialiser le raccourci clavier pour {0}", + "resetMultipleKeybindingsWarning": "Si plusieurs combinaisons de touches existent pour cette commande, elles seront toutes réinitialisées." }, "localize": { "offlineTooltip": "Impossible de se connecter au backend." @@ -354,10 +380,14 @@ "typeHierarchy": "Hiérarchie des types" }, "vsx-registry": { - "openVSX": "Registre Open VSX", + "errorFetching": "Erreur de récupération des extensions.", "recommendedExtensions": "Une liste des noms des extensions dont l'utilisation est recommandée dans cet espace de travail.", "searchPlaceholder": "Rechercher les extensions dans {0}", - "showRecommendedExtensions": "Contrôle si les notifications sont affichées pour les recommandations d'extension." + "showRecommendedExtensions": "Contrôle si les notifications sont affichées pour les recommandations d'extension.", + "vsx-extensions-contribution": { + "update-version-uninstall-error": "Erreur lors de la suppression de l'extension : {0}.", + "update-version-version-error": "Échec de l'installation de la version {0} de {1}." + } }, "webview": { "goToReadme": "Aller au fichier README", diff --git a/packages/core/i18n/nls.hu.json b/packages/core/i18n/nls.hu.json index 9b1cb8e4ca18a..8094fcbf45e65 100644 --- a/packages/core/i18n/nls.hu.json +++ b/packages/core/i18n/nls.hu.json @@ -1,4 +1,5 @@ { + "disassemblyView": "Szétszerelési nézet", "theia": { "callhierarchy": { "noCallers": "Nem észleltek hívókat.", @@ -58,18 +59,31 @@ "addConfigurationPlaceholder": "Válassza ki a munkaterület gyökerét a konfiguráció hozzáadásához", "continueAll": "Folytassa az összes", "copyExpressionValue": "Kifejezés értékének másolása", + "disassembly-view": { + "show-source-code": "Forráskód megjelenítése szétszerelési nézetben." + }, + "instruction-breakpoint": "Megszakítási pont", + "instructionAddress": "Cím:", + "instructionBytes": "Bájtok", + "instructionNotAvailable": "Szétszerelés nem lehetséges.", + "instructionText": "Utasítás", "missingConfiguration": "A '{0}:{1}' dinamikus konfiguráció hiányzik vagy nem alkalmazható.", + "open-disassembly-view": "Nyitott szétszerelési nézet", "pauseAll": "Minden szünet", "reveal": "Kiderül", "threads": "Szálak", "toggleTracing": "A hibakeresési adapterekkel folytatott kommunikáció nyomon követésének engedélyezése/letiltása" }, + "disassembly-view": { + "disassemblyTableColumnLabel": "utasítások" + }, "editor": { "diffEditor.maxFileSize": "Maximális fájlméret MB-ban, amelyre diffs-t kell számítani. Használja a 0 értéket, ha nincs korlát.", "editor.accessibilityPageSize": "A szerkesztő azon sorainak számát szabályozza, amelyeket a képernyőolvasó egyszerre fel tud olvasni. Amikor észlelünk egy képernyőolvasót, automatikusan 500-ra állítjuk az alapértelmezett értéket. Figyelmeztetés: ez az alapértelmezettnél nagyobb számok esetén teljesítménybeli következményekkel jár.", "editor.autoClosingDelete": "Szabályozza, hogy a szerkesztő törléskor eltávolítsa-e a szomszédos záró idézőjeleket vagy zárójeleket.", "editor.autoClosingDelete1": "Csak akkor távolítsa el a szomszédos záró idézőjeleket vagy zárójeleket, ha azok automatikusan be lettek illesztve.", "editor.bracketPairColorization.enabled": "Szabályozza, hogy a zárójelpár színezése engedélyezve legyen-e vagy sem. A 'workbench.colorCustomizations' használatával felülbírálhatja a zárójelek kiemelési színeit.", + "editor.bracketPairColorization.independentColorPoolPerBracketType": "Szabályozza, hogy minden zárójel-típusnak legyen-e saját, független színkészlete.", "editor.codeLensFontSize": "A CodeLens betűméretét vezérli pixelben. Ha `0`-ra van állítva, akkor a `#editor.fontSize#` 90%-át használja.", "editor.find.autoFindInSelection0": "Soha ne kapcsolja be automatikusan a Keresés a kiválasztásban funkciót (alapértelmezett).", "editor.find.autoFindInSelection1": "Mindig automatikusan kapcsolja be a Keresés a kiválasztásban funkciót.", @@ -88,13 +102,23 @@ "editor.guides.bracketPairsHorizontal1": "Csak az aktív konzolpár vízszintes vezetőit engedélyezi.", "editor.guides.bracketPairsHorizontal2": "Letiltja a vízszintes konzolpár vezetőket.", "editor.guides.highlightActiveBracketPair": "Szabályozza, hogy a szerkesztő kiemelje-e az aktív zárójelpárt.", + "editor.guides.highlightActiveIndentation0": "Kiemeli az aktív behúzási útmutatót.", + "editor.guides.highlightActiveIndentation1": "Kiemeli az aktív behúzási útmutatót, még akkor is, ha a zárójel-vezetők ki vannak jelölve.", + "editor.guides.highlightActiveIndentation2": "Ne emelje ki az aktív behúzási útmutatót.", "editor.hover.above": "Előnyben részesíti a vonal fölött lebegő megjelenítést, ha van hely.", "editor.inlayHints.enabled": "Engedélyezi az inlay tippeket a szerkesztőben.", + "editor.inlayHints.enabled0": "Az inlay tippek engedélyezve vannak", + "editor.inlayHints.enabled1": "Az inlay tippek alapértelmezés szerint megjelennek, és elrejtődnek, ha a \"Ctrl+Alt\" billentyűkombinációt nyomva tartjuk.", + "editor.inlayHints.enabled2": "Az inlay tippek alapértelmezés szerint el vannak rejtve, és a \"Ctrl+Alt\" billentyűkombináció lenyomásakor jelennek meg.", + "editor.inlayHints.enabled3": "Az inlay tippek le vannak tiltva", "editor.inlayHints.fontFamily": "A szerkesztőben lévő betűtípus-családot szabályozza. Ha üres, akkor a `#editor.fontFamily#`-t használja.", "editor.inlayHints.fontSize": "A betűméretet szabályozza a szerkesztőben megjelenő betűjelzések betűméretét. Az alapértelmezett érték a `#editor.fontSize#` 90%-a, ha a beállított érték kisebb, mint `5` vagy nagyobb, mint a szerkesztő betűmérete.", "editor.inlineSuggest.enabled": "Szabályozza, hogy a szerkesztőben automatikusan megjelenjenek-e a soron belüli javaslatok.", "editor.language.colorizedBracketPairs": "Meghatározza azokat a zárójelpárokat, amelyek színezése a beágyazási szintjük szerint történik, ha a zárójelpárok színezése engedélyezve van.", "editor.lineHeight": "A vonal magasságát szabályozza.\n - A 0 értéket használva automatikusan kiszámítja a sortávolságot a betűméretből.\n - A 0 és 8 közötti értékek a betűmérettel való szorzóként kerülnek felhasználásra.\n - A 8-nál nagyobb vagy azzal egyenlő értékek tényleges értékként lesznek használva.", + "editor.quickSuggestions0": "Gyors javaslatok megjelenítése a suggest widgeten belül", + "editor.quickSuggestions1": "A gyors javaslatok szellemszövegként jelennek meg", + "editor.quickSuggestions2": "A gyors javaslatok letiltva", "editor.renderLineHighlightOnlyWhenFocus": "Azt vezérli, hogy a szerkesztő csak akkor jelenítse meg az aktuális sor kiemelését, amikor a szerkesztő fókuszban van.", "editor.renderWhitespace3": "Csak az utolsó szóköz karaktereket adja vissza.", "editor.scrollbar.horizontal": "A vízszintes görgetősáv láthatóságát szabályozza.", @@ -170,6 +194,7 @@ "newPlugin": "Egy új plugin építése" }, "git": { + "aFewSecondsAgo": "néhány másodperccel ezelőtt", "addSignedOff": "Signed-off-by hozzáadása", "amendReuseMessag": "Az utolsó átadási üzenet újbóli használatához nyomja meg az 'Enter' billentyűt, vagy az 'Escape' billentyűt a törléshez.", "amendRewrite": "Írja át az előző commit üzenetet. Nyomja meg az 'Enter' billentyűt a megerősítéshez vagy az 'Escape' billentyűt a törléshez.", @@ -203,7 +228,8 @@ "keybindingCollidesValidation": "billentyűkötözés jelenleg ütközik", "requiredKeybindingValidation": "billentyűkötés értéke szükséges", "resetKeybindingConfirmation": "Tényleg vissza akarja állítani ezt a billentyűkötést az alapértelmezett értékre?", - "resetKeybindingTitle": "A {0} billentyűkhöz való kötés visszaállítása" + "resetKeybindingTitle": "A {0} billentyűkhöz való kötés visszaállítása", + "resetMultipleKeybindingsWarning": "Ha a parancshoz több billentyűzetmegkötés is létezik, akkor mindet visszaállítja a rendszer." }, "localize": { "offlineTooltip": "Nem tud csatlakozni a háttértárhoz." @@ -354,10 +380,14 @@ "typeHierarchy": "Típushierarchia" }, "vsx-registry": { - "openVSX": "VSX Registry megnyitása", + "errorFetching": "Hiba a kiterjesztések lekérdezésében.", "recommendedExtensions": "A munkaterületre ajánlott kiterjesztések neveinek listája.", "searchPlaceholder": "Keresés kiterjesztések {0}", - "showRecommendedExtensions": "Szabályozza, hogy a kiterjesztési ajánlásokhoz megjelenjenek-e értesítések." + "showRecommendedExtensions": "Szabályozza, hogy a kiterjesztési ajánlásokhoz megjelenjenek-e értesítések.", + "vsx-extensions-contribution": { + "update-version-uninstall-error": "Hiba a kiterjesztés eltávolításakor: {0}.", + "update-version-version-error": "Nem sikerült telepíteni a {1} {0} verzióját." + } }, "webview": { "goToReadme": "Tovább a README-hez", diff --git a/packages/core/i18n/nls.it.json b/packages/core/i18n/nls.it.json index fe1e037c2bc19..0a89bccdac8bf 100644 --- a/packages/core/i18n/nls.it.json +++ b/packages/core/i18n/nls.it.json @@ -1,4 +1,5 @@ { + "disassemblyView": "Vista di smontaggio", "theia": { "callhierarchy": { "noCallers": "Non sono stati rilevati chiamanti.", @@ -58,18 +59,31 @@ "addConfigurationPlaceholder": "Selezionare lo spazio di lavoro principale a cui aggiungere la configurazione", "continueAll": "Continua tutto", "copyExpressionValue": "Copiare il valore dell'espressione", + "disassembly-view": { + "show-source-code": "Mostra il codice sorgente nella vista di disassemblaggio." + }, + "instruction-breakpoint": "Istruzione Punto di interruzione", + "instructionAddress": "Indirizzo", + "instructionBytes": "Byte", + "instructionNotAvailable": "Smontaggio non disponibile.", + "instructionText": "Istruzioni", "missingConfiguration": "La configurazione dinamica '{0}:{1}' è mancante o non applicabile", + "open-disassembly-view": "Vista di smontaggio aperta", "pauseAll": "Pausa Tutto", "reveal": "Rivela", "threads": "Threads", "toggleTracing": "Abilita/disabilita il tracciamento delle comunicazioni con gli adattatori di debug" }, + "disassembly-view": { + "disassemblyTableColumnLabel": "istruzioni" + }, "editor": { "diffEditor.maxFileSize": "Dimensione massima del file in MB per cui calcolare le differenze. Usa 0 per nessun limite.", "editor.accessibilityPageSize": "Controlla il numero di linee nell'editor che possono essere lette da uno screen reader in una volta sola. Quando rileviamo uno screen reader impostiamo automaticamente il valore predefinito a 500. Attenzione: questo ha un'implicazione sulle prestazioni per numeri più grandi di quello predefinito.", "editor.autoClosingDelete": "Controlla se l'editor deve rimuovere le virgolette o le parentesi di chiusura adiacenti quando cancella.", "editor.autoClosingDelete1": "Rimuovi le virgolette o le parentesi di chiusura adiacenti solo se sono state inserite automaticamente.", "editor.bracketPairColorization.enabled": "Controlla se la colorazione delle coppie di parentesi è abilitata o meno. Usa 'workbench.colorCustomizations' per sovrascrivere i colori di evidenziazione delle parentesi.", + "editor.bracketPairColorization.independentColorPoolPerBracketType": "Controlla se ogni tipo di staffa ha il suo pool di colori indipendente.", "editor.codeLensFontSize": "Controlla la dimensione del carattere in pixel per CodeLens. Se impostato a `0`, viene usato il 90% di `#editor.fontSize#`.", "editor.find.autoFindInSelection0": "Non attivare mai automaticamente Find in Selection (predefinito).", "editor.find.autoFindInSelection1": "Attivare sempre automaticamente Find in Selection.", @@ -88,13 +102,23 @@ "editor.guides.bracketPairsHorizontal1": "Abilita le guide orizzontali solo per la coppia di staffe attiva.", "editor.guides.bracketPairsHorizontal2": "Disabilita le guide orizzontali della coppia di staffe.", "editor.guides.highlightActiveBracketPair": "Controlla se l'editor deve evidenziare la coppia di parentesi attiva.", + "editor.guides.highlightActiveIndentation0": "Evidenzia la guida al rientro attiva.", + "editor.guides.highlightActiveIndentation1": "Evidenzia la guida di rientro attiva anche se sono evidenziate le guide di parentesi.", + "editor.guides.highlightActiveIndentation2": "Non evidenziare la guida di rientro attiva.", "editor.hover.above": "Preferisce mostrare sopra la linea, se c'è spazio.", "editor.inlayHints.enabled": "Abilita i suggerimenti per l'intarsio nell'editor.", + "editor.inlayHints.enabled0": "I suggerimenti per l'intarsio sono abilitati", + "editor.inlayHints.enabled1": "I suggerimenti per l'intarsio sono visualizzati per impostazione predefinita e si nascondono quando si tiene premuto `Ctrl+Alt`.", + "editor.inlayHints.enabled2": "I suggerimenti per l'intarsio sono nascosti per impostazione predefinita e vengono visualizzati quando si tiene premuto `Ctrl+Alt`.", + "editor.inlayHints.enabled3": "I suggerimenti per l'intarsio sono disabilitati", "editor.inlayHints.fontFamily": "Controlla la famiglia di caratteri dei suggerimenti inlay nell'editor. Se impostato a vuoto, viene usato il `#editor.fontFamily#`.", "editor.inlayHints.fontSize": "Controlla la dimensione del carattere dei suggerimenti inlay nell'editor. Un valore predefinito del 90% di `#editor.fontSize#` è usato quando il valore configurato è inferiore a `5` o superiore alla dimensione del carattere dell'editor.", "editor.inlineSuggest.enabled": "Controlla se mostrare automaticamente i suggerimenti in linea nell'editor.", "editor.language.colorizedBracketPairs": "Definisce le coppie di parentesi che sono colorate dal loro livello di annidamento se la colorazione delle coppie di parentesi è abilitata.", "editor.lineHeight": "Controlla l'altezza della linea.\n - Usa 0 per calcolare automaticamente l'altezza della linea dalla dimensione del carattere.\n - I valori tra 0 e 8 saranno usati come moltiplicatore con la dimensione del carattere.\n - I valori maggiori o uguali a 8 saranno usati come valori effettivi.", + "editor.quickSuggestions0": "I suggerimenti rapidi vengono visualizzati all'interno del widget Suggerimenti", + "editor.quickSuggestions1": "I suggerimenti rapidi vengono visualizzati come testo fantasma", + "editor.quickSuggestions2": "I suggerimenti rapidi sono disabilitati", "editor.renderLineHighlightOnlyWhenFocus": "Controlla se l'editor deve rendere l'evidenziazione della linea corrente solo quando l'editor è focalizzato.", "editor.renderWhitespace3": "Rende solo i caratteri di spazi bianchi finali.", "editor.scrollbar.horizontal": "Controlla la visibilità della barra di scorrimento orizzontale.", @@ -170,6 +194,7 @@ "newPlugin": "Costruire un nuovo plugin" }, "git": { + "aFewSecondsAgo": "pochi secondi fa", "addSignedOff": "Aggiungi Firmato-da", "amendReuseMessag": "Per riutilizzare l'ultimo messaggio di commit, premi 'Enter' o 'Escape' per annullare.", "amendRewrite": "Riscrivere il messaggio di commit precedente. Premi 'Enter' per confermare o 'Escape' per annullare.", @@ -203,7 +228,8 @@ "keybindingCollidesValidation": "il keybinding attualmente collima", "requiredKeybindingValidation": "Il valore del keybinding è necessario", "resetKeybindingConfirmation": "Si vuole davvero ripristinare il valore predefinito di questo keybinding?", - "resetKeybindingTitle": "Azzeramento del keybinding per {0}" + "resetKeybindingTitle": "Azzeramento del keybinding per {0}", + "resetMultipleKeybindingsWarning": "Se per questo comando esistono più collegamenti ai tasti, tutti verranno azzerati." }, "localize": { "offlineTooltip": "Impossibile connettersi al backend." @@ -354,10 +380,14 @@ "typeHierarchy": "Gerarchia dei tipi" }, "vsx-registry": { - "openVSX": "Aprire il registro VSX", + "errorFetching": "Errore nel recupero delle estensioni.", "recommendedExtensions": "Una lista dei nomi delle estensioni raccomandate per l'uso in questo spazio di lavoro.", "searchPlaceholder": "Estensioni di ricerca in {0}", - "showRecommendedExtensions": "Controlla se le notifiche sono mostrate per le raccomandazioni di estensione." + "showRecommendedExtensions": "Controlla se le notifiche sono mostrate per le raccomandazioni di estensione.", + "vsx-extensions-contribution": { + "update-version-uninstall-error": "Errore durante la rimozione dell'estensione: {0}.", + "update-version-version-error": "Impossibile installare la versione {0} di {1}." + } }, "webview": { "goToReadme": "Vai a README", diff --git a/packages/core/i18n/nls.ja.json b/packages/core/i18n/nls.ja.json index d9d08ca00cdb8..a4a8fc9909021 100644 --- a/packages/core/i18n/nls.ja.json +++ b/packages/core/i18n/nls.ja.json @@ -1,4 +1,5 @@ { + "disassemblyView": "分解図", "theia": { "callhierarchy": { "noCallers": "発信者は検出されていません。", @@ -58,18 +59,31 @@ "addConfigurationPlaceholder": "設定を追加するワークスペース・ルートを選択します。", "continueAll": "すべてを続ける", "copyExpressionValue": "コピー式の値", + "disassembly-view": { + "show-source-code": "逆アセンブルビューでソースコードを表示する" + }, + "instruction-breakpoint": "命令ブレークポイント", + "instructionAddress": "住所", + "instructionBytes": "バイト", + "instructionNotAvailable": "分解はできません。", + "instructionText": "インストラクション", "missingConfiguration": "ダイナミックコンフィギュレーション「{0}:{1}」が存在しないか、適用できない", + "open-disassembly-view": "オープン分解図", "pauseAll": "ポーズ・オール", "reveal": "暴露", "threads": "スレッド", "toggleTracing": "デバッグアダプタとの通信のトレースの有効化/無効化" }, + "disassembly-view": { + "disassemblyTableColumnLabel": "指令" + }, "editor": { "diffEditor.maxFileSize": "差分を計算するファイルの最大サイズをMBで指定します。制限しない場合は 0 を使用します。", "editor.accessibilityPageSize": "スクリーン・リーダーが一度に読み上げられるエディターの行数を制御します。スクリーン・リーダーが検出されると、自動的にデフォルトが500に設定されます。警告: デフォルト値よりも大きな数値を設定した場合、パフォーマンスが低下します。", "editor.autoClosingDelete": "削除の際に、隣接する閉じ引用符や括弧を削除するかどうかを制御します。", "editor.autoClosingDelete1": "自動的に挿入された場合のみ、隣接する閉じ引用符または括弧を削除します。", "editor.bracketPairColorization.enabled": "ブラケットペアの色付けを有効にするかどうかを制御します。ブラケットのハイライト色をオーバーライドするには 'workbench.colorCustomizations' を使用します。", + "editor.bracketPairColorization.independentColorPoolPerBracketType": "各ブラケットタイプに独立したカラープールを持たせるかどうかを制御します。", "editor.codeLensFontSize": "CodeLensのフォントサイズをピクセル単位で制御します。0`に設定すると、`#editor.fontSize#`の90%が使用されます。", "editor.find.autoFindInSelection0": "選択部分の検索を自動的にオンにしない(デフォルト)。", "editor.find.autoFindInSelection1": "常に「選択中の検索」を自動的にオンにします。", @@ -88,13 +102,23 @@ "editor.guides.bracketPairsHorizontal1": "アクティブなブラケットペアにのみ水平方向のガイドを有効にします。", "editor.guides.bracketPairsHorizontal2": "水平ブラケットペアガイドを無効にします。", "editor.guides.highlightActiveBracketPair": "エディターがアクティブなブラケットペアをハイライト表示するかどうかを制御します。", + "editor.guides.highlightActiveIndentation0": "アクティブなインデントガイドをハイライト表示します。", + "editor.guides.highlightActiveIndentation1": "ブラケットガイドがハイライトされている場合でも、アクティブなインデントガイドをハイライトします。", + "editor.guides.highlightActiveIndentation2": "アクティブなインデントガイドをハイライト表示しない。", "editor.hover.above": "スペースがある場合は、行の上にホバー表示することを優先します。", "editor.inlayHints.enabled": "エディタでインレイのヒントを有効にします。", + "editor.inlayHints.enabled0": "インレイヒントが有効", + "editor.inlayHints.enabled1": "インレイのヒントはデフォルトで表示され、`Ctrl+Alt`を押すと隠れます。", + "editor.inlayHints.enabled2": "インレイのヒントはデフォルトでは非表示で、`Ctrl+Alt`を押したときに表示されます。", + "editor.inlayHints.enabled3": "インレイヒントが無効", "editor.inlayHints.fontFamily": "エディタ内のインレイヒントのフォントファミリーを制御します。空白に設定すると、`#editor.fontFamily#`が使用されます。", "editor.inlayHints.fontSize": "エディターでのインレイヒントのフォントサイズを制御します。設定値が `5` 未満またはエディタのフォントサイズより大きい場合、デフォルトの `#editor.fontSize#` の 90% が使用されます。", "editor.inlineSuggest.enabled": "エディタにインラインのサジェストを自動的に表示するかどうかを制御します。", "editor.language.colorizedBracketPairs": "ブラケットペアの色付けが有効な場合に、その入れ子レベルによって色付けされるブラケットペアを定義する。", "editor.lineHeight": "行の高さを制御します。\n - 0を指定すると、フォントサイズから自動的に行の高さが計算されます。\n - 0から8までの値は、フォントサイズとの乗数として使用されます。\n - 8以上の値は、有効な値として使用されます。", + "editor.quickSuggestions0": "サジェストウィジェットの中にクイックサジェストを表示", + "editor.quickSuggestions1": "クイックサジェスト機能をゴーストテキストで表示", + "editor.quickSuggestions2": "クイックサジェスト機能を無効化", "editor.renderLineHighlightOnlyWhenFocus": "エディタがフォーカスされているときのみ、現在の行のハイライトをレンダリングするかどうかを制御します。", "editor.renderWhitespace3": "末尾の空白文字のみをレンダリングする。", "editor.scrollbar.horizontal": "水平スクロールバーの表示/非表示を制御します。", @@ -170,6 +194,7 @@ "newPlugin": "新しいプラグインの構築" }, "git": { + "aFewSecondsAgo": "さきほど", "addSignedOff": "サイン・オフ・バイの追加", "amendReuseMessag": "最後のコミットメッセージを再利用するには、「Enter」または「Escape」を押してキャンセルしてください。", "amendRewrite": "前回のコミットメッセージを書き換えます。確定するには「Enter」を、キャンセルするには「Escape」を押してください。", @@ -203,7 +228,8 @@ "keybindingCollidesValidation": "キーバインドがコリジョン中", "requiredKeybindingValidation": "キーバインド値が必要です", "resetKeybindingConfirmation": "このキーバインドを本当に初期値に戻すのですか?", - "resetKeybindingTitle": "{0}のキーバインドをリセットする" + "resetKeybindingTitle": "{0}のキーバインドをリセットする", + "resetMultipleKeybindingsWarning": "このコマンドに複数のキーバインドが存在する場合は、すべてのキーバインドがリセットされます。" }, "localize": { "offlineTooltip": "バックエンドに接続できません。" @@ -354,10 +380,14 @@ "typeHierarchy": "タイプ階層" }, "vsx-registry": { - "openVSX": "VSXレジストリを開く", + "errorFetching": "拡張機能の取得にエラーが発生しました。", "recommendedExtensions": "このワークスペースでの使用が推奨される拡張機能の名前のリストです。", "searchPlaceholder": "{0}で拡張子を検索", - "showRecommendedExtensions": "拡張機能の推奨事項について、通知を表示するかどうかを制御します。" + "showRecommendedExtensions": "拡張機能の推奨事項について、通知を表示するかどうかを制御します。", + "vsx-extensions-contribution": { + "update-version-uninstall-error": "拡張子の削除中にエラーが発生しました。{0}.", + "update-version-version-error": "バージョン{0} のインストールに失敗しました。{1} 。" + } }, "webview": { "goToReadme": "READMEに戻る", diff --git a/packages/core/i18n/nls.json b/packages/core/i18n/nls.json index b21a2bd517ff5..8c79f8948245c 100644 --- a/packages/core/i18n/nls.json +++ b/packages/core/i18n/nls.json @@ -1,4 +1,5 @@ { + "disassemblyView": "Disassembly View", "theia": { "callhierarchy": { "noCallers": "No callers have been detected.", @@ -58,18 +59,31 @@ "addConfigurationPlaceholder": "Select workspace root to add configuration to", "continueAll": "Continue All", "copyExpressionValue": "Copy Expression Value", + "disassembly-view": { + "show-source-code": "Show Source Code in Disassembly View." + }, + "instruction-breakpoint": "Instruction Breakpoint", + "instructionAddress": "Address", + "instructionBytes": "Bytes", + "instructionNotAvailable": "Disassembly not available.", + "instructionText": "Instruction", "missingConfiguration": "Dynamic configuration '{0}:{1}' is missing or not applicable", + "open-disassembly-view": "Open Disassembly View", "pauseAll": "Pause All", "reveal": "Reveal", "threads": "Threads", "toggleTracing": "Enable/disable tracing communications with debug adapters" }, + "disassembly-view": { + "disassemblyTableColumnLabel": "instructions" + }, "editor": { "diffEditor.maxFileSize": "Maximum file size in MB for which to compute diffs. Use 0 for no limit.", "editor.accessibilityPageSize": "Controls the number of lines in the editor that can be read out by a screen reader at once. When we detect a screen reader we automatically set the default to be 500. Warning: this has a performance implication for numbers larger than the default.", "editor.autoClosingDelete": "Controls whether the editor should remove adjacent closing quotes or brackets when deleting.", "editor.autoClosingDelete1": "Remove adjacent closing quotes or brackets only if they were automatically inserted.", - "editor.bracketPairColorization.enabled": "Controls whether bracket pair colorization is enabled or not. Use 'workbench.colorCustomizations' to override the bracket highlight colors.", + "editor.bracketPairColorization.enabled": "Controls whether bracket pair colorization is enabled or not. Use `#workbench.colorCustomizations#` to override the bracket highlight colors.", + "editor.bracketPairColorization.independentColorPoolPerBracketType": "Controls whether each bracket type has its own independent color pool.", "editor.codeLensFontSize": "Controls the font size in pixels for CodeLens. When set to `0`, 90% of `#editor.fontSize#` is used.", "editor.find.autoFindInSelection0": "Never turn on Find in Selection automatically (default).", "editor.find.autoFindInSelection1": "Always turn on Find in Selection automatically.", @@ -88,13 +102,23 @@ "editor.guides.bracketPairsHorizontal1": "Enables horizontal guides only for the active bracket pair.", "editor.guides.bracketPairsHorizontal2": "Disables horizontal bracket pair guides.", "editor.guides.highlightActiveBracketPair": "Controls whether the editor should highlight the active bracket pair.", + "editor.guides.highlightActiveIndentation0": "Highlights the active indent guide.", + "editor.guides.highlightActiveIndentation1": "Highlights the active indent guide even if bracket guides are highlighted.", + "editor.guides.highlightActiveIndentation2": "Do not highlight the active indent guide.", "editor.hover.above": "Prefer showing hovers above the line, if there's space.", "editor.inlayHints.enabled": "Enables the inlay hints in the editor.", + "editor.inlayHints.enabled0": "Inlay hints are enabled", + "editor.inlayHints.enabled1": "Inlay hints are showing by default and hide when holding `Ctrl+Alt`", + "editor.inlayHints.enabled2": "Inlay hints are hidden by default and show when holding `Ctrl+Alt`", + "editor.inlayHints.enabled3": "Inlay hints are disabled", "editor.inlayHints.fontFamily": "Controls font family of inlay hints in the editor. When set to empty, the `#editor.fontFamily#` is used.", - "editor.inlayHints.fontSize": "Controls font size of inlay hints in the editor. A default of 90% of `#editor.fontSize#` is used when the configured value is less than `5` or greater than the editor font size.", + "editor.inlayHints.fontSize": "Controls font size of inlay hints in the editor. As default the `#editor.fontSize#` is used when the configured value is less than `5` or greater than the editor font size.", "editor.inlineSuggest.enabled": "Controls whether to automatically show inline suggestions in the editor.", "editor.language.colorizedBracketPairs": "Defines the bracket pairs that are colorized by their nesting level if bracket pair colorization is enabled.", "editor.lineHeight": "Controls the line height. \n - Use 0 to automatically compute the line height from the font size.\n - Values between 0 and 8 will be used as a multiplier with the font size.\n - Values greater than or equal to 8 will be used as effective values.", + "editor.quickSuggestions0": "Quick suggestions show inside the suggest widget", + "editor.quickSuggestions1": "Quick suggestions show as ghost text", + "editor.quickSuggestions2": "Quick suggestions are disabled", "editor.renderLineHighlightOnlyWhenFocus": "Controls if the editor should render the current line highlight only when the editor is focused.", "editor.renderWhitespace3": "Render only trailing whitespace characters.", "editor.scrollbar.horizontal": "Controls the visibility of the horizontal scrollbar.", @@ -170,6 +194,7 @@ "newPlugin": "Building a New Plugin" }, "git": { + "aFewSecondsAgo": "a few seconds ago", "addSignedOff": "Add Signed-off-by", "amendReuseMessag": "To reuse the last commit message, press 'Enter' or 'Escape' to cancel.", "amendRewrite": "Rewrite previous commit message. Press 'Enter' to confirm or 'Escape' to cancel.", @@ -203,7 +228,8 @@ "keybindingCollidesValidation": "keybinding currently collides", "requiredKeybindingValidation": "keybinding value is required", "resetKeybindingConfirmation": "Do you really want to reset this keybinding to its default value?", - "resetKeybindingTitle": "Reset keybinding for {0}" + "resetKeybindingTitle": "Reset keybinding for {0}", + "resetMultipleKeybindingsWarning": "If multiple keybindings exist for this command, all of them will be reset." }, "localize": { "offlineTooltip": "Cannot connect to backend." @@ -354,10 +380,14 @@ "typeHierarchy": "Type Hierarchy" }, "vsx-registry": { - "openVSX": "Open VSX Registry", + "errorFetching": "Error fetching extensions.", "recommendedExtensions": "A list of the names of extensions recommended for use in this workspace.", "searchPlaceholder": "Search Extensions in {0}", - "showRecommendedExtensions": "Controls whether notifications are shown for extension recommendations." + "showRecommendedExtensions": "Controls whether notifications are shown for extension recommendations.", + "vsx-extensions-contribution": { + "update-version-uninstall-error": "Error while removing the extension: {0}.", + "update-version-version-error": "Failed to install version {0} of {1}." + } }, "webview": { "goToReadme": "Go To README", diff --git a/packages/core/i18n/nls.pl.json b/packages/core/i18n/nls.pl.json index 1744978976ee4..9bb7bf5902100 100644 --- a/packages/core/i18n/nls.pl.json +++ b/packages/core/i18n/nls.pl.json @@ -1,4 +1,5 @@ { + "disassemblyView": "Widok z demontażu", "theia": { "callhierarchy": { "noCallers": "Nie wykryto żadnych rozmówców.", @@ -58,18 +59,31 @@ "addConfigurationPlaceholder": "Wybierz główny obszar roboczy, do którego chcesz dodać konfigurację", "continueAll": "Kontynuuj Wszystko", "copyExpressionValue": "Kopiuj wartość wyrażenia", + "disassembly-view": { + "show-source-code": "Pokaż kod źródłowy w widoku demontażu." + }, + "instruction-breakpoint": "Punkt przerwania instrukcji", + "instructionAddress": "Adres", + "instructionBytes": "Bajty", + "instructionNotAvailable": "Demontaż nie jest dostępny.", + "instructionText": "Instrukcja", "missingConfiguration": "Brak konfiguracji dynamicznej \"{0}:{1}\" lub nie ma ona zastosowania.", + "open-disassembly-view": "Otwarty widok demontażu", "pauseAll": "Pauza Wszystkie", "reveal": "Ujawnij", "threads": "Nici", "toggleTracing": "Włączanie/wyłączanie śledzenia komunikacji z adapterami debugowania" }, + "disassembly-view": { + "disassemblyTableColumnLabel": "instrukcje" + }, "editor": { "diffEditor.maxFileSize": "Maksymalny rozmiar pliku w MB, dla którego mają być obliczane różnice. Wartość 0 oznacza brak limitu.", "editor.accessibilityPageSize": "Określa liczbę linii w edytorze, które mogą być odczytywane jednocześnie przez czytnik ekranu. Po wykryciu czytnika ekranu automatycznie ustawiamy wartość domyślną na 500. Uwaga: ma to wpływ na wydajność w przypadku liczb większych niż domyślne.", "editor.autoClosingDelete": "Określa, czy edytor ma usuwać przylegające cudzysłowy lub nawiasy zamykające podczas usuwania.", "editor.autoClosingDelete1": "Usuń sąsiednie cudzysłowy lub nawiasy zamykające tylko wtedy, gdy zostały wstawione automatycznie.", "editor.bracketPairColorization.enabled": "Określa, czy kolorowanie par nawiasów jest włączone, czy nie. Użyj 'workbench.colorCustomizations', aby zmienić kolory podświetlenia nawiasów.", + "editor.bracketPairColorization.independentColorPoolPerBracketType": "Kontroluje, czy każdy typ wspornika ma swoją własną, niezależną pulę kolorów.", "editor.codeLensFontSize": "Kontroluje rozmiar czcionki w pikselach dla CodeLens. Gdy ustawione na `0`, używane jest 90% z `#editor.fontSize#`.", "editor.find.autoFindInSelection0": "Nigdy nie włączaj funkcji Znajdź w zaznaczeniu automatycznie (ustawienie domyślne).", "editor.find.autoFindInSelection1": "Zawsze automatycznie włączaj funkcję Znajdź w zaznaczeniu.", @@ -88,13 +102,23 @@ "editor.guides.bracketPairsHorizontal1": "Włącza prowadnice poziome tylko dla aktywnej pary wsporników.", "editor.guides.bracketPairsHorizontal2": "Wyłącza prowadnice par wsporników poziomych.", "editor.guides.highlightActiveBracketPair": "Określa, czy edytor ma podświetlać aktywną parę nawiasów.", + "editor.guides.highlightActiveIndentation0": "Podświetla aktywną prowadnicę wcięcia.", + "editor.guides.highlightActiveIndentation1": "Podświetla aktywną prowadnicę wcięcia, nawet jeśli prowadnice wsporników są podświetlone.", + "editor.guides.highlightActiveIndentation2": "Nie podświetlaj aktywnego przewodnika po wcięciach.", "editor.hover.above": "Preferuj wyświetlanie nad linią, jeśli jest na to miejsce.", "editor.inlayHints.enabled": "Włącza podpowiedzi wkładek w edytorze.", + "editor.inlayHints.enabled0": "Podpowiedzi dotyczące nakładek są włączone", + "editor.inlayHints.enabled1": "Podpowiedzi są domyślnie wyświetlane i ukrywają się po przytrzymaniu `Ctrl+Alt`.", + "editor.inlayHints.enabled2": "Podpowiedzi są domyślnie ukryte i pokazują się po przytrzymaniu `Ctrl+Alt`.", + "editor.inlayHints.enabled3": "Podpowiedzi układania są wyłączone", "editor.inlayHints.fontFamily": "Kontroluje rodzinę czcionek podpowiedzi wkładek w edytorze. Jeśli jest ustawione na puste, używana jest `#editor.fontFamily#`.", "editor.inlayHints.fontSize": "Kontroluje rozmiar czcionki podpowiedzi wkładek w edytorze. Domyślnie 90% `#editor.fontSize#` jest używane, gdy skonfigurowana wartość jest mniejsza niż `5` lub większa niż rozmiar czcionki edytora.", "editor.inlineSuggest.enabled": "Określa, czy w edytorze mają być automatycznie wyświetlane sugestie inline.", "editor.language.colorizedBracketPairs": "Określa pary nawiasów, które są kolorowane według poziomu ich zagnieżdżenia, jeśli kolorowanie par nawiasów jest włączone.", "editor.lineHeight": "Steruje wysokością wiersza.\n - Wartość 0 powoduje automatyczne obliczenie wysokości wiersza na podstawie rozmiaru czcionki.\n - Wartości z przedziału od 0 do 8 zostaną użyte jako mnożnik rozmiaru czcionki.\n - Wartości większe lub równe 8 będą używane jako wartości efektywne.", + "editor.quickSuggestions0": "Szybkie sugestie wyświetlane wewnątrz widżetu sugestii", + "editor.quickSuggestions1": "Szybkie sugestie są wyświetlane jako tekst widmo", + "editor.quickSuggestions2": "Szybkie sugestie są wyłączone", "editor.renderLineHighlightOnlyWhenFocus": "Określa, czy edytor ma wyświetlać podświetlenie bieżącej linii tylko wtedy, gdy edytor jest skoncentrowany.", "editor.renderWhitespace3": "Renderuj tylko końcowe znaki białych spacji.", "editor.scrollbar.horizontal": "Umożliwia sterowanie widocznością poziomego paska przewijania.", @@ -170,6 +194,7 @@ "newPlugin": "Tworzenie nowego pluginu" }, "git": { + "aFewSecondsAgo": "kilka sekund temu", "addSignedOff": "Dodaj podpisane przez", "amendReuseMessag": "Aby ponownie użyć ostatniego komunikatu commit, należy nacisnąć 'Enter' lub 'Escape', aby anulować.", "amendRewrite": "Ponownie napisać poprzednią wiadomość. Wcisnąć 'Enter', aby potwierdzić lub 'Escape', aby anulować.", @@ -203,7 +228,8 @@ "keybindingCollidesValidation": "przypisanie klawiszy aktualnie koliduje", "requiredKeybindingValidation": "wymagana jest wartość wiązania klawiszy", "resetKeybindingConfirmation": "Czy naprawdę chcesz przywrócić domyślną wartość tego powiązania klawiszy?", - "resetKeybindingTitle": "Zresetuj przypisanie klawiszy dla {0}." + "resetKeybindingTitle": "Zresetuj przypisanie klawiszy dla {0}.", + "resetMultipleKeybindingsWarning": "Jeśli dla tego polecenia istnieje wiele przypisań klawiszy, wszystkie zostaną zresetowane." }, "localize": { "offlineTooltip": "Nie można połączyć się z backendem." @@ -354,10 +380,14 @@ "typeHierarchy": "Hierarchia typów" }, "vsx-registry": { - "openVSX": "Otwórz Rejestr VSX", + "errorFetching": "Błąd pobierania rozszerzeń.", "recommendedExtensions": "Lista nazw rozszerzeń zalecanych do użycia w tym obszarze roboczym.", "searchPlaceholder": "Wyszukaj rozszerzenia w {0}.", - "showRecommendedExtensions": "Określa, czy dla zaleceń dotyczących rozszerzeń mają być wyświetlane powiadomienia." + "showRecommendedExtensions": "Określa, czy dla zaleceń dotyczących rozszerzeń mają być wyświetlane powiadomienia.", + "vsx-extensions-contribution": { + "update-version-uninstall-error": "Błąd podczas usuwania rozszerzenia: {0}.", + "update-version-version-error": "Nie udało się zainstalować wersji {0} z {1}." + } }, "webview": { "goToReadme": "Przejdź do pliku README", diff --git a/packages/core/i18n/nls.pt-br.json b/packages/core/i18n/nls.pt-br.json index 4f8d84f6c8c10..ac72e288a3b5a 100644 --- a/packages/core/i18n/nls.pt-br.json +++ b/packages/core/i18n/nls.pt-br.json @@ -1,4 +1,5 @@ { + "disassemblyView": "Vista de Desmontagem", "theia": { "callhierarchy": { "noCallers": "Nenhum chamador foi detectado.", @@ -58,18 +59,31 @@ "addConfigurationPlaceholder": "Selecione a raiz do espaço de trabalho para adicionar configuração a", "continueAll": "Continuar Todos", "copyExpressionValue": "Valor de Expressão de Cópia", + "disassembly-view": { + "show-source-code": "Mostrar Código Fonte em Vista de Desmontagem." + }, + "instruction-breakpoint": "Ponto de Interrupção da Instrução", + "instructionAddress": "Endereço", + "instructionBytes": "Bytes", + "instructionNotAvailable": "Desmontagem não disponível.", + "instructionText": "Instrução", "missingConfiguration": "A configuração dinâmica '{0}:{1}' está ausente ou não é aplicável", + "open-disassembly-view": "Vista de Desmontagem Aberta", "pauseAll": "Pausa Todos", "reveal": "Revelar", "threads": "Tópicos", "toggleTracing": "Habilitar/desabilitar as comunicações de rastreamento com adaptadores de depuração" }, + "disassembly-view": { + "disassemblyTableColumnLabel": "instruções" + }, "editor": { "diffEditor.maxFileSize": "Tamanho máximo de arquivo em MB para o qual calcular diffs. Usar 0 para sem limite.", "editor.accessibilityPageSize": "Controla o número de linhas no editor que podem ser lidas por um leitor de tela de uma só vez. Quando detectamos um leitor de tela, definimos automaticamente o padrão como sendo 500. Aviso: isto tem uma implicação de desempenho para números maiores do que o padrão.", "editor.autoClosingDelete": "Controla se o editor deve remover as cotações de fechamento adjacentes ou parênteses ao apagar.", "editor.autoClosingDelete1": "Remover as cotações de fechamento ou colchetes adjacentes somente se elas forem inseridas automaticamente.", "editor.bracketPairColorization.enabled": "Controla se a colorização do par de suportes está ou não habilitada. Use 'workbench.colorCustomizations' para sobrepor as cores de realce do par de braquetes.", + "editor.bracketPairColorization.independentColorPoolPerBracketType": "Controla se cada tipo de suporte tem seu próprio pool de cores independente.", "editor.codeLensFontSize": "Controla o tamanho da fonte em pixels para a CodeLens. Quando ajustado para `0', 90% do `#editor.fontSize#' é utilizado.", "editor.find.autoFindInSelection0": "Nunca ative o Find in Selection automaticamente (padrão).", "editor.find.autoFindInSelection1": "Ative sempre a opção Find in Selection automaticamente.", @@ -88,13 +102,23 @@ "editor.guides.bracketPairsHorizontal1": "Possibilita guias horizontais somente para o par de suportes ativos.", "editor.guides.bracketPairsHorizontal2": "Desativa as guias de par de suportes horizontais.", "editor.guides.highlightActiveBracketPair": "Controla se o editor deve destacar o par de suportes ativos.", + "editor.guides.highlightActiveIndentation0": "Destaca o guia de travessão ativo.", + "editor.guides.highlightActiveIndentation1": "Destaca o guia de travessão ativo, mesmo que as guias de parênteses sejam destacadas.", + "editor.guides.highlightActiveIndentation2": "Não destacar o guia de travessão ativo.", "editor.hover.above": "Prefira mostrar acima da linha, se houver espaço.", "editor.inlayHints.enabled": "Possibilita as dicas de embutir no editor.", + "editor.inlayHints.enabled0": "As dicas de Inlay estão habilitadas", + "editor.inlayHints.enabled1": "Dicas de Inlay estão mostrando por padrão e se escondem ao segurar `Ctrl+Alt`.", + "editor.inlayHints.enabled2": "Dicas de Inlay são ocultadas por padrão e mostram quando se segura `Ctrl+Alt`.", + "editor.inlayHints.enabled3": "As dicas da Inlay estão desativadas", "editor.inlayHints.fontFamily": "Controla a família de fontes de dicas de incrustação no editor. Quando ajustado para vazio, é utilizado o `#editor.fontFamily#'.", "editor.inlayHints.fontSize": "Controla o tamanho da fonte das dicas de inlay no editor. Um padrão de 90% de `#editor.fontSize#` é utilizado quando o valor configurado é menor que `5` ou maior que o tamanho da fonte do editor.", "editor.inlineSuggest.enabled": "Controla se as sugestões em linha devem ser mostradas automaticamente no editor.", "editor.language.colorizedBracketPairs": "Define os pares de parênteses que são coloridos por seu nível de agrupamento, se a colorização dos pares de parênteses estiver habilitada.", "editor.lineHeight": "Controla a altura da linha.\n - Use 0 para calcular automaticamente a altura da linha a partir do tamanho da fonte.\n - Valores entre 0 e 8 serão usados como um multiplicador com o tamanho da fonte.\n - Valores maiores ou iguais a 8 serão usados como valores efetivos.", + "editor.quickSuggestions0": "Sugestões rápidas mostram dentro do widget sugerir", + "editor.quickSuggestions1": "Sugestões rápidas mostram como texto fantasma", + "editor.quickSuggestions2": "Sugestões rápidas são desativadas", "editor.renderLineHighlightOnlyWhenFocus": "Controla se o editor deve destacar a linha atual apenas quando o editor está focado.", "editor.renderWhitespace3": "Renderizar apenas caracteres de espaços em branco.", "editor.scrollbar.horizontal": "Controla a visibilidade da barra de rolagem horizontal.", @@ -170,6 +194,7 @@ "newPlugin": "Construindo um Novo Plugin" }, "git": { + "aFewSecondsAgo": "alguns segundos atrás", "addSignedOff": "Adicionar Signed-off-by", "amendReuseMessag": "Para reutilizar a última mensagem de compromisso, pressione 'Enter' ou 'Escape' para cancelar.", "amendRewrite": "Reescrever mensagem de compromisso anterior. Pressione 'Enter' para confirmar ou 'Escape' para cancelar.", @@ -203,7 +228,8 @@ "keybindingCollidesValidation": "a chave de encadernação colide atualmente", "requiredKeybindingValidation": "valor vinculante é necessário", "resetKeybindingConfirmation": "Você realmente quer redefinir esta ligação de chave para seu valor padrão?", - "resetKeybindingTitle": "Redefinir a encadernação para {0}" + "resetKeybindingTitle": "Redefinir a encadernação para {0}", + "resetMultipleKeybindingsWarning": "Se existirem múltiplas ligações de teclas para este comando, todas elas serão reiniciadas." }, "localize": { "offlineTooltip": "Não pode ser conectado ao backend." @@ -354,10 +380,14 @@ "typeHierarchy": "Tipo Hierarquia" }, "vsx-registry": { - "openVSX": "Registro VSX aberto", + "errorFetching": "Extensões de erro de busca.", "recommendedExtensions": "Uma lista dos nomes das extensões recomendadas para uso neste espaço de trabalho.", "searchPlaceholder": "Pesquisar extensões em {0}", - "showRecommendedExtensions": "Controla se as notificações são mostradas para recomendações de extensão." + "showRecommendedExtensions": "Controla se as notificações são mostradas para recomendações de extensão.", + "vsx-extensions-contribution": { + "update-version-uninstall-error": "Erro ao remover a extensão: {0}.", + "update-version-version-error": "Falha na instalação da versão {0} de {1}." + } }, "webview": { "goToReadme": "Ir para o LEIAME", diff --git a/packages/core/i18n/nls.pt-pt.json b/packages/core/i18n/nls.pt-pt.json index 3d400b431b832..49e0da0a9a5cd 100644 --- a/packages/core/i18n/nls.pt-pt.json +++ b/packages/core/i18n/nls.pt-pt.json @@ -1,4 +1,5 @@ { + "disassemblyView": "Vista de Desmontagem", "theia": { "callhierarchy": { "noCallers": "Não foram detectadas pessoas que tenham telefonado.", @@ -58,18 +59,31 @@ "addConfigurationPlaceholder": "Seleccione a raiz do espaço de trabalho para adicionar configuração a", "continueAll": "Continuar Tudo", "copyExpressionValue": "Valor de Expressão da Cópia", + "disassembly-view": { + "show-source-code": "Mostrar Código Fonte em Vista de Desmontagem." + }, + "instruction-breakpoint": "Ponto de Interrupção da Instrução", + "instructionAddress": "Endereço", + "instructionBytes": "Bytes", + "instructionNotAvailable": "Desmontagem não disponível.", + "instructionText": "Instrução", "missingConfiguration": "Configuração dinâmica '{0}:{1}' está em falta ou não é aplicável", + "open-disassembly-view": "Vista de Desmontagem Aberta", "pauseAll": "Pausa Todos", "reveal": "Revelar", "threads": "Tópicos", "toggleTracing": "Activar/desactivar as comunicações de rastreio com adaptadores de depuração" }, + "disassembly-view": { + "disassemblyTableColumnLabel": "instruções" + }, "editor": { "diffEditor.maxFileSize": "Tamanho máximo do ficheiro em MB para o qual se devem calcular diffs. Utilizar 0 para sem limite.", "editor.accessibilityPageSize": "Controla o número de linhas no editor que podem ser lidas por um leitor de ecrã de uma só vez. Quando detectamos um leitor de ecrã, definimos automaticamente o valor por defeito de 500. Aviso: isto tem uma implicação de desempenho para números maiores do que o padrão.", "editor.autoClosingDelete": "Controla se o editor deve remover aspas ou parênteses de fecho adjacentes ao apagar.", "editor.autoClosingDelete1": "Retirar as aspas ou parênteses de fecho adjacentes apenas se forem automaticamente inseridas.", "editor.bracketPairColorization.enabled": "Controla se a colorização do par de parênteses está ou não activada. Utilizar 'workbench.colorCustomizations' para anular as cores de realce do par de parênteses.", + "editor.bracketPairColorization.independentColorPoolPerBracketType": "Controla se cada tipo de suporte tem a sua própria piscina de cores independente.", "editor.codeLensFontSize": "Controla o tamanho da fonte em pixels para a CodeLens. Quando definido para `0`, 90% do `#editor.fontSize#` é utilizado.", "editor.find.autoFindInSelection0": "Nunca ligar o Find in Selection automaticamente (por defeito).", "editor.find.autoFindInSelection1": "Ligar sempre o Find in Selection automaticamente.", @@ -88,13 +102,23 @@ "editor.guides.bracketPairsHorizontal1": "Possibilita guias horizontais apenas para o par de suportes activos.", "editor.guides.bracketPairsHorizontal2": "Desactiva as guias de par de suportes horizontais.", "editor.guides.highlightActiveBracketPair": "Controla se o editor deve destacar o par de parênteses activos.", + "editor.guides.highlightActiveIndentation0": "Destaca o guia de travessão activo.", + "editor.guides.highlightActiveIndentation1": "Realça o guia de travessão activo, mesmo que os guias de parênteses sejam realçados.", + "editor.guides.highlightActiveIndentation2": "Não destacar o guia de travessão activo.", "editor.hover.above": "Prefira mostrar acima da linha, se houver espaço.", "editor.inlayHints.enabled": "Possibilita as dicas de inlay no editor.", + "editor.inlayHints.enabled0": "As dicas de Inlay estão activadas", + "editor.inlayHints.enabled1": "Dicas de Inlay estão a mostrar por defeito e escondem-se quando se segura \"Ctrl+Alt\".", + "editor.inlayHints.enabled2": "Dicas de Inlay são ocultadas por defeito e mostram quando se mantém 'Ctrl+Alt'.", + "editor.inlayHints.enabled3": "As pistas de Inlay estão desactivadas", "editor.inlayHints.fontFamily": "Controla a família de fontes de inlay dicas no editor. Quando definido para vazio, é utilizado o `#editor.fontFamily#`.", "editor.inlayHints.fontSize": "Controla o tamanho do tipo de letra das dicas de inlay no editor. Um padrão de 90% de `#editor.fontSize#` é utilizado quando o valor configurado é inferior a `5` ou superior ao tamanho da fonte do editor.", "editor.inlineSuggest.enabled": "Controla se deve mostrar automaticamente as sugestões em linha no editor.", "editor.language.colorizedBracketPairs": "Define os pares de parênteses que são coloridos pelo seu nível de aninhamento se a colorização dos pares de parênteses estiver habilitada.", "editor.lineHeight": "Controla a altura da linha.\n - Utilizar 0 para calcular automaticamente a altura da linha a partir do tamanho da fonte.\n - Os valores entre 0 e 8 serão utilizados como multiplicador com o tamanho da fonte.\n - Valores maiores ou iguais a 8 serão utilizados como valores efectivos.", + "editor.quickSuggestions0": "Sugestões rápidas mostram dentro do widget sugerir", + "editor.quickSuggestions1": "Sugestões rápidas mostram como texto fantasma", + "editor.quickSuggestions2": "Sugestões rápidas são desactivadas", "editor.renderLineHighlightOnlyWhenFocus": "Controla se o editor deve destacar a linha actual apenas quando o editor está concentrado.", "editor.renderWhitespace3": "Renderizar apenas caracteres de espaços em branco.", "editor.scrollbar.horizontal": "Controla a visibilidade da barra de deslocamento horizontal.", @@ -170,6 +194,7 @@ "newPlugin": "Construir um Novo Plugin" }, "git": { + "aFewSecondsAgo": "há alguns segundos", "addSignedOff": "Adicionar Signed-off-by", "amendReuseMessag": "Para reutilizar a última mensagem de compromisso, prima 'Enter' ou 'Escape' para cancelar.", "amendRewrite": "Reescrever mensagem de compromisso anterior. Prima 'Enter' para confirmar ou 'Escape' para cancelar.", @@ -203,7 +228,8 @@ "keybindingCollidesValidation": "ligação de chaves actualmente colide", "requiredKeybindingValidation": "é necessário um valor de encadernação", "resetKeybindingConfirmation": "Quer mesmo repor esta encadernação de chave no seu valor por defeito?", - "resetKeybindingTitle": "Repor a encadernação para {0}" + "resetKeybindingTitle": "Repor a encadernação para {0}", + "resetMultipleKeybindingsWarning": "Se existirem múltiplas ligações de teclas para este comando, todas elas serão reiniciadas." }, "localize": { "offlineTooltip": "Não se pode ligar ao backend." @@ -354,10 +380,14 @@ "typeHierarchy": "Tipo Hierarquia" }, "vsx-registry": { - "openVSX": "Abrir Registo VSX", + "errorFetching": "Extensões de erro de busca.", "recommendedExtensions": "Uma lista dos nomes das extensões recomendadas para utilização neste espaço de trabalho.", "searchPlaceholder": "Pesquisar extensões em {0}", - "showRecommendedExtensions": "Controla se as notificações são mostradas para recomendações de extensão." + "showRecommendedExtensions": "Controla se as notificações são mostradas para recomendações de extensão.", + "vsx-extensions-contribution": { + "update-version-uninstall-error": "Erro ao retirar a extensão: {0}.", + "update-version-version-error": "Falha na instalação da versão {0} de {1}." + } }, "webview": { "goToReadme": "Ir para LEIAME", diff --git a/packages/core/i18n/nls.ru.json b/packages/core/i18n/nls.ru.json index 5088cf4db869b..decc6f03a97f5 100644 --- a/packages/core/i18n/nls.ru.json +++ b/packages/core/i18n/nls.ru.json @@ -1,4 +1,5 @@ { + "disassemblyView": "Вид в разобранном виде", "theia": { "callhierarchy": { "noCallers": "Вызывающих не обнаружено.", @@ -58,18 +59,31 @@ "addConfigurationPlaceholder": "Выберите корень рабочего пространства для добавления конфигурации", "continueAll": "Продолжить все", "copyExpressionValue": "Копирование значения выражения", + "disassembly-view": { + "show-source-code": "Показать исходный код в режиме просмотра разборки." + }, + "instruction-breakpoint": "Точка останова инструкции", + "instructionAddress": "Адрес", + "instructionBytes": "Байты", + "instructionNotAvailable": "Разборка недоступна.", + "instructionText": "Инструкция", "missingConfiguration": "Динамическая конфигурация '{0}:{1}' отсутствует или неприменима", + "open-disassembly-view": "Открытый вид разборки", "pauseAll": "Приостановить все", "reveal": "Раскрыть", "threads": "Нитки", "toggleTracing": "Включение/выключение трассировки связи с отладочными адаптерами" }, + "disassembly-view": { + "disassemblyTableColumnLabel": "инструкции" + }, "editor": { "diffEditor.maxFileSize": "Максимальный размер файла в МБ, для которого следует вычислять различия. Используйте 0 для отсутствия ограничений.", "editor.accessibilityPageSize": "Управляет количеством строк в редакторе, которые могут быть одновременно считаны устройством чтения с экрана. Когда мы обнаруживаем устройство чтения с экрана, мы автоматически устанавливаем значение по умолчанию 500. Внимание: это имеет последствия для производительности при числах, превышающих значение по умолчанию.", "editor.autoClosingDelete": "Управляет тем, должен ли редактор удалять соседние закрывающие кавычки или скобки при удалении.", "editor.autoClosingDelete1": "Удаляйте соседние закрывающие кавычки или скобки, только если они были вставлены автоматически.", "editor.bracketPairColorization.enabled": "Управляет тем, включена или нет раскраска пар скобок. Используйте 'workbench.colorCustomizations', чтобы переопределить цвета подсветки скобок.", + "editor.bracketPairColorization.independentColorPoolPerBracketType": "Управляет тем, имеет ли каждый тип скобок свой собственный независимый пул цветов.", "editor.codeLensFontSize": "Управляет размером шрифта в пикселях для CodeLens. Если установлено значение `0`, используется 90% от `#editor.fontSize#`.", "editor.find.autoFindInSelection0": "Никогда не включать функцию \"Найти в выделенном\" автоматически (по умолчанию).", "editor.find.autoFindInSelection1": "Всегда автоматически включайте функцию \"Найти в выделенном\".", @@ -88,13 +102,23 @@ "editor.guides.bracketPairsHorizontal1": "Включает горизонтальные направляющие только для активной пары скобок.", "editor.guides.bracketPairsHorizontal2": "Отключает горизонтальные направляющие пары кронштейнов.", "editor.guides.highlightActiveBracketPair": "Управляет тем, должен ли редактор выделять активную пару скобок.", + "editor.guides.highlightActiveIndentation0": "Выделяет активную направляющую отступа.", + "editor.guides.highlightActiveIndentation1": "Выделяет активную направляющую отступа, даже если выделены направляющие скобок.", + "editor.guides.highlightActiveIndentation2": "Не выделяйте активную направляющую отступа.", "editor.hover.above": "Предпочитайте показывать над строкой, если есть свободное место.", "editor.inlayHints.enabled": "Включает подсказки инкрустации в редакторе.", + "editor.inlayHints.enabled0": "Включены подсказки для инкрустации", + "editor.inlayHints.enabled1": "Подсказки инкрустации отображаются по умолчанию и скрываются при нажатии `Ctrl+Alt`.", + "editor.inlayHints.enabled2": "Подсказки инкрустации скрыты по умолчанию и отображаются при нажатии `Ctrl+Alt`.", + "editor.inlayHints.enabled3": "Подсказки для инкрустации отключены", "editor.inlayHints.fontFamily": "Управляет семейством шрифтов подсказок инкрустации в редакторе. Если установлено значение empty, используется `#editor.fontFamily#`.", "editor.inlayHints.fontSize": "Управляет размером шрифта подсказок инлея в редакторе. По умолчанию используется 90% от `#editor.fontSize#`, если настроенное значение меньше `5` или больше размера шрифта редактора.", "editor.inlineSuggest.enabled": "Управляет тем, показывать ли автоматически встроенные предложения в редакторе.", "editor.language.colorizedBracketPairs": "Определяет пары скобок, которые раскрашиваются по уровню вложенности, если раскраска пар скобок включена.", "editor.lineHeight": "Управляет высотой строки.\n - Используйте значение 0, чтобы автоматически вычислить высоту строки на основе размера шрифта.\n - Значения от 0 до 8 будут использоваться как множитель с размером шрифта.\n - Значения больше или равные 8 будут использоваться как эффективные значения.", + "editor.quickSuggestions0": "Быстрые предложения отображаются внутри виджета предложений", + "editor.quickSuggestions1": "Быстрые предложения отображаются в виде призрачного текста", + "editor.quickSuggestions2": "Быстрые предложения отключены", "editor.renderLineHighlightOnlyWhenFocus": "Управляет тем, должен ли редактор отображать подсветку текущей строки только тогда, когда редактор сфокусирован.", "editor.renderWhitespace3": "Передача только пробельных символов в конце строки.", "editor.scrollbar.horizontal": "Управляет видимостью горизонтальной полосы прокрутки.", @@ -170,6 +194,7 @@ "newPlugin": "Создание нового плагина" }, "git": { + "aFewSecondsAgo": "несколько секунд назад", "addSignedOff": "Добавить подписанный", "amendReuseMessag": "Чтобы повторно использовать последнее сообщение фиксации, нажмите 'Enter' или 'Escape' для отмены.", "amendRewrite": "Переписать предыдущее сообщение о фиксации. Нажмите 'Enter' для подтверждения или 'Escape' для отмены.", @@ -203,7 +228,8 @@ "keybindingCollidesValidation": "привязка клавиш в настоящее время сталкивается", "requiredKeybindingValidation": "требуется значение привязки клавиш", "resetKeybindingConfirmation": "Вы действительно хотите сбросить привязку к клавишам до значения по умолчанию?", - "resetKeybindingTitle": "Сброс привязки клавиш для {0}" + "resetKeybindingTitle": "Сброс привязки клавиш для {0}", + "resetMultipleKeybindingsWarning": "Если для этой команды существует несколько привязок клавиш, все они будут сброшены." }, "localize": { "offlineTooltip": "Не удается подключиться к бэкенду." @@ -354,10 +380,14 @@ "typeHierarchy": "Иерархия типов" }, "vsx-registry": { - "openVSX": "Открыть реестр VSX", + "errorFetching": "Ошибка при получении расширений.", "recommendedExtensions": "Список имен расширений, рекомендуемых для использования в данной рабочей области.", "searchPlaceholder": "Поисковые расширения в {0}", - "showRecommendedExtensions": "Служит для управления отображением уведомлений о рекомендациях расширения." + "showRecommendedExtensions": "Служит для управления отображением уведомлений о рекомендациях расширения.", + "vsx-extensions-contribution": { + "update-version-uninstall-error": "Ошибка при удалении расширения: {0}.", + "update-version-version-error": "Не удалось установить версию {0} сайта {1}." + } }, "webview": { "goToReadme": "Перейти к README", diff --git a/packages/core/i18n/nls.zh-cn.json b/packages/core/i18n/nls.zh-cn.json index 0ebf1096865ae..fc44e39f3b42a 100644 --- a/packages/core/i18n/nls.zh-cn.json +++ b/packages/core/i18n/nls.zh-cn.json @@ -1,4 +1,5 @@ { + "disassemblyView": "拆卸视图", "theia": { "callhierarchy": { "noCallers": "没有发现来电者。", @@ -58,18 +59,31 @@ "addConfigurationPlaceholder": "选择要添加配置的工作区根", "continueAll": "继续所有", "copyExpressionValue": "复制表达式的值", + "disassembly-view": { + "show-source-code": "在反汇编视图中显示源代码。" + }, + "instruction-breakpoint": "指令断点", + "instructionAddress": "地址", + "instructionBytes": "字节数", + "instructionNotAvailable": "不提供拆卸服务。", + "instructionText": "指示", "missingConfiguration": "动态配置'{0}:{1}'缺少或不适用", + "open-disassembly-view": "开放式拆卸视图", "pauseAll": "暂停所有", "reveal": "显示", "threads": "线程", "toggleTracing": "启用/禁用与调试适配器的跟踪通信" }, + "disassembly-view": { + "disassemblyTableColumnLabel": "说明" + }, "editor": { "diffEditor.maxFileSize": "要为其计算差异的最大文件大小(MB)。使用 0 表示无限制。", "editor.accessibilityPageSize": "控制编辑器中可由屏幕阅读器一次读出的行数。当检测到屏幕阅读器时,会自动将默认值设置为 500。警告: 如果行数大于默认值,可能会影响性能。", "editor.autoClosingDelete": "控制在删除时编辑器是否应删除相邻的右引号或右方括号。", "editor.autoClosingDelete1": "只有在相邻的闭合引号或方括号被自动插入的情况下,才能删除它们。", "editor.bracketPairColorization.enabled": "控制是否已启用括号对着色。使用 `#workbench.colorCustomizations#` 替代括号高亮颜色。", + "editor.bracketPairColorization.independentColorPoolPerBracketType": "控制每个托架类型是否有自己独立的颜色池。", "editor.codeLensFontSize": "控制 CodeLens 的字号(以像素为单位)。设置为 `0` 时,将使用 90% 的 `#editor.fontSize#`。", "editor.find.autoFindInSelection0": "从不自动打开“在选定内容中查找”(默认)。", "editor.find.autoFindInSelection1": "始终自动打开“在选定内容中查找”。", @@ -88,13 +102,23 @@ "editor.guides.bracketPairsHorizontal1": "只对活动支架对启用水平导向。", "editor.guides.bracketPairsHorizontal2": "禁用水平托架对导板。", "editor.guides.highlightActiveBracketPair": "控制编辑器是否应突出显示活动的括号对。", + "editor.guides.highlightActiveIndentation0": "突出活动缩进指南。", + "editor.guides.highlightActiveIndentation1": "突出显示活动的缩进指南,即使括号内的指南被突出显示。", + "editor.guides.highlightActiveIndentation2": "不要突出显示活动缩进指南。", "editor.hover.above": "如果有空间的话,更倾向于显示悬停在该线之上。", "editor.inlayHints.enabled": "启用编辑器中的内联提示。", + "editor.inlayHints.enabled0": "镶嵌提示已启用", + "editor.inlayHints.enabled1": "镶嵌提示默认显示,按住 \"Ctrl+Alt \"时隐藏。", + "editor.inlayHints.enabled2": "镶嵌提示默认是隐藏的,当按住`Ctrl+Alt`时显示。", + "editor.inlayHints.enabled3": "镶嵌提示被禁用", "editor.inlayHints.fontFamily": "控制编辑器中内联提示的字体家族。当设置为空时,使用`#editor.fontFamily#`。", "editor.inlayHints.fontSize": "控制编辑器中内联提示的字体大小。当配置值小于`5'或大于编辑器的字体大小时,默认使用`#editor.fontSize#`的90%。", "editor.inlineSuggest.enabled": "控制是否在编辑器中自动显示内联建议。", "editor.language.colorizedBracketPairs": "如果启用了括号对着色,则定义括号对按其嵌套级别进行着色。", "editor.lineHeight": "控制行高。\n - 使用0可以根据字体大小自动计算行高。\n - 0到8之间的值将被用作字体大小的乘数。\n - 大于或等于8的值将作为有效值使用。", + "editor.quickSuggestions0": "快速建议显示在建议小部件内", + "editor.quickSuggestions1": "快速建议显示为幽灵文本", + "editor.quickSuggestions2": "快速建议被禁用", "editor.renderLineHighlightOnlyWhenFocus": "控制编辑器是否应该只在编辑器被聚焦时呈现当前行的高亮。", "editor.renderWhitespace3": "只渲染尾部的空白字符。", "editor.scrollbar.horizontal": "控制水平滚动条的可见性。", @@ -170,6 +194,7 @@ "newPlugin": "构建一个新的插件" }, "git": { + "aFewSecondsAgo": "几秒钟前", "addSignedOff": "添加 \"已签署\"。", "amendReuseMessag": "要重新使用最后一条提交信息,请按'Enter'或'Escape'来取消。", "amendRewrite": "重写之前的提交信息。按'Enter'键确认或按'Escape'键取消。", @@ -203,7 +228,8 @@ "keybindingCollidesValidation": "键盘绑定目前碰撞", "requiredKeybindingValidation": "键盘绑定值是必需的", "resetKeybindingConfirmation": "你真的想把这个按键绑定重置为默认值吗?", - "resetKeybindingTitle": "重置{0}的键盘绑定" + "resetKeybindingTitle": "重置{0}的键盘绑定", + "resetMultipleKeybindingsWarning": "如果这个命令存在多个按键绑定,所有的按键都将被重置。" }, "localize": { "offlineTooltip": "无法连接到后端。" @@ -354,10 +380,14 @@ "typeHierarchy": "类型层次结构" }, "vsx-registry": { - "openVSX": "打开VSX注册表", + "errorFetching": "取出扩展程序时出错。", "recommendedExtensions": "建议在该工作区使用的扩展名称的列表。", "searchPlaceholder": "在{0}中搜索扩展", - "showRecommendedExtensions": "控制是否显示扩展建议的通知。" + "showRecommendedExtensions": "控制是否显示扩展建议的通知。", + "vsx-extensions-contribution": { + "update-version-uninstall-error": "删除扩展名时出错:{0}.", + "update-version-version-error": "{0} 在安装{1} 的版本时失败。" + } }, "webview": { "goToReadme": "转到README", diff --git a/packages/core/package.json b/packages/core/package.json index 1434d8b3fa6a9..ff349d3be5143 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@theia/core", - "version": "1.27.0", + "version": "1.28.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.27.0", - "@theia/request": "1.27.0", + "@theia/application-package": "1.28.0", + "@theia/request": "1.28.0", "@types/body-parser": "^1.16.4", "@types/cookie": "^0.3.3", "@types/dompurify": "^2.2.2", @@ -26,8 +26,8 @@ "@types/lodash.debounce": "4.0.3", "@types/lodash.throttle": "^4.1.3", "@types/markdown-it": "^12.2.3", - "@types/react": "^16.8.0", - "@types/react-dom": "^16.8.0", + "@types/react": "^18.0.15", + "@types/react-dom": "^18.0.6", "@types/react-virtualized": "^9.18.3", "@types/route-parser": "^0.1.1", "@types/safer-buffer": "^2.1.0", @@ -58,8 +58,8 @@ "nsfw": "^2.1.2", "p-debounce": "^2.1.0", "perfect-scrollbar": "^1.3.0", - "react": "^16.8.0", - "react-dom": "^16.8.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", "react-tooltip": "^4.2.21", "react-virtualized": "^9.20.0", "reflect-metadata": "^0.1.10", @@ -110,6 +110,7 @@ "fuzzy", "inversify", "react-dom", + "react-dom/client", "react-virtualized", "vscode-languageserver-protocol", "vscode-uri" @@ -194,8 +195,8 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0", - "@theia/re-exports": "1.27.0", + "@theia/ext-scripts": "1.28.0", + "@theia/re-exports": "1.28.0", "minimist": "^1.2.0" }, "nyc": { diff --git a/packages/core/shared/react-dom/client/index.d.ts b/packages/core/shared/react-dom/client/index.d.ts new file mode 100644 index 0000000000000..f34a1f2a76d69 --- /dev/null +++ b/packages/core/shared/react-dom/client/index.d.ts @@ -0,0 +1 @@ +export * from 'react-dom/client'; diff --git a/packages/core/shared/react-dom/client/index.js b/packages/core/shared/react-dom/client/index.js new file mode 100644 index 0000000000000..ed832bc3aac9c --- /dev/null +++ b/packages/core/shared/react-dom/client/index.js @@ -0,0 +1 @@ +module.exports = require('react-dom/client'); diff --git a/packages/core/src/browser/breadcrumbs/breadcrumbs-renderer.tsx b/packages/core/src/browser/breadcrumbs/breadcrumbs-renderer.tsx index 89966496d77ca..1166d4dbf324c 100644 --- a/packages/core/src/browser/breadcrumbs/breadcrumbs-renderer.tsx +++ b/packages/core/src/browser/breadcrumbs/breadcrumbs-renderer.tsx @@ -23,7 +23,6 @@ import PerfectScrollbar from 'perfect-scrollbar'; import URI from '../../common/uri'; import { Emitter, Event } from '../../common'; import { BreadcrumbPopupContainer } from './breadcrumb-popup-container'; -import { DisposableCollection } from '../../common/disposable'; import { CorePreferences } from '../core-preferences'; import { Breadcrumb, Styles } from './breadcrumbs-constants'; import { LabelProvider } from '../label-provider'; @@ -56,7 +55,6 @@ export class BreadcrumbsRenderer extends ReactRenderer { protected breadcrumbs: Breadcrumb[] = []; protected popup: BreadcrumbPopupContainer | undefined; protected scrollbar: PerfectScrollbar | undefined; - protected toDispose: DisposableCollection = new DisposableCollection(); get active(): boolean { return !!this.breadcrumbs.length; diff --git a/packages/core/src/browser/common-frontend-contribution.ts b/packages/core/src/browser/common-frontend-contribution.ts index 9aac0b62fabaa..1a920732a89b3 100644 --- a/packages/core/src/browser/common-frontend-contribution.ts +++ b/packages/core/src/browser/common-frontend-contribution.ts @@ -39,20 +39,20 @@ import { StorageService } from './storage-service'; import { Navigatable } from './navigatable'; import { QuickViewService } from './quick-input/quick-view-service'; import { environment } from '@theia/application-package/lib/environment'; -import { IconThemeService } from './icon-theme-service'; +import { IconTheme, IconThemeService } from './icon-theme-service'; import { ColorContribution } from './color-application-contribution'; import { ColorRegistry } from './color-registry'; import { Color } from '../common/color'; import { CoreConfiguration, CorePreferences } from './core-preferences'; import { ThemeService } from './theming'; -import { PreferenceService, PreferenceScope, PreferenceChangeEvent } from './preferences'; +import { PreferenceService, PreferenceChangeEvent } from './preferences'; import { ClipboardService } from './clipboard-service'; import { EncodingRegistry } from './encoding-registry'; import { UTF8 } from '../common/encodings'; import { EnvVariablesServer } from '../common/env-variables'; import { AuthenticationService } from './authentication-service'; import { FormatType, Saveable, SaveOptions } from './saveable'; -import { QuickInputService, QuickPick, QuickPickItem, QuickPickItemOrSeparator } from './quick-input'; +import { QuickInputService, QuickPickItem, QuickPickItemOrSeparator } from './quick-input'; import { AsyncLocalizationProvider } from '../common/i18n/localization'; import { nls } from '../common/nls'; import { CurrentWidgetCommandAdapter } from './shell/current-widget-command-adapter'; @@ -430,12 +430,8 @@ export class CommonFrontendContribution implements FrontendApplicationContributi this.registerCtrlWHandling(); this.updateStyles(); - this.updateThemeFromPreference('workbench.colorTheme'); - this.updateThemeFromPreference('workbench.iconTheme'); this.preferences.ready.then(() => this.setSashProperties()); this.preferences.onPreferenceChanged(e => this.handlePreferenceChange(e, app)); - this.themeService.onDidColorThemeChange(() => this.updateThemePreference('workbench.colorTheme')); - this.iconThemes.onDidChangeCurrent(() => this.updateThemePreference('workbench.iconTheme')); app.shell.leftPanelHandler.addBottomMenu({ id: 'settings-menu', @@ -475,43 +471,12 @@ export class CommonFrontendContribution implements FrontendApplicationContributi this.pinnedKey.set(value); } - protected updateThemePreference(preferenceName: 'workbench.colorTheme' | 'workbench.iconTheme'): void { - const inspect = this.preferenceService.inspect(preferenceName); - const workspaceValue = inspect && inspect.workspaceValue; - const userValue = inspect && inspect.globalValue; - const value = workspaceValue || userValue; - const newValue = preferenceName === 'workbench.colorTheme' ? this.themeService.getCurrentTheme().id : this.iconThemes.current; - if (newValue !== value) { - const scope = workspaceValue !== undefined ? PreferenceScope.Workspace : PreferenceScope.User; - this.preferenceService.set(preferenceName, newValue, scope); - } - } - - protected updateThemeFromPreference(preferenceName: 'workbench.colorTheme' | 'workbench.iconTheme'): void { - const inspect = this.preferenceService.inspect(preferenceName); - const workspaceValue = inspect && inspect.workspaceValue; - const userValue = inspect && inspect.globalValue; - const value = workspaceValue || userValue; - if (value !== undefined) { - if (preferenceName === 'workbench.colorTheme') { - this.themeService.setCurrentTheme(value || this.themeService.defaultTheme.id); - } else { - this.iconThemes.current = value || this.iconThemes.default.id; - } - } - } - protected handlePreferenceChange(e: PreferenceChangeEvent, app: FrontendApplication): void { switch (e.preferenceName) { case 'workbench.editor.highlightModifiedTabs': { this.updateStyles(); break; } - case 'workbench.colorTheme': - case 'workbench.iconTheme': { - this.updateThemeFromPreference(e.preferenceName); - break; - } case 'window.menuBarVisibility': { const { newValue } = e; const mainMenuId = 'main-menu'; @@ -554,6 +519,8 @@ export class CommonFrontendContribution implements FrontendApplicationContributi onStop(): void { const recent = this.commandRegistry.recent; this.storageService.setData<{ recent: Command[] }>(RECENT_COMMANDS_STORAGE_KEY, { recent }); + window.localStorage.setItem(IconThemeService.STORAGE_KEY, this.iconThemes.current); + window.localStorage.setItem(ThemeService.STORAGE_KEY, this.themeService.getCurrentTheme().id); } protected initResourceContextKeys(): void { @@ -971,6 +938,21 @@ export class CommonFrontendContribution implements FrontendApplicationContributi return open(this.openerService, untitledUri); } }); + 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, + execute: () => { + const widget = this.shell.mainAreaTabBars[index]?.currentTitle?.owner; + if (widget) { + this.shell.activateWidget(widget.id); + } + } + }); + } + } + + protected getOrdinalNumbers(): readonly string[] { + return ['First', 'Second', 'Third', 'Fourth', 'Fifth', 'Sixth', 'Seventh', 'Eighth', 'Ninth']; } protected isElectron(): boolean { @@ -1109,6 +1091,12 @@ export class CommonFrontendContribution implements FrontendApplicationContributi keybinding: this.isElectron() ? 'ctrlcmd+n' : 'alt+n', } ); + for (const [index, ordinal] of this.getOrdinalNumbers().entries()) { + registry.registerKeybinding({ + command: `workbench.action.focus${ordinal}EditorGroup`, + keybinding: `ctrlcmd+${(index + 1) % 10}`, + }); + } } protected async save(options?: SaveOptions): Promise { @@ -1173,10 +1161,16 @@ export class CommonFrontendContribution implements FrontendApplicationContributi } protected selectIconTheme(): void { - let resetTo: string | undefined = this.iconThemes.current; - const previewTheme = debounce((id: string) => this.iconThemes.current = id, 200); + let resetTo: IconTheme | undefined = this.iconThemes.getCurrent(); + const setTheme = (id: string, persist: boolean) => { + const theme = this.iconThemes.getDefinition(id); + if (theme) { + this.iconThemes.setCurrent(theme as IconTheme, persist); + } + }; + const previewTheme = debounce(setTheme, 200); - let items: Array = []; + let items: Array = []; for (const iconTheme of this.iconThemes.definitions) { items.push({ id: iconTheme.id, @@ -1194,17 +1188,17 @@ export class CommonFrontendContribution implements FrontendApplicationContributi this.quickInputService?.showQuickPick(items, { placeholder: nls.localizeByDefault('Select File Icon Theme'), - activeItem: items.find(item => item.id === resetTo), - onDidChangeSelection: (quickPick: QuickPick, selectedItems: Array) => { + activeItem: items.find(item => item.id === resetTo?.id), + onDidChangeSelection: (_, selectedItems) => { resetTo = undefined; - previewTheme(selectedItems[0].id!); + setTheme(selectedItems[0].id, true); }, - onDidChangeActive: (quickPick: QuickPick, activeItems: Array) => { - previewTheme(activeItems[0].id!); + onDidChangeActive: (_, activeItems) => { + previewTheme(activeItems[0].id, false); }, onDidHide: () => { if (resetTo) { - this.iconThemes.current = resetTo; + this.iconThemes.setCurrent(resetTo, false); } } }); @@ -1212,9 +1206,10 @@ export class CommonFrontendContribution implements FrontendApplicationContributi protected selectColorTheme(): void { let resetTo: string | undefined = this.themeService.getCurrentTheme().id; - const previewTheme = debounce((id: string) => this.themeService.setCurrentTheme(id), 200); - - const itemsByTheme: { light: Array, dark: Array, hc: Array } = { light: [], dark: [], hc: [] }; + const setTheme = (id: string, persist: boolean) => this.themeService.setCurrentTheme(id, persist); + const previewTheme = debounce(setTheme, 200); + type QuickPickWithId = QuickPickItem & { id: string }; + const itemsByTheme: { light: Array, dark: Array, hc: Array } = { light: [], dark: [], hc: [] }; for (const theme of this.themeService.getThemes().sort((a, b) => a.label.localeCompare(b.label))) { const themeItems: QuickPickItemOrSeparator[] = itemsByTheme[theme.type]; if (themeItems.length === 0) { @@ -1233,19 +1228,17 @@ export class CommonFrontendContribution implements FrontendApplicationContributi this.quickInputService?.showQuickPick(items, { placeholder: nls.localizeByDefault('Select Color Theme (Up/Down Keys to Preview)'), - activeItem: items.find((item: QuickPickItem) => item.id === resetTo), - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onDidChangeSelection: (quickPick: any, selectedItems: Array) => { + activeItem: items.find(item => item.id === resetTo), + onDidChangeSelection: (_, selectedItems) => { resetTo = undefined; - previewTheme(selectedItems[0].id!); + setTheme(selectedItems[0].id, true); }, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onDidChangeActive: (quickPick: any, activeItems: Array) => { - previewTheme(activeItems[0].id!); + onDidChangeActive: (_, activeItems) => { + previewTheme(activeItems[0].id, false); }, onDidHide: () => { if (resetTo) { - this.themeService.setCurrentTheme(resetTo); + setTheme(resetTo, false); } } }); diff --git a/packages/core/src/browser/decorations-service.ts b/packages/core/src/browser/decorations-service.ts index f0c4b6c7228c7..723893dafb680 100644 --- a/packages/core/src/browser/decorations-service.ts +++ b/packages/core/src/browser/decorations-service.ts @@ -15,6 +15,7 @@ // ***************************************************************************** import { injectable } from 'inversify'; +import { isThenable } from '../common/promise-util'; import { CancellationToken, CancellationTokenSource, Disposable, Emitter, Event } from '../common'; import { TernarySearchTree } from '../common/ternary-search-tree'; import URI from '../common/uri'; @@ -157,12 +158,6 @@ class DecorationProviderWrapper { this.data.set(uri, request); return undefined; } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - function isThenable(obj: any): obj is Promise { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return obj && typeof (>obj).then === 'function'; - } } private keepItem(uri: URI, data: Decoration | undefined): Decoration | undefined { diff --git a/packages/core/src/browser/dialogs/react-dialog.tsx b/packages/core/src/browser/dialogs/react-dialog.tsx index 0ab936c581d19..8cbc9b8f48e07 100644 --- a/packages/core/src/browser/dialogs/react-dialog.tsx +++ b/packages/core/src/browser/dialogs/react-dialog.tsx @@ -15,28 +15,27 @@ // ***************************************************************************** import * as React from 'react'; -import * as ReactDOM from 'react-dom'; import { injectable, inject } from 'inversify'; -import { Disposable, DisposableCollection } from '../../common'; +import { Disposable } from '../../common'; import { Message } from '../widgets'; import { AbstractDialog, DialogProps } from '../dialogs'; +import { createRoot, Root } from 'react-dom/client'; @injectable() export abstract class ReactDialog extends AbstractDialog { - protected readonly onRender = new DisposableCollection(); + protected contentNodeRoot: Root; constructor( @inject(DialogProps) props: DialogProps ) { super(props); - this.toDispose.push(Disposable.create(() => { - ReactDOM.unmountComponentAtNode(this.contentNode); - })); + this.contentNodeRoot = createRoot(this.contentNode); + this.toDispose.push(Disposable.create(() => this.contentNodeRoot.unmount())); } protected override onUpdateRequest(msg: Message): void { super.onUpdateRequest(msg); - ReactDOM.render(<>{this.render()}, this.contentNode, () => this.onRender.dispose()); + this.contentNodeRoot.render(<>{this.render()}); } /** diff --git a/packages/core/src/browser/frontend-application.ts b/packages/core/src/browser/frontend-application.ts index 10043a3165dfb..e25f02554ff81 100644 --- a/packages/core/src/browser/frontend-application.ts +++ b/packages/core/src/browser/frontend-application.ts @@ -26,6 +26,7 @@ import { preventNavigation, parseCssTime, animationFrame } from './browser'; import { CorePreferences } from './core-preferences'; import { WindowService } from './window/window-service'; import { TooltipService } from './tooltip-service'; +import { StopReason } from '../common/frontend-application-state'; /** * Clients can implement to get a callback for contributing widgets to a shell on start. @@ -81,11 +82,11 @@ export interface OnWillStopAction { /** * @resolves to a prepared value to be passed into the `action` function. */ - prepare?: () => MaybePromise; + prepare?: (stopReason?: StopReason) => MaybePromise; /** * @resolves to `true` if it is safe to close the application; `false` otherwise. */ - action: (prepared: T) => MaybePromise; + action: (prepared: T, stopReason?: StopReason) => MaybePromise; /** * A descriptive string for the reason preventing close. */ diff --git a/packages/core/src/browser/icon-theme-service.ts b/packages/core/src/browser/icon-theme-service.ts index 5c870eaf04f0c..3c968fd808c3f 100644 --- a/packages/core/src/browser/icon-theme-service.ts +++ b/packages/core/src/browser/icon-theme-service.ts @@ -19,6 +19,9 @@ import { Emitter } from '../common/event'; import { Disposable, DisposableCollection } from '../common/disposable'; import { LabelProviderContribution, DidChangeLabelEvent } from './label-provider'; import { FrontendApplicationConfigProvider } from './frontend-application-config-provider'; +import { PreferenceService } from './preferences'; + +const ICON_THEME_PREFERENCE_KEY = 'workbench.iconTheme'; export interface IconThemeDefinition { readonly id: string @@ -74,7 +77,7 @@ export class NoneIconTheme implements IconTheme, LabelProviderContribution { @injectable() export class IconThemeService { - protected static STORAGE_KEY = 'iconTheme'; + static readonly STORAGE_KEY = 'iconTheme'; protected readonly onDidChangeEmitter = new Emitter(); readonly onDidChange = this.onDidChangeEmitter.event; @@ -90,27 +93,28 @@ export class IconThemeService { return this._iconThemes.get(id); } - @inject(NoneIconTheme) - protected readonly noneIconTheme: NoneIconTheme; + @inject(NoneIconTheme) protected readonly noneIconTheme: NoneIconTheme; + @inject(PreferenceService) protected readonly preferences: PreferenceService; protected readonly onDidChangeCurrentEmitter = new Emitter(); readonly onDidChangeCurrent = this.onDidChangeCurrentEmitter.event; protected readonly toDeactivate = new DisposableCollection(); + protected activeTheme: IconTheme; + @postConstruct() protected init(): void { - this.initDefaultTheme(); - this.register(this.noneIconTheme); - } - - protected initDefaultTheme(): void { - // If no theme is set yet, we store the desired default theme so it will be applied as soon as it is registered. - // The registration may happen after preference initialization when contributed by a plugin. - // If another theme is set by the user in the meantime, the local storage will be overridden anyway. - if (!window.localStorage.getItem(IconThemeService.STORAGE_KEY) && FrontendApplicationConfigProvider.get().defaultIconTheme) { - window.localStorage.setItem(IconThemeService.STORAGE_KEY, FrontendApplicationConfigProvider.get().defaultIconTheme); - } + this.register(this.fallback); + this.setCurrent(this.fallback, false); + this.preferences.ready.then(() => { + this.validateActiveTheme(); + this.preferences.onPreferencesChanged(changes => { + if (ICON_THEME_PREFERENCE_KEY in changes) { + this.validateActiveTheme(); + } + }); + }); } register(iconTheme: IconTheme): Disposable { @@ -120,10 +124,7 @@ export class IconThemeService { } this._iconThemes.set(iconTheme.id, iconTheme); this.onDidChangeEmitter.fire(undefined); - if (this.toDeactivate.disposed - && window.localStorage.getItem(IconThemeService.STORAGE_KEY) === iconTheme.id) { - this.setCurrent(iconTheme); - } + this.validateActiveTheme(); return Disposable.create(() => this.unregister(iconTheme.id)); } @@ -133,11 +134,10 @@ export class IconThemeService { return undefined; } this._iconThemes.delete(id); - if (window.localStorage.getItem(IconThemeService.STORAGE_KEY) === id) { - window.localStorage.removeItem(IconThemeService.STORAGE_KEY); - this.onDidChangeCurrentEmitter.fire(this.default.id); - } this.onDidChangeEmitter.fire(undefined); + if (id === this.getCurrent().id) { + this.setCurrent(this.default, false); + } return iconTheme; } @@ -146,22 +146,43 @@ export class IconThemeService { } set current(id: string) { - const newCurrent = this._iconThemes.get(id) || this.default; - if (this.getCurrent().id !== newCurrent.id) { + const newCurrent = this._iconThemes.get(id); + if (newCurrent && this.getCurrent().id !== newCurrent.id) { this.setCurrent(newCurrent); } } - protected getCurrent(): IconTheme { - const id = window.localStorage.getItem(IconThemeService.STORAGE_KEY); - return id && this._iconThemes.get(id) || this.default; + getCurrent(): IconTheme { + return this.activeTheme; + } + + /** + * @param persistSetting If `true`, the theme's id will be set as the value of the `workbench.iconTheme` preference. (default: `true`) + */ + setCurrent(newCurrent: IconTheme, persistSetting = true): void { + if (newCurrent !== this.getCurrent()) { + this.toDeactivate.dispose(); + this.toDeactivate.push(newCurrent.activate()); + this.activeTheme = newCurrent; + this.onDidChangeCurrentEmitter.fire(newCurrent.id); + } + if (persistSetting) { + this.preferences.updateValue(ICON_THEME_PREFERENCE_KEY, newCurrent.id); + } + } + + protected getConfiguredTheme(): IconTheme | undefined { + const configuredId = this.preferences.get(ICON_THEME_PREFERENCE_KEY); + return configuredId ? this._iconThemes.get(configuredId) : undefined; } - protected setCurrent(current: IconTheme): void { - window.localStorage.setItem(IconThemeService.STORAGE_KEY, current.id); - this.toDeactivate.dispose(); - this.toDeactivate.push(current.activate()); - this.onDidChangeCurrentEmitter.fire(current.id); + protected validateActiveTheme(): void { + if (this.preferences.isReady) { + const configured = this.getConfiguredTheme(); + if (configured && configured !== this.getCurrent()) { + this.setCurrent(configured, false); + } + } } get default(): IconTheme { @@ -171,9 +192,4 @@ export class IconThemeService { get fallback(): IconTheme { return this.noneIconTheme; } - - protected load(): string | undefined { - return window.localStorage.getItem(IconThemeService.STORAGE_KEY) || undefined; - } - } diff --git a/packages/core/src/browser/label-provider.ts b/packages/core/src/browser/label-provider.ts index b862149f26f47..565246692fc11 100644 --- a/packages/core/src/browser/label-provider.ts +++ b/packages/core/src/browser/label-provider.ts @@ -93,9 +93,8 @@ export interface URIIconReference { uri?: URI } export namespace URIIconReference { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function is(element: any | undefined): element is URIIconReference { - return !!element && typeof element === 'object' && 'kind' in element && element['kind'] === 'uriIconReference'; + export function is(element: unknown): element is URIIconReference { + return !!element && typeof element === 'object' && 'kind' in element && (element as URIIconReference).kind === 'uriIconReference'; } export function create(id: URIIconReference['id'], uri?: URI): URIIconReference { return { kind: 'uriIconReference', id, uri }; 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 469c08bc69408..ce155e75f9c88 100644 --- a/packages/core/src/browser/menu/browser-context-menu-renderer.ts +++ b/packages/core/src/browser/menu/browser-context-menu-renderer.ts @@ -14,8 +14,6 @@ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 // ***************************************************************************** -/* eslint-disable @typescript-eslint/no-explicit-any */ - import { inject, injectable } from 'inversify'; import { Menu } from '../widgets'; import { ContextMenuAccess, ContextMenuRenderer, coordinateFromAnchor, RenderContextMenuOptions } from '../context-menu-renderer'; diff --git a/packages/core/src/browser/menu/browser-menu-plugin.ts b/packages/core/src/browser/menu/browser-menu-plugin.ts index 6ebac56e784da..614d61983c172 100644 --- a/packages/core/src/browser/menu/browser-menu-plugin.ts +++ b/packages/core/src/browser/menu/browser-menu-plugin.ts @@ -285,8 +285,6 @@ export class DynamicMenuWidget extends MenuWidget { } } - protected buildSubmenusCalled = 0; - protected buildSubMenus(parentItems: MenuWidget.IItemOptions[], menu: MenuNode, commands: MenuCommandRegistry): MenuWidget.IItemOptions[] { if (CompoundMenuNode.is(menu) && menu.children.length && this.undefinedOrMatch(menu.when, this.options.context)) { const role = menu === this.menu ? CompoundMenuNodeRole.Group : CompoundMenuNode.getRole(menu); diff --git a/packages/core/src/browser/navigatable-types.ts b/packages/core/src/browser/navigatable-types.ts index 370868afc73fb..a52f39491d139 100644 --- a/packages/core/src/browser/navigatable-types.ts +++ b/packages/core/src/browser/navigatable-types.ts @@ -33,14 +33,14 @@ export interface Navigatable { } export namespace Navigatable { - export function is(arg: Object | undefined): arg is Navigatable { - return !!arg && 'getResourceUri' in arg && 'createMoveToUri' in arg; + export function is(arg: unknown): arg is Navigatable { + return !!arg && typeof arg === 'object' && 'getResourceUri' in arg && 'createMoveToUri' in arg; } } export type NavigatableWidget = BaseWidget & Navigatable; export namespace NavigatableWidget { - export function is(arg: Object | undefined): arg is NavigatableWidget { + export function is(arg: unknown): arg is NavigatableWidget { return arg instanceof BaseWidget && Navigatable.is(arg); } export function* getAffected( @@ -76,8 +76,7 @@ export interface NavigatableWidgetOptions { counter?: number, } export namespace NavigatableWidgetOptions { - export function is(arg: Object | undefined): arg is NavigatableWidgetOptions { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return !!arg && 'kind' in arg && (arg as any).kind === 'navigatable'; + export function is(arg: unknown): arg is NavigatableWidgetOptions { + return !!arg && typeof arg === 'object' && 'kind' in arg && (arg as NavigatableWidgetOptions).kind === 'navigatable'; } } diff --git a/packages/core/src/browser/preferences/injectable-preference-proxy.ts b/packages/core/src/browser/preferences/injectable-preference-proxy.ts index b57ce36feca95..b5addbf63c613 100644 --- a/packages/core/src/browser/preferences/injectable-preference-proxy.ts +++ b/packages/core/src/browser/preferences/injectable-preference-proxy.ts @@ -108,7 +108,7 @@ export class InjectablePreferenceProxy> impl if (this.schema && (this.isFlat || !property.includes('.')) && this.schema.properties[preferenceName]) { const { overrideIdentifier } = this; const toGet = overrideIdentifier ? this.preferences.overridePreferenceName({ overrideIdentifier, preferenceName }) : preferenceName; - return this.getValue(toGet as keyof T & string, undefined as any); // eslint-disable-line @typescript-eslint/no-explicit-any + return this.getValue(toGet as keyof T & string, undefined!); } switch (property) { case 'onPreferenceChanged': diff --git a/packages/core/src/browser/preferences/preference-language-override-service.ts b/packages/core/src/browser/preferences/preference-language-override-service.ts index 8a54239ddb22b..37a3cfddd1c58 100644 --- a/packages/core/src/browser/preferences/preference-language-override-service.ts +++ b/packages/core/src/browser/preferences/preference-language-override-service.ts @@ -23,8 +23,7 @@ export interface OverridePreferenceName { overrideIdentifier: string } export namespace OverridePreferenceName { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function is(arg: any): arg is OverridePreferenceName { + export function is(arg: unknown): arg is OverridePreferenceName { return !!arg && typeof arg === 'object' && 'preferenceName' in arg && 'overrideIdentifier' in arg; } } @@ -37,8 +36,7 @@ export const getOverridePattern = (identifier: string) => `\\[(${identifier})\\] export class PreferenceLanguageOverrideService { protected readonly overrideIdentifiers = new Set(); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - testOverrideValue(name: string, value: any): value is PreferenceSchemaProperties { + testOverrideValue(name: string, value: unknown): value is PreferenceSchemaProperties { return PreferenceSchemaProperties.is(value) && OVERRIDE_PROPERTY_PATTERN.test(name); } diff --git a/packages/core/src/browser/preferences/preference-service.ts b/packages/core/src/browser/preferences/preference-service.ts index 8395c2b912c9c..87252057bfc13 100644 --- a/packages/core/src/browser/preferences/preference-service.ts +++ b/packages/core/src/browser/preferences/preference-service.ts @@ -91,6 +91,10 @@ export interface PreferenceService extends Disposable { * Promise indicating whether the service successfully initialized. */ readonly ready: Promise; + /** + * Indicates whether the service has successfully initialized. Will be `true` when {@link PreferenceService.ready the `ready` Promise} resolves. + */ + readonly isReady: boolean; /** * Retrieve the stored value for the given preference. * @@ -171,10 +175,18 @@ export interface PreferenceService extends Disposable { * * @param preferenceName the preference identifier. * @param resourceUri the uri of the resource for which the preference is stored. + * @param forceLanguageOverride if `true` and `preferenceName` is a language override, only values for the specified override will be returned. + * Otherwise, values for the override will be returned where defined, and values from the base preference will be returned otherwise. * * @return an object containing the value of the given preference for all scopes. */ - inspect(preferenceName: string, resourceUri?: string): PreferenceInspection | undefined; + inspect(preferenceName: string, resourceUri?: string, forceLanguageOverride?: boolean): PreferenceInspection | undefined; + /** + * For behavior, see {@link PreferenceService.inspect}. + * + * @returns the value in the scope specified. + */ + inspectInScope(preferenceName: string, scope: PreferenceScope, resourceUri?: string, forceLanguageOverride?: boolean): T | undefined /** * Returns a new preference identifier based on the given OverridePreferenceName. * @@ -298,6 +310,7 @@ export class PreferenceServiceImpl implements PreferenceService { await provider.ready; } this._ready.resolve(); + this._isReady = true; } catch (e) { this._ready.reject(e); } @@ -318,6 +331,11 @@ export class PreferenceServiceImpl implements PreferenceService { return this._ready.promise; } + protected _isReady = false; + get isReady(): boolean { + return this._isReady; + } + protected reconcilePreferences(changes: PreferenceProviderDataChanges): void { const changesToEmit: PreferenceChanges = {}; const acceptChange = (change: PreferenceProviderDataChange) => @@ -459,20 +477,20 @@ export class PreferenceServiceImpl implements PreferenceService { return Number(value); } - inspect(preferenceName: string, resourceUri?: string): PreferenceInspection | undefined { - const defaultValue = this.inspectInScope(preferenceName, PreferenceScope.Default, resourceUri); - const globalValue = this.inspectInScope(preferenceName, PreferenceScope.User, resourceUri); - const workspaceValue = this.inspectInScope(preferenceName, PreferenceScope.Workspace, resourceUri); - const workspaceFolderValue = this.inspectInScope(preferenceName, PreferenceScope.Folder, resourceUri); + inspect(preferenceName: string, resourceUri?: string, forceLanguageOverride?: boolean): PreferenceInspection | undefined { + const defaultValue = this.inspectInScope(preferenceName, PreferenceScope.Default, resourceUri, forceLanguageOverride); + const globalValue = this.inspectInScope(preferenceName, PreferenceScope.User, resourceUri, forceLanguageOverride); + const workspaceValue = this.inspectInScope(preferenceName, PreferenceScope.Workspace, resourceUri, forceLanguageOverride); + const workspaceFolderValue = this.inspectInScope(preferenceName, PreferenceScope.Folder, resourceUri, forceLanguageOverride); const valueApplied = workspaceFolderValue ?? workspaceValue ?? globalValue ?? defaultValue; return { preferenceName, defaultValue, globalValue, workspaceValue, workspaceFolderValue, value: valueApplied }; } - protected inspectInScope(preferenceName: string, scope: PreferenceScope, resourceUri?: string): T | undefined { + inspectInScope(preferenceName: string, scope: PreferenceScope, resourceUri?: string, forceLanguageOverride?: boolean): T | undefined { const value = this.doInspectInScope(preferenceName, scope, resourceUri); - if (value === undefined) { + if (value === undefined && !forceLanguageOverride) { const overridden = this.overriddenPreferenceName(preferenceName); if (overridden) { return this.doInspectInScope(overridden.preferenceName, scope, resourceUri); diff --git a/packages/core/src/browser/preferences/test/mock-preference-service.ts b/packages/core/src/browser/preferences/test/mock-preference-service.ts index 67b8d199b081d..8db48b6cdc3d9 100644 --- a/packages/core/src/browser/preferences/test/mock-preference-service.ts +++ b/packages/core/src/browser/preferences/test/mock-preference-service.ts @@ -40,10 +40,14 @@ export class MockPreferenceService implements PreferenceService { inspect(preferenceName: string, resourceUri?: string): PreferenceInspection | undefined { return undefined; } + inspectInScope(preferenceName: string, scope: PreferenceScope, resourceUri?: string, forceLanguageOverride?: boolean): T | undefined { + return undefined; + } // eslint-disable-next-line @typescript-eslint/no-explicit-any set(preferenceName: string, value: any): Promise { return Promise.resolve(); } updateValue(): Promise { return Promise.resolve(); } - ready: Promise = Promise.resolve(); + readonly ready: Promise = Promise.resolve(); + readonly isReady = true; readonly onPreferenceChanged: Event = new Emitter().event; readonly onPreferencesChanged: Event = new Emitter().event; overridePreferenceName(options: OverridePreferenceName): string { diff --git a/packages/core/src/browser/saveable.ts b/packages/core/src/browser/saveable.ts index ed6759860dbd0..06f5571c18140 100644 --- a/packages/core/src/browser/saveable.ts +++ b/packages/core/src/browser/saveable.ts @@ -59,16 +59,13 @@ export namespace Saveable { } export type Snapshot = { value: string } | { read(): string | null }; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function isSource(arg: any): arg is SaveableSource { - return !!arg && ('saveable' in arg) && is(arg.saveable); + export function isSource(arg: unknown): arg is SaveableSource { + return typeof arg === 'object' && !!arg && is((arg as SaveableSource).saveable); } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function is(arg: any): arg is Saveable { - return !!arg && ('dirty' in arg) && ('onDirtyChanged' in arg); + export function is(arg: unknown): arg is Saveable { + return typeof arg === 'object' && !!arg && 'dirty' in arg && 'onDirtyChanged' in arg; } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function get(arg: any): Saveable | undefined { + export function get(arg: unknown): Saveable | undefined { if (is(arg)) { return arg; } @@ -77,20 +74,17 @@ export namespace Saveable { } return undefined; } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function getDirty(arg: any): Saveable | undefined { + export function getDirty(arg: unknown): Saveable | undefined { const saveable = get(arg); if (saveable && saveable.dirty) { return saveable; } return undefined; } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function isDirty(arg: any): boolean { + export function isDirty(arg: unknown): boolean { return !!getDirty(arg); } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export async function save(arg: any, options?: SaveOptions): Promise { + export async function save(arg: unknown, options?: SaveOptions): Promise { const saveable = get(arg); if (saveable) { await saveable.save(options); @@ -229,7 +223,7 @@ export namespace SaveableWidget { return !!widget && 'closeWithoutSaving' in widget; } export function getDirty(widgets: Iterable): IterableIterator { - return get(widgets, Saveable.isDirty); + return get(widgets, Saveable.isDirty); } export function* get( widgets: Iterable, diff --git a/packages/core/src/browser/shell/application-shell.ts b/packages/core/src/browser/shell/application-shell.ts index 94d36e3dd28f6..51b9ffd830576 100644 --- a/packages/core/src/browser/shell/application-shell.ts +++ b/packages/core/src/browser/shell/application-shell.ts @@ -1934,10 +1934,9 @@ export namespace ApplicationShell { return area === 'left' || area === 'right' || area === 'bottom'; } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function isValidArea(area?: any): area is ApplicationShell.Area { + export function isValidArea(area?: unknown): area is ApplicationShell.Area { const areas = ['main', 'top', 'left', 'right', 'bottom']; - return (area !== undefined && typeof area === 'string' && areas.includes(area)); + return typeof area === 'string' && areas.includes(area); } /** @@ -1981,8 +1980,8 @@ export namespace ApplicationShell { * Whether a widget should be opened to the side tab bar relatively to the reference widget. */ export type OpenToSideMode = 'open-to-left' | 'open-to-right'; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function isOpenToSideMode(mode: OpenToSideMode | any): mode is OpenToSideMode { + + export function isOpenToSideMode(mode: unknown): mode is OpenToSideMode { return mode === 'open-to-left' || mode === 'open-to-right'; } @@ -2060,8 +2059,8 @@ export namespace ApplicationShell { } export namespace TrackableWidgetProvider { - export function is(widget: object | undefined): widget is TrackableWidgetProvider { - return !!widget && 'getTrackableWidgets' in widget; + export function is(widget: unknown): widget is TrackableWidgetProvider { + return !!widget && typeof widget === 'object' && 'getTrackableWidgets' in widget; } } diff --git a/packages/core/src/browser/shell/shell-layout-restorer.ts b/packages/core/src/browser/shell/shell-layout-restorer.ts index 6af5dd643c203..ac7f680ff70fe 100644 --- a/packages/core/src/browser/shell/shell-layout-restorer.ts +++ b/packages/core/src/browser/shell/shell-layout-restorer.ts @@ -27,6 +27,7 @@ import { MaybePromise } from '../../common/types'; import { ApplicationShell, applicationShellLayoutVersion, ApplicationShellLayoutVersion } from './application-shell'; import { CommonCommands } from '../common-frontend-contribution'; import { WindowService } from '../window/window-service'; +import { StopReason } from '../../common/frontend-application-state'; /** * A contract for widgets that want to store and restore their inner state, between sessions. @@ -45,9 +46,8 @@ export interface StatefulWidget { } export namespace StatefulWidget { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function is(arg: any): arg is StatefulWidget { - return arg !== undefined && typeof arg['storeState'] === 'function' && typeof arg['restoreState'] === 'function'; + export function is(arg: unknown): arg is StatefulWidget { + return !!arg && typeof arg === 'object' && typeof (arg as StatefulWidget).storeState === 'function' && typeof (arg as StatefulWidget).restoreState === 'function'; } } @@ -139,7 +139,7 @@ export class ShellLayoutRestorer implements CommandContribution { } protected async resetLayout(): Promise { - if (await this.windowService.isSafeToShutDown()) { + if (await this.windowService.isSafeToShutDown(StopReason.Reload)) { this.logger.info('>>> Resetting layout...'); this.shouldStoreLayout = false; this.storageService.setData(this.storageKey, undefined); 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 3a4ebc623d87b..acf15dd917bbc 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 @@ -171,9 +171,8 @@ export namespace TabBarToolbarItem { return (left.priority || 0) - (right.priority || 0); }; - export function is(arg: Object | undefined): arg is TabBarToolbarItem { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return !!arg && 'command' in arg && typeof (arg as any).command === 'string'; + export function is(arg: unknown): arg is TabBarToolbarItem { + return !!arg && typeof arg === 'object' && 'command' in arg && typeof (arg as TabBarToolbarItem).command === '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 2c16235bf7a0d..7776842ebf958 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 @@ -52,8 +52,11 @@ export class TabBarToolbar extends ReactWidget { super(); this.addClass(TabBarToolbar.Styles.TAB_BAR_TOOLBAR); this.hide(); + this.onRender = this.onRender.bind(this); } + protected onRender = () => this.show(); + updateItems(items: Array, current: Widget | undefined): void { this.inline.clear(); this.more.clear(); @@ -68,11 +71,6 @@ export class TabBarToolbar extends ReactWidget { if (!items.length) { this.hide(); } - this.onRender.push(Disposable.create(() => { - if (items.length) { - this.show(); - } - })); this.update(); } @@ -129,6 +127,7 @@ export class TabBarToolbar extends ReactWidget { const toolbarItemClassNames = this.getToolbarItemClassNames(command?.id ?? item.command); if (item.menuPath && !item.command) { toolbarItemClassNames.push('enabled'); } return
): WidgetDecoration.Data[] { if (this.tabBar && this.decoratorService) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any const owner: { resetTabBarDecorations?: () => void; } & Widget = title.owner; if (!owner.resetTabBarDecorations) { owner.resetTabBarDecorations = () => this.decorations.delete(title); diff --git a/packages/core/src/browser/shell/view-contribution.ts b/packages/core/src/browser/shell/view-contribution.ts index c5fd7ec765e41..387bfc5bbc789 100644 --- a/packages/core/src/browser/shell/view-contribution.ts +++ b/packages/core/src/browser/shell/view-contribution.ts @@ -41,8 +41,7 @@ export interface ViewContributionOptions { toggleKeybinding?: string; } -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export function bindViewContribution>(bind: interfaces.Bind, identifier: interfaces.Newable): interfaces.BindingWhenOnSyntax { +export function bindViewContribution>(bind: interfaces.Bind, identifier: interfaces.Newable): interfaces.BindingWhenOnSyntax { const syntax = bind(identifier).toSelf().inSingletonScope(); bind(CommandContribution).toService(identifier); bind(KeybindingContribution).toService(identifier); diff --git a/packages/core/src/browser/source-tree/tree-source.ts b/packages/core/src/browser/source-tree/tree-source.ts index 02e4765123cf6..e0dc628eeabe8 100644 --- a/packages/core/src/browser/source-tree/tree-source.ts +++ b/packages/core/src/browser/source-tree/tree-source.ts @@ -38,11 +38,10 @@ export interface CompositeTreeElement extends TreeElement { getElements(): MaybePromise> } export namespace CompositeTreeElement { - /* eslint-disable @typescript-eslint/no-explicit-any */ - export function is(element: CompositeTreeElement | any): element is CompositeTreeElement { - return !!element && 'getElements' in element; + export function is(element: unknown): element is CompositeTreeElement { + return !!element && typeof element === 'object' && 'getElements' in element; } - export function hasElements(element: CompositeTreeElement | any): element is CompositeTreeElement { + export function hasElements(element: unknown): element is CompositeTreeElement { return is(element) && element.hasElements !== false; } } diff --git a/packages/core/src/browser/style/alert-messages.css b/packages/core/src/browser/style/alert-messages.css index 7e3ef6afb6e63..b2e80c1116221 100644 --- a/packages/core/src/browser/style/alert-messages.css +++ b/packages/core/src/browser/style/alert-messages.css @@ -25,6 +25,12 @@ padding-right: 3px; } +.theia-alert-message-container .theia-message-header, +.theia-alert-message-container .theia-message-content { + text-overflow: ellipsis; + overflow: hidden; +} + /* information message */ .theia-info-alert { background-color: var(--theia-inputValidation-infoBackground); diff --git a/packages/core/src/browser/style/tabs.css b/packages/core/src/browser/style/tabs.css index 7b24c571fc903..cb35d7e7f5990 100644 --- a/packages/core/src/browser/style/tabs.css +++ b/packages/core/src/browser/style/tabs.css @@ -384,6 +384,10 @@ background: var(--theia-icon-close) no-repeat; } +#theia-main-content-panel .p-TabBar:not(.theia-tabBar-active) .p-TabBar-toolbar { + display: none; +} + .theia-tabBar-breadcrumb-row { min-width: 100%; } diff --git a/packages/core/src/browser/theming.ts b/packages/core/src/browser/theming.ts index e7aed2aeb83a2..285c12178caff 100644 --- a/packages/core/src/browser/theming.ts +++ b/packages/core/src/browser/theming.ts @@ -19,14 +19,21 @@ import { Disposable } from '../common/disposable'; import { FrontendApplicationConfigProvider } from './frontend-application-config-provider'; import { ApplicationProps } from '@theia/application-package/lib/application-props'; import { Theme, ThemeChangeEvent } from '../common/theme'; -import { injectable, postConstruct } from 'inversify'; +import { inject, injectable, postConstruct } from 'inversify'; import { Deferred } from '../common/promise-util'; +import { PreferenceService } from './preferences'; + +const COLOR_THEME_PREFERENCE_KEY = 'workbench.colorTheme'; +const NO_THEME = { id: 'no-theme', label: 'Not a real theme.', type: 'dark' } as const; @injectable() export class ThemeService { + static readonly STORAGE_KEY = 'theme'; + + @inject(PreferenceService) protected readonly preferences: PreferenceService; protected themes: { [id: string]: Theme } = {}; - protected activeTheme: Theme | undefined; + protected activeTheme: Theme = NO_THEME; protected readonly themeChange = new Emitter(); protected readonly deferredInitializer = new Deferred(); get initialized(): Promise { @@ -39,6 +46,14 @@ export class ThemeService { protected init(): void { this.register(...BuiltinThemeProvider.themes); this.loadUserTheme(); + this.preferences.ready.then(() => { + this.validateActiveTheme(); + this.preferences.onPreferencesChanged(changes => { + if (COLOR_THEME_PREFERENCE_KEY in changes) { + this.validateActiveTheme(); + } + }); + }); } register(...themes: Theme[]): Disposable { @@ -49,21 +64,19 @@ export class ThemeService { return Disposable.create(() => { for (const theme of themes) { delete this.themes[theme.id]; + if (this.activeTheme === theme) { + this.setCurrentTheme(this.defaultTheme.id, false); + } } - this.validateActiveTheme(); }); } protected validateActiveTheme(): void { - if (!this.activeTheme) { - return; - } - const theme = this.themes[this.activeTheme.id]; - if (!theme) { - this.loadUserTheme(); - } else if (theme !== this.activeTheme) { - this.activeTheme = undefined; - this.setCurrentTheme(theme.id); + if (this.preferences.isReady) { + const configuredTheme = this.getConfiguredTheme(); + if (configuredTheme && configuredTheme !== this.activeTheme) { + this.setCurrentTheme(configuredTheme.id, false); + } } } @@ -81,44 +94,49 @@ export class ThemeService { return this.themes[themeId] || this.defaultTheme; } - startupTheme(): void { - const theme = this.getCurrentTheme(); - theme.activate?.(); + protected tryGetTheme(themeId: string): Theme | undefined { + return this.themes[themeId]; } + /** Should only be called at startup. */ loadUserTheme(): void { - const theme = this.getCurrentTheme(); - this.setCurrentTheme(theme.id); + const storedThemeId = window.localStorage.getItem(ThemeService.STORAGE_KEY) ?? this.defaultTheme.id; + const theme = this.getTheme(storedThemeId); + this.setCurrentTheme(theme.id, false); this.deferredInitializer.resolve(); } - setCurrentTheme(themeId: string): void { - const newTheme = this.getTheme(themeId); + /** + * @param persist If `true`, the value of the `workbench.colorTheme` preference will be set to the provided ID. + */ + setCurrentTheme(themeId: string, persist = true): void { + const newTheme = this.tryGetTheme(themeId); const oldTheme = this.activeTheme; - if (oldTheme) { - if (oldTheme.id === newTheme.id) { - return; - } - oldTheme.deactivate?.(); + if (newTheme && newTheme !== oldTheme) { + oldTheme?.deactivate?.(); + newTheme.activate?.(); + this.activeTheme = newTheme; + this.themeChange.fire({ newTheme, oldTheme }); + } + if (persist) { + this.preferences.updateValue(COLOR_THEME_PREFERENCE_KEY, themeId); } - newTheme.activate?.(); - this.activeTheme = newTheme; - window.localStorage.setItem('theme', themeId); - this.themeChange.fire({ - newTheme, oldTheme - }); } getCurrentTheme(): Theme { - const themeId = window.localStorage.getItem('theme') || this.defaultTheme.id; - return this.getTheme(themeId); + return this.activeTheme; + } + + protected getConfiguredTheme(): Theme | undefined { + const configuredId = this.preferences.get(COLOR_THEME_PREFERENCE_KEY); + return configuredId ? this.themes[configuredId.toString()] : undefined; } /** * The default theme. If that is not applicable, returns with the fallback theme. */ get defaultTheme(): Theme { - return this.themes[FrontendApplicationConfigProvider.get().defaultTheme] || this.themes[ApplicationProps.DEFAULT.frontend.config.defaultTheme]; + return this.tryGetTheme(FrontendApplicationConfigProvider.get().defaultTheme) ?? this.getTheme(ApplicationProps.DEFAULT.frontend.config.defaultTheme); } /** diff --git a/packages/core/src/browser/tooltip-service.tsx b/packages/core/src/browser/tooltip-service.tsx index 76c14f6ddb814..eb0bbc2419bda 100644 --- a/packages/core/src/browser/tooltip-service.tsx +++ b/packages/core/src/browser/tooltip-service.tsx @@ -19,7 +19,6 @@ import * as React from 'react'; import ReactTooltip from 'react-tooltip'; import { ReactRenderer, RendererHost } from './widgets/react-renderer'; import { CorePreferences } from './core-preferences'; -import { DisposableCollection } from '../common/disposable'; import { v4 } from 'uuid'; export const TooltipService = Symbol('TooltipService'); @@ -55,7 +54,6 @@ export class TooltipServiceImpl extends ReactRenderer implements TooltipService public readonly tooltipId: string; protected rendered = false; - protected toDispose: DisposableCollection = new DisposableCollection(); constructor( @inject(RendererHost) @optional() host?: RendererHost diff --git a/packages/core/src/browser/tree/tree-expansion.ts b/packages/core/src/browser/tree/tree-expansion.ts index b4ae7abdfc00b..9a5bf8088cebd 100644 --- a/packages/core/src/browser/tree/tree-expansion.ts +++ b/packages/core/src/browser/tree/tree-expansion.ts @@ -69,11 +69,11 @@ export namespace ExpandableTreeNode { return !!node && CompositeTreeNode.is(node) && 'expanded' in node; } - export function isExpanded(node: Object | undefined): node is ExpandableTreeNode { + export function isExpanded(node: unknown): node is ExpandableTreeNode { return ExpandableTreeNode.is(node) && node.expanded; } - export function isCollapsed(node: Object | undefined): node is ExpandableTreeNode { + export function isCollapsed(node: unknown): node is ExpandableTreeNode { return ExpandableTreeNode.is(node) && !node.expanded; } } diff --git a/packages/core/src/browser/tree/tree-selection-state.ts b/packages/core/src/browser/tree/tree-selection-state.ts index 57015e4bde9af..431e414db4099 100644 --- a/packages/core/src/browser/tree/tree-selection-state.ts +++ b/packages/core/src/browser/tree/tree-selection-state.ts @@ -36,7 +36,7 @@ export namespace FocusableTreeSelection { /** * `true` if the argument is a focusable tree selection. Otherwise, `false`. */ - export function is(arg: object | undefined): arg is FocusableTreeSelection { + export function is(arg: unknown): arg is FocusableTreeSelection { return TreeSelection.is(arg) && 'focus' in arg; } diff --git a/packages/core/src/browser/tree/tree-selection.ts b/packages/core/src/browser/tree/tree-selection.ts index ccc971b9d0cce..d358008b91ba7 100644 --- a/packages/core/src/browser/tree/tree-selection.ts +++ b/packages/core/src/browser/tree/tree-selection.ts @@ -86,8 +86,8 @@ export namespace TreeSelection { RANGE } - export function is(arg: Object | undefined): arg is TreeSelection { - return !!arg && 'node' in arg; + export function is(arg: unknown): arg is TreeSelection { + return !!arg && typeof arg === 'object' && 'node' in arg; } export function isRange(arg: TreeSelection | SelectionType | undefined): boolean { @@ -129,11 +129,11 @@ export interface SelectableTreeNode extends TreeNode { export namespace SelectableTreeNode { - export function is(node: TreeNode | undefined): node is SelectableTreeNode { - return !!node && 'selected' in node; + export function is(node: unknown): node is SelectableTreeNode { + return TreeNode.is(node) && 'selected' in node; } - export function isSelected(node: TreeNode | undefined): node is SelectableTreeNode { + export function isSelected(node: unknown): node is SelectableTreeNode { return is(node) && node.selected; } diff --git a/packages/core/src/browser/tree/tree-widget-selection.ts b/packages/core/src/browser/tree/tree-widget-selection.ts index aaaec788acb50..7d40b10672c5a 100644 --- a/packages/core/src/browser/tree/tree-widget-selection.ts +++ b/packages/core/src/browser/tree/tree-widget-selection.ts @@ -21,15 +21,14 @@ export type TreeWidgetSelection = ReadonlyArray> & source: TreeWidget }; export namespace TreeWidgetSelection { - export function isSource(selection: Object | undefined, source: TreeWidget): selection is TreeWidgetSelection { + export function isSource(selection: unknown, source: TreeWidget): selection is TreeWidgetSelection { return getSource(selection) === source; } - export function getSource(selection: Object | undefined): TreeWidget | undefined { + export function getSource(selection: unknown): TreeWidget | undefined { return is(selection) ? selection.source : undefined; } - export function is(selection: Object | undefined): selection is TreeWidgetSelection { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return Array.isArray(selection) && ('source' in selection) && selection['source'] instanceof TreeWidget; + export function is(selection: unknown): selection is TreeWidgetSelection { + return Array.isArray(selection) && ('source' in selection) && (selection as TreeWidgetSelection).source instanceof TreeWidget; } export function create(source: TreeWidget): TreeWidgetSelection { diff --git a/packages/core/src/browser/tree/tree-widget.tsx b/packages/core/src/browser/tree/tree-widget.tsx index dd0429ef6d31a..3dc6ab5242123 100644 --- a/packages/core/src/browser/tree/tree-widget.tsx +++ b/packages/core/src/browser/tree/tree-widget.tsx @@ -42,6 +42,7 @@ import { MaybePromise } from '../../common/types'; import { LabelProvider } from '../label-provider'; import { CorePreferences } from '../core-preferences'; import { TreeFocusService } from './tree-focus-service'; +import { useEffect } from 'react'; const debounce = require('lodash.debounce'); @@ -467,6 +468,11 @@ export class TreeWidget extends ReactWidget implements StatefulWidget { return this.model.root; } + protected ScrollingRowRenderer: React.FC<{ rows: TreeWidget.NodeRow[] }> = ({ rows }) => { + useEffect(() => this.scrollToSelected()); + return <>{rows.map(row =>
{this.renderNodeRow(row)}
)}; + }; + protected view: TreeWidget.View | undefined; /** * Render the tree widget. @@ -476,8 +482,7 @@ export class TreeWidget extends ReactWidget implements StatefulWidget { if (model.root) { const rows = Array.from(this.rows.values()); if (this.props.virtualized === false) { - this.onRender.push(Disposable.create(() => this.scrollToSelected())); - return rows.map(row =>
{this.renderNodeRow(row)}
); + return ; } return this.view = (view || undefined)} diff --git a/packages/core/src/browser/tree/tree.ts b/packages/core/src/browser/tree/tree.ts index a719554f1f601..8a65875b61499 100644 --- a/packages/core/src/browser/tree/tree.ts +++ b/packages/core/src/browser/tree/tree.ts @@ -123,7 +123,7 @@ export interface TreeNode { } export namespace TreeNode { - export function is(node: Object | undefined): node is TreeNode { + export function is(node: unknown): node is TreeNode { return !!node && typeof node === 'object' && 'id' in node && 'parent' in node; } diff --git a/packages/core/src/browser/view-container.ts b/packages/core/src/browser/view-container.ts index e97908463336c..56e267d4c2229 100644 --- a/packages/core/src/browser/view-container.ts +++ b/packages/core/src/browser/view-container.ts @@ -63,13 +63,13 @@ export interface BadgeWidget { } export namespace DescriptionWidget { - export function is(arg: Object | undefined): arg is DescriptionWidget { + export function is(arg: unknown): arg is DescriptionWidget { return !!arg && typeof arg === 'object' && 'onDidChangeDescription' in arg; } } export namespace BadgeWidget { - export function is(arg: Object | undefined): arg is BadgeWidget { + export function is(arg: unknown): arg is BadgeWidget { return !!arg && typeof arg === 'object' && 'onDidChangeBadge' in arg; } } diff --git a/packages/core/src/browser/widgets/alert-message.tsx b/packages/core/src/browser/widgets/alert-message.tsx index 6324ff458fd4f..4581687f82f2e 100644 --- a/packages/core/src/browser/widgets/alert-message.tsx +++ b/packages/core/src/browser/widgets/alert-message.tsx @@ -36,6 +36,7 @@ const AlertMessageIcon = { export interface AlertMessageProps { type: MessageType; header: string; + children?: React.ReactNode } export class AlertMessage extends React.Component { diff --git a/packages/core/src/browser/widgets/react-renderer.tsx b/packages/core/src/browser/widgets/react-renderer.tsx index b702fc87aa878..6302b5bdadbce 100644 --- a/packages/core/src/browser/widgets/react-renderer.tsx +++ b/packages/core/src/browser/widgets/react-renderer.tsx @@ -16,27 +16,32 @@ import { inject, injectable, optional } from 'inversify'; import * as React from 'react'; -import * as ReactDOM from 'react-dom'; -import { Disposable } from '../../common'; +import { createRoot, Root } from 'react-dom/client'; +import { Disposable, DisposableCollection } from '../../common'; export type RendererHost = HTMLElement; export const RendererHost = Symbol('RendererHost'); @injectable() export class ReactRenderer implements Disposable { + protected readonly toDispose = new DisposableCollection(); readonly host: HTMLElement; + protected hostRoot: Root; + constructor( @inject(RendererHost) @optional() host?: RendererHost ) { this.host = host || document.createElement('div'); + this.hostRoot = createRoot(this.host); + this.toDispose.push(Disposable.create(() => this.hostRoot.unmount())); } dispose(): void { - ReactDOM.unmountComponentAtNode(this.host); + this.toDispose.dispose(); } render(): void { - ReactDOM.render({this.doRender()}, this.host); + this.hostRoot.render({this.doRender()}); } protected doRender(): React.ReactNode { diff --git a/packages/core/src/browser/widgets/react-widget.tsx b/packages/core/src/browser/widgets/react-widget.tsx index feae69f849e50..7db0cf9908a45 100644 --- a/packages/core/src/browser/widgets/react-widget.tsx +++ b/packages/core/src/browser/widgets/react-widget.tsx @@ -14,17 +14,17 @@ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 // ***************************************************************************** -import * as ReactDOM from 'react-dom'; import * as React from 'react'; import { injectable, unmanaged } from 'inversify'; -import { DisposableCollection, Disposable } from '../../common'; +import { Disposable } from '../../common'; import { BaseWidget, Message } from './widget'; import { Widget } from '@phosphor/widgets'; +import { createRoot, Root } from 'react-dom/client'; @injectable() export abstract class ReactWidget extends BaseWidget { - protected readonly onRender = new DisposableCollection(); + protected nodeRoot: Root; constructor(@unmanaged() options?: Widget.IOptions) { super(options); @@ -32,14 +32,13 @@ export abstract class ReactWidget extends BaseWidget { suppressScrollX: true, minScrollbarLength: 35, }; - this.toDispose.push(Disposable.create(() => { - ReactDOM.unmountComponentAtNode(this.node); - })); + this.nodeRoot = createRoot(this.node); + this.toDispose.push(Disposable.create(() => this.nodeRoot.unmount())); } protected override onUpdateRequest(msg: Message): void { super.onUpdateRequest(msg); - ReactDOM.render({this.render()}, this.node, () => this.onRender.dispose()); + this.nodeRoot.render({this.render()}); } /** diff --git a/packages/core/src/browser/widgets/widget.ts b/packages/core/src/browser/widgets/widget.ts index 863e68b4d6d26..5274d0f2386a6 100644 --- a/packages/core/src/browser/widgets/widget.ts +++ b/packages/core/src/browser/widgets/widget.ts @@ -246,9 +246,8 @@ export interface EventListenerObject { handleEvent(evt: HTMLElementEventMap[K]): void; } export namespace EventListenerObject { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function is(listener: any | undefined): listener is EventListenerObject { - return !!listener && 'handleEvent' in listener; + export function is(listener: unknown): listener is EventListenerObject { + return !!listener && typeof listener === 'object' && 'handleEvent' in listener; } } export type EventListenerOrEventListenerObject = EventListener | EventListenerObject; diff --git a/packages/core/src/browser/window/default-window-service.ts b/packages/core/src/browser/window/default-window-service.ts index 10953b1553507..bf659c068269d 100644 --- a/packages/core/src/browser/window/default-window-service.ts +++ b/packages/core/src/browser/window/default-window-service.ts @@ -22,6 +22,7 @@ import { FrontendApplicationContribution, FrontendApplication, OnWillStopAction import { WindowService } from './window-service'; import { DEFAULT_WINDOW_HASH } from '../../common/window'; import { confirmExit } from '../dialogs'; +import { StopReason } from '../../common/frontend-application-state'; @injectable() export class DefaultWindowService implements WindowService, FrontendApplicationContribution { @@ -97,16 +98,16 @@ export class DefaultWindowService implements WindowService, FrontendApplicationC window.addEventListener('unload', () => this.onUnloadEmitter.fire()); } - async isSafeToShutDown(): Promise { + async isSafeToShutDown(stopReason: StopReason): Promise { const vetoes = this.collectContributionUnloadVetoes(); if (vetoes.length === 0) { return true; } - const preparedValues = await Promise.all(vetoes.map(e => e.prepare?.())); + const preparedValues = await Promise.all(vetoes.map(e => e.prepare?.(stopReason))); console.debug('Shutdown prevented by', vetoes.map(({ reason }) => reason).join(', ')); for (let i = 0; i < vetoes.length; i++) { try { - const result = await vetoes[i].action(preparedValues[i]); + const result = await vetoes[i].action(preparedValues[i], stopReason); if (!result) { return false; } @@ -156,6 +157,10 @@ export class DefaultWindowService implements WindowService, FrontendApplicationC } reload(): void { - window.location.reload(); + this.isSafeToShutDown(StopReason.Reload).then(isSafe => { + if (isSafe) { + window.location.reload(); + } + }); } } diff --git a/packages/core/src/browser/window/window-service.ts b/packages/core/src/browser/window/window-service.ts index 139638fcd05a1..f1fbbfd9ce824 100644 --- a/packages/core/src/browser/window/window-service.ts +++ b/packages/core/src/browser/window/window-service.ts @@ -14,6 +14,7 @@ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 // ***************************************************************************** +import { StopReason } from '../../common/frontend-application-state'; import { Event } from '../../common/event'; import { NewWindowOptions } from '../../common/window'; @@ -49,7 +50,7 @@ export interface WindowService { * will not be called again in the current session. I.e. if this return `true`, the shutdown should proceed without * further condition. */ - isSafeToShutDown(): Promise; + isSafeToShutDown(reason: StopReason): Promise; /** * Will prevent subsequent checks of `FrontendApplicationContribution#willStop`. Should only be used after requesting diff --git a/packages/core/src/common/cancellation.ts b/packages/core/src/common/cancellation.ts index 8105ba7c8f2e1..05e93cc18d748 100644 --- a/packages/core/src/common/cancellation.ts +++ b/packages/core/src/common/cancellation.ts @@ -50,8 +50,7 @@ export namespace CancellationToken { onCancellationRequested: shortcutEvent }); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function is(value: any): value is CancellationToken { + export function is(value: unknown): value is CancellationToken { const candidate = value as CancellationToken; return candidate && (candidate === CancellationToken.None || candidate === CancellationToken.Cancelled diff --git a/packages/core/src/common/command.ts b/packages/core/src/common/command.ts index 2d398fa35b25a..b46a29a510305 100644 --- a/packages/core/src/common/command.ts +++ b/packages/core/src/common/command.ts @@ -49,9 +49,8 @@ export interface Command { export namespace Command { /* Determine whether object is a Command */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function is(arg: Command | any): arg is Command { - return !!arg && arg === Object(arg) && 'id' in arg; + export function is(arg: unknown): arg is Command { + return !!arg && typeof arg === 'object' && 'id' in arg; } /** Utility function to easily translate commands */ diff --git a/packages/core/src/common/disposable.ts b/packages/core/src/common/disposable.ts index 8d4f0fe46d3f5..379b31006f17f 100644 --- a/packages/core/src/common/disposable.ts +++ b/packages/core/src/common/disposable.ts @@ -23,9 +23,8 @@ export interface Disposable { } export namespace Disposable { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function is(arg: any): arg is Disposable { - return !!arg && typeof arg === 'object' && 'dispose' in arg && typeof arg['dispose'] === 'function'; + export function is(arg: unknown): arg is Disposable { + return !!arg && typeof arg === 'object' && typeof (arg as Disposable).dispose === 'function'; } export function create(func: () => void): Disposable { return { dispose: func }; diff --git a/packages/core/src/common/frontend-application-state.ts b/packages/core/src/common/frontend-application-state.ts index 05bd1cd331787..02cd17c1cbfad 100644 --- a/packages/core/src/common/frontend-application-state.ts +++ b/packages/core/src/common/frontend-application-state.ts @@ -21,3 +21,18 @@ export type FrontendApplicationState = | 'initialized_layout' | 'ready' | 'closing_window'; + +export enum StopReason { + /** + * Closing the window with no prospect of restart. + */ + Close, + /** + * Reload without closing the window. + */ + Reload, + /** + * Reload that includes closing the window. + */ + Restart, +} diff --git a/packages/core/src/common/glob.ts b/packages/core/src/common/glob.ts index 719905b4f5d1f..9e326a3eb41e8 100644 --- a/packages/core/src/common/glob.ts +++ b/packages/core/src/common/glob.ts @@ -549,11 +549,10 @@ function listToMap(list: string[]): Record { return map; } -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export function isRelativePattern(obj: any): obj is IRelativePattern { +export function isRelativePattern(obj: unknown): obj is IRelativePattern { const rp = obj as IRelativePattern; - return rp && typeof rp.base === 'string' && typeof rp.pattern === 'string' && typeof rp.pathToRelative === 'function'; + return !!rp && typeof rp === 'object' && typeof rp.base === 'string' && typeof rp.pattern === 'string' && typeof rp.pathToRelative === 'function'; } /** diff --git a/packages/core/src/common/keybinding.ts b/packages/core/src/common/keybinding.ts index 5fca1a928c581..cb334bfd7bc28 100644 --- a/packages/core/src/common/keybinding.ts +++ b/packages/core/src/common/keybinding.ts @@ -101,9 +101,8 @@ export namespace Keybinding { } /* Determine whether object is a KeyBinding */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function is(arg: Keybinding | any): arg is Keybinding { - return !!arg && arg === Object(arg) && 'command' in arg && 'keybinding' in arg; + export function is(arg: unknown): arg is Keybinding { + return !!arg && typeof arg === 'object' && 'command' in arg && 'keybinding' in arg; } } diff --git a/packages/core/src/common/keys.ts b/packages/core/src/common/keys.ts index b84c543c76dac..156c2319b3bd9 100644 --- a/packages/core/src/common/keys.ts +++ b/packages/core/src/common/keys.ts @@ -488,9 +488,8 @@ export namespace SpecialCases { export namespace Key { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function isKey(arg: any): arg is Key { - return typeof arg === 'object' && ('code' in arg) && ('keyCode' in arg); + export function isKey(arg: unknown): arg is Key { + return !!arg && typeof arg === 'object' && 'code' in arg && 'keyCode' in arg; } export function getKey(arg: string | number): Key | undefined { diff --git a/packages/core/src/common/lsp-types.ts b/packages/core/src/common/lsp-types.ts index e630ea5a4bb25..7af131ef28ae9 100644 --- a/packages/core/src/common/lsp-types.ts +++ b/packages/core/src/common/lsp-types.ts @@ -23,9 +23,13 @@ export interface TextDocumentContentChangeDelta { } export namespace TextDocumentContentChangeDelta { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function is(arg: any): arg is TextDocumentContentChangeDelta { - return !!arg && typeof arg['text'] === 'string' && (typeof arg['rangeLength'] === 'number' || typeof arg['rangeLength'] === 'undefined') && Range.is(arg['range']); + export function is(arg: unknown): arg is TextDocumentContentChangeDelta { + const changeDelta = arg as TextDocumentContentChangeDelta; + return !!changeDelta + && typeof changeDelta === 'object' + && typeof changeDelta.text === 'string' + && (typeof changeDelta.rangeLength === 'number' || typeof changeDelta.rangeLength === 'undefined') + && Range.is(changeDelta.range); } } diff --git a/packages/core/src/common/menu/menu-types.ts b/packages/core/src/common/menu/menu-types.ts index 9c56a9279628f..c763c26a8e649 100644 --- a/packages/core/src/common/menu/menu-types.ts +++ b/packages/core/src/common/menu/menu-types.ts @@ -36,9 +36,8 @@ export interface MenuAction extends MenuNodeRenderingData, Pick return factory.createProxy(); } - protected channelMultiPlexer?: ChannelMultiplexer; + protected channelMultiplexer?: ChannelMultiplexer; // A set of channel opening functions that are executed if the backend reconnects to restore the // the channels that were open before the disconnect occurred. @@ -80,7 +80,7 @@ export abstract class AbstractConnectionProvider protected initializeMultiplexer(): void { const mainChannel = this.createMainChannel(); mainChannel.onMessage(() => this.onIncomingMessageActivityEmitter.fire()); - this.channelMultiPlexer = new ChannelMultiplexer(mainChannel); + this.channelMultiplexer = new ChannelMultiplexer(mainChannel); } /** @@ -93,10 +93,10 @@ export abstract class AbstractConnectionProvider } async openChannel(path: string, handler: (channel: Channel) => void, options?: AbstractOptions): Promise { - if (!this.channelMultiPlexer) { + if (!this.channelMultiplexer) { throw new Error('The channel multiplexer has not been initialized yet!'); } - const newChannel = await this.channelMultiPlexer.open(path); + const newChannel = await this.channelMultiplexer.open(path); newChannel.onClose(() => { const { reconnecting } = { reconnecting: true, ...options }; if (reconnecting) { diff --git a/packages/core/src/common/preferences/preference-schema.ts b/packages/core/src/common/preferences/preference-schema.ts index 05f85c13e52b9..23449e9760007 100644 --- a/packages/core/src/common/preferences/preference-schema.ts +++ b/packages/core/src/common/preferences/preference-schema.ts @@ -27,8 +27,8 @@ export interface PreferenceSchema { properties: PreferenceSchemaProperties } export namespace PreferenceSchema { - export function is(obj: Object | undefined): obj is PreferenceSchema { - return !!obj && ('properties' in obj) && PreferenceSchemaProperties.is((obj)['properties']); + export function is(obj: unknown): obj is PreferenceSchema { + return !!obj && typeof obj === 'object' && ('properties' in obj) && PreferenceSchemaProperties.is((obj as PreferenceSchema).properties); } export function getDefaultScope(schema: PreferenceSchema): PreferenceScope { let defaultScope: PreferenceScope = PreferenceScope.Workspace; @@ -45,7 +45,7 @@ export interface PreferenceSchemaProperties { [name: string]: PreferenceSchemaProperty } export namespace PreferenceSchemaProperties { - export function is(obj: Object | undefined): obj is PreferenceSchemaProperties { + export function is(obj: unknown): obj is PreferenceSchemaProperties { return !!obj && typeof obj === 'object'; } } diff --git a/packages/core/src/common/preferences/preference-scope.spec.ts b/packages/core/src/common/preferences/preference-scope.spec.ts new file mode 100644 index 0000000000000..27791ab410c0c --- /dev/null +++ b/packages/core/src/common/preferences/preference-scope.spec.ts @@ -0,0 +1,50 @@ +// ***************************************************************************** +// 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 WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { expect } from 'chai'; +import { PreferenceScope } from './preference-scope'; + +describe('PreferenceScope', () => { + + it('getScopes() should return numbers from broadest to narrowest', () => { + expect(PreferenceScope.getScopes()).deep.equal([0, 1, 2, 3]); + }); + + it('getReversedScopes() should return numbers from narrowest to broadest', () => { + expect(PreferenceScope.getReversedScopes()).deep.equal([3, 2, 1, 0]); + }); + + it('getScopeNames() should return the names of scopes broader than the current one', () => { + expect(PreferenceScope.getScopeNames(PreferenceScope.Workspace)).deep.equal(['Default', 'User', 'Workspace']); + }); + + it('is() returns whether a value is a preference scope', () => { + /* eslint-disable no-unused-expressions */ + expect(PreferenceScope.is(PreferenceScope.Default)).to.be.true; + expect(PreferenceScope.is(PreferenceScope.User)).to.be.true; + expect(PreferenceScope.is(PreferenceScope.Workspace)).to.be.true; + expect(PreferenceScope.is(PreferenceScope.Folder)).to.be.true; + expect(PreferenceScope.is(0)).to.be.true; + expect(PreferenceScope.is(1)).to.be.true; + expect(PreferenceScope.is(2)).to.be.true; + expect(PreferenceScope.is(3)).to.be.true; + expect(PreferenceScope.is(4)).to.be.false; + expect(PreferenceScope.is(-1)).to.be.false; + expect(PreferenceScope.is({})).to.be.false; + expect(PreferenceScope.is('Default')).to.be.false; + /* eslint-enable no-unused-expressions */ + }); +}); diff --git a/packages/core/src/common/preferences/preference-scope.ts b/packages/core/src/common/preferences/preference-scope.ts index 03fed97a979f2..6414033a1e72d 100644 --- a/packages/core/src/common/preferences/preference-scope.ts +++ b/packages/core/src/common/preferences/preference-scope.ts @@ -14,8 +14,6 @@ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 // ***************************************************************************** -/* eslint-disable @typescript-eslint/no-explicit-any */ - export enum PreferenceScope { Default, User, @@ -24,17 +22,15 @@ export enum PreferenceScope { } export namespace PreferenceScope { - export function is(scope: any): scope is PreferenceScope { - return typeof scope === 'number' && getScopes().findIndex(s => s === scope) >= 0; + export function is(scope: unknown): scope is PreferenceScope { + return typeof scope === 'number' && getScopes().includes(scope); } /** * @returns preference scopes from broadest to narrowest: Default -> Folder. */ export function getScopes(): PreferenceScope[] { - return Object.keys(PreferenceScope) - .filter(k => typeof PreferenceScope[k as any] === 'string') - .map(v => Number(v)); + return Object.values(PreferenceScope).filter(nameOrIndex => !isNaN(Number(nameOrIndex))) as PreferenceScope[]; } /** @@ -46,12 +42,11 @@ export namespace PreferenceScope { export function getScopeNames(scope?: PreferenceScope): string[] { const names: string[] = []; - const allNames = Object.keys(PreferenceScope) - .filter(k => typeof PreferenceScope[k as any] === 'number'); + const scopes = getScopes(); if (scope) { - for (const name of allNames) { - if ((PreferenceScope)[name] <= scope) { - names.push(name); + for (const scopeIndex of scopes) { + if (scopeIndex <= scope) { + names.push(PreferenceScope[scopeIndex]); } } } diff --git a/packages/core/src/common/promise-util.ts b/packages/core/src/common/promise-util.ts index 1234828aeb33b..301ac51254229 100644 --- a/packages/core/src/common/promise-util.ts +++ b/packages/core/src/common/promise-util.ts @@ -124,3 +124,7 @@ export function waitForEvent(event: Event, ms: number, thisArg?: any, disp }); } + +export function isThenable(obj: unknown): obj is Promise { + return typeof obj === 'object' && !!obj && typeof (obj as Promise).then === 'function'; +} diff --git a/packages/core/src/common/selection.ts b/packages/core/src/common/selection.ts index 40345d3ca0c66..62deee5e06a5e 100644 --- a/packages/core/src/common/selection.ts +++ b/packages/core/src/common/selection.ts @@ -22,12 +22,11 @@ export interface UriSelection { export namespace UriSelection { - export function is(arg: Object | undefined): arg is UriSelection { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return typeof arg === 'object' && ('uri' in arg) && (arg)['uri'] instanceof URI; + export function is(arg: unknown): arg is UriSelection { + return !!arg && typeof arg === 'object' && ('uri' in arg) && (arg as UriSelection).uri instanceof URI; } - export function getUri(selection: Object | undefined): URI | undefined { + export function getUri(selection: unknown): URI | undefined { if (is(selection)) { return selection.uri; } @@ -37,7 +36,7 @@ export namespace UriSelection { return undefined; } - export function getUris(selection: Object | undefined): URI[] { + export function getUris(selection: unknown): URI[] { if (is(selection)) { return [selection.uri]; } diff --git a/packages/core/src/common/types.ts b/packages/core/src/common/types.ts index cdabbeb69a96c..a01d1c4bef275 100644 --- a/packages/core/src/common/types.ts +++ b/packages/core/src/common/types.ts @@ -162,6 +162,13 @@ export namespace ArrayUtils { } return -(low + 1); } + + /** + * @returns New array with all falsy values removed. The original array IS NOT modified. + */ + export function coalesce(array: ReadonlyArray): T[] { + return array.filter(e => !!e); + } } /** diff --git a/packages/core/src/electron-browser/messaging/electron-ws-connection-provider.ts b/packages/core/src/electron-browser/messaging/electron-ws-connection-provider.ts index f29776df9fa48..f5a5fd6e90cd5 100644 --- a/packages/core/src/electron-browser/messaging/electron-ws-connection-provider.ts +++ b/packages/core/src/electron-browser/messaging/electron-ws-connection-provider.ts @@ -37,7 +37,7 @@ export class ElectronWebSocketConnectionProvider extends WebSocketConnectionProv // Manually close the websocket connections `onStop`. Otherwise, the channels will be closed with 30 sec (`MessagingContribution#checkAliveTimeout`) delay. // https://github.com/eclipse-theia/theia/issues/6499 // `1001` indicates that an endpoint is "going away", such as a server going down or a browser having navigated away from a page. - this.channelMultiPlexer?.onUnderlyingChannelClose({ reason: 'The frontend is "going away"', code: 1001 }); + this.channelMultiplexer?.onUnderlyingChannelClose({ reason: 'The frontend is "going away"', code: 1001 }); } override async openChannel(path: string, handler: (channel: Channel) => void, options?: WebSocketOptions): Promise { diff --git a/packages/core/src/electron-browser/window/electron-window-service.ts b/packages/core/src/electron-browser/window/electron-window-service.ts index db36a486ecd13..fd39ba39dfc33 100644 --- a/packages/core/src/electron-browser/window/electron-window-service.ts +++ b/packages/core/src/electron-browser/window/electron-window-service.ts @@ -72,7 +72,7 @@ export class ElectronWindowService extends DefaultWindowService { * after running FrontendApplication `onWillStop` handlers or on the `cancelChannel` if it is not safe to exit. */ protected async handleCloseRequestedEvent(event: CloseRequestArguments): Promise { - const safeToClose = await this.isSafeToShutDown(); + const safeToClose = await this.isSafeToShutDown(event.reason); if (safeToClose) { console.debug(`Shutting down because of ${StopReason[event.reason]} request.`); electron.ipcRenderer.send(event.confirmChannel); diff --git a/packages/core/src/electron-common/messaging/electron-messages.ts b/packages/core/src/electron-common/messaging/electron-messages.ts index 9c3d15c1beca2..53ec84e7edb6d 100644 --- a/packages/core/src/electron-common/messaging/electron-messages.ts +++ b/packages/core/src/electron-common/messaging/electron-messages.ts @@ -14,6 +14,10 @@ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 // ***************************************************************************** +import { StopReason } from '../../common/frontend-application-state'; +/** @deprecated @since 1.28 import from common/frontend-application-state instead */ +export { StopReason }; + export const RequestTitleBarStyle = 'requestTitleBarStyle'; export const TitleBarStyleChanged = 'titleBarStyleChanged'; export const TitleBarStyleAtStartup = 'titleBarStyleAtStartup'; @@ -31,21 +35,6 @@ export const RELOAD_REQUESTED_SIGNAL = 'reload-requested'; */ export const APPLICATION_STATE_CHANGE_SIGNAL = 'application-state-changed'; -export enum StopReason { - /** - * Closing the window with no prospect of restart. - */ - Close, - /** - * Reload without closing the window. - */ - Reload, - /** - * Reload that includes closing the window. - */ - Restart, // eslint-disable-line @typescript-eslint/no-shadow -} - export interface CloseRequestArguments { confirmChannel: string; cancelChannel: string; diff --git a/packages/core/src/electron-main/messaging/electron-messaging-contribution.ts b/packages/core/src/electron-main/messaging/electron-messaging-contribution.ts index b2e4b00e2e1a3..e7aa0b511c711 100644 --- a/packages/core/src/electron-main/messaging/electron-messaging-contribution.ts +++ b/packages/core/src/electron-main/messaging/electron-messaging-contribution.ts @@ -44,9 +44,9 @@ export class ElectronMessagingContribution implements ElectronMainApplicationCon protected readonly channelHandlers = new MessagingContribution.ConnectionHandlers(); /** - * Each electron window has a main chanel and its own multiplexer to route multiple client messages the same IPC connection. + * Each electron window has a main channel and its own multiplexer to route multiple client messages the same IPC connection. */ - protected readonly windowChannelMultiplexer = new Map(); + protected readonly windowChannelMultiplexer = new Map(); @postConstruct() protected init(): void { @@ -67,10 +67,10 @@ export class ElectronMessagingContribution implements ElectronMainApplicationCon } // Creates a new multiplexer for a given sender/window - protected createWindowChannelData(sender: Electron.WebContents): { channel: ElectronWebContentChannel, multiPlexer: ChannelMultiplexer } { + protected createWindowChannelData(sender: Electron.WebContents): { channel: ElectronWebContentChannel, multiplexer: ChannelMultiplexer } { const mainChannel = this.createWindowMainChannel(sender); - const multiPlexer = new ChannelMultiplexer(mainChannel); - multiPlexer.onDidOpenChannel(openEvent => { + const multiplexer = new ChannelMultiplexer(mainChannel); + multiplexer.onDidOpenChannel(openEvent => { const { channel, id } = openEvent; if (this.channelHandlers.route(id, channel)) { console.debug(`Opening channel for service path '${id}'.`); @@ -78,9 +78,9 @@ export class ElectronMessagingContribution implements ElectronMainApplicationCon } }); - sender.once('did-navigate', () => multiPlexer.onUnderlyingChannelClose({ reason: 'Window was refreshed' })); // When refreshing the browser window. - sender.once('destroyed', () => multiPlexer.onUnderlyingChannelClose({ reason: 'Window was closed' })); // When closing the browser window. - const data = { channel: mainChannel, multiPlexer }; + sender.once('did-navigate', () => multiplexer.onUnderlyingChannelClose({ reason: 'Window was refreshed' })); // When refreshing the browser window. + sender.once('destroyed', () => multiplexer.onUnderlyingChannelClose({ reason: 'Window was closed' })); // When closing the browser window. + const data = { channel: mainChannel, multiplexer }; this.windowChannelMultiplexer.set(sender.id, data); return data; } diff --git a/packages/debug/package.json b/packages/debug/package.json index d4bafedcb1412..d736137e0f04f 100644 --- a/packages/debug/package.json +++ b/packages/debug/package.json @@ -1,21 +1,21 @@ { "name": "@theia/debug", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - Debug Extension", "dependencies": { - "@theia/console": "1.27.0", - "@theia/core": "1.27.0", - "@theia/editor": "1.27.0", - "@theia/filesystem": "1.27.0", - "@theia/markers": "1.27.0", - "@theia/monaco": "1.27.0", + "@theia/console": "1.28.0", + "@theia/core": "1.28.0", + "@theia/editor": "1.28.0", + "@theia/filesystem": "1.28.0", + "@theia/markers": "1.28.0", + "@theia/monaco": "1.28.0", "@theia/monaco-editor-core": "1.67.2", - "@theia/output": "1.27.0", - "@theia/process": "1.27.0", - "@theia/task": "1.27.0", - "@theia/terminal": "1.27.0", - "@theia/variable-resolver": "1.27.0", - "@theia/workspace": "1.27.0", + "@theia/output": "1.28.0", + "@theia/process": "1.28.0", + "@theia/task": "1.28.0", + "@theia/terminal": "1.28.0", + "@theia/variable-resolver": "1.28.0", + "@theia/workspace": "1.28.0", "jsonc-parser": "^2.2.0", "mkdirp": "^0.5.0", "p-debounce": "^2.1.0", @@ -63,7 +63,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0" + "@theia/ext-scripts": "1.28.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/debug/src/browser/disassembly-view/disassembly-view-widget.ts b/packages/debug/src/browser/disassembly-view/disassembly-view-widget.ts index 958d93da6a6cd..1a26478e07284 100644 --- a/packages/debug/src/browser/disassembly-view/disassembly-view-widget.ts +++ b/packages/debug/src/browser/disassembly-view/disassembly-view-widget.ts @@ -44,7 +44,7 @@ import { URI } from '@theia/core/lib/common/uri'; // This file is adapted from https://github.com/microsoft/vscode/blob/c061ce5c24fc480342fbc5f23244289d633c56eb/src/vs/workbench/contrib/debug/browser/disassemblyView.ts -// Special entry as a placeholer when disassembly is not available +// Special entry as a placeholder when disassembly is not available const disassemblyNotAvailable: DisassembledInstructionEntry = { allowBreakpoint: false, isBreakpointSet: false, diff --git a/packages/debug/src/browser/editor/debug-breakpoint-widget.tsx b/packages/debug/src/browser/editor/debug-breakpoint-widget.tsx index 2fd7d85e28bf4..f9a2d4fe01a86 100644 --- a/packages/debug/src/browser/editor/debug-breakpoint-widget.tsx +++ b/packages/debug/src/browser/editor/debug-breakpoint-widget.tsx @@ -15,7 +15,7 @@ // ***************************************************************************** import * as React from '@theia/core/shared/react'; -import * as ReactDOM from '@theia/core/shared/react-dom'; +import { createRoot, Root } from '@theia/core/shared/react-dom/client'; import { DebugProtocol } from 'vscode-debugprotocol'; import { injectable, postConstruct, inject } from '@theia/core/shared/inversify'; import { Disposable, DisposableCollection, nls } from '@theia/core'; @@ -55,6 +55,7 @@ export class DebugBreakpointWidget implements Disposable { protected readonly editorProvider: MonacoEditorProvider; protected selectNode: HTMLDivElement; + protected selectNodeRoot: Root; protected zone: MonacoEditorZoneWidget; @@ -99,6 +100,8 @@ export class DebugBreakpointWidget implements Disposable { const selectNode = this.selectNode = document.createElement('div'); selectNode.classList.add('theia-debug-breakpoint-select'); this.zone.containerNode.appendChild(selectNode); + this.selectNodeRoot = createRoot(this.selectNode); + this.toDispose.push(Disposable.create(() => this.selectNodeRoot.unmount())); const inputNode = document.createElement('div'); inputNode.classList.add('theia-debug-breakpoint-input'); @@ -148,7 +151,6 @@ export class DebugBreakpointWidget implements Disposable { this.zone.layout(heightInLines); this.updatePlaceholder(); })); - this.toDispose.push(Disposable.create(() => ReactDOM.unmountComponentAtNode(selectNode))); } dispose(): void { @@ -213,14 +215,14 @@ export class DebugBreakpointWidget implements Disposable { if (this._input) { this._input.getControl().setValue(this._values[this.context] || ''); } - ReactDOM.render(, this.selectNode); + />); } protected readonly updateInput = (option: SelectOption) => { diff --git a/packages/debug/src/browser/editor/debug-exception-widget.tsx b/packages/debug/src/browser/editor/debug-exception-widget.tsx index 723ca64325b01..2658bd727acf3 100644 --- a/packages/debug/src/browser/editor/debug-exception-widget.tsx +++ b/packages/debug/src/browser/editor/debug-exception-widget.tsx @@ -15,13 +15,15 @@ // ***************************************************************************** import * as React from '@theia/core/shared/react'; -import * as ReactDOM from '@theia/core/shared/react-dom'; +import { createRoot, Root } from '@theia/core/shared/react-dom/client'; import * as monaco from '@theia/monaco-editor-core'; import { injectable, inject, postConstruct } from '@theia/core/shared/inversify'; import { Disposable, DisposableCollection } from '@theia/core/lib/common/disposable'; import { MonacoEditorZoneWidget } from '@theia/monaco/lib/browser/monaco-editor-zone-widget'; import { DebugEditor } from './debug-editor'; import { DebugExceptionInfo } from '../model/debug-thread'; +import { nls } from '@theia/core/lib/common/nls'; +import { codicon } from '@theia/core/lib/browser/widgets'; export interface ShowDebugExceptionParams { info: DebugExceptionInfo @@ -52,6 +54,7 @@ export class DebugExceptionWidget implements Disposable { readonly editor: DebugEditor; protected zone: MonacoEditorZoneWidget; + protected containerNodeRoot: Root; protected readonly toDispose = new DisposableCollection(); @@ -59,7 +62,8 @@ export class DebugExceptionWidget implements Disposable { protected async init(): Promise { this.toDispose.push(this.zone = new DebugExceptionMonacoEditorZoneWidget(this.editor.getControl())); this.zone.containerNode.classList.add('theia-debug-exception-widget'); - this.toDispose.push(Disposable.create(() => ReactDOM.unmountComponentAtNode(this.zone.containerNode))); + this.containerNodeRoot = createRoot(this.zone.containerNode); + this.toDispose.push(Disposable.create(() => this.containerNodeRoot.unmount())); this.toDispose.push(this.editor.getControl().onDidLayoutChange(() => this.layout())); } @@ -89,11 +93,17 @@ export class DebugExceptionWidget implements Disposable { protected render(info: DebugExceptionInfo, cb: () => void): void { const stackTrace = info.details && info.details.stackTrace; - ReactDOM.render( -
{info.id ? `Exception has occurred: ${info.id}` : 'Exception has occurred.'}
+ const exceptionTitle = info.id ? + nls.localizeByDefault('Exception has occurred: {0}', info.id) : + nls.localizeByDefault('Exception has occurred.'); + this.containerNodeRoot.render( +
+ {exceptionTitle} + this.hide()} title={nls.localizeByDefault('Close')}> +
{info.description &&
{info.description}
} {stackTrace &&
{stackTrace}
} -
, this.zone.containerNode, cb); +
); } protected layout(): void { diff --git a/packages/debug/src/browser/editor/debug-hover-widget.ts b/packages/debug/src/browser/editor/debug-hover-widget.ts index fa5e4f208c921..ea1d1c2f87d67 100644 --- a/packages/debug/src/browser/editor/debug-hover-widget.ts +++ b/packages/debug/src/browser/editor/debug-hover-widget.ts @@ -28,6 +28,11 @@ import { DebugExpressionProvider } from './debug-expression-provider'; import { DebugHoverSource } from './debug-hover-source'; import { DebugVariable } from '../console/debug-console-items'; import * as monaco from '@theia/monaco-editor-core'; +import { StandaloneServices } from '@theia/monaco-editor-core/esm/vs/editor/standalone/browser/standaloneServices'; +import { ILanguageFeaturesService } from '@theia/monaco-editor-core/esm/vs/editor/common/services/languageFeatures'; +import { CancellationTokenSource } from '@theia/monaco-editor-core/esm/vs/base/common/cancellation'; +import { Position } from '@theia/monaco-editor-core/esm/vs/editor/common/core/position'; +import { ArrayUtils } from '@theia/core'; export interface ShowDebugHoverOptions { selection: monaco.Range @@ -146,6 +151,8 @@ export class DebugHoverWidget extends SourceTreeWidget implements monaco.editor. } protected async doShow(options: ShowDebugHoverOptions | undefined = this.options): Promise { + const cancellationSource = new CancellationTokenSource(); + if (!this.isEditorFrame()) { this.hide(); return; @@ -162,7 +169,33 @@ export class DebugHoverWidget extends SourceTreeWidget implements monaco.editor. } this.options = options; - const matchingExpression = this.expressionProvider.get(this.editor.getControl().getModel()!, options.selection); + let matchingExpression: string | undefined; + + const pluginExpressionProvider = StandaloneServices.get(ILanguageFeaturesService).evaluatableExpressionProvider; + const textEditorModel = this.editor.document.textEditorModel; + + if (pluginExpressionProvider && pluginExpressionProvider.has(textEditorModel)) { + const registeredProviders = pluginExpressionProvider.ordered(textEditorModel); + const position = new Position(this.options!.selection.startLineNumber, this.options!.selection.startColumn); + + const promises = registeredProviders.map(support => + Promise.resolve(support.provideEvaluatableExpression(textEditorModel, position, cancellationSource.token)) + ); + + const results = await Promise.all(promises).then(ArrayUtils.coalesce); + if (results.length > 0) { + matchingExpression = results[0].expression; + const range = results[0].range; + + if (!matchingExpression) { + const lineContent = textEditorModel.getLineContent(position.lineNumber); + matchingExpression = lineContent.substring(range.startColumn - 1, range.endColumn - 1); + } + } + } else { // use fallback if no provider was registered + matchingExpression = this.expressionProvider.get(this.editor.getControl().getModel()!, options.selection); + } + if (!matchingExpression) { this.hide(); return; diff --git a/packages/debug/src/browser/style/index.css b/packages/debug/src/browser/style/index.css index 8cfc8a0912a77..05fe0259f1769 100644 --- a/packages/debug/src/browser/style/index.css +++ b/packages/debug/src/browser/style/index.css @@ -211,7 +211,7 @@ } .codicon-debug-hint { - cursor: pointer; + cursor: pointer; } .codicon-debug-breakpoint, @@ -227,7 +227,7 @@ } .codicon[class*='-disabled'] { - color: var(--theia-debugIcon-breakpointDisabledForeground) !important; + color: var(--theia-debugIcon-breakpointDisabledForeground) !important; } .codicon[class*='-unverified'] { @@ -245,41 +245,41 @@ .codicon-debug-breakpoint.codicon-debug-stackframe-focused::after, .codicon-debug-breakpoint.codicon-debug-stackframe::after { - content: '\eb8a'; - position: absolute; + content: '\eb8a'; + position: absolute; } .monaco-editor .theia-debug-breakpoint-column::before { - height: .9em; - display: inline-flex; - vertical-align: middle; + height: .9em; + display: inline-flex; + vertical-align: middle; } .monaco-editor .theia-debug-top-stack-frame-column::before { - content: ' '; - width: 0.9em; - display: inline-flex; - vertical-align: middle; - margin-top: -1px; /* TODO @misolori: figure out a way to not use negative margin for alignment */ + content: ' '; + width: 0.9em; + display: inline-flex; + vertical-align: middle; + margin-top: -1px; /* TODO @misolori: figure out a way to not use negative margin for alignment */ } .monaco-editor .theia-debug-top-stack-frame-column { - display: inline-flex; - vertical-align: middle; + display: inline-flex; + vertical-align: middle; } .monaco-editor .theia-debug-top-stack-frame-column::before { - content: '\eb8b'; - font: normal normal normal 16px/1 codicon; - text-rendering: auto; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - margin-left: 0; - margin-right: 4px; + content: '\eb8b'; + font: normal normal normal 16px/1 codicon; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + margin-left: 0; + margin-right: 4px; } .codicon-debug-hint:not([class*='codicon-debug-breakpoint']):not([class*='codicon-debug-stackframe']) { - opacity: 0.4 !important; + opacity: 0.4 !important; } .monaco-editor .view-overlays .theia-debug-top-stack-frame-line { @@ -368,17 +368,17 @@ } .theia-debug-breakpoint-select { - display: flex; - justify-content: center; - flex-direction: column; - padding: 0 10px; - flex-shrink: 0; + display: flex; + justify-content: center; + flex-direction: column; + padding: 0 10px; + flex-shrink: 0; } .theia-debug-breakpoint-input { - flex: 1; - margin-top: var(--theia-ui-padding); - margin-bottom: var(--theia-ui-padding); + flex: 1; + margin-top: var(--theia-ui-padding); + margin-bottom: var(--theia-ui-padding); } /* Status Bar */ @@ -401,15 +401,22 @@ border-bottom-color: var(--theia-debugExceptionWidget-border); background-color: var(--theia-debugExceptionWidget-background); padding: var(--theia-ui-padding) calc(var(--theia-ui-padding)*1.5); - white-space: pre-wrap; - user-select: text; + white-space: pre-wrap; + user-select: text; overflow: hidden; } .theia-debug-exception-widget .title { - font-weight: bold; + font-family: var(--theia-ui-font-family); + font-weight: bold; } .theia-debug-exception-widget .stack-trace { - margin-top: 0.5em; + margin-top: 0.5em; +} + +.theia-debug-exception-widget #exception-close { + cursor: pointer; + margin-left: 5px; + vertical-align: middle; } diff --git a/packages/debug/src/browser/view/debug-configuration-widget.tsx b/packages/debug/src/browser/view/debug-configuration-widget.tsx index 71132dfb5f77e..124aeac52fe76 100644 --- a/packages/debug/src/browser/view/debug-configuration-widget.tsx +++ b/packages/debug/src/browser/view/debug-configuration-widget.tsx @@ -15,7 +15,7 @@ // ***************************************************************************** import { ReactWidget, QuickInputService } from '@theia/core/lib/browser'; -import { CommandRegistry, Disposable, MessageService } from '@theia/core/lib/common'; +import { CommandRegistry, Disposable, DisposableCollection, MessageService } from '@theia/core/lib/common'; import { inject, injectable, postConstruct } from '@theia/core/shared/inversify'; import * as React from '@theia/core/shared/react'; import { WorkspaceService } from '@theia/workspace/lib/browser'; @@ -55,6 +55,8 @@ export class DebugConfigurationWidget extends ReactWidget { @inject(MessageService) protected readonly messageService: MessageService; + protected readonly onRender = new DisposableCollection(); + @postConstruct() protected init(): void { this.addClass('debug-toolbar'); @@ -80,7 +82,10 @@ export class DebugConfigurationWidget extends ReactWidget { } protected stepRef: DebugAction | undefined; - protected setStepRef = (stepRef: DebugAction | null) => this.stepRef = stepRef || undefined; + protected setStepRef = (stepRef: DebugAction | null) => { + this.stepRef = stepRef || undefined; + this.onRender.dispose(); + }; render(): React.ReactNode { return diff --git a/packages/debug/src/browser/view/debug-toolbar-widget.tsx b/packages/debug/src/browser/view/debug-toolbar-widget.tsx index 9cfe951a23dc0..705c29f6c19bc 100644 --- a/packages/debug/src/browser/view/debug-toolbar-widget.tsx +++ b/packages/debug/src/browser/view/debug-toolbar-widget.tsx @@ -16,7 +16,7 @@ import * as React from '@theia/core/shared/react'; import { inject, postConstruct, injectable } from '@theia/core/shared/inversify'; -import { Disposable, MenuPath } from '@theia/core'; +import { Disposable, DisposableCollection, MenuPath } from '@theia/core'; import { ReactWidget } from '@theia/core/lib/browser/widgets'; import { DebugViewModel } from './debug-view-model'; import { DebugState } from '../debug-session'; @@ -31,6 +31,8 @@ export class DebugToolBar extends ReactWidget { @inject(DebugViewModel) protected readonly model: DebugViewModel; + protected readonly onRender = new DisposableCollection(); + @postConstruct() protected init(): void { this.id = 'debug:toolbar:' + this.model.id; @@ -55,7 +57,10 @@ export class DebugToolBar extends ReactWidget { return true; } protected stepRef: DebugAction | undefined; - protected setStepRef = (stepRef: DebugAction | null) => this.stepRef = stepRef || undefined; + protected setStepRef = (stepRef: DebugAction | null) => { + this.stepRef = stepRef || undefined; + this.onRender.dispose(); + }; protected render(): React.ReactNode { const { state } = this.model; diff --git a/packages/debug/src/common/debug-configuration.ts b/packages/debug/src/common/debug-configuration.ts index 262c75b810438..6abd0a8a725d6 100644 --- a/packages/debug/src/common/debug-configuration.ts +++ b/packages/debug/src/common/debug-configuration.ts @@ -56,7 +56,7 @@ export interface DebugConfiguration { * The data is sent as the 'restart' attribute of the 'terminated' event. * The client should leave the data intact. */ - __restart?: any; + __restart?: boolean; /** default: neverOpen */ openDebug?: 'neverOpen' | 'openOnSessionStart' | 'openOnFirstSessionStart' | 'openOnDebugBreak'; @@ -71,7 +71,7 @@ export interface DebugConfiguration { postDebugTask?: string | TaskIdentifier; } export namespace DebugConfiguration { - export function is(arg: DebugConfiguration | any): arg is DebugConfiguration { + export function is(arg: unknown): arg is DebugConfiguration { return !!arg && typeof arg === 'object' && 'type' in arg && 'name' in arg && 'request' in arg; } } diff --git a/packages/debug/src/node/debug-adapter-factory.ts b/packages/debug/src/node/debug-adapter-factory.ts index cf0792d1233c2..dd0b0b9026e3f 100644 --- a/packages/debug/src/node/debug-adapter-factory.ts +++ b/packages/debug/src/node/debug-adapter-factory.ts @@ -66,9 +66,8 @@ export class LaunchBasedDebugAdapterFactory implements DebugAdapterFactory { } private childProcess(executable: DebugAdapterExecutable): RawProcess { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const isForkOptions = (forkOptions: RawForkOptions | any): forkOptions is RawForkOptions => - !!forkOptions && !!forkOptions.modulePath; + const isForkOptions = (forkOptions: unknown): forkOptions is RawForkOptions => + !!forkOptions && typeof forkOptions === 'object' && 'modulePath' in forkOptions; const processOptions: RawProcessOptions | RawForkOptions = { ...executable }; const options: { stdio: (string | number)[], env?: object, execArgv?: string[] } = { stdio: ['pipe', 'pipe', 2] }; diff --git a/packages/editor-preview/package.json b/packages/editor-preview/package.json index 464193557e1cb..757f3e9019770 100644 --- a/packages/editor-preview/package.json +++ b/packages/editor-preview/package.json @@ -1,11 +1,11 @@ { "name": "@theia/editor-preview", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - Editor Preview Extension", "dependencies": { - "@theia/core": "1.27.0", - "@theia/editor": "1.27.0", - "@theia/navigator": "1.27.0" + "@theia/core": "1.28.0", + "@theia/editor": "1.28.0", + "@theia/navigator": "1.28.0" }, "publishConfig": { "access": "public" @@ -40,7 +40,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0" + "@theia/ext-scripts": "1.28.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/editor/package.json b/packages/editor/package.json index 84619fa056f1b..c709feb21ebf2 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -1,10 +1,10 @@ { "name": "@theia/editor", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - Editor Extension", "dependencies": { - "@theia/core": "1.27.0", - "@theia/variable-resolver": "1.27.0" + "@theia/core": "1.28.0", + "@theia/variable-resolver": "1.28.0" }, "publishConfig": { "access": "public" @@ -39,7 +39,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0" + "@theia/ext-scripts": "1.28.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/editor/src/browser/editor-menu.ts b/packages/editor/src/browser/editor-menu.ts index b2612a0bf7670..c1f359a622aff 100644 --- a/packages/editor/src/browser/editor-menu.ts +++ b/packages/editor/src/browser/editor-menu.ts @@ -46,6 +46,16 @@ export namespace EditorMainMenu { */ export const NAVIGATION_GROUP = [...GO, '1_navigation_group']; + /** + * Context management group in the `Go` main menu: Pane and editor switching commands. + */ + export const CONTEXT_GROUP = [...GO, '1.1_context_group']; + + /** + * Submenu for switching panes in the main area. + */ + export const PANE_GROUP = [...CONTEXT_GROUP, '2_pane_group']; + /** * Workspace menu group in the `Go` main-menu. */ @@ -104,6 +114,29 @@ export class EditorMenuContribution implements MenuContribution { order: '3' }); + registry.registerSubmenu(EditorMainMenu.PANE_GROUP, nls.localizeByDefault('Switch Group')); + const BY_NUMBER = [...EditorMainMenu.PANE_GROUP, '1_by_number']; + registry.registerMenuAction(BY_NUMBER, { + commandId: 'workbench.action.focusFirstEditorGroup', + label: nls.localizeByDefault('Group 1'), + }); + registry.registerMenuAction(BY_NUMBER, { + commandId: 'workbench.action.focusSecondEditorGroup', + label: nls.localizeByDefault('Group 2'), + }); + registry.registerMenuAction(BY_NUMBER, { + commandId: 'workbench.action.focusThirdEditorGroup', + label: nls.localizeByDefault('Group 3'), + }); + registry.registerMenuAction(BY_NUMBER, { + commandId: 'workbench.action.focusFourthEditorGroup', + label: nls.localizeByDefault('Group 4'), + }); + registry.registerMenuAction(BY_NUMBER, { + commandId: 'workbench.action.focusFifthEditorGroup', + label: nls.localizeByDefault('Group 5'), + }); + registry.registerMenuAction(EditorMainMenu.LOCATION_GROUP, { commandId: EditorCommands.GOTO_LINE_COLUMN.id, order: '1' diff --git a/packages/editor/src/browser/editor.ts b/packages/editor/src/browser/editor.ts index a5f95136fab2b..12a1cf85c21e2 100644 --- a/packages/editor/src/browser/editor.ts +++ b/packages/editor/src/browser/editor.ts @@ -331,9 +331,8 @@ export interface ReplaceOperation { } export namespace TextEditorSelection { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function is(e: any): e is TextEditorSelection { - return e && e['uri'] instanceof URI; + export function is(e: unknown): e is TextEditorSelection { + return !!e && typeof e === 'object' && (e as TextEditorSelection).uri instanceof URI; } } diff --git a/packages/electron/package.json b/packages/electron/package.json index 9de769def6fd0..b88f8ef82d014 100644 --- a/packages/electron/package.json +++ b/packages/electron/package.json @@ -1,6 +1,6 @@ { "name": "@theia/electron", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - Electron utility package", "dependencies": { "@electron/remote": "^2.0.1 <2.0.4 || >2.0.4", @@ -9,8 +9,8 @@ "native-keymap": "^2.2.1" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0", - "@theia/re-exports": "1.27.0" + "@theia/ext-scripts": "1.28.0", + "@theia/re-exports": "1.28.0" }, "peerDependencies": { "electron": "^15.3.5" diff --git a/packages/external-terminal/package.json b/packages/external-terminal/package.json index 522c86e3bb08e..c9b6a38a984da 100644 --- a/packages/external-terminal/package.json +++ b/packages/external-terminal/package.json @@ -1,11 +1,11 @@ { "name": "@theia/external-terminal", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - External Terminal Extension", "dependencies": { - "@theia/core": "1.27.0", - "@theia/editor": "1.27.0", - "@theia/workspace": "1.27.0" + "@theia/core": "1.28.0", + "@theia/editor": "1.28.0", + "@theia/workspace": "1.28.0" }, "publishConfig": { "access": "public" @@ -41,7 +41,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0" + "@theia/ext-scripts": "1.28.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/file-search/package.json b/packages/file-search/package.json index 42db0086fc301..f0f0398d096cd 100644 --- a/packages/file-search/package.json +++ b/packages/file-search/package.json @@ -1,13 +1,13 @@ { "name": "@theia/file-search", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - File Search Extension", "dependencies": { - "@theia/core": "1.27.0", - "@theia/editor": "1.27.0", - "@theia/filesystem": "1.27.0", - "@theia/process": "1.27.0", - "@theia/workspace": "1.27.0", + "@theia/core": "1.28.0", + "@theia/editor": "1.28.0", + "@theia/filesystem": "1.28.0", + "@theia/process": "1.28.0", + "@theia/workspace": "1.28.0", "@vscode/ripgrep": "^1.14.2" }, "publishConfig": { @@ -44,7 +44,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0" + "@theia/ext-scripts": "1.28.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/filesystem/package.json b/packages/filesystem/package.json index 150821d837501..a152938bd91e3 100644 --- a/packages/filesystem/package.json +++ b/packages/filesystem/package.json @@ -1,9 +1,9 @@ { "name": "@theia/filesystem", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - FileSystem Extension", "dependencies": { - "@theia/core": "1.27.0", + "@theia/core": "1.28.0", "@types/body-parser": "^1.17.0", "@types/multer": "^1.4.7", "@types/rimraf": "^2.0.2", @@ -63,7 +63,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0" + "@theia/ext-scripts": "1.28.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/filesystem/src/browser/file-selection.ts b/packages/filesystem/src/browser/file-selection.ts index f08b59981bb79..81aefa5942992 100644 --- a/packages/filesystem/src/browser/file-selection.ts +++ b/packages/filesystem/src/browser/file-selection.ts @@ -22,8 +22,8 @@ export interface FileSelection { fileStat: FileStat } export namespace FileSelection { - export function is(arg: Object | undefined): arg is FileSelection { - return typeof arg === 'object' && ('fileStat' in arg) && FileStat.is(arg['fileStat']); + export function is(arg: unknown): arg is FileSelection { + return !!arg && typeof arg === 'object' && ('fileStat' in arg) && FileStat.is((arg as FileSelection).fileStat); } export class CommandHandler extends SelectionCommandHandler { diff --git a/packages/filesystem/src/browser/file-tree/file-tree.ts b/packages/filesystem/src/browser/file-tree/file-tree.ts index e347a46bb7c04..733ec2766e9c4 100644 --- a/packages/filesystem/src/browser/file-tree/file-tree.ts +++ b/packages/filesystem/src/browser/file-tree/file-tree.ts @@ -101,8 +101,8 @@ export class FileTree extends TreeImpl { export interface FileStatNode extends SelectableTreeNode, Mutable, FileSelection { } export namespace FileStatNode { - export function is(node: object | undefined): node is FileStatNode { - return !!node && 'fileStat' in node; + export function is(node: unknown): node is FileStatNode { + return !!node && typeof node === 'object' && 'fileStat' in node; } export function getUri(node: TreeNode | undefined): string | undefined { @@ -119,21 +119,21 @@ export type FileStatNodeData = Omit & { fileStat?: FileStat }; export namespace FileStatNodeData { - export function is(node: object | undefined): node is FileStatNodeData { - return !!node && 'uri' in node && ('fileStat' in node || 'stat' in node); + export function is(node: unknown): node is FileStatNodeData { + return !!node && typeof node === 'object' && 'uri' in node && ('fileStat' in node || 'stat' in node); } } export type FileNode = FileStatNode; export namespace FileNode { - export function is(node: Object | undefined): node is FileNode { + export function is(node: unknown): node is FileNode { return FileStatNode.is(node) && !node.fileStat.isDirectory; } } export type DirNode = FileStatNode & ExpandableTreeNode; export namespace DirNode { - export function is(node: Object | undefined): node is DirNode { + export function is(node: unknown): node is DirNode { return FileStatNode.is(node) && node.fileStat.isDirectory; } diff --git a/packages/filesystem/src/browser/location/location-renderer.tsx b/packages/filesystem/src/browser/location/location-renderer.tsx index 5f4992546191b..12bfa6e85aa11 100644 --- a/packages/filesystem/src/browser/location/location-renderer.tsx +++ b/packages/filesystem/src/browser/location/location-renderer.tsx @@ -17,7 +17,6 @@ import URI from '@theia/core/lib/common/uri'; import { LocationService } from './location-service'; import * as React from '@theia/core/shared/react'; -import * as ReactDOM from '@theia/core/shared/react-dom'; import { FileService } from '../file-service'; import { DisposableCollection, Emitter, Path } from '@theia/core/lib/common'; import { injectable, inject, postConstruct } from '@theia/core/shared/inversify'; @@ -109,6 +108,7 @@ export class LocationListRenderer extends ReactRenderer { super(options.host); this.service = options.model; this.doLoadDrives(); + this.doAfterRender = this.doAfterRender.bind(this); } @postConstruct() @@ -118,7 +118,7 @@ export class LocationListRenderer extends ReactRenderer { } override render(): void { - ReactDOM.render(this.doRender(), this.host, this.doAfterRender); + this.hostRoot.render(this.doRender()); } protected initResolveDirectoryCache(): void { @@ -178,6 +178,7 @@ export class LocationListRenderer extends ReactRenderer { title={this.doShowTextInput ? LocationListRenderer.Tooltips.TOGGLE_SELECT_INPUT : LocationListRenderer.Tooltips.TOGGLE_TEXT_INPUT} + ref={this.doAfterRender} > diff --git a/packages/filesystem/src/common/download/file-download-data.ts b/packages/filesystem/src/common/download/file-download-data.ts index fab1fb708101b..048e8da47bce9 100644 --- a/packages/filesystem/src/common/download/file-download-data.ts +++ b/packages/filesystem/src/common/download/file-download-data.ts @@ -19,7 +19,7 @@ export interface FileDownloadData { } export namespace FileDownloadData { - export function is(arg: Object | undefined): arg is FileDownloadData { - return !!arg && 'uris' in arg; + export function is(arg: unknown): arg is FileDownloadData { + return !!arg && typeof arg === 'object' && 'uris' in arg; } } diff --git a/packages/filesystem/src/common/files.ts b/packages/filesystem/src/common/files.ts index dde1eac4ecb1d..2dfed8108bb9c 100644 --- a/packages/filesystem/src/common/files.ts +++ b/packages/filesystem/src/common/files.ts @@ -200,11 +200,10 @@ export interface BaseStat { etag?: string; } export namespace BaseStat { - export function is(arg: Object | undefined): arg is BaseStat { + export function is(arg: unknown): arg is BaseStat { return !!arg && typeof arg === 'object' - // eslint-disable-next-line @typescript-eslint/no-explicit-any - && ('resource' in arg && arg['resource'] instanceof URI) - && ('name' in arg && typeof arg['name'] === 'string'); + && ('resource' in arg && (arg as BaseStat).resource instanceof URI) + && ('name' in arg && typeof (arg as BaseStat).name === 'string'); } } @@ -241,11 +240,12 @@ export interface FileStat extends BaseStat { children?: FileStat[]; } export namespace FileStat { - export function is(arg: Object | undefined): arg is FileStat { - return BaseStat.is(arg) && - ('isFile' in arg && typeof arg['isFile'] === 'boolean') && - ('isDirectory' in arg && typeof arg['isDirectory'] === 'boolean') && - ('isSymbolicLink' in arg && typeof arg['isSymbolicLink'] === 'boolean'); + export function is(arg: unknown): arg is FileStat { + const fileStat = arg as FileStat; + return BaseStat.is(fileStat) && + ('isFile' in fileStat && typeof fileStat.isFile === 'boolean') && + ('isDirectory' in fileStat && typeof fileStat.isDirectory === 'boolean') && + ('isSymbolicLink' in fileStat && typeof fileStat.isSymbolicLink === 'boolean'); } export function asFileType(stat: FileStat): FileType { let res = 0; diff --git a/packages/getting-started/package.json b/packages/getting-started/package.json index a29c4c022fb57..cb4136ec7c8e5 100644 --- a/packages/getting-started/package.json +++ b/packages/getting-started/package.json @@ -1,11 +1,11 @@ { "name": "@theia/getting-started", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - GettingStarted Extension", "dependencies": { - "@theia/core": "1.27.0", - "@theia/keymaps": "1.27.0", - "@theia/workspace": "1.27.0" + "@theia/core": "1.28.0", + "@theia/keymaps": "1.28.0", + "@theia/workspace": "1.28.0" }, "publishConfig": { "access": "public" @@ -41,7 +41,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0" + "@theia/ext-scripts": "1.28.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/git/package.json b/packages/git/package.json index a35a47215970d..d25d996ead4ed 100644 --- a/packages/git/package.json +++ b/packages/git/package.json @@ -1,16 +1,16 @@ { "name": "@theia/git", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - Git Integration", "dependencies": { - "@theia/core": "1.27.0", - "@theia/editor": "1.27.0", - "@theia/filesystem": "1.27.0", + "@theia/core": "1.28.0", + "@theia/editor": "1.28.0", + "@theia/filesystem": "1.28.0", "@theia/monaco-editor-core": "1.67.2", - "@theia/navigator": "1.27.0", - "@theia/scm": "1.27.0", - "@theia/scm-extra": "1.27.0", - "@theia/workspace": "1.27.0", + "@theia/navigator": "1.28.0", + "@theia/scm": "1.28.0", + "@theia/scm-extra": "1.28.0", + "@theia/workspace": "1.28.0", "@types/diff": "^3.2.2", "@types/p-queue": "^2.3.1", "diff": "^3.4.0", @@ -65,7 +65,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0", + "@theia/ext-scripts": "1.28.0", "@types/luxon": "^2.3.2", "upath": "^1.0.2" }, diff --git a/packages/git/src/browser/blame/blame-contribution.ts b/packages/git/src/browser/blame/blame-contribution.ts index 3a42a153b14db..460e38bfd83e9 100644 --- a/packages/git/src/browser/blame/blame-contribution.ts +++ b/packages/git/src/browser/blame/blame-contribution.ts @@ -16,7 +16,7 @@ import { inject, injectable } from '@theia/core/shared/inversify'; import { KeybindingContribution, KeybindingRegistry } from '@theia/core/lib/browser'; -import { CommandContribution, CommandRegistry, Command, MenuContribution, MenuModelRegistry, Disposable, DisposableCollection } from '@theia/core/lib/common'; +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 { BlameManager } from './blame-manager'; @@ -60,8 +60,7 @@ export class BlameContribution implements CommandContribution, KeybindingContrib } } }, - isVisible: () => - !!this.currentFileEditorWidget, + isVisible: () => !!this.currentFileEditorWidget, isEnabled: () => { const editorWidget = this.currentFileEditorWidget; return !!editorWidget && this.isBlameable(editorWidget.editor.uri); @@ -74,8 +73,7 @@ export class BlameContribution implements CommandContribution, KeybindingContrib this.clearBlame(editorWidget.editor.uri); } }, - isVisible: () => - !!this.currentFileEditorWidget, + isVisible: () => !!this.currentFileEditorWidget, isEnabled: () => { const editorWidget = this.currentFileEditorWidget; const enabled = !!editorWidget && this.showsBlameAnnotations(editorWidget.editor.uri); @@ -85,7 +83,7 @@ export class BlameContribution implements CommandContribution, KeybindingContrib } showsBlameAnnotations(uri: string | URI): boolean { - return this.appliedDecorations.has(uri.toString()); + return this.appliedDecorations.get(uri.toString())?.disposed === false; } protected get currentFileEditorWidget(): EditorWidget | undefined { @@ -102,28 +100,34 @@ export class BlameContribution implements CommandContribution, KeybindingContrib return this.blameManager.isBlameable(uri.toString()); } - protected appliedDecorations = new Map(); + protected appliedDecorations = new Map(); protected async showBlame(editorWidget: EditorWidget): Promise { const uri = editorWidget.editor.uri.toString(); if (this.appliedDecorations.get(uri)) { return; } - const editor = editorWidget.editor; - const document = editor.document; - const content = document.dirty ? document.getText() : undefined; - const blame = await this.blameManager.getBlame(uri, content); - if (blame) { - const toDispose = new DisposableCollection(); - this.appliedDecorations.set(uri, toDispose); - toDispose.push(this.decorator.decorate(blame, editor, editor.cursor.line)); - toDispose.push(editor.onDocumentContentChanged(() => this.clearBlame(uri))); - toDispose.push(editor.onCursorPositionChanged(debounce(_position => { - if (!toDispose.disposed) { - this.decorator.decorate(blame, editor, editor.cursor.line); - } - }, 50))); - editorWidget.disposed.connect(() => this.clearBlame(uri)); + const toDispose = new DisposableCollection(); + this.appliedDecorations.set(uri, toDispose); + try { + const editor = editorWidget.editor; + const document = editor.document; + const content = document.dirty ? document.getText() : undefined; + const blame = await this.blameManager.getBlame(uri, content); + if (blame) { + toDispose.push(this.decorator.decorate(blame, editor, editor.cursor.line)); + toDispose.push(editor.onDocumentContentChanged(() => this.clearBlame(uri))); + toDispose.push(editor.onCursorPositionChanged(debounce(_position => { + if (!toDispose.disposed) { + this.decorator.decorate(blame, editor, editor.cursor.line); + } + }, 50))); + editorWidget.disposed.connect(() => this.clearBlame(uri)); + } + } finally { + if (toDispose.disposed) { + this.appliedDecorations.delete(uri); + }; } } diff --git a/packages/git/src/browser/diff/git-diff-contribution.ts b/packages/git/src/browser/diff/git-diff-contribution.ts index ccaff9aba8f14..82b4de5d044e3 100644 --- a/packages/git/src/browser/diff/git-diff-contribution.ts +++ b/packages/git/src/browser/diff/git-diff-contribution.ts @@ -178,14 +178,12 @@ export class GitDiffContribution extends AbstractViewContribution }); const viewModeEmitter = new Emitter(); - /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ - const extractDiffWidget = (widget: any) => { + const extractDiffWidget = (widget: unknown) => { if (widget instanceof GitDiffWidget) { return widget; } }; - /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ - const extractCommitDetailWidget = (widget: any) => { + const extractCommitDetailWidget = (widget: unknown) => { const ref = widget ? widget : this.editorManager.currentEditor; if (ref instanceof GitCommitDetailWidget) { return ref; diff --git a/packages/git/src/browser/diff/git-diff-widget.tsx b/packages/git/src/browser/diff/git-diff-widget.tsx index edd935eea1b8e..ad06f15b8fa85 100644 --- a/packages/git/src/browser/diff/git-diff-widget.tsx +++ b/packages/git/src/browser/diff/git-diff-widget.tsx @@ -28,8 +28,6 @@ import { ScmTreeWidget } from '@theia/scm/lib/browser/scm-tree-widget'; import { ScmPreferences } from '@theia/scm/lib/browser/scm-preferences'; import { nls } from '@theia/core'; -/* eslint-disable @typescript-eslint/no-explicit-any */ - export const GIT_DIFF = 'git-diff'; @injectable() export class GitDiffWidget extends BaseWidget implements StatefulWidget { @@ -135,14 +133,15 @@ export class GitDiffWidget extends BaseWidget implements StatefulWidget { this.resourceWidget.goToNextChange(); } - storeState(): any { - const state: object = { + storeState(): object { + const state = { commitState: this.diffHeaderWidget.storeState(), changesTreeState: this.resourceWidget.storeState(), }; return state; } + // eslint-disable-next-line @typescript-eslint/no-explicit-any restoreState(oldState: any): void { const { commitState, changesTreeState } = oldState; this.diffHeaderWidget.restoreState(commitState); diff --git a/packages/git/src/browser/git-scm-provider.ts b/packages/git/src/browser/git-scm-provider.ts index 740be2a0b6e1d..f88dd72a811d3 100644 --- a/packages/git/src/browser/git-scm-provider.ts +++ b/packages/git/src/browser/git-scm-provider.ts @@ -398,7 +398,7 @@ export class GitScmProvider implements ScmProvider { this.gitErrorHandler.handleError(error); } } else { - await this.commands.executeCommand(WorkspaceCommands.FILE_DELETE.id, new URI(pair.uri)); + await this.commands.executeCommand(WorkspaceCommands.FILE_DELETE.id, [new URI(pair.uri)]); } }; return discardSingle(); diff --git a/packages/git/src/common/git-model.ts b/packages/git/src/common/git-model.ts index ff87dfe7e41a9..64b8bd3cd2cca 100644 --- a/packages/git/src/common/git-model.ts +++ b/packages/git/src/common/git-model.ts @@ -212,8 +212,8 @@ export namespace Repository { } return repository === repository2; } - export function is(repository: Object | undefined): repository is Repository { - return !!repository && 'localUri' in repository; + export function is(repository: unknown): repository is Repository { + return !!repository && typeof repository === 'object' && 'localUri' in repository; } export function relativePath(repository: Repository | URI, uri: URI | string): Path | undefined { const repositoryUri = new URI(Repository.is(repository) ? repository.localUri : String(repository)); diff --git a/packages/git/src/common/git-watcher.ts b/packages/git/src/common/git-watcher.ts index c381ea368fbb8..a078e376f3cb3 100644 --- a/packages/git/src/common/git-watcher.ts +++ b/packages/git/src/common/git-watcher.ts @@ -47,9 +47,8 @@ export namespace GitStatusChangeEvent { * `true` if the argument is a `GitStatusEvent`, otherwise `false`. * @param event the argument to check whether it is a Git status change event or not. */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function is(event: any | undefined): event is GitStatusChangeEvent { - return !!event && ('source' in event) && ('status' in event); + export function is(event: unknown): event is GitStatusChangeEvent { + return !!event && typeof event === 'object' && ('source' in event) && ('status' in event); } } diff --git a/packages/git/src/common/git.ts b/packages/git/src/common/git.ts index 6cdd540de2269..9ed52916f2b35 100644 --- a/packages/git/src/common/git.ts +++ b/packages/git/src/common/git.ts @@ -846,56 +846,50 @@ export interface Git extends Disposable { } /** - * Contains a set of utility functions for [Git](#Git). + * Contains a set of utility functions for {@link Git}. */ export namespace GitUtils { /** * `true` if the argument is an option for renaming an existing branch in the repository. */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function isBranchRename(arg: any | undefined): arg is Git.Options.BranchCommand.Rename { - return !!arg && ('newName' in arg); + export function isBranchRename(arg: unknown): arg is Git.Options.BranchCommand.Rename { + return !!arg && typeof arg === 'object' && ('newName' in arg); } /** * `true` if the argument is an option for deleting an existing branch in the repository. */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function isBranchDelete(arg: any | undefined): arg is Git.Options.BranchCommand.Delete { - return !!arg && ('toDelete' in arg); + export function isBranchDelete(arg: unknown): arg is Git.Options.BranchCommand.Delete { + return !!arg && typeof arg === 'object' && ('toDelete' in arg); } /** * `true` if the argument is an option for creating a new branch in the repository. */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function isBranchCreate(arg: any | undefined): arg is Git.Options.BranchCommand.Create { - return !!arg && ('toCreate' in arg); + export function isBranchCreate(arg: unknown): arg is Git.Options.BranchCommand.Create { + return !!arg && typeof arg === 'object' && ('toCreate' in arg); } /** * `true` if the argument is an option for listing the branches in a repository. */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function isBranchList(arg: any | undefined): arg is Git.Options.BranchCommand.List { - return !!arg && ('type' in arg); + export function isBranchList(arg: unknown): arg is Git.Options.BranchCommand.List { + return !!arg && typeof arg === 'object' && ('type' in arg); } /** * `true` if the argument is an option for checking out a new local branch. */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function isBranchCheckout(arg: any | undefined): arg is Git.Options.Checkout.CheckoutBranch { - return !!arg && ('branch' in arg); + export function isBranchCheckout(arg: unknown): arg is Git.Options.Checkout.CheckoutBranch { + return !!arg && typeof arg === 'object' && ('branch' in arg); } /** * `true` if the argument is an option for checking out a working tree file. */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function isWorkingTreeFileCheckout(arg: any | undefined): arg is Git.Options.Checkout.WorkingTreeFile { - return !!arg && ('paths' in arg); + export function isWorkingTreeFileCheckout(arg: unknown): arg is Git.Options.Checkout.WorkingTreeFile { + return !!arg && typeof arg === 'object' && ('paths' in arg); } /** @@ -907,13 +901,11 @@ export namespace GitUtils { * `true` if the argument is an error indicating the absence of a local Git repository. * Otherwise, `false`. */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function isRepositoryDoesNotExistError(error: any | undefined): boolean { + export function isRepositoryDoesNotExistError(error: unknown): boolean { // TODO this is odd here.This piece of code is already implementation specific, so this should go to the Git API. // But how can we ensure that the `any` type error is serializable? if (error instanceof Error && ('code' in error)) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return (error).code === RepositoryDoesNotExistErrorCode; + return (error as { code: string }).code === RepositoryDoesNotExistErrorCode; } return false; } diff --git a/packages/keymaps/package.json b/packages/keymaps/package.json index 8a08791e10826..f935201bdfb5b 100644 --- a/packages/keymaps/package.json +++ b/packages/keymaps/package.json @@ -1,17 +1,17 @@ { "name": "@theia/keymaps", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - Custom Keymaps Extension", "dependencies": { - "@theia/core": "1.27.0", - "@theia/monaco": "1.27.0", + "@theia/core": "1.28.0", + "@theia/monaco": "1.28.0", "@theia/monaco-editor-core": "1.67.2", - "@theia/preferences": "1.27.0", - "@theia/userstorage": "1.27.0", + "@theia/preferences": "1.28.0", + "@theia/userstorage": "1.28.0", "jsonc-parser": "^2.2.0" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0" + "@theia/ext-scripts": "1.28.0" }, "publishConfig": { "access": "public" diff --git a/packages/keymaps/src/browser/keybindings-widget.tsx b/packages/keymaps/src/browser/keybindings-widget.tsx index d995a5155eb43..84767e4923776 100644 --- a/packages/keymaps/src/browser/keybindings-widget.tsx +++ b/packages/keymaps/src/browser/keybindings-widget.tsx @@ -17,16 +17,17 @@ import React = require('@theia/core/shared/react'); import debounce = require('@theia/core/shared/lodash.debounce'); import * as fuzzy from '@theia/core/shared/fuzzy'; -import { injectable, inject, postConstruct } from '@theia/core/shared/inversify'; +import { injectable, inject, postConstruct, unmanaged } from '@theia/core/shared/inversify'; import { Emitter, Event } from '@theia/core/lib/common/event'; import { CommandRegistry, Command } from '@theia/core/lib/common/command'; import { ReactWidget } from '@theia/core/lib/browser/widgets/react-widget'; import { - KeybindingRegistry, SingleTextInputDialog, KeySequence, ConfirmDialog, Message, KeybindingScope, SingleTextInputDialogProps, Key, ScopedKeybinding, codicon, StatefulWidget + KeybindingRegistry, SingleTextInputDialog, KeySequence, ConfirmDialog, Message, KeybindingScope, + SingleTextInputDialogProps, Key, ScopedKeybinding, codicon, StatefulWidget, Widget } from '@theia/core/lib/browser'; import { KeymapsService } from './keymaps-service'; import { AlertMessage } from '@theia/core/lib/browser/widgets/alert-message'; -import { isOSX } from '@theia/core'; +import { DisposableCollection, isOSX } from '@theia/core'; import { nls } from '@theia/core/lib/common/nls'; /** @@ -116,12 +117,19 @@ export class KeybindingWidget extends ReactWidget implements StatefulWidget { protected readonly onDidUpdateEmitter = new Emitter(); readonly onDidUpdate: Event = this.onDidUpdateEmitter.event; + protected readonly onRenderCallbacks = new DisposableCollection(); + protected onRender = () => this.onRenderCallbacks.dispose(); /** * Search keybindings. */ protected readonly searchKeybindings: () => void = debounce(() => this.doSearchKeybindings(), 50); + constructor(@unmanaged() options?: Widget.IOptions) { + super(options); + this.onRender = this.onRender.bind(this); + } + /** * Initialize the widget. */ @@ -297,6 +305,7 @@ export class KeybindingWidget extends ReactWidget implements StatefulWidget {
0) ? '' : ' no-kb'}`} type='text' spellCheck={false} @@ -703,7 +712,7 @@ export class KeybindingWidget extends ReactWidget implements StatefulWidget { restoreState(oldState: { query: string }): void { if (typeof oldState?.query === 'string') { - this.onRender.push({ + this.onRenderCallbacks.push({ dispose: () => { const searchField = this.findSearchField(); if (searchField) { diff --git a/packages/markers/package.json b/packages/markers/package.json index 4ed06423a8d43..8e677fc0c01ad 100644 --- a/packages/markers/package.json +++ b/packages/markers/package.json @@ -1,11 +1,11 @@ { "name": "@theia/markers", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - Markers Extension", "dependencies": { - "@theia/core": "1.27.0", - "@theia/filesystem": "1.27.0", - "@theia/workspace": "1.27.0" + "@theia/core": "1.28.0", + "@theia/filesystem": "1.28.0", + "@theia/workspace": "1.28.0" }, "publishConfig": { "access": "public" @@ -40,7 +40,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0" + "@theia/ext-scripts": "1.28.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/markers/src/browser/marker-tree.ts b/packages/markers/src/browser/marker-tree.ts index 251862dbab9ce..8018bae409621 100644 --- a/packages/markers/src/browser/marker-tree.ts +++ b/packages/markers/src/browser/marker-tree.ts @@ -139,7 +139,7 @@ export interface MarkerInfoNode extends UriSelection, SelectableTreeNode, Expand severity?: DiagnosticSeverity; } export namespace MarkerInfoNode { - export function is(node: Object | undefined): node is MarkerInfoNode { + export function is(node: unknown): node is MarkerInfoNode { return ExpandableTreeNode.is(node) && UriSelection.is(node) && 'numberOfMarkers' in node; } } diff --git a/packages/markers/src/browser/problem/problem-selection.ts b/packages/markers/src/browser/problem/problem-selection.ts index 461256f60e189..39552b170de0a 100644 --- a/packages/markers/src/browser/problem/problem-selection.ts +++ b/packages/markers/src/browser/problem/problem-selection.ts @@ -23,8 +23,8 @@ export interface ProblemSelection { marker: Marker; } export namespace ProblemSelection { - export function is(arg: Object | undefined): arg is ProblemSelection { - return typeof arg === 'object' && ('marker' in arg) && ProblemMarker.is(arg['marker']); + export function is(arg: unknown): arg is ProblemSelection { + return !!arg && typeof arg === 'object' && ('marker' in arg) && ProblemMarker.is((arg as ProblemSelection).marker); } export class CommandHandler extends SelectionCommandHandler { diff --git a/packages/messages/package.json b/packages/messages/package.json index 0b9fde9c3b4e6..e6198d5b72092 100644 --- a/packages/messages/package.json +++ b/packages/messages/package.json @@ -1,9 +1,9 @@ { "name": "@theia/messages", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - Messages Extension", "dependencies": { - "@theia/core": "1.27.0", + "@theia/core": "1.28.0", "react-perfect-scrollbar": "^1.5.3", "ts-md5": "^1.2.2" }, @@ -40,7 +40,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0" + "@theia/ext-scripts": "1.28.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/messages/src/browser/notifications-renderer.tsx b/packages/messages/src/browser/notifications-renderer.tsx index cd40f337c8cb5..e024f937afa09 100644 --- a/packages/messages/src/browser/notifications-renderer.tsx +++ b/packages/messages/src/browser/notifications-renderer.tsx @@ -14,8 +14,8 @@ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 // ***************************************************************************** -import * as ReactDOM from '@theia/core/shared/react-dom'; import * as React from '@theia/core/shared/react'; +import { createRoot, Root } from '@theia/core/shared/react-dom/client'; import { injectable, inject, postConstruct } from '@theia/core/shared/inversify'; import { ApplicationShell, CorePreferences } from '@theia/core/lib/browser'; import { NotificationManager } from './notifications-manager'; @@ -33,6 +33,7 @@ export class NotificationsRenderer { @inject(CorePreferences) protected readonly corePreferences: CorePreferences; + protected containerRoot: Root; @postConstruct() protected init(): void { @@ -47,13 +48,14 @@ export class NotificationsRenderer { if (window.document.body) { window.document.body.appendChild(this.container); } + this.containerRoot = createRoot(this.container); } protected render(): void { - ReactDOM.render(
+ this.containerRoot.render(
-
, this.container); +
); } } diff --git a/packages/metrics/package.json b/packages/metrics/package.json index 2c422f1f1789c..48289eec98597 100644 --- a/packages/metrics/package.json +++ b/packages/metrics/package.json @@ -1,9 +1,9 @@ { "name": "@theia/metrics", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - Metrics Extension", "dependencies": { - "@theia/core": "1.27.0", + "@theia/core": "1.28.0", "prom-client": "^10.2.0" }, "publishConfig": { @@ -39,7 +39,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0" + "@theia/ext-scripts": "1.28.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/mini-browser/package.json b/packages/mini-browser/package.json index 006d654af78f3..f1c7c78d404e3 100644 --- a/packages/mini-browser/package.json +++ b/packages/mini-browser/package.json @@ -1,10 +1,10 @@ { "name": "@theia/mini-browser", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - Mini-Browser Extension", "dependencies": { - "@theia/core": "1.27.0", - "@theia/filesystem": "1.27.0", + "@theia/core": "1.28.0", + "@theia/filesystem": "1.28.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.27.0" + "@theia/ext-scripts": "1.28.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/monaco/package.json b/packages/monaco/package.json index dcb4c787f5a78..55f7a5a5023e4 100644 --- a/packages/monaco/package.json +++ b/packages/monaco/package.json @@ -1,14 +1,14 @@ { "name": "@theia/monaco", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - Monaco Extension", "dependencies": { - "@theia/core": "1.27.0", - "@theia/editor": "1.27.0", - "@theia/filesystem": "1.27.0", - "@theia/markers": "1.27.0", + "@theia/core": "1.28.0", + "@theia/editor": "1.28.0", + "@theia/filesystem": "1.28.0", + "@theia/markers": "1.28.0", "@theia/monaco-editor-core": "1.67.2", - "@theia/outline-view": "1.27.0", + "@theia/outline-view": "1.28.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.27.0" + "@theia/ext-scripts": "1.28.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/monaco/src/browser/monaco-color-registry.ts b/packages/monaco/src/browser/monaco-color-registry.ts index da70a0033d66c..df9edd1433322 100644 --- a/packages/monaco/src/browser/monaco-color-registry.ts +++ b/packages/monaco/src/browser/monaco-color-registry.ts @@ -38,7 +38,7 @@ export class MonacoColorRegistry extends ColorRegistry { override getCurrentColor(id: string): string | undefined { const color = this.monacoThemeService.getColorTheme().getColor(id); - return color && color.toString(); + return color?.toString(); } protected override doRegister(definition: ColorDefinition): Disposable { diff --git a/packages/monaco/src/browser/monaco-frontend-application-contribution.ts b/packages/monaco/src/browser/monaco-frontend-application-contribution.ts index e8450e4b6ef0e..e99434d883cb2 100644 --- a/packages/monaco/src/browser/monaco-frontend-application-contribution.ts +++ b/packages/monaco/src/browser/monaco-frontend-application-contribution.ts @@ -35,6 +35,16 @@ import { editorOptionsRegistry, IEditorOption } from '@theia/monaco-editor-core/ import { MAX_SAFE_INTEGER } from '@theia/core'; import { editorGeneratedPreferenceProperties } from '@theia/editor/lib/browser/editor-generated-preference-schema'; +let theiaDidInitialize = false; +const originalInitialize = StandaloneServices.initialize; +StandaloneServices.initialize = overrides => { + if (!theiaDidInitialize) { + console.warn('Monaco was initialized before overrides were installed by Theia\'s initialization.' + + ' Please check the lifecycle of services that use Monaco and ensure that Monaco entities are not instantiated before Theia is initialized.', new Error()); + } + return originalInitialize(overrides); +}; + @injectable() export class MonacoFrontendApplicationContribution implements FrontendApplicationContribution, StylingParticipant { @@ -65,6 +75,7 @@ export class MonacoFrontendApplicationContribution implements FrontendApplicatio protected init(): void { this.addAdditionalPreferenceValidations(); const { codeEditorService, textModelService, contextKeyService, contextMenuService } = this; + theiaDidInitialize = true; StandaloneServices.initialize({ [ICodeEditorService.toString()]: codeEditorService, [ITextModelService.toString()]: textModelService, diff --git a/packages/monaco/src/browser/monaco-indexed-db.ts b/packages/monaco/src/browser/monaco-indexed-db.ts index 4ba02c70ae2c8..2e29b183b10f4 100644 --- a/packages/monaco/src/browser/monaco-indexed-db.ts +++ b/packages/monaco/src/browser/monaco-indexed-db.ts @@ -21,6 +21,7 @@ import * as monaco from '@theia/monaco-editor-core'; import { injectable } from '@theia/core/shared/inversify'; import type { ThemeMix } from './textmate/monaco-theme-types'; import { Theme } from '@theia/core/lib/common/theme'; +import { Emitter, Event } from '@theia/core'; let _monacoDB: Promise | undefined; if ('indexedDB' in window) { @@ -43,7 +44,7 @@ export interface MonacoThemeState { data: ThemeMix } export namespace MonacoThemeState { - export function is(state: Object | undefined): state is MonacoThemeState { + export function is(state: unknown): state is MonacoThemeState { return !!state && typeof state === 'object' && 'id' in state && 'label' in state && 'uiTheme' in state && 'data' in state; } } @@ -99,25 +100,31 @@ export function stateToTheme(state: MonacoThemeState): Theme { }; } -async function getThemeFromDB(id: string): Promise { - const matchingState = (await getThemes()).find(theme => theme.id === id); - return matchingState && stateToTheme(matchingState); -} - @injectable() export class ThemeServiceWithDB extends ThemeService { + protected onDidRetrieveThemeEmitter = new Emitter(); + get onDidRetrieveTheme(): Event { + return this.onDidRetrieveThemeEmitter.event; + } + override loadUserTheme(): void { this.loadUserThemeWithDB(); } protected async loadUserThemeWithDB(): Promise { - const themeId = window.localStorage.getItem('theme') || this.defaultTheme.id; - const theme = this.themes[themeId] ?? await getThemeFromDB(themeId) ?? this.defaultTheme; + const themeId = window.localStorage.getItem(ThemeService.STORAGE_KEY) ?? this.defaultTheme.id; + const theme = this.themes[themeId] ?? await getThemes().then(themes => { + const matchingTheme = themes.find(candidate => candidate.id === themeId); + if (matchingTheme) { + this.onDidRetrieveThemeEmitter.fire(matchingTheme); + return stateToTheme(matchingTheme); + } + }) ?? this.getTheme(themeId); // In case the theme comes from the DB. if (!this.themes[theme.id]) { this.themes[theme.id] = theme; } - this.setCurrentTheme(theme.id); + this.setCurrentTheme(theme.id, false); this.deferredInitializer.resolve(); } } diff --git a/packages/monaco/src/browser/monaco-snippet-suggest-provider.ts b/packages/monaco/src/browser/monaco-snippet-suggest-provider.ts index 9e0a6d32f1981..6215a39aebaa7 100644 --- a/packages/monaco/src/browser/monaco-snippet-suggest-provider.ts +++ b/packages/monaco/src/browser/monaco-snippet-suggest-provider.ts @@ -249,8 +249,8 @@ export interface JsonSerializedSnippet { description: string; } export namespace JsonSerializedSnippet { - export function is(obj: Object | undefined): obj is JsonSerializedSnippet { - return typeof obj === 'object' && 'body' in obj && 'prefix' in obj; + export function is(obj: unknown): obj is JsonSerializedSnippet { + return !!obj && typeof obj === 'object' && 'body' in obj && 'prefix' in obj; } } diff --git a/packages/monaco/src/browser/monaco-theming-service.ts b/packages/monaco/src/browser/monaco-theming-service.ts index 58e5e5e5a5472..88be8798d61fd 100644 --- a/packages/monaco/src/browser/monaco-theming-service.ts +++ b/packages/monaco/src/browser/monaco-theming-service.ts @@ -19,11 +19,10 @@ import { injectable, inject } from '@theia/core/shared/inversify'; import * as jsoncparser from 'jsonc-parser'; import * as plistparser from 'fast-plist'; -import { ThemeService } from '@theia/core/lib/browser/theming'; import URI from '@theia/core/lib/common/uri'; import { Disposable, DisposableCollection } from '@theia/core/lib/common/disposable'; import { MonacoThemeRegistry } from './textmate/monaco-theme-registry'; -import { getThemes, putTheme, MonacoThemeState, stateToTheme } from './monaco-indexed-db'; +import { getThemes, putTheme, MonacoThemeState, stateToTheme, ThemeServiceWithDB } from './monaco-indexed-db'; import { FileService } from '@theia/filesystem/lib/browser/file-service'; import * as monaco from '@theia/monaco-editor-core'; @@ -61,7 +60,7 @@ export class MonacoThemingService { @inject(FileService) protected readonly fileService: FileService; @inject(MonacoThemeRegistry) protected readonly monacoThemeRegistry: MonacoThemeRegistry; - @inject(ThemeService) protected readonly themeService: ThemeService; + @inject(ThemeServiceWithDB) protected readonly themeService: ThemeServiceWithDB; /** Register themes whose configuration needs to be loaded */ register(theme: MonacoTheme, pending: { [uri: string]: Promise } = {}): Disposable { @@ -143,6 +142,7 @@ export class MonacoThemingService { this.monacoThemeRegistry.initializeDefaultThemes(); this.updateBodyUiTheme(); this.themeService.onDidColorThemeChange(() => this.updateBodyUiTheme()); + this.themeService.onDidRetrieveTheme(theme => this.monacoThemeRegistry.setTheme(MonacoThemingService.toCssSelector(theme.id), theme.data)); this.restore(); } diff --git a/packages/navigator/package.json b/packages/navigator/package.json index abed8ba185c1e..ec46bdac45000 100644 --- a/packages/navigator/package.json +++ b/packages/navigator/package.json @@ -1,11 +1,11 @@ { "name": "@theia/navigator", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - Navigator Extension", "dependencies": { - "@theia/core": "1.27.0", - "@theia/filesystem": "1.27.0", - "@theia/workspace": "1.27.0", + "@theia/core": "1.28.0", + "@theia/filesystem": "1.28.0", + "@theia/workspace": "1.28.0", "minimatch": "^3.0.4" }, "publishConfig": { @@ -44,7 +44,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0" + "@theia/ext-scripts": "1.28.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/navigator/src/browser/navigator-contribution.ts b/packages/navigator/src/browser/navigator-contribution.ts index 77994dcb87a74..5c9f87d654ade 100644 --- a/packages/navigator/src/browser/navigator-contribution.ts +++ b/packages/navigator/src/browser/navigator-contribution.ts @@ -486,10 +486,12 @@ export class FileNavigatorContribution extends AbstractViewContribution { + const fileName = path.basename(localPath); + const pathInUserExtensionsDirectory = await this.ensureDiscoverability(localPath); + pluginResolverContext.addPlugin(fileName, pathInUserExtensionsDirectory); + } + + /** + * Ensures that a user-installed plugin file is transferred to the user extension folder. + */ + protected async ensureDiscoverability(localPath: string): Promise { + const userExtensionsDir = await this.environment.getExtensionsDirUri(); + if (!userExtensionsDir.isEqualOrParent(FileUri.create(localPath))) { + try { + const newPath = FileUri.fsPath(userExtensionsDir.resolve(path.basename(localPath))); + await fs.mkdirp(FileUri.fsPath(userExtensionsDir)); + await new Promise((resolve, reject) => { + fs.copyFile(localPath, newPath, error => error ? reject(error) : resolve()); + }); + return newPath; + } catch (e) { + console.warn(`Problem copying plugin at ${localPath}:`, e); + } + } + return localPath; + } +} diff --git a/packages/plugin-ext-vscode/src/node/plugin-vscode-backend-module.ts b/packages/plugin-ext-vscode/src/node/plugin-vscode-backend-module.ts index 920fced396f63..180781526b768 100644 --- a/packages/plugin-ext-vscode/src/node/plugin-vscode-backend-module.ts +++ b/packages/plugin-ext-vscode/src/node/plugin-vscode-backend-module.ts @@ -16,7 +16,7 @@ import { ContainerModule } from '@theia/core/shared/inversify'; import { - PluginDeployerFileHandler, PluginDeployerDirectoryHandler, PluginScanner, PluginDeployerParticipant + PluginDeployerFileHandler, PluginDeployerDirectoryHandler, PluginScanner, PluginDeployerParticipant, PluginDeployerResolver } from '@theia/plugin-ext'; import { PluginVsCodeFileHandler } from './plugin-vscode-file-handler'; import { PluginVsCodeDirectoryHandler } from './plugin-vscode-directory-handler'; @@ -27,6 +27,7 @@ import { PluginHostEnvironmentVariable } from '@theia/plugin-ext/lib/common'; import { PluginVSCodeEnvironment } from '../common/plugin-vscode-environment'; import { PluginVSCodeDeployerParticipant } from './plugin-vscode-deployer-participant'; import { HostedPluginReader } from './plugin-reader'; +import { LocalVSIXFilePluginDeployerResolver } from './local-vsix-file-plugin-deployer-resolver'; export default new ContainerModule(bind => { bind(PluginVSCodeEnvironment).toSelf().inSingletonScope(); @@ -44,4 +45,6 @@ export default new ContainerModule(bind => { bind(HostedPluginReader).toSelf().inSingletonScope(); bind(BackendApplicationContribution).toService(HostedPluginReader); + + bind(PluginDeployerResolver).to(LocalVSIXFilePluginDeployerResolver).inSingletonScope(); }); 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 a442c6f34678b..8c092ffebe95d 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 @@ -22,7 +22,8 @@ import { injectable, inject } from '@theia/core/shared/inversify'; import { getTempDir } 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'; -import URI from '@theia/core/lib/common/uri'; + +export const isVSCodePluginFile = (pluginPath?: string) => Boolean(pluginPath && (pluginPath.endsWith('.vsix') || pluginPath.endsWith('.tgz'))); @injectable() export class PluginVsCodeFileHandler implements PluginDeployerFileHandler { @@ -36,12 +37,10 @@ export class PluginVsCodeFileHandler implements PluginDeployerFileHandler { if (!resolvedPlugin.isFile()) { return false; } - const pluginPath = resolvedPlugin.path(); - return !!pluginPath && pluginPath.endsWith('.vsix') || pluginPath.endsWith('.tgz'); + return isVSCodePluginFile(resolvedPlugin.path()); } async handle(context: PluginDeployerFileHandlerContext): Promise { - await this.ensureDiscoverability(context); const id = context.pluginEntry().id(); const extensionDir = await this.getExtensionDir(context); console.log(`[${id}]: trying to decompress into "${extensionDir}"...`); @@ -59,29 +58,6 @@ export class PluginVsCodeFileHandler implements PluginDeployerFileHandler { return FileUri.fsPath(this.systemExtensionsDirUri.resolve(filenamify(context.pluginEntry().id(), { replacement: '_' }))); } - /** - * Ensures that a user-installed plugin file is transferred to the user extension folder. - */ - protected async ensureDiscoverability(context: PluginDeployerFileHandlerContext): Promise { - if (context.pluginEntry().type === PluginType.User) { - const userExtensionsDir = await this.environment.getExtensionsDirUri(); - const currentPath = context.pluginEntry().path(); - if (!userExtensionsDir.isEqualOrParent(new URI(currentPath)) && !userExtensionsDir.isEqualOrParent(new URI(context.pluginEntry().originalPath()))) { - try { - const newPath = FileUri.fsPath(userExtensionsDir.resolve(path.basename(currentPath))); - await fs.mkdirp(FileUri.fsPath(userExtensionsDir)); - await new Promise((resolve, reject) => { - fs.copyFile(currentPath, newPath, error => error ? reject(error) : resolve()); - }); - context.pluginEntry().updatePath(newPath); - context.pluginEntry().storeValue('sourceLocations', [newPath]); - } catch (e) { - console.error(`[${context.pluginEntry().id}]: Failed to copy to user directory. Future sessions may not have access to this plugin.`); - } - } - } - } - protected async decompress(extensionDir: string, context: PluginDeployerFileHandlerContext): Promise { await context.unzip(context.pluginEntry().path(), extensionDir); if (context.pluginEntry().path().endsWith('.tgz')) { diff --git a/packages/plugin-ext/package.json b/packages/plugin-ext/package.json index cf8977f13e69f..490fdd223eb5a 100644 --- a/packages/plugin-ext/package.json +++ b/packages/plugin-ext/package.json @@ -1,33 +1,33 @@ { "name": "@theia/plugin-ext", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - Plugin Extension", "main": "lib/common/index.js", "typings": "lib/common/index.d.ts", "dependencies": { - "@theia/bulk-edit": "1.27.0", - "@theia/callhierarchy": "1.27.0", - "@theia/console": "1.27.0", - "@theia/core": "1.27.0", - "@theia/debug": "1.27.0", - "@theia/editor": "1.27.0", - "@theia/file-search": "1.27.0", - "@theia/filesystem": "1.27.0", - "@theia/markers": "1.27.0", - "@theia/messages": "1.27.0", - "@theia/monaco": "1.27.0", + "@theia/bulk-edit": "1.28.0", + "@theia/callhierarchy": "1.28.0", + "@theia/console": "1.28.0", + "@theia/core": "1.28.0", + "@theia/debug": "1.28.0", + "@theia/editor": "1.28.0", + "@theia/file-search": "1.28.0", + "@theia/filesystem": "1.28.0", + "@theia/markers": "1.28.0", + "@theia/messages": "1.28.0", + "@theia/monaco": "1.28.0", "@theia/monaco-editor-core": "1.67.2", - "@theia/navigator": "1.27.0", - "@theia/output": "1.27.0", - "@theia/plugin": "1.27.0", - "@theia/preferences": "1.27.0", - "@theia/scm": "1.27.0", - "@theia/search-in-workspace": "1.27.0", - "@theia/task": "1.27.0", - "@theia/terminal": "1.27.0", - "@theia/timeline": "1.27.0", - "@theia/variable-resolver": "1.27.0", - "@theia/workspace": "1.27.0", + "@theia/navigator": "1.28.0", + "@theia/output": "1.28.0", + "@theia/plugin": "1.28.0", + "@theia/preferences": "1.28.0", + "@theia/scm": "1.28.0", + "@theia/search-in-workspace": "1.28.0", + "@theia/task": "1.28.0", + "@theia/terminal": "1.28.0", + "@theia/timeline": "1.28.0", + "@theia/variable-resolver": "1.28.0", + "@theia/workspace": "1.28.0", "@types/mime": "^2.0.1", "decompress": "^4.2.1", "escape-html": "^1.0.3", @@ -84,7 +84,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0", + "@theia/ext-scripts": "1.28.0", "@types/decompress": "^4.2.2", "@types/escape-html": "^0.0.20", "@types/lodash.clonedeep": "^4.5.3", diff --git a/packages/plugin-ext/src/common/plugin-api-rpc-model.ts b/packages/plugin-ext/src/common/plugin-api-rpc-model.ts index 681247c2a1310..976bf2cfc25fe 100644 --- a/packages/plugin-ext/src/common/plugin-api-rpc-model.ts +++ b/packages/plugin-ext/src/common/plugin-api-rpc-model.ts @@ -255,6 +255,16 @@ export interface HoverProvider { provideHover(model: monaco.editor.ITextModel, position: monaco.Position, token: monaco.CancellationToken): Hover | undefined | Thenable; } +export interface EvaluatableExpression { + range: Range; + expression?: string; +} + +export interface EvaluatableExpressionProvider { + provideEvaluatableExpression(model: monaco.editor.ITextModel, position: monaco.Position, + token: monaco.CancellationToken): EvaluatableExpression | undefined | Thenable; +} + export enum DocumentHighlightKind { Text = 0, Read = 1, diff --git a/packages/plugin-ext/src/common/plugin-api-rpc.ts b/packages/plugin-ext/src/common/plugin-api-rpc.ts index 532184f80ec88..f46c2c0a31f3f 100644 --- a/packages/plugin-ext/src/common/plugin-api-rpc.ts +++ b/packages/plugin-ext/src/common/plugin-api-rpc.ts @@ -41,6 +41,7 @@ import { MarkerData, SignatureHelp, Hover, + EvaluatableExpression, DocumentHighlight, FormattingOptions, ChainedCacheId, @@ -141,6 +142,7 @@ export interface EnvInit { shell: string; uiKind: UIKind, appName: string; + appHost: string; } export interface PluginAPI { @@ -732,7 +734,7 @@ export interface TreeViewSelection { treeItemId: string } export namespace TreeViewSelection { - export function is(arg: Object | any): arg is TreeViewSelection { + export function is(arg: unknown): arg is TreeViewSelection { return !!arg && typeof arg === 'object' && 'treeViewId' in arg && 'treeItemId' in arg; } } @@ -778,7 +780,7 @@ export interface ScmCommandArg { resourceStateHandle?: number } export namespace ScmCommandArg { - export function is(arg: Object | undefined): arg is ScmCommandArg { + export function is(arg: unknown): arg is ScmCommandArg { return !!arg && typeof arg === 'object' && 'sourceControlHandle' in arg; } } @@ -794,7 +796,7 @@ export interface ScmExt { } export namespace TimelineCommandArg { - export function is(arg: Object | undefined): arg is TimelineCommandArg { + export function is(arg: unknown): arg is TimelineCommandArg { return !!arg && typeof arg === 'object' && 'timelineHandle' in arg; } } @@ -813,7 +815,7 @@ export type DecorationData = [boolean, string, string, ThemeColor]; export interface DecorationReply { [id: number]: DecorationData; } export namespace CommentsCommandArg { - export function is(arg: Object | undefined): arg is CommentsCommandArg { + export function is(arg: unknown): arg is CommentsCommandArg { return !!arg && typeof arg === 'object' && 'commentControlHandle' in arg && 'commentThreadHandle' in arg && 'text' in arg && !('commentUniqueId' in arg); } } @@ -824,7 +826,7 @@ export interface CommentsCommandArg { } export namespace CommentsContextCommandArg { - export function is(arg: Object | undefined): arg is CommentsContextCommandArg { + export function is(arg: unknown): arg is CommentsContextCommandArg { return !!arg && typeof arg === 'object' && 'commentControlHandle' in arg && 'commentThreadHandle' in arg && 'commentUniqueId' in arg && !('text' in arg); } } @@ -835,7 +837,7 @@ export interface CommentsContextCommandArg { } export namespace CommentsEditCommandArg { - export function is(arg: Object | undefined): arg is CommentsEditCommandArg { + export function is(arg: unknown): arg is CommentsEditCommandArg { return !!arg && typeof arg === 'object' && 'commentControlHandle' in arg && 'commentThreadHandle' in arg && 'commentUniqueId' in arg && 'text' in arg; } } @@ -1262,18 +1264,24 @@ export interface PreferenceRegistryMain { target: boolean | ConfigurationTarget | undefined, key: string, value: any, - resource?: string + resource?: string, + withLanguageOverride?: boolean ): PromiseLike; $removeConfigurationOption( target: boolean | ConfigurationTarget | undefined, key: string, - resource?: string + resource?: string, + withLanguageOverride?: boolean, ): PromiseLike; } export interface PreferenceChangeExt { preferenceName: string, - newValue: any + newValue: any, + /** + * The URI the folder affected, or undefined if User scope. + */ + scope?: string; } export interface TerminalOptionsExt { @@ -1463,6 +1471,7 @@ export interface LanguagesExt { ): Promise; $releaseSignatureHelp(handle: number, id: number): void; $provideHover(handle: number, resource: UriComponents, position: Position, token: CancellationToken): Promise; + $provideEvaluatableExpression(handle: number, resource: UriComponents, position: Position, token: CancellationToken): Promise; $provideDocumentHighlights(handle: number, resource: UriComponents, position: Position, token: CancellationToken): Promise; $provideDocumentFormattingEdits(handle: number, resource: UriComponents, options: FormattingOptions, token: CancellationToken): Promise; @@ -1539,6 +1548,7 @@ export interface LanguagesMain { $registerReferenceProvider(handle: number, pluginInfo: PluginInfo, selector: SerializedDocumentFilter[]): void; $registerSignatureHelpProvider(handle: number, pluginInfo: PluginInfo, selector: SerializedDocumentFilter[], metadata: theia.SignatureHelpProviderMetadata): void; $registerHoverProvider(handle: number, pluginInfo: PluginInfo, selector: SerializedDocumentFilter[]): void; + $registerEvaluatableExpressionProvider(handle: number, pluginInfo: PluginInfo, selector: SerializedDocumentFilter[]): void; $registerDocumentHighlightProvider(handle: number, pluginInfo: PluginInfo, selector: SerializedDocumentFilter[]): void; $registerQuickFixProvider(handle: number, pluginInfo: PluginInfo, selector: SerializedDocumentFilter[], codeActionKinds?: string[], documentation?: CodeActionProviderDocumentation): void; $clearDiagnostics(id: string): void; diff --git a/packages/plugin-ext/src/common/rpc-protocol.ts b/packages/plugin-ext/src/common/rpc-protocol.ts index e46c930a3c325..efd5b9503bee3 100644 --- a/packages/plugin-ext/src/common/rpc-protocol.ts +++ b/packages/plugin-ext/src/common/rpc-protocol.ts @@ -70,9 +70,8 @@ export namespace ConnectionClosedError { export function create(message: string = 'connection is closed'): ConnectionClosedError { return Object.assign(new Error(message), { code }); } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function is(error: any): error is ConnectionClosedError { - return !!error && typeof error === 'object' && 'code' in error && error['code'] === code; + export function is(error: unknown): error is ConnectionClosedError { + return !!error && typeof error === 'object' && 'code' in error && (error as ConnectionClosedError).code === code; } } @@ -469,8 +468,9 @@ enum SerializedObjectType { TEXT_BUFFER } -function isSerializedObject(obj: any): obj is SerializedObject { - return obj && obj.$type !== undefined && obj.data !== undefined; +function isSerializedObject(obj: unknown): obj is SerializedObject { + const serializedObject = obj as SerializedObject; + return !!obj && typeof obj === 'object' && serializedObject.$type !== undefined && serializedObject.data !== undefined; } export const enum MessageType { diff --git a/packages/plugin-ext/src/hosted/browser/hosted-plugin.ts b/packages/plugin-ext/src/hosted/browser/hosted-plugin.ts index ecd1c5a155533..9ca1f7db8e38d 100644 --- a/packages/plugin-ext/src/hosted/browser/hosted-plugin.ts +++ b/packages/plugin-ext/src/hosted/browser/hosted-plugin.ts @@ -499,6 +499,7 @@ export class HostedPluginSupport { return undefined; } + const isElectron = environment.electron.is(); await manager.$init({ preferences: getPreferences(this.preferenceProviderProvider, this.workspaceService.tryGetRoots()), globalState, @@ -507,8 +508,9 @@ export class HostedPluginSupport { queryParams: getQueryParameters(), language: nls.locale || 'en', shell: defaultShell, - uiKind: environment.electron.is() ? UIKind.Desktop : UIKind.Web, - appName: FrontendApplicationConfigProvider.get().applicationName + uiKind: isElectron ? UIKind.Desktop : UIKind.Web, + appName: FrontendApplicationConfigProvider.get().applicationName, + appHost: isElectron ? 'desktop' : 'web' // TODO: 'web' could be the embedder's name, e.g. 'github.dev' }, extApi, webview: { diff --git a/packages/plugin-ext/src/hosted/browser/worker/worker-env-ext.ts b/packages/plugin-ext/src/hosted/browser/worker/worker-env-ext.ts index f931c63ae9fcb..b2b931f64065a 100644 --- a/packages/plugin-ext/src/hosted/browser/worker/worker-env-ext.ts +++ b/packages/plugin-ext/src/hosted/browser/worker/worker-env-ext.ts @@ -34,4 +34,8 @@ export class WorkerEnvExtImpl extends EnvExtImpl { throw new Error('There is no app root in worker context'); } + get isNewAppInstall(): boolean { + return false; + } + } diff --git a/packages/plugin-ext/src/main/browser/comments/comment-thread-widget.tsx b/packages/plugin-ext/src/main/browser/comments/comment-thread-widget.tsx index a34d5f92032db..f2bee6244e8b2 100644 --- a/packages/plugin-ext/src/main/browser/comments/comment-thread-widget.tsx +++ b/packages/plugin-ext/src/main/browser/comments/comment-thread-widget.tsx @@ -22,7 +22,6 @@ import { } from '../../../common/plugin-api-rpc-model'; import { CommentGlyphWidget } from './comment-glyph-widget'; import { BaseWidget, DISABLED_CLASS } from '@theia/core/lib/browser'; -import * as ReactDOM from '@theia/core/shared/react-dom'; import * as React from '@theia/core/shared/react'; import { MouseTargetType } from '@theia/editor/lib/browser'; import { CommentsService } from './comments-service'; @@ -36,6 +35,7 @@ import { import { CommentsContextKeyService } from './comments-context-key-service'; import { RefObject } from '@theia/core/shared/react'; import * as monaco from '@theia/monaco-editor-core'; +import { createRoot, Root } from '@theia/core/shared/react-dom/client'; /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. @@ -50,6 +50,7 @@ export const COMMENT_TITLE: MenuPath = ['comment-title-menu']; export class CommentThreadWidget extends BaseWidget { protected readonly zoneWidget: MonacoEditorZoneWidget; + protected readonly containerNodeRoot: Root; protected readonly commentGlyphWidget: CommentGlyphWidget; protected readonly contextMenu: CompositeMenuNode; protected readonly commentFormRef: RefObject = React.createRef(); @@ -67,6 +68,7 @@ export class CommentThreadWidget extends BaseWidget { ) { super(); this.toDispose.push(this.zoneWidget = new MonacoEditorZoneWidget(editor)); + this.containerNodeRoot = createRoot(this.zoneWidget.containerNode); this.toDispose.push(this.commentGlyphWidget = new CommentGlyphWidget(editor)); this.toDispose.push(this._commentThread.onDidChangeCollapsibleState(state => { if (state === CommentThreadCollapsibleState.Expanded && !this.isExpanded) { @@ -255,7 +257,7 @@ export class CommentThreadWidget extends BaseWidget { protected render(): void { const headHeight = Math.ceil(this.zoneWidget.editor.getOption(monaco.editor.EditorOption.lineHeight) * 1.2); - ReactDOM.render(
+ this.containerNodeRoot.render(
{this.getThreadLabel()} @@ -295,7 +297,7 @@ export class CommentThreadWidget extends BaseWidget { ref={this.commentFormRef} />
-
, this.zoneWidget.containerNode); +
); } } diff --git a/packages/plugin-ext/src/main/browser/languages-main.ts b/packages/plugin-ext/src/main/browser/languages-main.ts index 2b7438967ab26..078d4e20d668d 100644 --- a/packages/plugin-ext/src/main/browser/languages-main.ts +++ b/packages/plugin-ext/src/main/browser/languages-main.ts @@ -66,6 +66,9 @@ import * as MonacoPath from '@theia/monaco-editor-core/esm/vs/base/common/path'; import { IRelativePattern } from '@theia/monaco-editor-core/esm/vs/base/common/glob'; import { EditorLanguageStatusService, LanguageStatus as EditorLanguageStatus } from '@theia/editor/lib/browser/language-status/editor-language-status-service'; import { LanguageSelector, RelativePattern } from '@theia/editor/lib/common/language-selector'; +import { ILanguageFeaturesService } from '@theia/monaco-editor-core/esm/vs/editor/common/services/languageFeatures'; +import { EvaluatableExpression, EvaluatableExpressionProvider } from '@theia/monaco-editor-core/esm/vs/editor/common/languages'; +import { ITextModel } from '@theia/monaco-editor-core/esm/vs/editor/common/model'; /** * @monaco-uplift The public API declares these functions as (languageId: string, service). @@ -338,7 +341,26 @@ export class LanguagesMainImpl implements LanguagesMain, Disposable { return this.proxy.$provideHover(handle, model.uri, position, token); } - $registerDocumentHighlightProvider(handle: number, pluginInfo: PluginInfo, selector: SerializedDocumentFilter[]): void { + $registerEvaluatableExpressionProvider(handle: number, pluginInfo: PluginInfo, selector: SerializedDocumentFilter[]): void { + const languageSelector = this.toLanguageSelector(selector); + const evaluatableExpressionProvider = this.createEvaluatableExpressionProvider(handle); + this.register(handle, + (StandaloneServices.get(ILanguageFeaturesService).evaluatableExpressionProvider.register as RegistrationFunction) + (languageSelector, evaluatableExpressionProvider)); + } + + protected createEvaluatableExpressionProvider(handle: number): EvaluatableExpressionProvider { + return { + provideEvaluatableExpression: (model, position, token) => this.provideEvaluatableExpression(handle, model, position, token) + }; + } + + protected provideEvaluatableExpression(handle: number, model: ITextModel, position: monaco.Position, + token: monaco.CancellationToken): monaco.languages.ProviderResult { + return this.proxy.$provideEvaluatableExpression(handle, model.uri, position, token); + } + + $registerDocumentHighlightProvider(handle: number, _pluginInfo: PluginInfo, selector: SerializedDocumentFilter[]): void { const languageSelector = this.toLanguageSelector(selector); const documentHighlightProvider = this.createDocumentHighlightProvider(handle); this.register(handle, (monaco.languages.registerDocumentHighlightProvider as RegistrationFunction) diff --git a/packages/plugin-ext/src/main/browser/plugin-ext-deploy-command.ts b/packages/plugin-ext/src/main/browser/plugin-ext-deploy-command.ts deleted file mode 100644 index dd9b91a4bd8cf..0000000000000 --- a/packages/plugin-ext/src/main/browser/plugin-ext-deploy-command.ts +++ /dev/null @@ -1,50 +0,0 @@ -// ***************************************************************************** -// Copyright (C) 2018 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 WITH Classpath-exception-2.0 -// ***************************************************************************** - -import { injectable, inject, optional } from '@theia/core/shared/inversify'; -import { PluginServer } from '../../common'; -import { Command } from '@theia/core/lib/common/command'; -import { QuickInputService, QuickPick, QuickPickItem } from '@theia/core/lib/browser'; - -@injectable() -export class PluginExtDeployCommandService /* implements QuickOpenModel */ { - public static COMMAND: Command = { - id: 'plugin-ext:deploy-plugin-id', - category: 'Plugin', - label: 'Deploy Plugin by Id', - }; - - @inject(QuickInputService) @optional() - protected readonly quickInputService: QuickInputService; - - @inject(PluginServer) - protected readonly pluginServer: PluginServer; - - deploy(): void { - this.quickInputService?.showQuickPick([], - { - placeholder: "Plugin's id to deploy.", - onDidChangeValue: (quickPick: QuickPick, filter: string) => { - quickPick.items = [{ - label: filter, - detail: 'Deploy this plugin', - execute: () => this.pluginServer.deploy(filter) - }]; - } - } - ); - } -} 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 3c560527cf4f8..024cb87870599 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 @@ -33,7 +33,6 @@ import { HostedPluginServer, hostedServicePath, PluginServer, pluginServerJsonRp import { ModalNotification } from './dialogs/modal-notification'; import { PluginWidget } from './plugin-ext-widget'; import { PluginFrontendViewContribution } from './plugin-frontend-view-contribution'; -import { PluginExtDeployCommandService } from './plugin-ext-deploy-command'; import { EditorModelService } from './text-editor-model-service'; import { MenusContributionPointHandler } from './menus/menus-contribution-handler'; import { PluginContributionHandler } from './plugin-contribution-handler'; @@ -80,6 +79,7 @@ import { AuthenticationService } from '@theia/core/lib/browser/authentication-se import { bindTreeViewDecoratorUtilities, TreeViewDecoratorService } from './view/tree-view-decorator-service'; import { CodeEditorWidgetUtil } from './menus/vscode-theia-menu-mappings'; import { PluginMenuCommandAdapter } from './menus/plugin-menu-command-adapter'; +import './theme-icon-override'; export default new ContainerModule((bind, unbind, isBound, rebind) => { @@ -133,7 +133,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { createWidget: () => ctx.container.get(PluginWidget) })); - bind(PluginExtDeployCommandService).toSelf().inSingletonScope(); bind(PluginServer).toDynamicValue(ctx => { const provider = ctx.container.get(WebSocketConnectionProvider); return provider.createProxy(pluginServerJsonRpcPath); diff --git a/packages/plugin-ext/src/main/browser/plugin-frontend-contribution.ts b/packages/plugin-ext/src/main/browser/plugin-frontend-contribution.ts index 60f4ac873706b..ddd600fe17839 100644 --- a/packages/plugin-ext/src/main/browser/plugin-frontend-contribution.ts +++ b/packages/plugin-ext/src/main/browser/plugin-frontend-contribution.ts @@ -16,25 +16,16 @@ import { injectable, inject } from '@theia/core/shared/inversify'; import { CommandRegistry, CommandContribution } from '@theia/core/lib/common'; -import { PluginExtDeployCommandService } from './plugin-ext-deploy-command'; import { OpenUriCommandHandler } from './commands'; import URI from '@theia/core/lib/common/uri'; @injectable() export class PluginApiFrontendContribution implements CommandContribution { - @inject(PluginExtDeployCommandService) - protected readonly pluginExtDeployCommandService: PluginExtDeployCommandService; - @inject(OpenUriCommandHandler) protected readonly openUriCommandHandler: OpenUriCommandHandler; registerCommands(commands: CommandRegistry): void { - - commands.registerCommand(PluginExtDeployCommandService.COMMAND, { - execute: () => this.pluginExtDeployCommandService.deploy() - }); - commands.registerCommand(OpenUriCommandHandler.COMMAND_METADATA, { execute: (arg: URI) => this.openUriCommandHandler.execute(arg), isVisible: () => false diff --git a/packages/plugin-ext/src/main/browser/preference-registry-main.ts b/packages/plugin-ext/src/main/browser/preference-registry-main.ts index 61ea41c3d7c5e..0dc5919f7d025 100644 --- a/packages/plugin-ext/src/main/browser/preference-registry-main.ts +++ b/packages/plugin-ext/src/main/browser/preference-registry-main.ts @@ -70,11 +70,10 @@ export class PreferenceRegistryMainImpl implements PreferenceRegistryMain, Dispo const roots = workspaceService.tryGetRoots(); const data = getPreferences(preferenceProviderProvider, roots); - const eventData: PreferenceChangeExt[] = []; - for (const preferenceName of Object.keys(changes)) { - const { newValue } = changes[preferenceName]; - eventData.push({ preferenceName, newValue }); - } + const eventData = Object.values(changes).map(({ scope, newValue, domain, preferenceName }) => { + const extScope = scope === PreferenceScope.User ? undefined : domain?.[0]; + return { preferenceName, newValue, scope: extScope }; + }); this.proxy.$acceptConfigurationChanged(data, eventData); })); } @@ -84,17 +83,19 @@ export class PreferenceRegistryMainImpl implements PreferenceRegistryMain, Dispo } // eslint-disable-next-line @typescript-eslint/no-explicit-any - async $updateConfigurationOption(target: boolean | ConfigurationTarget | undefined, key: string, value: any, resource?: string): Promise { - const scope = this.parseConfigurationTarget(target); - await this.preferenceService.set(key, value, scope, resource); + async $updateConfigurationOption(target: boolean | ConfigurationTarget | undefined, key: string, value: any, resource?: string, withLanguageOverride?: boolean): Promise { + const scope = this.parseConfigurationTarget(target, resource); + const effectiveKey = this.getEffectiveKey(key, scope, withLanguageOverride, resource); + await this.preferenceService.set(effectiveKey, value, scope, resource); } - async $removeConfigurationOption(target: boolean | ConfigurationTarget | undefined, key: string, resource?: string): Promise { - const scope = this.parseConfigurationTarget(target); - await this.preferenceService.set(key, undefined, scope, resource); + async $removeConfigurationOption(target: boolean | ConfigurationTarget | undefined, key: string, resource?: string, withLanguageOverride?: boolean): Promise { + const scope = this.parseConfigurationTarget(target, resource); + const effectiveKey = this.getEffectiveKey(key, scope, withLanguageOverride, resource); + await this.preferenceService.set(effectiveKey, undefined, scope, resource); } - private parseConfigurationTarget(target?: boolean | ConfigurationTarget): PreferenceScope | undefined { + private parseConfigurationTarget(target?: boolean | ConfigurationTarget, resource?: string): PreferenceScope { if (typeof target === 'boolean') { return target ? PreferenceScope.User : PreferenceScope.Workspace; } @@ -106,9 +107,17 @@ export class PreferenceRegistryMainImpl implements PreferenceRegistryMain, Dispo case ConfigurationTarget.WorkspaceFolder: return PreferenceScope.Folder; default: - // PreferenceService knows how to deal with undefined in VS Code compatible way - return undefined; + return resource ? PreferenceScope.Folder : PreferenceScope.Workspace; } } + // If the caller does not set `withLanguageOverride = true`, we have to check whether the setting exists with that override already. + protected getEffectiveKey(key: string, scope: PreferenceScope, withLanguageOverride?: boolean, resource?: string): string { + if (withLanguageOverride) { return key; } + const overridden = this.preferenceService.overriddenPreferenceName(key); + if (!overridden) { return key; } + const value = this.preferenceService.inspectInScope(key, scope, resource, withLanguageOverride); + return value === undefined ? overridden.preferenceName : key; + } + } diff --git a/packages/plugin-ext/src/main/browser/theme-icon-override.ts b/packages/plugin-ext/src/main/browser/theme-icon-override.ts new file mode 100644 index 0000000000000..51a28e96e2674 --- /dev/null +++ b/packages/plugin-ext/src/main/browser/theme-icon-override.ts @@ -0,0 +1,221 @@ +// ***************************************************************************** +// 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 WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { ThemeIcon } from '@theia/monaco-editor-core/esm/vs/platform/theme/common/themeService'; + +// @monaco-uplift +// Keep this up-to-date with the table at https://code.visualstudio.com/api/references/icons-in-labels#icon-listing +const codeIconMap: Record = { + 'accounts-view-bar-icon': 'account', + 'breakpoints-activate': 'activate-breakpoints', + 'breakpoints-remove-all': 'close-all', + 'breakpoints-view-icon': 'debug-alt', + 'callhierarchy-incoming': 'call-incoming', + 'callhierarchy-outgoing': 'call-outgoing', + 'callstack-view-icon': 'debug-alt', + 'callstack-view-session': 'bug', + 'comments-view-icon': 'comment-discussion', + 'debug-collapse-all': 'collapse-all', + 'debug-configure': 'gear', + 'debug-console-clear-all': 'clear-all', + 'debug-console-evaluation-input': 'arrow-small-right', + 'debug-console-evaluation-prompt': 'chevron-right', + 'debug-console-view-icon': 'debug-console', + 'debug-gripper': 'gripper', + 'default-view-icon': 'window', + 'diff-editor-next-change': 'arrow-down', + 'diff-editor-previous-change': 'arrow-up', + 'diff-editor-toggle-whitespace': 'whitespace', + 'diff-insert': 'add', + 'diff-remove': 'remove', + 'diff-review-close': 'close', + 'diff-review-insert': 'add', + 'diff-review-remove': 'remove', + 'explorer-view-icon': 'files', + 'extensions-clear-search-results': 'clear-all', + 'extensions-configure-recommended': 'pencil', + 'extensions-filter': 'filter', + 'extensions-info-message': 'info', + 'extensions-install-count': 'cloud-download', + 'extensions-install-local-in-remote': 'cloud-download', + 'extensions-install-workspace-recommended': 'cloud-download', + 'extensions-manage': 'gear', + 'extensions-rating': 'star', + 'extensions-refresh': 'refresh', + 'extensions-remote': 'remote', + 'extensions-star-empty': 'star-empty', + 'extensions-star-full': 'star-full', + 'extensions-star-half': 'star-half', + 'extensions-sync-enabled': 'sync', + 'extensions-sync-ignored': 'sync-ignored', + 'extensions-view-icon': 'extensions', + 'extensions-warning-message': 'warning', + 'find-collapsed': 'chevron-right', + 'find-expanded': 'chevron-down', + 'find-next-match': 'arrow-down', + 'find-previous-match': 'arrow-up', + 'find-replace': 'replace', + 'find-replace-all': 'replace-all', + 'find-selection': 'selection', + 'folding-collapsed': 'chevron-right', + 'folding-expanded': 'chevron-down', + 'getting-started-beginner': 'lightbulb', + 'getting-started-codespaces': 'github', + 'getting-started-item-checked': 'pass-filled', + 'getting-started-item-unchecked': 'circle-large-outline', + 'getting-started-setup': 'heart', + 'goto-next-location': 'arrow-down', + 'goto-previous-location': 'arrow-up', + 'keybindings-add': 'add', + 'keybindings-edit': 'edit', + 'keybindings-record-keys': 'record-keys', + 'keybindings-sort': 'sort-precedence', + 'loaded-scripts-view-icon': 'debug-alt', + 'marker-navigation-next': 'chevron-down', + 'marker-navigation-previous': 'chevron-up', + 'markers-view-filter': 'filter', + 'markers-view-icon': 'warning', + 'markers-view-multi-line-collapsed': 'chevron-down', + 'markers-view-multi-line-expanded': 'chevron-up', + 'notebook-clear': 'clear-all', + 'notebook-collapsed': 'chevron-right', + 'notebook-delete-cell': 'trash', + 'notebook-edit': 'pencil', + 'notebook-execute': 'play', + 'notebook-execute-all': 'run-all', + 'notebook-expanded': 'chevron-down', + 'notebook-kernel-configure': 'settings-gear', + 'notebook-kernel-select': 'server-environment', + 'notebook-mimetype': 'code', + 'notebook-move-down': 'arrow-down', + 'notebook-move-up': 'arrow-up', + 'notebook-open-as-text': 'file-code', + 'notebook-render-output': 'preview', + 'notebook-revert': 'discard', + 'notebook-split-cell': 'split-vertical', + 'notebook-state-error': 'error', + 'notebook-state-success': 'check', + 'notebook-stop': 'primitive-square', + 'notebook-stop-edit': 'check', + 'notebook-unfold': 'unfold', + 'notifications-clear': 'close', + 'notifications-clear-all': 'clear-all', + 'notifications-collapse': 'chevron-down', + 'notifications-configure': 'gear', + 'notifications-expand': 'chevron-up', + 'notifications-hide': 'chevron-down', + 'open-editors-view-icon': 'book', + 'outline-view-icon': 'symbol-class', + 'output-view-icon': 'output', + 'panel-close': 'close', + 'panel-maximize': 'chevron-up', + 'panel-restore': 'chevron-down', + 'parameter-hints-next': 'chevron-down', + 'parameter-hints-previous': 'chevron-up', + 'ports-forward-icon': 'plus', + 'ports-open-browser-icon': 'globe', + 'ports-stop-forward-icon': 'x', + 'ports-view-icon': 'plug', + 'preferences-clear-input': 'clear-all', + 'preferences-open-settings': 'go-to-file', + 'private-ports-view-icon': 'lock', + 'public-ports-view-icon': 'eye', + 'refactor-preview-view-icon': 'lightbulb', + 'remote-explorer-documentation': 'book', + 'remote-explorer-feedback': 'twitter', + 'remote-explorer-get-started': 'star', + 'remote-explorer-report-issues': 'comment', + 'remote-explorer-review-issues': 'issues', + 'remote-explorer-view-icon': 'remote-explorer', + 'review-comment-collapse': 'chevron-up', + 'run-view-icon': 'debug-alt', + 'search-clear-results': 'clear-all', + 'search-collapse-results': 'collapse-all', + 'search-details': 'ellipsis', + 'search-expand-results': 'expand-all', + 'search-hide-replace': 'chevron-right', + 'search-new-editor': 'new-file', + 'search-refresh': 'refresh', + 'search-remove': 'close', + 'search-replace': 'replace', + 'search-replace-all': 'replace-all', + 'search-show-context': 'list-selection', + 'search-show-replace': 'chevron-down', + 'search-stop': 'search-stop', + 'search-view-icon': 'search', + 'settings-add': 'add', + 'settings-discard': 'discard', + 'settings-edit': 'edit', + 'settings-folder-dropdown': 'triangle-down', + 'settings-group-collapsed': 'chevron-right', + 'settings-group-expanded': 'chevron-down', + 'settings-more-action': 'gear', + 'settings-remove': 'close', + 'settings-sync-view-icon': 'sync', + 'settings-view-bar-icon': 'settings-gear', + 'source-control-view-icon': 'source-control', + 'suggest-more-info': 'chevron-right', + 'tasks-list-configure': 'gear', + 'tasks-remove': 'close', + 'terminal-kill': 'trash', + 'terminal-new': 'add', + 'terminal-rename': 'gear', + 'terminal-view-icon': 'terminal', + 'test-view-icon': 'beaker', + 'testing-cancel-icon': 'close', + 'testing-debug-icon': 'debug-alt', + 'testing-error-icon': 'warning', + 'testing-failed-icon': 'close', + 'testing-passed-icon': 'pass', + 'testing-queued-icon': 'watch', + 'testing-run-all-icon': 'run-all', + 'testing-run-icon': 'run', + 'testing-show-as-list-icon': 'list-tree', + 'testing-skipped-icon': 'debug-step-over', + 'testing-unset-icon': 'circle-outline', + 'timeline-open': 'history', + 'timeline-pin': 'pin', + 'timeline-refresh': 'refresh', + 'timeline-unpin': 'pinned', + 'timeline-view-icon': 'history', + 'variables-view-icon': 'debug-alt', + 'view-pane-container-collapsed': 'chevron-right', + 'view-pane-container-expanded': 'chevron-down', + 'watch-expressions-add': 'add', + 'watch-expressions-add-function-breakpoint': 'add', + 'watch-expressions-remove-all': 'close-all', + 'watch-view-icon': 'debug-alt', + 'widget-close': 'close' +}; + +const originalAsCSSSelector = ThemeIcon.asCSSSelector; +const originalAsClassName = ThemeIcon.asClassName; +const originalAsClassNameArray = ThemeIcon.asClassNameArray; + +function buildMappedIcon(icon: ThemeIcon): ThemeIcon { + const id = codeIconMap[icon.id] ?? icon.id; + const newIcon: ThemeIcon = { + ...icon, + id + }; + return newIcon; +} + +Object.assign(ThemeIcon, { + asCSSSelector: (icon: ThemeIcon) => originalAsCSSSelector(buildMappedIcon(icon)), + asClassName: (icon: ThemeIcon) => originalAsClassName(buildMappedIcon(icon)), + asClassNameArray: (icon: ThemeIcon) => originalAsClassNameArray(buildMappedIcon(icon)) +}); diff --git a/packages/plugin-ext/src/main/browser/view/tree-view-decorator-service.ts b/packages/plugin-ext/src/main/browser/view/tree-view-decorator-service.ts index ae079fb330d35..c6df32ad46596 100644 --- a/packages/plugin-ext/src/main/browser/view/tree-view-decorator-service.ts +++ b/packages/plugin-ext/src/main/browser/view/tree-view-decorator-service.ts @@ -32,9 +32,9 @@ export class TreeViewDecoratorAdapter extends FileTreeDecoratorAdapter { } } - protected isTreeItem(node: object | undefined): node is TreeItem & { resourceUri: Uri } { + protected isTreeItem(node: unknown): node is TreeItem & { resourceUri: Uri } { const candidate = node as TreeItem; - return !!candidate && 'resourceUri' in candidate && !!candidate.resourceUri; + return !!candidate && typeof node === 'object' && 'resourceUri' in candidate && !!candidate.resourceUri; } } diff --git a/packages/plugin-ext/src/main/browser/workspace-main.ts b/packages/plugin-ext/src/main/browser/workspace-main.ts index 9a8b561a019bb..0606b4cb1e426 100644 --- a/packages/plugin-ext/src/main/browser/workspace-main.ts +++ b/packages/plugin-ext/src/main/browser/workspace-main.ts @@ -367,12 +367,8 @@ export class TextContentResource implements Resource { return content; } else { const content = await this.proxy.$provideTextDocumentContent(this.uri.toString()); - if (content) { - return content; - } + return content ?? ''; } - - return Promise.reject(new Error(`Unable to get content for '${this.uri.toString()}'`)); } dispose(): void { 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 80d2e1385c508..8e0cecb65f727 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 @@ -14,7 +14,6 @@ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 // ***************************************************************************** -import * as path from 'path'; import { PluginDeployerFileHandler, PluginDeployerEntry, PluginDeployerFileHandlerContext, PluginType } from '../../../common/plugin-protocol'; import { injectable, inject } from '@theia/core/shared/inversify'; import { getTempDir } from '../temp-dir-util'; @@ -22,7 +21,6 @@ import * as fs from '@theia/core/shared/fs-extra'; import * as filenamify from 'filenamify'; import { FileUri } from '@theia/core/lib/node/file-uri'; import { PluginTheiaEnvironment } from '../../common/plugin-theia-environment'; -import URI from '@theia/core/lib/common/uri'; @injectable() export class PluginTheiaFileHandler implements PluginDeployerFileHandler { @@ -37,7 +35,6 @@ export class PluginTheiaFileHandler implements PluginDeployerFileHandler { } async handle(context: PluginDeployerFileHandlerContext): Promise { - await this.ensureDiscoverability(context); const id = context.pluginEntry().id(); const pluginDir = await this.getPluginDir(context); console.log(`[${id}]: trying to decompress into "${pluginDir}"...`); @@ -51,29 +48,6 @@ export class PluginTheiaFileHandler implements PluginDeployerFileHandler { context.pluginEntry().updatePath(pluginDir); } - /** - * Ensures that a user-installed plugin file is transferred to the user extension folder. - */ - protected async ensureDiscoverability(context: PluginDeployerFileHandlerContext): Promise { - if (context.pluginEntry().type === PluginType.User) { - const userExtensionsDir = await this.environment.getPluginsDirUri(); - const currentPath = context.pluginEntry().path(); - if (!userExtensionsDir.isEqualOrParent(new URI(currentPath)) && !userExtensionsDir.isEqualOrParent(new URI(context.pluginEntry().originalPath()))) { - try { - const newPath = FileUri.fsPath(userExtensionsDir.resolve(path.basename(currentPath))); - await fs.mkdirp(FileUri.fsPath(userExtensionsDir)); - await new Promise((resolve, reject) => { - fs.copyFile(currentPath, newPath, error => error ? reject(error) : resolve()); - }); - context.pluginEntry().updatePath(newPath); - context.pluginEntry().storeValue('sourceLocations', [newPath]); - } catch (e) { - console.error(`[${context.pluginEntry().id}]: Failed to copy to user directory. Future sessions may not have access to this plugin.`); - } - } - } - } - protected async getPluginDir(context: PluginDeployerFileHandlerContext): Promise { return FileUri.fsPath(this.systemPluginsDirUri.resolve(filenamify(context.pluginEntry().id(), { replacement: '_' }))); } 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 dfcb84e349c2b..ec67c9fd56780 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 @@ -25,7 +25,6 @@ import { PluginDeployerDirectoryHandler, PluginServer, pluginServerJsonRpcPath, PluginDeployerParticipant } from '../../common/plugin-protocol'; import { PluginDeployerImpl } from './plugin-deployer-impl'; -import { LocalFilePluginDeployerResolver } from './resolvers/local-file-plugin-deployer-resolver'; import { LocalDirectoryPluginDeployerResolver } from './resolvers/local-directory-plugin-deployer-resolver'; import { PluginTheiaFileHandler } from './handlers/plugin-theia-file-handler'; import { PluginTheiaDirectoryHandler } from './handlers/plugin-theia-directory-handler'; @@ -54,7 +53,6 @@ export function bindMainBackend(bind: interfaces.Bind): void { bind(PluginUninstallationManager).toSelf().inSingletonScope(); bind(PluginDeployerResolver).to(LocalDirectoryPluginDeployerResolver).inSingletonScope(); - bind(PluginDeployerResolver).to(LocalFilePluginDeployerResolver).inSingletonScope(); bind(PluginDeployerResolver).to(GithubPluginDeployerResolver).inSingletonScope(); bind(PluginDeployerResolver).to(HttpPluginDeployerResolver).inSingletonScope(); diff --git a/packages/plugin-ext/src/main/node/resolvers/local-file-plugin-deployer-resolver.ts b/packages/plugin-ext/src/main/node/resolvers/local-file-plugin-deployer-resolver.ts deleted file mode 100644 index bbdaa6f677d2b..0000000000000 --- a/packages/plugin-ext/src/main/node/resolvers/local-file-plugin-deployer-resolver.ts +++ /dev/null @@ -1,34 +0,0 @@ -// ***************************************************************************** -// Copyright (C) 2018 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 WITH Classpath-exception-2.0 -// ***************************************************************************** - -import { PluginDeployerResolverContext } from '../../../common/plugin-protocol'; -import { injectable } from '@theia/core/shared/inversify'; -import * as path from 'path'; -import { LocalPluginDeployerResolver } from './local-plugin-deployer-resolver'; - -@injectable() -export class LocalFilePluginDeployerResolver extends LocalPluginDeployerResolver { - static LOCAL_FILE = 'local-file'; - - protected get supportedScheme(): string { - return LocalFilePluginDeployerResolver.LOCAL_FILE; - } - - async resolveFromLocalPath(pluginResolverContext: PluginDeployerResolverContext, localPath: string): Promise { - const fileName = path.basename(localPath); - pluginResolverContext.addPlugin(fileName, localPath); - } -} diff --git a/packages/plugin-ext/src/main/node/resolvers/local-plugin-deployer-resolver.ts b/packages/plugin-ext/src/main/node/resolvers/local-plugin-deployer-resolver.ts index d831a2933d04a..b93c555bfa74f 100644 --- a/packages/plugin-ext/src/main/node/resolvers/local-plugin-deployer-resolver.ts +++ b/packages/plugin-ext/src/main/node/resolvers/local-plugin-deployer-resolver.ts @@ -23,16 +23,14 @@ import URI from '@theia/core/lib/common/uri'; @injectable() export abstract class LocalPluginDeployerResolver implements PluginDeployerResolver { - public async resolve(pluginResolverContext: PluginDeployerResolverContext): Promise { - const localPath = await this.resolveLocalPluginPath( - pluginResolverContext, - this.supportedScheme); + async resolve(pluginResolverContext: PluginDeployerResolverContext): Promise { + const localPath = await this.resolveLocalPluginPath(pluginResolverContext, this.supportedScheme); if (localPath) { await this.resolveFromLocalPath(pluginResolverContext, localPath); } } - public accept(pluginId: string): boolean { + accept(pluginId: string): boolean { return pluginId.startsWith(this.supportedScheme); } @@ -40,9 +38,7 @@ export abstract class LocalPluginDeployerResolver implements PluginDeployerResol protected abstract resolveFromLocalPath(pluginResolverContext: PluginDeployerResolverContext, localPath: string): Promise; - private async resolveLocalPluginPath( - pluginResolverContext: PluginDeployerResolverContext, - expectedScheme: string): Promise { + private async resolveLocalPluginPath(pluginResolverContext: PluginDeployerResolverContext, expectedScheme: string): Promise { const localUri = new URI(pluginResolverContext.getOriginId()); if (localUri.scheme !== expectedScheme) { return null; diff --git a/packages/plugin-ext/src/plugin/env.ts b/packages/plugin-ext/src/plugin/env.ts index 6441172d6a9bf..8033ca7c12b3b 100644 --- a/packages/plugin-ext/src/plugin/env.ts +++ b/packages/plugin-ext/src/plugin/env.ts @@ -14,6 +14,7 @@ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 // ***************************************************************************** +import { Emitter, Event } from '@theia/core/lib/common/event'; import * as theia from '@theia/plugin'; import { RPCProtocol } from '../common/rpc-protocol'; import { EnvMain, PLUGIN_RPC_CONTEXT } from '../common/plugin-api-rpc'; @@ -29,11 +30,18 @@ export abstract class EnvExtImpl { private ui: theia.UIKind; private envMachineId: string; private envSessionId: string; + private host: string; + private _isTelemetryEnabled: boolean; + private _remoteName: string | undefined; + private onDidChangeTelemetryEnabledEmitter = new Emitter(); constructor(rpc: RPCProtocol) { this.proxy = rpc.getProxy(PLUGIN_RPC_CONTEXT.ENV_MAIN); this.envSessionId = v4(); this.envMachineId = v4(); + // we don't support telemetry at the moment + this._isTelemetryEnabled = false; + this._remoteName = undefined; } getEnvVariable(envVarName: string): Promise { @@ -73,6 +81,10 @@ export abstract class EnvExtImpl { this.ui = uiKind; } + setAppHost(appHost: string): void { + this.host = appHost; + } + getClientOperatingSystem(): Promise { return this.proxy.$getClientOperatingSystem(); } @@ -83,6 +95,24 @@ export abstract class EnvExtImpl { abstract get appRoot(): string; + abstract get isNewAppInstall(): boolean; + + get appHost(): string { + return this.host; + } + + get isTelemetryEnabled(): boolean { + return this._isTelemetryEnabled; + } + + get onDidChangeTelemetryEnabled(): Event { + return this.onDidChangeTelemetryEnabledEmitter.event; + } + + get remoteName(): string | undefined { + return this._remoteName; + } + get language(): string { return this.lang; } diff --git a/packages/plugin-ext/src/plugin/languages.ts b/packages/plugin-ext/src/plugin/languages.ts index 3e80545fbe764..c438d85eb924e 100644 --- a/packages/plugin-ext/src/plugin/languages.ts +++ b/packages/plugin-ext/src/plugin/languages.ts @@ -62,11 +62,13 @@ import { CallHierarchyIncomingCall, CallHierarchyOutgoingCall, LinkedEditingRanges, + EvaluatableExpression } from '../common/plugin-api-rpc-model'; import { CompletionAdapter } from './languages/completion'; import { Diagnostics } from './languages/diagnostics'; import { SignatureHelpAdapter } from './languages/signature'; import { HoverAdapter } from './languages/hover'; +import { EvaluatableExpressionAdapter } from './languages/evaluatable-expression'; import { DocumentHighlightAdapter } from './languages/document-highlight'; import { DocumentFormattingAdapter } from './languages/document-formatting'; import { RangeFormattingAdapter } from './languages/range-formatting'; @@ -100,6 +102,7 @@ import { serializeEnterRules, serializeIndentation, serializeRegExp } from './la type Adapter = CompletionAdapter | SignatureHelpAdapter | HoverAdapter | + EvaluatableExpressionAdapter | DocumentHighlightAdapter | DocumentFormattingAdapter | RangeFormattingAdapter | @@ -350,6 +353,18 @@ export class LanguagesExtImpl implements LanguagesExt { } // ### Hover Provider end + // ### EvaluatableExpression Provider begin + registerEvaluatableExpressionProvider(selector: theia.DocumentSelector, provider: theia.EvaluatableExpressionProvider, pluginInfo: PluginInfo): theia.Disposable { + const callId = this.addNewAdapter(new EvaluatableExpressionAdapter(provider, this.documents)); + this.proxy.$registerEvaluatableExpressionProvider(callId, pluginInfo, this.transformDocumentSelector(selector)); + return this.createDisposable(callId); + } + + $provideEvaluatableExpression(handle: number, resource: UriComponents, position: Position, token: theia.CancellationToken): Promise { + return this.withAdapter(handle, EvaluatableExpressionAdapter, adapter => adapter.provideEvaluatableExpression(URI.revive(resource), position, token), undefined); + } + // ### EvaluatableExpression Provider end + // ### Document Highlight Provider begin registerDocumentHighlightProvider(selector: theia.DocumentSelector, provider: theia.DocumentHighlightProvider, pluginInfo: PluginInfo): theia.Disposable { const callId = this.addNewAdapter(new DocumentHighlightAdapter(provider, this.documents)); diff --git a/packages/plugin-ext/src/plugin/languages/code-action.ts b/packages/plugin-ext/src/plugin/languages/code-action.ts index 37564bb07fe0e..9bbff9fe8ba81 100644 --- a/packages/plugin-ext/src/plugin/languages/code-action.ts +++ b/packages/plugin-ext/src/plugin/languages/code-action.ts @@ -145,20 +145,17 @@ export class CodeActionAdapter { return this.cacheId++; } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - private static _isCommand(smth: any): smth is theia.Command { - return typeof (smth).command === 'string'; + private static _isCommand(arg: unknown): arg is theia.Command { + return !!arg && typeof arg === 'object' && typeof (arg as theia.Command).command === 'string'; } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - private static _isSelection(obj: any): obj is Selection { - return ( - obj - && (typeof obj.selectionStartLineNumber === 'number') - && (typeof obj.selectionStartColumn === 'number') - && (typeof obj.positionLineNumber === 'number') - && (typeof obj.positionColumn === 'number') - ); + private static _isSelection(obj: unknown): obj is Selection { + const selection = obj as Selection; + return !!obj && typeof obj === 'object' + && typeof selection.selectionStartLineNumber === 'number' + && typeof selection.selectionStartColumn === 'number' + && typeof selection.positionLineNumber === 'number' + && typeof selection.positionColumn === 'number'; } } diff --git a/packages/plugin-ext/src/plugin/languages/document-highlight.ts b/packages/plugin-ext/src/plugin/languages/document-highlight.ts index bc7a95ded2bbd..152de8d002dfa 100644 --- a/packages/plugin-ext/src/plugin/languages/document-highlight.ts +++ b/packages/plugin-ext/src/plugin/languages/document-highlight.ts @@ -55,8 +55,7 @@ export class DocumentHighlightAdapter { }); } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - private isDocumentHighlightArray(array: any): array is types.DocumentHighlight[] { + private isDocumentHighlightArray(array: unknown): array is types.DocumentHighlight[] { return Array.isArray(array) && array.length > 0 && array[0] instanceof types.DocumentHighlight; } } diff --git a/packages/plugin-ext/src/plugin/languages/evaluatable-expression.ts b/packages/plugin-ext/src/plugin/languages/evaluatable-expression.ts new file mode 100644 index 0000000000000..ea7fb6f643b3f --- /dev/null +++ b/packages/plugin-ext/src/plugin/languages/evaluatable-expression.ts @@ -0,0 +1,47 @@ +// ***************************************************************************** +// Copyright (C) 2022 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 WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { URI } from '@theia/core/shared/vscode-uri'; +import * as theia from '@theia/plugin'; +import { Position } from '../../common/plugin-api-rpc'; +import { EvaluatableExpression } from '../../common/plugin-api-rpc-model'; +import { DocumentsExtImpl } from '../documents'; +import * as Converter from '../type-converters'; + +export class EvaluatableExpressionAdapter { + + constructor( + private readonly provider: theia.EvaluatableExpressionProvider, + private readonly documents: DocumentsExtImpl + ) { } + + async provideEvaluatableExpression(resource: URI, position: Position, token: theia.CancellationToken): Promise { + const documentData = this.documents.getDocumentData(resource); + if (!documentData) { + return Promise.reject(new Error(`There is no document data for ${resource}`)); + } + + const document = documentData.document; + const pos = Converter.toPosition(position); + + return Promise.resolve(this.provider.provideEvaluatableExpression(document, pos, token)).then(expression => { + if (!expression) { + return undefined; + } + return Converter.fromEvaluatableExpression(expression); + }); + } +} diff --git a/packages/plugin-ext/src/plugin/languages/util.ts b/packages/plugin-ext/src/plugin/languages/util.ts index 6c38a6bb80743..2918f5edcf0a2 100644 --- a/packages/plugin-ext/src/plugin/languages/util.ts +++ b/packages/plugin-ext/src/plugin/languages/util.ts @@ -17,12 +17,10 @@ import * as theia from '@theia/plugin'; import * as types from '../types-impl'; -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export function isLocationArray(array: any): array is types.Location[] { +export function isLocationArray(array: unknown): array is types.Location[] { return Array.isArray(array) && array.length > 0 && array[0] instanceof types.Location; } -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export function isDefinitionLinkArray(array: any): array is theia.DefinitionLink[] { +export function isDefinitionLinkArray(array: unknown): array is theia.DefinitionLink[] { return Array.isArray(array) && array.length > 0 && array[0].hasOwnProperty('targetUri') && array[0].hasOwnProperty('targetRange'); } diff --git a/packages/plugin-ext/src/plugin/node/env-node-ext.ts b/packages/plugin-ext/src/plugin/node/env-node-ext.ts index efdaaca491158..c1e6f75a5fee8 100644 --- a/packages/plugin-ext/src/plugin/node/env-node-ext.ts +++ b/packages/plugin-ext/src/plugin/node/env-node-ext.ts @@ -19,6 +19,7 @@ import { EnvExtImpl } from '../env'; import { RPCProtocol } from '../../common/rpc-protocol'; import { createHash } from 'crypto'; import { v4 } from 'uuid'; +import fs = require('fs'); /** * Provides machineId using mac address. It's only possible on node side @@ -27,6 +28,7 @@ import { v4 } from 'uuid'; export class EnvNodeExtImpl extends EnvExtImpl { private macMachineId: string; + private _isNewAppInstall: boolean; constructor(rpc: RPCProtocol) { super(rpc); @@ -37,7 +39,7 @@ export class EnvNodeExtImpl extends EnvExtImpl { this.macMachineId = createHash('sha256').update(macAddress, 'utf8').digest('hex'); } }); - + this._isNewAppInstall = this.computeIsNewAppInstall(); } /** @@ -54,4 +56,14 @@ export class EnvNodeExtImpl extends EnvExtImpl { return __dirname; } + get isNewAppInstall(): boolean { + return this._isNewAppInstall; + } + + private computeIsNewAppInstall(): boolean { + const creation = fs.statSync(__filename).birthtimeMs; + const current = Date.now(); + const dayMs = 24 * 3600 * 1000; + return (current - creation) < dayMs; + } } diff --git a/packages/plugin-ext/src/plugin/plugin-context.ts b/packages/plugin-ext/src/plugin/plugin-context.ts index 0ecbc837047fb..00fddb1f7c806 100644 --- a/packages/plugin-ext/src/plugin/plugin-context.ts +++ b/packages/plugin-ext/src/plugin/plugin-context.ts @@ -78,6 +78,7 @@ import { SignatureHelp, SignatureHelpTriggerKind, Hover, + EvaluatableExpression, DocumentHighlightKind, DocumentHighlight, DocumentLink, @@ -559,7 +560,7 @@ export function createAPIFactory( extHostFileSystemEvent.getOnWillDeleteFileEvent(plugin)(listener, thisArg, disposables), onWillRenameFiles: (listener: (e: theia.FileWillRenameEvent) => any, thisArg?: any, disposables?: theia.Disposable[]) => extHostFileSystemEvent.getOnWillRenameFileEvent(plugin)(listener, thisArg, disposables), - getConfiguration(section?, resource?): theia.WorkspaceConfiguration { + getConfiguration(section, resource): theia.WorkspaceConfiguration { return preferenceRegistryExt.getConfiguration(section, resource); }, onDidChangeConfiguration(listener, thisArgs?, disposables?): theia.Disposable { @@ -639,7 +640,14 @@ export function createAPIFactory( const env: typeof theia.env = Object.freeze({ get appName(): string { return envExt.appName; }, get appRoot(): string { return envExt.appRoot; }, + get appHost(): string { return envExt.appHost; }, get language(): string { return envExt.language; }, + get isNewAppInstall(): boolean { return envExt.isNewAppInstall; }, + get isTelemetryEnabled(): boolean { return envExt.isTelemetryEnabled; }, + get onDidChangeTelemetryEnabled(): theia.Event { + return envExt.onDidChangeTelemetryEnabled; + }, + get remoteName(): string | undefined { return envExt.remoteName; }, get machineId(): string { return envExt.machineId; }, get sessionId(): string { return envExt.sessionId; }, get uriScheme(): string { return envExt.uriScheme; }, @@ -724,6 +732,9 @@ export function createAPIFactory( registerHoverProvider(selector: theia.DocumentSelector, provider: theia.HoverProvider): theia.Disposable { return languagesExt.registerHoverProvider(selector, provider, pluginToPluginInfo(plugin)); }, + registerEvaluatableExpressionProvider(selector: theia.DocumentSelector, provider: theia.EvaluatableExpressionProvider): theia.Disposable { + return languagesExt.registerEvaluatableExpressionProvider(selector, provider, pluginToPluginInfo(plugin)); + }, registerDocumentHighlightProvider(selector: theia.DocumentSelector, provider: theia.DocumentHighlightProvider): theia.Disposable { return languagesExt.registerDocumentHighlightProvider(selector, provider, pluginToPluginInfo(plugin)); }, @@ -984,6 +995,7 @@ export function createAPIFactory( SignatureHelp, SignatureHelpTriggerKind, Hover, + EvaluatableExpression, DocumentHighlightKind, DocumentHighlight, DocumentLink, diff --git a/packages/plugin-ext/src/plugin/plugin-manager.ts b/packages/plugin-ext/src/plugin/plugin-manager.ts index ceb29a41645d5..d78afa6a1a33f 100644 --- a/packages/plugin-ext/src/plugin/plugin-manager.ts +++ b/packages/plugin-ext/src/plugin/plugin-manager.ts @@ -201,6 +201,7 @@ export class PluginManagerExtImpl implements PluginManagerExt, PluginManager { this.envExt.setShell(params.env.shell); this.envExt.setUIKind(params.env.uiKind); this.envExt.setApplicationName(params.env.appName); + this.envExt.setAppHost(params.env.appHost); this.preferencesManager.init(params.preferences); diff --git a/packages/plugin-ext/src/plugin/plugin-storage.ts b/packages/plugin-ext/src/plugin/plugin-storage.ts index b65e80f710595..45eb129f0b08d 100644 --- a/packages/plugin-ext/src/plugin/plugin-storage.ts +++ b/packages/plugin-ext/src/plugin/plugin-storage.ts @@ -38,6 +38,10 @@ export class Memento implements theia.Memento { } } + keys(): string[] { + return Object.entries(this.cache).filter(([, value]) => value !== undefined).map(([key]) => key); + } + get(key: string): T | undefined; get(key: string, defaultValue: T): T; get(key: string, defaultValue?: T): T | undefined { diff --git a/packages/plugin-ext/src/plugin/preference-registry.spec.ts b/packages/plugin-ext/src/plugin/preference-registry.spec.ts index 5e71b28bd7f1c..8c333982a7053 100644 --- a/packages/plugin-ext/src/plugin/preference-registry.spec.ts +++ b/packages/plugin-ext/src/plugin/preference-registry.spec.ts @@ -14,16 +14,17 @@ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 // ***************************************************************************** -import { PreferenceRegistryExtImpl } from './preference-registry'; +import { PreferenceRegistryExtImpl, PreferenceScope } from './preference-registry'; import * as chai from 'chai'; import { WorkspaceExtImpl } from '../plugin/workspace'; import { ProxyIdentifier, RPCProtocol } from '../common/rpc-protocol'; +import { URI } from './types-impl'; const expect = chai.expect; /* eslint-disable @typescript-eslint/no-explicit-any */ describe('PreferenceRegistryExtImpl:', () => { - + const workspaceRoot = URI.parse('/workspace-root'); let preferenceRegistryExtImpl: PreferenceRegistryExtImpl; const getProxy = (proxyId: ProxyIdentifier) => { }; const set = (identifier: ProxyIdentifier, instance: unknown) => { }; @@ -34,59 +35,266 @@ describe('PreferenceRegistryExtImpl:', () => { set, dispose } as RPCProtocol; - const mockWorkspace: WorkspaceExtImpl = {} as WorkspaceExtImpl; + const mockWorkspace: WorkspaceExtImpl = { workspaceFolders: [{ uri: workspaceRoot, name: 'workspace-root', index: 0 }] } as WorkspaceExtImpl; beforeEach(() => { preferenceRegistryExtImpl = new PreferenceRegistryExtImpl(mockRPC, mockWorkspace); }); - it('Check parseConfigurationData', () => { - const value: { [key: string]: any } = { + it('should parse configuration data without overrides', () => { + const value: Record = { 'my.key1.foo': 'value1', 'my.key1.bar': 'value2', }; - const result: { [key: string]: any } = (preferenceRegistryExtImpl as any).parseConfigurationData(value); - expect(result.my).to.be.an('object'); - expect(result.my.key1).to.be.an('object'); + const result = preferenceRegistryExtImpl['parseConfigurationData'](value); + expect(result.contents.my).to.be.an('object'); + expect(result.contents.my.key1).to.be.an('object'); - expect(result.my.key1.foo).to.be.an('string'); - expect(result.my.key1.foo).to.equal('value1'); + expect(result.contents.my.key1.foo).to.be.an('string'); + expect(result.contents.my.key1.foo).to.equal('value1'); - expect(result.my.key1.bar).to.be.an('string'); - expect(result.my.key1.bar).to.equal('value2'); + expect(result.contents.my.key1.bar).to.be.an('string'); + expect(result.contents.my.key1.bar).to.equal('value2'); + expect(result.keys).deep.equal(['my.key1.foo', 'my.key1.bar']); }); - it('Prototype pollution check', () => { - const value: { [key: string]: any } = { - 'my.key1.foo': 'value1', - '__proto__.injectedParsedPrototype': true, - 'a.__proto__.injectedParsedPrototype': true, - '__proto__': {}, + it('should parse configuration with overrides', () => { + const value: Record = { + 'editor.tabSize': 2, + '[typescript].editor.tabSize': 4, }; - const result: { [key: string]: any } = (preferenceRegistryExtImpl as any).parseConfigurationData(value); - expect(result.my).to.be.an('object'); - expect(result.__proto__).to.be.an('undefined'); - expect(result.my.key1.foo).to.equal('value1'); - const prototypeObject = Object.prototype as any; - expect(prototypeObject.injectedParsedPrototype).to.be.an('undefined'); - const rawObject = {} as any; - expect(rawObject.injectedParsedPrototype).to.be.an('undefined'); + const result = preferenceRegistryExtImpl['parseConfigurationData'](value); + expect(result.contents.editor.tabSize).to.equal(2); + const tsOverride = result.overrides[0]; + expect(tsOverride.contents.editor.tabSize).to.equal(4); + expect(tsOverride.identifiers).deep.equal(['typescript']); + expect(tsOverride.keys).deep.equal(['editor.tabSize']); }); - it('Prototype constructor pollution check', () => { - const value: { [key: string]: any } = { - 'my.key1.foo': 'value1', - 'a.constructor.prototype.injectedParsedConstructorPrototype': true, - 'constructor.prototype.injectedParsedConstructorPrototype': true, + describe('Prototype pollution', () => { + it('Ignores key `__proto__`', () => { + const value: Record = { + 'my.key1.foo': 'value1', + '__proto__.injectedParsedPrototype': true, + 'a.__proto__.injectedParsedPrototype': true, + '__proto__': {}, + '[typescript].someKey.foo': 'value', + '[typescript].__proto__.injectedParsedPrototype': true, + }; + const result = preferenceRegistryExtImpl['parseConfigurationData'](value); + expect(result.contents.my).to.be.an('object'); + expect(result.contents.__proto__).to.be.an('undefined'); + expect(result.contents.my.key1.foo).to.equal('value1'); + expect(result.overrides[0].contents.__proto__).to.be.an('undefined'); + const prototypeObject = Object.prototype as any; + expect(prototypeObject.injectedParsedPrototype).to.be.an('undefined'); + const rawObject = {} as any; + expect(rawObject.injectedParsedPrototype).to.be.an('undefined'); + }); + + it('Ignores key `constructor.prototype`', () => { + const value: Record = { + 'my.key1.foo': 'value1', + 'a.constructor.prototype.injectedParsedConstructorPrototype': true, + 'constructor.prototype.injectedParsedConstructorPrototype': true, + '[python].some.key.foo': 'value', + '[python].a.constructor.prototype.injectedParsedConsttructorPrototype': true + }; + const result = preferenceRegistryExtImpl['parseConfigurationData'](value); + expect(result.contents.my).to.be.an('object'); + expect(result.contents.__proto__).to.be.an('undefined'); + expect(result.contents.my.key1.foo).to.equal('value1'); + const prototypeObject = Object.prototype as any; + expect(prototypeObject.injectedParsedConstructorPrototype).to.be.an('undefined'); + expect(result.overrides[0].contents.__proto__).to.be.an('undefined'); + const rawObject = {} as any; + expect(rawObject.injectedParsedConstructorPrototype).to.be.an('undefined'); + }); + }); + + /* eslint-disable no-unused-expressions */ + describe('toConfigurationChangeEvent', () => { + // E.g. deletion of a `tasks.json`. + it('Handles deletion of a section', () => { + const affectsChecker = preferenceRegistryExtImpl['toConfigurationChangeEvent']([{ newValue: undefined, preferenceName: 'whole-section' }]); + expect(affectsChecker.affectsConfiguration('whole-section')).to.be.true; + }); + + it('Reports true of supersection if subsection changes', () => { + const affectsChecker = preferenceRegistryExtImpl['toConfigurationChangeEvent']([{ newValue: 'foo', preferenceName: 'whole-section.subsection.item' }]); + expect(affectsChecker.affectsConfiguration('whole-section')).to.be.true; + }); + + // This assumes that there should not exist a preference `section` and `section.*` as separate preferences. + // This is true in practice in all cases except `extensions` (i.e. extensions.json) and extensions.ignoreRecommendations etc. + // Given that, if a super-section changes (e.g. through deletion), all subsections will also be affected. + it('Reports true of a subsection if a supersection changes', () => { + const affectsChecker = preferenceRegistryExtImpl['toConfigurationChangeEvent']([{ newValue: 'bar', preferenceName: 'whole-section' }]); + expect(affectsChecker.affectsConfiguration('whole-section.subsection')).to.be.true; + }); + + it('Does not report true if a different subsection changes:', () => { + const affectsChecker = preferenceRegistryExtImpl['toConfigurationChangeEvent']([{ newValue: 'bar', preferenceName: 'whole-section.subsection.itemA' }]); + expect(affectsChecker.affectsConfiguration('whole-section.subsection.itemB')).to.be.false; + }); + + it('Reports that any URI is affected if change has no URI', () => { + const affectsChecker = preferenceRegistryExtImpl['toConfigurationChangeEvent']([{ newValue: 'bar', preferenceName: 'whole-section' }]); + expect(affectsChecker.affectsConfiguration('whole-section.subsection', URI.parse('/wherever'))).to.be.true; + }); + + it('Reports true if no URI is provided to check', () => { + const affectsChecker = preferenceRegistryExtImpl['toConfigurationChangeEvent']( + [{ newValue: 'bar', preferenceName: 'whole-section', scope: 'file:///very/specific/path' }] + ); + expect(affectsChecker.affectsConfiguration('whole-section.subsection')).to.be.true; + }); + + it('Reports false if the URIs dont match.', () => { + const affectsChecker = preferenceRegistryExtImpl['toConfigurationChangeEvent']( + [{ newValue: 'bar', preferenceName: 'whole-section', scope: 'file:///very/specific/path' }] + ); + expect(affectsChecker.affectsConfiguration('whole-section.subsection', URI.parse('/other/specific/path'))).to.be.false; + }); + + it('Reports true if the URIs do match', () => { + const affectsChecker = preferenceRegistryExtImpl['toConfigurationChangeEvent']( + [{ newValue: 'bar', preferenceName: 'whole-section', scope: 'file:///very/specific/path' }] + ); + expect(affectsChecker.affectsConfiguration('whole-section.subsection', URI.parse('/very/specific/path'))).to.be.true; + }); + + it('Reports true if the checked URI is a child of the affected path', () => { + const affectsChecker = preferenceRegistryExtImpl['toConfigurationChangeEvent']( + [{ newValue: 'bar', preferenceName: 'whole-section', scope: 'file:///very/specific/path' }] + ); + expect(affectsChecker.affectsConfiguration('whole-section.subsection', URI.parse('/very/specific/path/and/its/child'))).to.be.true; + }); + + it('Reports false if the checked URI starts with the affected path but not at a directory break', () => { + const affectsChecker = preferenceRegistryExtImpl['toConfigurationChangeEvent']( + [{ newValue: 'bar', preferenceName: 'whole-section', scope: 'file:///very/specific/path' }] + ); + expect(affectsChecker.affectsConfiguration('whole-section.subsection', URI.parse('/very/specific/path-or-not/and/its/child'))).to.be.false; + }); + + it('Extracts language override and returns false if change does not include language', () => { + const affectsChecker = preferenceRegistryExtImpl['toConfigurationChangeEvent']( + [{ newValue: 'bar', preferenceName: 'whole-section', scope: 'file:///very/specific/path' }] + ); + expect(affectsChecker.affectsConfiguration('whole-section.subsection', { languageId: 'typescript' })).to.be.false; + }); + + it('Extracts language override and returns true if change does include language', () => { + const affectsChecker = preferenceRegistryExtImpl['toConfigurationChangeEvent']( + [{ newValue: 'bar', preferenceName: '[typescript].whole-section', scope: 'file:///very/specific/path' }] + ); + expect(affectsChecker.affectsConfiguration('whole-section.subsection', { languageId: 'typescript' })).to.be.true; + }); + + it("Extracts language override and URI and returns false if the URI doesn't match", () => { + const affectsChecker = preferenceRegistryExtImpl['toConfigurationChangeEvent']( + [{ newValue: 'bar', preferenceName: '[typescript].whole-section', scope: 'file:///very/specific/path' }] + ); + expect(affectsChecker.affectsConfiguration('whole-section.subsection', { languageId: 'typescript', uri: URI.parse('/other/specific/path') })).to.be.false; + }); + + it('Extracts language override and URI and returns true if both match', () => { + const affectsChecker = preferenceRegistryExtImpl['toConfigurationChangeEvent']( + [{ newValue: 'bar', preferenceName: '[typescript].whole-section', scope: 'file:///very/specific/path' }] + ); + expect(affectsChecker.affectsConfiguration('whole-section.subsection', { languageId: 'typescript', uri: URI.parse('/very/specific/path') })).to.be.true; + }); + + it('Reports true if no language override is provided and a language overriden preference changes', () => { + const affectsChecker = preferenceRegistryExtImpl['toConfigurationChangeEvent']( + [{ newValue: 'bar', preferenceName: '[typescript].whole-section.subitem', scope: 'file:///somewhat-specific-path' }] + ); + expect(affectsChecker.affectsConfiguration('whole-section.subitem')).to.be.true; + }); + }); + + describe('Overrides', () => { + const values = { + [PreferenceScope.Default]: { + 'editor.fontSize': 14, + 'editor.tabSize': 2, + 'editor.renderWhitespace': 'selection' + }, + [PreferenceScope.User]: { + 'editor.tabSize': 4, + }, + [PreferenceScope.Workspace]: { + 'editor.renderWhitespace': 'none', + '[python].editor.renderWhitespace': 'all', + }, + [PreferenceScope.Folder]: { + [workspaceRoot.toString()]: { + 'editor.fontSize': 12, + } + }, }; - const result: { [key: string]: any } = (preferenceRegistryExtImpl as any).parseConfigurationData(value); - expect(result.my).to.be.an('object'); - expect(result.__proto__).to.be.an('undefined'); - expect(result.my.key1.foo).to.equal('value1'); - const prototypeObject = Object.prototype as any; - expect(prototypeObject.injectedParsedConstructorPrototype).to.be.an('undefined'); - const rawObject = {} as any; - expect(rawObject.injectedParsedConstructorPrototype).to.be.an('undefined'); + beforeEach(() => preferenceRegistryExtImpl.init(values)); + it('Returns a scoped value when URI is provided', () => { + const valuesRetrieved = preferenceRegistryExtImpl.getConfiguration(undefined, workspaceRoot).get('editor') as Record; + expect(valuesRetrieved.fontSize).equal(12); + }); + it('Returns a lower-priority scope if the value is undefined in the URI-designated scope', () => { + const valuesRetrieved = preferenceRegistryExtImpl.getConfiguration(undefined, workspaceRoot).get('editor') as Record; + expect(valuesRetrieved.renderWhitespace).equal('none'); + }); + it('Returns a language-overridden value if languageId is provided', () => { + const valuesRetrieved = preferenceRegistryExtImpl.getConfiguration(undefined, { uri: workspaceRoot, languageId: 'python' }).get('editor') as Record; + expect(valuesRetrieved.renderWhitespace).equal('all'); + }); + it('Returns the default value if the language override is undefined', () => { + const valuesRetrieved = preferenceRegistryExtImpl.getConfiguration(undefined, { uri: workspaceRoot, languageId: 'python' }).get('editor') as Record; + expect(valuesRetrieved.tabSize).equal(4); + }); }); + describe('Proxy Behavior', () => { + const deepConfig = { + 'python.linting.enabled': true, + 'python.linting.flake8Args': [], + 'python.linting.flake8CategorySeverity.E': 'Error', + 'python.linting.flake8CategorySeverity.F': 'Error', + 'python.linting.flake8CategorySeverity.W': 'Warning', + 'python.linting.flake8Enabled': false, + 'python.linting.flake8Path': 'flake8', + 'python.linting.ignorePatterns': ['.vscode/*.py', '**/site-packages/**/*.py'], + 'python.linting.lintOnSave': true, + 'python.linting.maxNumberOfProblems': 100, + 'python.linting.banditArgs': [], + 'python.linting.banditEnabled': false, + 'python.linting.banditPath': 'bandit', + 'python.linting.mypyArgs': [ + '--ignore-missing-imports', + '--follow-imports=silent', + '--show-column-numbers' + ], + 'python.linting.mypyCategorySeverity.error': 'Error', + 'python.linting.mypyCategorySeverity.note': 'Information', + 'python.linting.mypyEnabled': false, + 'python.linting.mypyPath': 'mypy', + }; + // https://github.com/eclipse-theia/theia/issues/11501 + it("Doesn't violate proxy rules and return a proxy when the underlying object is expected.", () => { + preferenceRegistryExtImpl.init({ + [PreferenceScope.Default]: deepConfig, + [PreferenceScope.User]: {}, + [PreferenceScope.Workspace]: {}, + [PreferenceScope.Folder]: { + [workspaceRoot.toString()]: {}, + } + }); + const pythonConfig = preferenceRegistryExtImpl.getConfiguration('python', workspaceRoot); + const lintConfig = pythonConfig.get>('linting')!; + const stringDictionary = Object.create(null); + Object.keys(lintConfig).forEach(key => { + stringDictionary[key] = lintConfig[key]; + }); + expect(Boolean('Made it this far without throwing an error')).to.be.true; + }); + }); }); diff --git a/packages/plugin-ext/src/plugin/preference-registry.ts b/packages/plugin-ext/src/plugin/preference-registry.ts index 0eb6133d74e74..c99b6c19a5c4f 100644 --- a/packages/plugin-ext/src/plugin/preference-registry.ts +++ b/packages/plugin-ext/src/plugin/preference-registry.ts @@ -17,17 +17,20 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { Emitter, Event } from '@theia/core/lib/common/event'; +import { URI } from '@theia/core/shared/vscode-uri'; +import { ResourceMap } from '@theia/monaco-editor-core/esm/vs/base/common/map'; +import { IConfigurationOverrides, IOverrides } from '@theia/monaco-editor-core/esm/vs/platform/configuration/common/configuration'; +import { Configuration, ConfigurationModel } from '@theia/monaco-editor-core/esm/vs/platform/configuration/common/configurationModels'; +import { Workspace, WorkspaceFolder } from '@theia/monaco-editor-core/esm/vs/platform/workspace/common/workspace'; import * as theia from '@theia/plugin'; +import { platform } from 'os'; +import { v4 } from 'uuid'; import { - PLUGIN_RPC_CONTEXT, - PreferenceRegistryExt, - PreferenceRegistryMain, - PreferenceData, - PreferenceChangeExt + PLUGIN_RPC_CONTEXT, PreferenceChangeExt, PreferenceData, PreferenceRegistryExt, + PreferenceRegistryMain } from '../common/plugin-api-rpc'; import { RPCProtocol } from '../common/rpc-protocol'; import { isObject, mixin } from '../common/types'; -import { Configuration, ConfigurationModel } from './preferences/configuration'; import { WorkspaceExtImpl } from './workspace'; import cloneDeep = require('lodash.clonedeep'); @@ -35,14 +38,14 @@ const injectionRe = /\b__proto__\b|\bconstructor\.prototype\b/; enum ConfigurationTarget { Global = 1, - Workspace = 2, - WorkspaceFolder = 3 + Workspace = 2, // eslint-disable-line @typescript-eslint/no-shadow + WorkspaceFolder = 3 // eslint-disable-line @typescript-eslint/no-shadow } -enum PreferenceScope { +export enum PreferenceScope { Default, User, - Workspace, + Workspace, // eslint-disable-line @typescript-eslint/no-shadow Folder, } @@ -68,6 +71,13 @@ function lookUp(tree: any, key: string): any { return node; } +export class TheiaWorkspace extends Workspace { + constructor(ext: WorkspaceExtImpl) { + const folders = (ext.workspaceFolders ?? []).map(folder => new WorkspaceFolder(folder)); + super(v4(), folders, false, ext.workspaceFile ?? null, () => ['win32', 'darwin'].includes(platform())); + } +} + export class PreferenceRegistryExtImpl implements PreferenceRegistryExt { private proxy: PreferenceRegistryMain; private _preferences: Configuration; @@ -91,11 +101,11 @@ export class PreferenceRegistryExtImpl implements PreferenceRegistryExt { this._onDidChangeConfiguration.fire(this.toConfigurationChangeEvent(eventData)); } - getConfiguration(section?: string, resource?: theia.Uri | null, extensionId?: string): theia.WorkspaceConfiguration { - resource = resource === null ? undefined : resource; - const preferences = this.toReadonlyValue(section - ? lookUp(this._preferences.getValue(undefined, this.workspace, resource), section) - : this._preferences.getValue(undefined, this.workspace, resource)); + getConfiguration(rawSection?: string, rawScope?: theia.ConfigurationScope | null, extensionId?: string): theia.WorkspaceConfiguration { + const overrides = this.parseConfigurationAccessOptions(rawScope); + + const preferences = this.toReadonlyValue( + this._preferences.getValue(rawSection, overrides, new TheiaWorkspace(this.workspace))); const configuration: theia.WorkspaceConfiguration = { has(key: string): boolean { @@ -119,6 +129,11 @@ export class PreferenceRegistryExtImpl implements PreferenceRegistryExt { } return new Proxy(target, { get: (targ: any, prop: string) => { + const config = Object.getOwnPropertyDescriptor(targ, prop); + // This check ensures that https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy/Proxy/get#invariants are satisfied + if (config?.configurable === false && config?.writable === false) { + return targ[prop]; + } if (typeof prop === 'string' && prop.toLowerCase() === 'tojson') { cloneTarget(); return () => clonedTarget; @@ -153,37 +168,28 @@ export class PreferenceRegistryExtImpl implements PreferenceRegistryExt { return cloneOnWriteProxy(result, key); } }, - update: (key: string, value: any, arg?: ConfigurationTarget | boolean): PromiseLike => { - key = section ? `${section}.${key}` : key; - const resourceStr: string | undefined = resource ? resource.toString() : undefined; + update: (key: string, value: any, targetScope?: ConfigurationTarget | boolean, withLanguageOverride?: boolean): PromiseLike => { + const resourceStr = overrides.resource?.toString(); + const fullPath = `${overrides.overrideIdentifier ? `[${overrides.overrideIdentifier}].` : ''}${rawSection}.${key}`; if (typeof value !== 'undefined') { - return this.proxy.$updateConfigurationOption(arg, key, value, resourceStr); + return this.proxy.$updateConfigurationOption(targetScope, fullPath, value, resourceStr, withLanguageOverride); } else { - return this.proxy.$removeConfigurationOption(arg, key, resourceStr); + return this.proxy.$removeConfigurationOption(targetScope, fullPath, resourceStr, withLanguageOverride); } }, inspect: (key: string): ConfigurationInspect | undefined => { - key = section ? `${section}.${key}` : key; - resource = resource === null ? undefined : resource; - const result = cloneDeep(this._preferences.inspect(key, this.workspace, resource)); + const path = `${rawSection}.${key}`; + const result = this._preferences.inspect(path, overrides, new TheiaWorkspace(this.workspace)); if (!result) { return undefined; } const configInspect: ConfigurationInspect = { key }; - if (typeof result.default !== 'undefined') { - configInspect.defaultValue = result.default; - } - if (typeof result.user !== 'undefined') { - configInspect.globalValue = result.user; - } - if (typeof result.workspace !== 'undefined') { - configInspect.workspaceValue = result.workspace; - } - if (typeof result.workspaceFolder !== 'undefined') { - configInspect.workspaceFolderValue = result.workspaceFolder; - } + configInspect.defaultValue = result.default?.value; + configInspect.globalValue = result.user?.value; + configInspect.workspaceValue = result.workspace?.value; + configInspect.workspaceFolderValue = result.workspaceFolder?.value; return configInspect; } }; @@ -198,7 +204,14 @@ export class PreferenceRegistryExtImpl implements PreferenceRegistryExt { private toReadonlyValue(data: any): any { const readonlyProxy = (target: any): any => isObject(target) ? new Proxy(target, { - get: (targ: any, prop: string) => readonlyProxy(targ[prop]), + get: (targ: any, prop: string) => { + const config = Object.getOwnPropertyDescriptor(targ, prop); + // This check ensures that https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy/Proxy/get#invariants are satisfied + if (config?.configurable === false && config?.writable === false) { + return targ[prop]; + } + return readonlyProxy(targ[prop]); + }, set: (targ: any, prop: string, val: any) => { throw new Error(`TypeError: Cannot assign to read only property '${prop}' of object`); }, @@ -222,70 +235,93 @@ export class PreferenceRegistryExtImpl implements PreferenceRegistryExt { const defaultConfiguration = this.getConfigurationModel(data[PreferenceScope.Default]); const userConfiguration = this.getConfigurationModel(data[PreferenceScope.User]); const workspaceConfiguration = this.getConfigurationModel(data[PreferenceScope.Workspace]); - const folderConfigurations = {} as { [resource: string]: ConfigurationModel }; + const folderConfigurations = new ResourceMap(); Object.keys(data[PreferenceScope.Folder]).forEach(resource => { - folderConfigurations[resource] = this.getConfigurationModel(data[PreferenceScope.Folder][resource]); + folderConfigurations.set(URI.parse(resource), this.getConfigurationModel(data[PreferenceScope.Folder][resource])); }); - return new Configuration(defaultConfiguration, userConfiguration, workspaceConfiguration, folderConfigurations); + return new Configuration(defaultConfiguration, userConfiguration, undefined, workspaceConfiguration, folderConfigurations); } private getConfigurationModel(data: { [key: string]: any }): ConfigurationModel { if (!data) { return new ConfigurationModel(); } - return new ConfigurationModel(this.parseConfigurationData(data), Object.keys(data)); + const configData = this.parseConfigurationData(data); + return new ConfigurationModel(configData.contents, configData.keys, configData.overrides); } - private readonly OVERRIDE_PROPERTY = '\\[(.*)\\]$'; + private readonly OVERRIDE_PROPERTY = '^\\[(.*)\\]$'; private readonly OVERRIDE_PROPERTY_PATTERN = new RegExp(this.OVERRIDE_PROPERTY); + private readonly OVERRIDE_KEY_TEST = /^\[([^\]]+)\]\./; - private parseConfigurationData(data: { [key: string]: any }): { [key: string]: any } { - return Object.keys(data).reduce((result: any, key: string) => { + private parseConfigurationData(data: { [key: string]: any }): Omit & { overrides: IOverrides[] } { + const keys = new Array(); + const overrides: Record = Object.create(null); + const contents = Object.keys(data).reduce((result: any, key: string) => { if (injectionRe.test(key)) { return result; } const parts = key.split('.'); let branch = result; - + const isOverride = this.OVERRIDE_KEY_TEST.test(key); + if (!isOverride) { + keys.push(key); + } for (let i = 0; i < parts.length; i++) { - if (i === parts.length - 1) { + if (i === 0 && isOverride) { + const identifier = this.OVERRIDE_PROPERTY_PATTERN.exec(parts[i])![1]; + if (!overrides[identifier]) { + overrides[identifier] = { keys: [], identifiers: [identifier], contents: Object.create(null) }; + } + branch = overrides[identifier].contents; + overrides[identifier].keys.push(key.slice(parts[i].length + 1)); + } else if (i === parts.length - 1) { branch[parts[i]] = data[key]; - continue; - } - if (!branch[parts[i]]) { - branch[parts[i]] = Object.create(null); - } - branch = branch[parts[i]]; - - // overridden properties should be transformed into - // "[overridden_identifier]" : { - // "property1" : "value1" - // "property2" : "value2" - // } - if (i === 0 && this.OVERRIDE_PROPERTY_PATTERN.test(parts[i])) { - branch[key.substring(parts[0].length + 1)] = data[key]; - break; + } else { + if (!branch[parts[i]]) { + branch[parts[i]] = Object.create(null); + } + branch = branch[parts[i]]; } } return result; }, Object.create(null)); + return { contents, keys, overrides: Object.values(overrides) }; } private toConfigurationChangeEvent(eventData: PreferenceChangeExt[]): theia.ConfigurationChangeEvent { return Object.freeze({ - affectsConfiguration: (section: string, uri?: theia.Uri): boolean => { - // TODO respect uri - // TODO respect scopes shadowing - for (const change of eventData) { - const tree = change.preferenceName - .split('.') - .reverse() - .reduce((prevValue: any, curValue: any) => ({ [curValue]: prevValue }), change.newValue); - return typeof lookUp(tree, section) !== 'undefined'; - } - return false; + affectsConfiguration: (section: string, scope?: theia.ConfigurationScope): boolean => { + const { resource, overrideIdentifier } = this.parseConfigurationAccessOptions(scope); + const sectionWithLanguage = overrideIdentifier ? `[${overrideIdentifier}].${section}` : section; + return eventData.some(change => { + const matchesUri = !resource || !change.scope || (resource.toString() + '/').startsWith(change.scope.endsWith('/') ? change.scope : change.scope + '/'); + const sliceIndex = overrideIdentifier ? 0 : (this.OVERRIDE_KEY_TEST.exec(change.preferenceName)?.[0].length ?? 0); + const changedPreferenceName = sliceIndex ? change.preferenceName.slice(sliceIndex) : change.preferenceName; + return matchesUri && ( + sectionWithLanguage === changedPreferenceName + || sectionWithLanguage.startsWith(`${changedPreferenceName}.`) + || changedPreferenceName.startsWith(`${sectionWithLanguage}.`)); + }); } }); } + protected parseConfigurationAccessOptions(scope?: theia.ConfigurationScope | null): IConfigurationOverrides { + if (!scope) { + return {}; + } + let overrideIdentifier: string | undefined = undefined; + let resource: theia.Uri | undefined; + if ('uri' in scope || 'languageId' in scope) { + resource = scope.uri; + } else { + resource = scope; + } + if ('languageId' in scope) { + overrideIdentifier = scope.languageId; + } + return { resource, overrideIdentifier }; + } + } diff --git a/packages/plugin-ext/src/plugin/preferences/configuration.spec.ts b/packages/plugin-ext/src/plugin/preferences/configuration.spec.ts deleted file mode 100644 index e43797fd4641a..0000000000000 --- a/packages/plugin-ext/src/plugin/preferences/configuration.spec.ts +++ /dev/null @@ -1,292 +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 WITH Classpath-exception-2.0 -// ***************************************************************************** - -/* eslint-disable @typescript-eslint/no-explicit-any */ -import * as chai from 'chai'; -import { Configuration, ConfigurationModel } from './configuration'; -import { PreferenceData } from '../../common'; -import { PreferenceScope } from '@theia/core/lib/common/preferences/preference-scope'; -import { WorkspaceExtImpl } from '../workspace'; -import { URI } from '@theia/core/shared/vscode-uri'; - -const expect = chai.expect; - -interface Inspect { - default: C; - user: C; - workspace?: C; - workspaceFolder?: C; - value: C; -} -let inspect: Inspect; - -const projects = ['/projects/workspace/project1', '/projects/workspace/project2']; - -const propertyName = 'tabSize'; -const preferences: PreferenceData = { - [PreferenceScope.Default]: { - [propertyName]: 6, - }, - [PreferenceScope.User]: { - [propertyName]: 5 - }, - [PreferenceScope.Workspace]: { - [propertyName]: 4 - }, - [PreferenceScope.Folder]: { - [projects[0]]: { - [propertyName]: 3 - }, - [projects[1]]: { - [propertyName]: 2 - } - } -}; - -const workspace: WorkspaceExtImpl = {} as WorkspaceExtImpl; -let configuration: Configuration; -let defaultConfiguration: ConfigurationModel; -let userConfiguration: ConfigurationModel; -let workspaceConfiguration: ConfigurationModel; -let folderConfigurations: { [key: string]: ConfigurationModel }; -before(() => { - workspace.getWorkspaceFolder = (uri => { - const name = uri.toString().replace(/[^\/]+$/, '$1'); - const index = projects.indexOf(uri.toString()); - return { uri, name, index }; - }); - - defaultConfiguration = new ConfigurationModel( - preferences[PreferenceScope.Default], - Object.keys(preferences[PreferenceScope.Default]) - ); - userConfiguration = new ConfigurationModel( - preferences[PreferenceScope.User], - Object.keys(preferences[PreferenceScope.User]) - ); - workspaceConfiguration = new ConfigurationModel( - preferences[PreferenceScope.Workspace], - Object.keys(preferences[PreferenceScope.Workspace]) - ); - folderConfigurations = projects.reduce((configurations: { [key: string]: ConfigurationModel }, project: string) => { - const folderPrefs = preferences[PreferenceScope.Folder][project]; - configurations[project] = new ConfigurationModel(folderPrefs, Object.keys(folderPrefs)); - return configurations; - }, {}); -}); - -describe('Configuration:', () => { - - describe('Default scope preferences:', () => { - - beforeEach(() => { - configuration = new Configuration( - defaultConfiguration, new ConfigurationModel({}, []), undefined, undefined - ); - inspect = configuration.inspect(propertyName, workspace, undefined); - }); - - it('should have correct value of \'default\' property', () => { - expect(inspect).to.have.property( - 'default', - preferences[PreferenceScope.Default][propertyName] - ); - expect(inspect.default).to.equal(preferences[PreferenceScope.Default][propertyName]); - }); - - it('should have correct value of \'value\' property', () => { - expect(inspect).to.have.property( - 'value', - preferences[PreferenceScope.Default][propertyName] - ); - expect(inspect.value).to.equal(preferences[PreferenceScope.Default][propertyName]); - }); - - }); - - describe('User scope preferences:', () => { - - beforeEach(() => { - configuration = new Configuration( - defaultConfiguration, userConfiguration, undefined, undefined - ); - inspect = configuration.inspect(propertyName, workspace, undefined); - }); - - it('should have correct value of \'default\' property', () => { - expect(inspect).to.have.property( - 'default', - preferences[PreferenceScope.Default][propertyName] - ); - expect(inspect.default).to.equal(preferences[PreferenceScope.Default][propertyName]); - }); - - it('should have correct value of \'user\' property', () => { - expect(inspect).to.have.property( - 'user', - preferences[PreferenceScope.User][propertyName] - ); - expect(inspect.user).to.equal(preferences[PreferenceScope.User][propertyName]); - }); - - it('should have correct value of \'value\' property', () => { - expect(inspect).to.have.property( - 'value', - preferences[PreferenceScope.User][propertyName] - ); - expect(inspect.value).to.equal(preferences[PreferenceScope.User][propertyName]); - }); - - }); - - describe('Workspace scope preferences:', () => { - - beforeEach(() => { - configuration = new Configuration( - defaultConfiguration, userConfiguration, workspaceConfiguration, undefined - ); - inspect = configuration.inspect(propertyName, workspace, undefined); - }); - - it('should have correct value of \'default\' property', () => { - expect(inspect).to.have.property( - 'default', - preferences[PreferenceScope.Default][propertyName] - ); - expect(inspect.default).to.equal(preferences[PreferenceScope.Default][propertyName]); - }); - - it('should have correct value of \'user\' property', () => { - expect(inspect).to.have.property( - 'user', - preferences[PreferenceScope.User][propertyName] - ); - expect(inspect.user).to.equal(preferences[PreferenceScope.User][propertyName]); - }); - - it('should have correct value of \'workspace\' property', () => { - expect(inspect).to.have.property( - 'workspace', - preferences[PreferenceScope.Workspace][propertyName] - ); - expect(inspect.workspace).to.equal(preferences[PreferenceScope.Workspace][propertyName]); - }); - - it('should have correct value of \'value\' property', () => { - expect(inspect).to.have.property( - 'value', - preferences[PreferenceScope.Workspace][propertyName] - ); - expect(inspect.value).to.equal(preferences[PreferenceScope.Workspace][propertyName]); - }); - - }); - - describe('Folder scope preferences:', () => { - const project = projects[0]; - - beforeEach(() => { - configuration = new Configuration( - defaultConfiguration, userConfiguration, workspaceConfiguration, folderConfigurations - ); - const resource = URI.revive({ path: project, scheme: '', authority: '', query: '', fragment: '' }); - inspect = configuration.inspect(propertyName, workspace, resource); - }); - - it('should have correct value of \'default\' property', () => { - expect(inspect).to.have.property( - 'default', - preferences[PreferenceScope.Default][propertyName] - ); - expect(inspect.default).to.equal(preferences[PreferenceScope.Default][propertyName]); - }); - - it('should have correct value of \'user\' property', () => { - expect(inspect).to.have.property( - 'user', - preferences[PreferenceScope.User][propertyName] - ); - expect(inspect.user).to.equal(preferences[PreferenceScope.User][propertyName]); - }); - - it('should have correct value of \'workspace\' property', () => { - expect(inspect).to.have.property( - 'workspace', - preferences[PreferenceScope.Workspace][propertyName] - ); - expect(inspect.workspace).to.equal(preferences[PreferenceScope.Workspace][propertyName]); - }); - - it('should have correct value of \'workspaceFolder\' property', () => { - expect(inspect).to.have.property( - 'workspaceFolder', - preferences[PreferenceScope.Folder][project][propertyName] - ); - expect(inspect.workspaceFolder).to.equal(preferences[PreferenceScope.Folder][project][propertyName]); - }); - - it('should have correct value of \'value\' property', () => { - expect(inspect).to.have.property( - 'value', - preferences[PreferenceScope.Folder][project][propertyName] - ); - expect(inspect.value).to.equal(preferences[PreferenceScope.Folder][project][propertyName]); - }); - - }); - - describe('ConfigurationModel', () => { - - it('check merge', () => { - defaultConfiguration = new ConfigurationModel( - preferences[PreferenceScope.Default], - Object.keys(preferences[PreferenceScope.Default]) - ); - userConfiguration = new ConfigurationModel( - preferences[PreferenceScope.User], - Object.keys(preferences[PreferenceScope.User]) - ); - workspaceConfiguration = new ConfigurationModel( - preferences[PreferenceScope.Workspace], - Object.keys(preferences[PreferenceScope.Workspace]) - ); - const mergedConfiguration = new ConfigurationModel().merge(defaultConfiguration, userConfiguration, workspaceConfiguration); - expect(mergedConfiguration.getValue('tabSize')).to.equal(4); - }); - - it('Prototype pollution check', () => { - const payload = JSON.parse('{"__proto__":{"injectedConfigurationPrototype": true}}'); - const configurationModel = new ConfigurationModel(); - configurationModel.merge(new ConfigurationModel(payload)); - const prototypeObject = Object.prototype as any; - expect(prototypeObject.injectedConfigurationPrototype).to.be.an('undefined'); - const rawObject = {} as any; - expect(rawObject.injectedConfigurationPrototype).to.be.an('undefined'); - }); - - it('Prototype constructor pollution check', () => { - const payload = JSON.parse('{"constructor": {"prototype": {"injectedConfigurationConstructorPrototype": true}}}'); - const configurationModel = new ConfigurationModel(); - configurationModel.merge(new ConfigurationModel(payload)); - const prototypeObject = Object.prototype as any; - expect(prototypeObject.injectedConfigurationConstructorPrototype).to.be.an('undefined'); - const rawObject = {} as any; - expect(rawObject.injectedConfigurationConstructorPrototype).to.be.an('undefined'); - }); - - }); - -}); diff --git a/packages/plugin-ext/src/plugin/preferences/configuration.ts b/packages/plugin-ext/src/plugin/preferences/configuration.ts deleted file mode 100644 index 0c0f24fb3622d..0000000000000 --- a/packages/plugin-ext/src/plugin/preferences/configuration.ts +++ /dev/null @@ -1,167 +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 WITH Classpath-exception-2.0 -// ***************************************************************************** - -import { WorkspaceExtImpl } from '../workspace'; -import { isObject } from '../../common/types'; -import cloneDeep = require('lodash.clonedeep'); -import { URI } from '@theia/core/shared/vscode-uri'; - -/* eslint-disable @typescript-eslint/no-explicit-any */ - -export class Configuration { - - private combinedConfig: ConfigurationModel | undefined; - private folderCombinedConfigs: { [resource: string]: ConfigurationModel } = {}; - - constructor( - private defaultConfiguration: ConfigurationModel, - private userConfiguration: ConfigurationModel, - private workspaceConfiguration: ConfigurationModel = new ConfigurationModel(), - private folderConfigurations: { [resource: string]: ConfigurationModel } = {}, - ) { } - - getValue(section: string | undefined, workspace: WorkspaceExtImpl, resource?: URI): any { - return this.getCombinedResourceConfig(workspace, resource).getValue(section); - } - - inspect(key: string, workspace: WorkspaceExtImpl, resource?: URI): { - default: C, - user: C, - workspace: C | undefined, - workspaceFolder: C | undefined, - value: C, - } { - const combinedConfiguration = this.getCombinedResourceConfig(workspace, resource); - const folderConfiguration = this.getFolderResourceConfig(workspace, resource); - return { - default: this.defaultConfiguration.getValue(key), - user: this.userConfiguration.getValue(key), - workspace: workspace ? this.workspaceConfiguration.getValue(key) : undefined, - workspaceFolder: folderConfiguration ? folderConfiguration.getValue(key) : undefined, - value: combinedConfiguration.getValue(key) - }; - } - - private getCombinedResourceConfig(workspace: WorkspaceExtImpl, resource?: URI): ConfigurationModel { - const combinedConfig = this.getCombinedConfig(); - if (!workspace || !resource) { - return combinedConfig; - } - - const workspaceFolder = workspace.getWorkspaceFolder(resource); - if (!workspaceFolder) { - return combinedConfig; - } - - return this.getFolderCombinedConfig(workspaceFolder.uri.toString()) || combinedConfig; - } - - private getCombinedConfig(): ConfigurationModel { - if (!this.combinedConfig) { - this.combinedConfig = this.defaultConfiguration.merge(this.userConfiguration, this.workspaceConfiguration); - } - return this.combinedConfig; - } - - private getFolderCombinedConfig(folder: string): ConfigurationModel | undefined { - if (this.folderCombinedConfigs[folder]) { - return this.folderCombinedConfigs[folder]; - } - - const combinedConfig = this.getCombinedConfig(); - const folderConfig = this.folderConfigurations[folder]; - if (!folderConfig) { - return combinedConfig; - } - - const folderCombinedConfig = combinedConfig.merge(folderConfig); - this.folderCombinedConfigs[folder] = folderCombinedConfig; - - return folderCombinedConfig; - } - - private getFolderResourceConfig(workspace: WorkspaceExtImpl, resource?: URI): ConfigurationModel | undefined { - if (!workspace || !resource) { - return; - } - - const workspaceFolder = workspace.getWorkspaceFolder(resource); - if (!workspaceFolder) { - return; - } - return this.folderConfigurations[workspaceFolder.uri.toString()]; - } - -} - -export class ConfigurationModel { - - constructor( - private contents: any = Object.create(null), - private keys: string[] = [], - ) { } - - getValue(section?: string): any { - if (!section) { - return this.contents; - } - - const path = section.split('.'); - let current = this.contents; - for (let i = 0; i < path.length; i++) { - if (typeof current !== 'object' || current === null) { - return undefined; - } - current = current[path[i]]; - } - return current; - } - - merge(...others: ConfigurationModel[]): ConfigurationModel { - const contents = cloneDeep(this.contents); - const allKeys = [...this.keys]; - - for (const other of others) { - this.mergeContents(contents, other.contents); - this.mergeKeys(allKeys, other.keys); - } - return new ConfigurationModel(contents, allKeys); - } - - private mergeContents(source: any, target: any): void { - for (const key of Object.keys(target)) { - if (key === '__proto__') { - continue; - } - if (key in source) { - if (isObject(source[key]) && isObject(target[key])) { - this.mergeContents(source[key], target[key]); - continue; - } - } - source[key] = cloneDeep(target[key]); - } - } - - private mergeKeys(source: string[], target: string[]): void { - for (const key of target) { - if (source.indexOf(key) === -1) { - source.push(key); - } - } - } - -} diff --git a/packages/plugin-ext/src/plugin/type-converters.ts b/packages/plugin-ext/src/plugin/type-converters.ts index ae400b0db32f9..78fc0a257d334 100644 --- a/packages/plugin-ext/src/plugin/type-converters.ts +++ b/packages/plugin-ext/src/plugin/type-converters.ts @@ -137,9 +137,8 @@ export function toPosition(position: Position): types.Position { return new types.Position(position.lineNumber - 1, position.column - 1); } -// eslint-disable-next-line @typescript-eslint/no-explicit-any -function isDecorationOptions(something: any): something is theia.DecorationOptions { - return (typeof something.range !== 'undefined'); +function isDecorationOptions(arg: unknown): arg is theia.DecorationOptions { + return !!arg && typeof arg === 'object' && typeof (arg as theia.DecorationOptions).range !== 'undefined'; } export function isDecorationOptionsArr(something: theia.Range[] | theia.DecorationOptions[]): something is theia.DecorationOptions[] { @@ -182,11 +181,10 @@ interface Codeblock { value: string; } -// eslint-disable-next-line @typescript-eslint/no-explicit-any -function isCodeblock(thing: any): thing is Codeblock { - return thing && typeof thing === 'object' - && typeof (thing).language === 'string' - && typeof (thing).value === 'string'; +function isCodeblock(arg: unknown): arg is Codeblock { + return !!arg && typeof arg === 'object' + && typeof (arg as Codeblock).language === 'string' + && typeof (arg as Codeblock).value === 'string'; } export function fromMarkdown(markup: theia.MarkdownString | theia.MarkedString): MarkdownStringDTO { @@ -396,6 +394,13 @@ export function fromHover(hover: theia.Hover): model.Hover { }; } +export function fromEvaluatableExpression(evaluatableExpression: theia.EvaluatableExpression): model.EvaluatableExpression { + return { + range: fromRange(evaluatableExpression.range), + expression: evaluatableExpression.expression + }; +} + export function fromLocation(location: theia.Location): model.Location { return { uri: location.uri, @@ -618,64 +623,58 @@ export function toSymbolTag(kind: model.SymbolTag): types.SymbolTag { } } -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export function isModelLocation(thing: any): thing is model.Location { - if (!thing) { - return false; - } - return isModelRange((thing).range) && - isUriComponents((thing).uri); -} - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export function isModelRange(thing: any): thing is model.Range { - if (!thing) { - return false; - } - return (('startLineNumber' in thing) && typeof thing.startLineNumber === 'number') && - (('startColumn' in thing) && typeof thing.startColumn === 'number') && - (('endLineNumber' in thing) && typeof thing.endLineNumber === 'number') && - (('endColumn' in thing) && typeof thing.endColumn === 'number'); -} - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export function isUriComponents(thing: any): thing is UriComponents { - if (!thing) { +export function isModelLocation(arg: unknown): arg is model.Location { + if (!arg) { return false; } - return (('scheme' in thing) && typeof thing.scheme === 'string') && - (('path' in thing) && typeof thing.path === 'string') && - (('query' in thing) && typeof thing.query === 'string') && - (('fragment' in thing) && typeof thing.fragment === 'string'); + return !!arg && + typeof arg === 'object' && + isModelRange((arg as model.Location).range) && + isUriComponents((arg as model.Location).uri); } -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export function isModelCallHierarchyItem(thing: any): thing is model.CallHierarchyItem { - if (!thing) { - return false; - } - return isModelRange(thing.range) - && isModelRange(thing.selectionRange) - && isUriComponents(thing.uri) - && !!thing.name; +export function isModelRange(arg: unknown): arg is model.Range { + const range = arg as model.Range; + return !!arg && typeof arg === 'object' && + typeof range.startLineNumber === 'number' && + typeof range.startColumn === 'number' && + typeof range.endLineNumber === 'number' && + typeof range.endColumn === 'number'; } // eslint-disable-next-line @typescript-eslint/no-explicit-any -export function isModelCallHierarchyIncomingCall(thing: any): thing is model.CallHierarchyIncomingCall { - if (!thing) { - return false; - } - const maybeIncomingCall = thing as model.CallHierarchyIncomingCall; - return 'from' in maybeIncomingCall && 'fromRanges' in maybeIncomingCall && isModelCallHierarchyItem(maybeIncomingCall.from); -} - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export function isModelCallHierarchyOutgoingCall(thing: any): thing is model.CallHierarchyOutgoingCall { - if (!thing) { - return false; - } - const maybeOutgoingCall = thing as model.CallHierarchyOutgoingCall; - return 'to' in maybeOutgoingCall && 'fromRanges' in maybeOutgoingCall && isModelCallHierarchyItem(maybeOutgoingCall.to); +export function isUriComponents(arg: unknown): arg is UriComponents { + const uriComponents = arg as UriComponents; + return !!arg && typeof arg === 'object' && + typeof uriComponents.scheme === 'string' && + typeof uriComponents.path === 'string' && + typeof uriComponents.query === 'string' && + typeof uriComponents.fragment === 'string'; +} + +export function isModelCallHierarchyItem(arg: unknown): arg is model.CallHierarchyItem { + const item = arg as model.CallHierarchyItem; + return !!item && typeof item === 'object' + && isModelRange(item.range) + && isModelRange(item.selectionRange) + && isUriComponents(item.uri) + && !!item.name; +} + +export function isModelCallHierarchyIncomingCall(arg: unknown): arg is model.CallHierarchyIncomingCall { + const maybeIncomingCall = arg as model.CallHierarchyIncomingCall; + return !!arg && typeof arg === 'object' && + 'from' in maybeIncomingCall && + 'fromRanges' in maybeIncomingCall && + isModelCallHierarchyItem(maybeIncomingCall.from); +} + +export function isModelCallHierarchyOutgoingCall(arg: unknown): arg is model.CallHierarchyOutgoingCall { + const maybeOutgoingCall = arg as model.CallHierarchyOutgoingCall; + return !!arg && typeof arg === 'object' && + 'to' in maybeOutgoingCall && + 'fromRanges' in maybeOutgoingCall && + isModelCallHierarchyItem(maybeOutgoingCall.to); } export function toLocation(value: model.Location): types.Location { diff --git a/packages/plugin-ext/src/plugin/types-impl.ts b/packages/plugin-ext/src/plugin/types-impl.ts index 5ababe64d05ac..281b85dbf057e 100644 --- a/packages/plugin-ext/src/plugin/types-impl.ts +++ b/packages/plugin-ext/src/plugin/types-impl.ts @@ -20,7 +20,6 @@ *--------------------------------------------------------------------------------------------*/ /* eslint-disable no-null/no-null */ -/* eslint-disable @typescript-eslint/no-explicit-any */ import { UUID } from '@theia/core/shared/@phosphor/coreutils'; import { illegalArgument } from '../common/errors'; @@ -38,6 +37,7 @@ import { es5ClassCompat } from '../common/types'; * A reviver that takes URI's transferred via JSON.stringify() and makes * instances of our local plugin API URI class (below) */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any export function reviver(key: string | undefined, value: any): any { const revived = ObjectsTransferrer.reviver(key, value); if (CodeURI.isUri(revived)) { @@ -423,7 +423,7 @@ export class Position { return false; } - toJSON(): any { + toJSON(): unknown { return { line: this.line, character: this.character }; } } @@ -546,19 +546,17 @@ export class Range { return new Range(start, end); } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - static isRange(thing: any): thing is theia.Range { + static isRange(thing: unknown): thing is theia.Range { if (thing instanceof Range) { return true; } - if (!thing) { - return false; - } - return Position.isPosition((thing).start) - && Position.isPosition((thing).end); + const range = thing as theia.Range; + return !!thing && typeof thing === 'object' + && Position.isPosition(range.start) + && Position.isPosition(range.end); } - toJSON(): any { + toJSON(): unknown { return [this.start, this.end]; } } @@ -1119,6 +1117,24 @@ export class Hover { } } +@es5ClassCompat +export class EvaluatableExpression { + + public range: Range; + public expression?: string; + + constructor( + range: Range, + expression?: string + ) { + if (!range) { + illegalArgument('range must be defined'); + } + this.range = range; + this.expression = expression; + } +} + export enum DocumentHighlightKind { Text = 0, Read = 1, @@ -1618,8 +1634,8 @@ export class FileSystemError extends Error { // workaround when extending builtin objects and when compiling to ES5, see: // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work - if (typeof (Object).setPrototypeOf === 'function') { - (Object).setPrototypeOf(this, FileSystemError.prototype); + if (typeof Object.setPrototypeOf === 'function') { + Object.setPrototypeOf(this, FileSystemError.prototype); } if (typeof Error.captureStackTrace === 'function' && typeof terminator === 'function') { @@ -2537,7 +2553,7 @@ export class SemanticTokensLegend { } } -function isStrArrayOrUndefined(arg: any): arg is string[] | undefined { +function isStrArrayOrUndefined(arg: unknown): arg is string[] | undefined { return ((typeof arg === 'undefined') || (Array.isArray(arg) && arg.every(e => typeof e === 'string'))); } @@ -2575,7 +2591,7 @@ export class SemanticTokensBuilder { public push(line: number, char: number, length: number, tokenType: number, tokenModifiers?: number): void; public push(range: Range, tokenType: string, tokenModifiers?: string[]): void; - public push(arg0: any, arg1: any, arg2: any, arg3?: any, arg4?: any): void { + public push(arg0: number | Range, arg1: number | string, arg2?: number | string[], arg3?: number, arg4?: number): void { if (typeof arg0 === 'number' && typeof arg1 === 'number' && typeof arg2 === 'number' && typeof arg3 === 'number' && (typeof arg4 === 'number' || typeof arg4 === 'undefined')) { if (typeof arg4 === 'undefined') { diff --git a/packages/plugin-metrics/package.json b/packages/plugin-metrics/package.json index 9cee027bcb354..742233d812d32 100644 --- a/packages/plugin-metrics/package.json +++ b/packages/plugin-metrics/package.json @@ -1,13 +1,13 @@ { "name": "@theia/plugin-metrics", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - Plugin Metrics", "dependencies": { - "@theia/core": "1.27.0", - "@theia/metrics": "1.27.0", + "@theia/core": "1.28.0", + "@theia/metrics": "1.28.0", "@theia/monaco-editor-core": "1.67.2", - "@theia/plugin": "1.27.0", - "@theia/plugin-ext": "1.27.0" + "@theia/plugin": "1.28.0", + "@theia/plugin-ext": "1.28.0" }, "publishConfig": { "access": "public" @@ -43,7 +43,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0" + "@theia/ext-scripts": "1.28.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/plugin/package.json b/packages/plugin/package.json index 365c9f0781db0..8586dc98f8ccf 100644 --- a/packages/plugin/package.json +++ b/packages/plugin/package.json @@ -1,6 +1,6 @@ { "name": "@theia/plugin", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - Plugin API", "types": "./src/theia.d.ts", "publishConfig": { @@ -27,7 +27,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0" + "@theia/ext-scripts": "1.28.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/plugin/src/theia.d.ts b/packages/plugin/src/theia.d.ts index e7151d334a047..825a44b33a0fc 100644 --- a/packages/plugin/src/theia.d.ts +++ b/packages/plugin/src/theia.d.ts @@ -617,7 +617,7 @@ export module '@theia/plugin' { * Provides additional metadata over normal [location](#Location) definitions, including the range of * the defining symbol */ - export interface DefinitionLink { + export interface LocationLink { /** * Span of the symbol being defined in the source file. * @@ -3469,6 +3469,13 @@ export module '@theia/plugin' { */ export interface Memento { + /** + * Returns the stored keys. + * + * @return The stored keys. + */ + keys(): readonly string[]; + /** * Return a value. * @@ -5640,12 +5647,14 @@ export module '@theia/plugin' { * Returns `true` if the given section for the given resource (if provided) is affected. * * @param section Configuration name, supports _dotted_ names. - * @param resource A resource Uri. + * @param scope a {@link ConfigurationScope} * @return `true` if the given section for the given resource (if provided) is affected. */ - affectsConfiguration(section: string, resource?: Uri): boolean; + affectsConfiguration(section: string, scope?: ConfigurationScope): boolean; } + export type ConfigurationScope = Uri | WorkspaceFolder | TextDocument | { uri?: Uri, languageId: string }; + /** * An event describing a change to the set of [workspace folders](#workspace.workspaceFolders). */ @@ -6300,13 +6309,13 @@ export module '@theia/plugin' { * is returned. Dots in the section-identifier are interpreted as child-access, * like `{ myExt: { setting: { doIt: true }}}` and `getConfiguration('myExt.setting').get('doIt') === true`. * - * When a resource is provided, configuration scoped to that resource is returned. + * When a scope is provided configuration confined to that scope is returned. Scope can be a resource or a language identifier or both. * * @param section A dot-separated identifier. - * @param resource A resource for which the configuration is asked for + * @param scope A scope for which the configuration is asked for. * @return The full configuration or a subset. */ - export function getConfiguration(section?: string, resource?: Uri | null): WorkspaceConfiguration; + export function getConfiguration(section?: string, scope?: ConfigurationScope | null): WorkspaceConfiguration; /** * An event that is emitted when the [configuration](#WorkspaceConfiguration) changed. @@ -6533,6 +6542,14 @@ export module '@theia/plugin' { */ export const appRoot: string; + /** + * The hosted location of the application + * On desktop this is 'desktop' + * In the web this is the specified embedder i.e. 'github.dev', 'codespaces', or 'web' if the embedder + * does not provide that information + */ + export const appHost: string; + /** * The custom uri scheme the editor registers to in the operating system. */ @@ -6543,6 +6560,35 @@ export module '@theia/plugin' { */ export const language: string; + /** + * Indicates that this is a fresh install of the application. + * `true` if within the first day of installation otherwise `false`. + */ + export const isNewAppInstall: boolean; + + /** + * Indicates whether the users has telemetry enabled. + * Can be observed to determine if the extension should send telemetry. + */ + export const isTelemetryEnabled: boolean; + + /** + * An {@link Event} which fires when the user enabled or disables telemetry. + * `true` if the user has enabled telemetry or `false` if the user has disabled telemetry. + */ + export const onDidChangeTelemetryEnabled: Event; + + /** + * The name of a remote. Defined by extensions, popular samples are `wsl` for the Windows + * Subsystem for Linux or `ssh-remote` for remotes using a secure shell. + * + * *Note* that the value is `undefined` when there is no remote extension host but that the + * value is defined in all extension hosts (local and remote) in case a remote extension host + * exists. Use {@link Extension.extensionKind} to know if + * a specific extension runs remote or not. + */ + export const remoteName: string | undefined; + /** * The detected default shell for the extension host. */ @@ -7852,10 +7898,12 @@ export module '@theia/plugin' { } /** - * Represents the connection of two locations. Provides additional metadata over normal {@link Location locations}, - * including an origin range. + * Information about where a symbol is defined. + * + * Provides additional metadata over normal {@link Location} definitions, including the range of + * the defining symbol */ - export type LocationLink = DefinitionLink; + export type DefinitionLink = LocationLink; /** * The declaration of a symbol representation as one or many {@link Location locations} @@ -9228,6 +9276,18 @@ export module '@theia/plugin' { */ export function registerHoverProvider(selector: DocumentSelector, provider: HoverProvider): Disposable; + /** + * Register a provider that locates evaluatable expressions in text documents. + * The editor will evaluate the expression in the active debug session and will show the result in the debug hover. + * + * If multiple providers are registered for a language an arbitrary provider will be used. + * + * @param selector A selector that defines the documents this provider is applicable to. + * @param provider An evaluatable expression provider. + * @return A {@link Disposable} that unregisters this provider when being disposed. + */ + export function registerEvaluatableExpressionProvider(selector: DocumentSelector, provider: EvaluatableExpressionProvider): Disposable; + /** * Register a workspace symbol provider. * @@ -9541,6 +9601,54 @@ export module '@theia/plugin' { provideHover(document: TextDocument, position: Position, token: CancellationToken | undefined): ProviderResult; } + /** + * An EvaluatableExpression represents an expression in a document that can be evaluated by an active debugger or runtime. + * The result of this evaluation is shown in a tooltip-like widget. + * If only a range is specified, the expression will be extracted from the underlying document. + * An optional expression can be used to override the extracted expression. + * In this case the range is still used to highlight the range in the document. + */ + export class EvaluatableExpression { + + /* + * The range is used to extract the evaluatable expression from the underlying document and to highlight it. + */ + readonly range: Range; + + /* + * If specified the expression overrides the extracted expression. + */ + readonly expression?: string | undefined; + + /** + * Creates a new evaluatable expression object. + * + * @param range The range in the underlying document from which the evaluatable expression is extracted. + * @param expression If specified overrides the extracted expression. + */ + constructor(range: Range, expression?: string); + } + + /** + * The evaluatable expression provider interface defines the contract between extensions and + * the debug hover. In this contract the provider returns an evaluatable expression for a given position + * in a document and the editor evaluates this expression in the active debug session and shows the result in a debug hover. + */ + export interface EvaluatableExpressionProvider { + /** + * Provide an evaluatable expression for the given document and position. + * The editor will evaluate this expression in the active debug session and will show the result in the debug hover. + * The expression can be implicitly specified by the range in the underlying document or by explicitly returning an expression. + * + * @param document The document for which the debug hover is about to appear. + * @param position The line and character position in the document where the debug hover is about to appear. + * @param token A cancellation token. + * @return An EvaluatableExpression or a thenable that resolves to such. The lack of a result can be + * signaled by returning `undefined` or `null`. + */ + provideEvaluatableExpression(document: TextDocument, position: Position, token: CancellationToken | undefined): ProviderResult; + } + /** * A document highlight kind. */ diff --git a/packages/preferences/package.json b/packages/preferences/package.json index ff51dda7bf5d0..98b34b0d43fea 100644 --- a/packages/preferences/package.json +++ b/packages/preferences/package.json @@ -1,15 +1,15 @@ { "name": "@theia/preferences", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - Preferences Extension", "dependencies": { - "@theia/core": "1.27.0", - "@theia/editor": "1.27.0", - "@theia/filesystem": "1.27.0", - "@theia/monaco": "1.27.0", + "@theia/core": "1.28.0", + "@theia/editor": "1.28.0", + "@theia/filesystem": "1.28.0", + "@theia/monaco": "1.28.0", "@theia/monaco-editor-core": "1.67.2", - "@theia/userstorage": "1.27.0", - "@theia/workspace": "1.27.0", + "@theia/userstorage": "1.28.0", + "@theia/workspace": "1.28.0", "async-mutex": "^0.3.1", "jsonc-parser": "^2.2.0", "p-debounce": "^2.1.0" @@ -47,7 +47,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0" + "@theia/ext-scripts": "1.28.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/preferences/src/browser/preferences-contribution.ts b/packages/preferences/src/browser/preferences-contribution.ts index 1b7fe8b5497f2..a5c9561d590a5 100644 --- a/packages/preferences/src/browser/preferences-contribution.ts +++ b/packages/preferences/src/browser/preferences-contribution.ts @@ -28,6 +28,7 @@ import { QuickInputService, QuickPickItem, isFirefox, + PreferenceSchemaProvider, } from '@theia/core/lib/browser'; import { isOSX } from '@theia/core/lib/common/os'; import { TabBarToolbarRegistry } from '@theia/core/lib/browser/shell/tab-bar-toolbar'; @@ -52,6 +53,7 @@ export class PreferencesContribution extends AbstractViewContribution = React.createRef(); protected resultsCount: number = 0; + constructor(@unmanaged() options?: Widget.IOptions) { + super(options); + this.focus = this.focus.bind(this); + } + @postConstruct() protected init(): void { - this.onRender.push(Disposable.create(() => this.focus())); this.id = PreferencesSearchbarWidget.ID; this.title.label = PreferencesSearchbarWidget.LABEL; this.update(); @@ -139,7 +143,7 @@ export class PreferencesSearchbarWidget extends ReactWidget implements StatefulW const optionContainer = this.renderOptionContainer(); return (
-
+
({ - ...prevState, - history, - })); - } - - setIndex(index: number): void { - const { history } = this.state; - this.value = history[index]; - this.setState(prevState => ({ - ...prevState, - index, - })); + 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 { @@ -85,7 +83,7 @@ export class SearchInWorkspaceInput extends React.Component 0 && index < history.length) { - this.setIndex(index - 1); + this.updateState(index - 1); } } @@ -99,7 +97,7 @@ export class SearchInWorkspaceInput extends React.Component= 0 && index < history.length - 1) { - this.setIndex(index + 1); + this.updateState(index + 1); } } @@ -124,8 +122,7 @@ export class SearchInWorkspaceInput extends React.Component term !== this.value) .concat(this.value) .slice(-SearchInWorkspaceInput.LIMIT); - this.setHistory(history); - this.setIndex(history.length - 1); + this.updateState(history.length - 1, history); } override render(): React.ReactNode { diff --git a/packages/search-in-workspace/src/browser/search-in-workspace-frontend-contribution.ts b/packages/search-in-workspace/src/browser/search-in-workspace-frontend-contribution.ts index f7a23af2c64c0..a432a46505702 100644 --- a/packages/search-in-workspace/src/browser/search-in-workspace-frontend-contribution.ts +++ b/packages/search-in-workspace/src/browser/search-in-workspace-frontend-contribution.ts @@ -298,12 +298,18 @@ export class SearchInWorkspaceFrontendContribution extends AbstractViewContribut command: SearchInWorkspaceCommands.OPEN_SIW_WIDGET.id, keybinding: 'ctrlcmd+shift+f' }); + keybindings.registerKeybinding({ + command: SearchInWorkspaceCommands.FIND_IN_FOLDER.id, + keybinding: 'shift+alt+f', + when: 'explorerResourceIsFolder' + }); } override registerMenus(menus: MenuModelRegistry): void { super.registerMenus(menus); menus.registerMenuAction(NavigatorContextMenu.SEARCH, { - commandId: SearchInWorkspaceCommands.FIND_IN_FOLDER.id + commandId: SearchInWorkspaceCommands.FIND_IN_FOLDER.id, + when: 'explorerResourceIsFolder' }); menus.registerMenuAction(CommonMenus.EDIT_FIND, { commandId: SearchInWorkspaceCommands.OPEN_SIW_WIDGET.id, 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 04760c9bc10cb..0149bac766cf4 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 @@ -59,8 +59,7 @@ export interface SearchInWorkspaceRoot extends CompositeTreeNode { children: SearchInWorkspaceRootFolderNode[]; } export namespace SearchInWorkspaceRoot { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function is(node: any): node is SearchInWorkspaceRoot { + export function is(node: unknown): node is SearchInWorkspaceRoot { return CompositeTreeNode.is(node) && node.id === ROOT_ID; } } @@ -74,8 +73,7 @@ export interface SearchInWorkspaceRootFolderNode extends ExpandableTreeNode, Sel uri: URI; } export namespace SearchInWorkspaceRootFolderNode { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function is(node: any): node is SearchInWorkspaceRootFolderNode { + export function is(node: unknown): node is SearchInWorkspaceRootFolderNode { return ExpandableTreeNode.is(node) && SelectableTreeNode.is(node) && 'path' in node && 'folderUri' in node && !('fileUri' in node); } } @@ -90,8 +88,7 @@ export interface SearchInWorkspaceFileNode extends ExpandableTreeNode, Selectabl uri: URI; } export namespace SearchInWorkspaceFileNode { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function is(node: any): node is SearchInWorkspaceFileNode { + export function is(node: unknown): node is SearchInWorkspaceFileNode { return ExpandableTreeNode.is(node) && SelectableTreeNode.is(node) && 'path' in node && 'fileUri' in node && !('folderUri' in node); } } @@ -100,8 +97,7 @@ export interface SearchInWorkspaceResultLineNode extends SelectableTreeNode, Sea parent: SearchInWorkspaceFileNode } export namespace SearchInWorkspaceResultLineNode { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function is(node: any): node is SearchInWorkspaceResultLineNode { + export function is(node: unknown): node is SearchInWorkspaceResultLineNode { return SelectableTreeNode.is(node) && 'line' in node && 'character' in node && 'lineText' in node; } } 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 49166ad4227ab..521621e2e1b66 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 @@ -19,7 +19,7 @@ import { inject, injectable, postConstruct } from '@theia/core/shared/inversify' import { SearchInWorkspaceResultTreeWidget } from './search-in-workspace-result-tree-widget'; import { SearchInWorkspaceOptions } from '../common/search-in-workspace-interface'; import * as React from '@theia/core/shared/react'; -import * as ReactDOM from '@theia/core/shared/react-dom'; +import { createRoot, Root } from '@theia/core/shared/react-dom/client'; import { Event, Emitter, Disposable } from '@theia/core/lib/common'; import { WorkspaceService } from '@theia/workspace/lib/browser'; import { SearchInWorkspaceContextKeyService } from './search-in-workspace-context-key-service'; @@ -100,6 +100,8 @@ export class SearchInWorkspaceWidget extends BaseWidget implements StatefulWidge @inject(SearchInWorkspacePreferences) protected readonly searchInWorkspacePreferences: SearchInWorkspacePreferences; + protected searchFormContainerRoot: Root; + @postConstruct() protected init(): void { this.id = SearchInWorkspaceWidget.ID; @@ -112,6 +114,7 @@ export class SearchInWorkspaceWidget extends BaseWidget implements StatefulWidge this.searchFormContainer = document.createElement('div'); this.searchFormContainer.classList.add('searchHeader'); this.contentNode.appendChild(this.searchFormContainer); + this.searchFormContainerRoot = createRoot(this.searchFormContainer); this.node.tabIndex = 0; this.node.appendChild(this.contentNode); @@ -302,7 +305,7 @@ export class SearchInWorkspaceWidget extends BaseWidget implements StatefulWidge protected override onAfterAttach(msg: Message): void { super.onAfterAttach(msg); - ReactDOM.render({this.renderSearchHeader()}{this.renderSearchInfo()}, this.searchFormContainer); + this.searchFormContainerRoot.render({this.renderSearchHeader()}{this.renderSearchInfo()}); Widget.attach(this.resultTreeWidget, this.contentNode); this.toDisposeOnDetach.push(Disposable.create(() => { Widget.detach(this.resultTreeWidget); @@ -313,7 +316,7 @@ export class SearchInWorkspaceWidget extends BaseWidget implements StatefulWidge super.onUpdateRequest(msg); const searchInfo = this.renderSearchInfo(); if (searchInfo) { - ReactDOM.render({this.renderSearchHeader()}{searchInfo}, this.searchFormContainer); + this.searchFormContainerRoot.render({this.renderSearchHeader()}{searchInfo}); this.onDidUpdateEmitter.fire(undefined); } } diff --git a/packages/task/package.json b/packages/task/package.json index c170f236f406b..aac6ff54cc99e 100644 --- a/packages/task/package.json +++ b/packages/task/package.json @@ -1,19 +1,19 @@ { "name": "@theia/task", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - Task extension. This extension adds support for executing raw or terminal processes in the backend.", "dependencies": { - "@theia/core": "1.27.0", - "@theia/editor": "1.27.0", - "@theia/filesystem": "1.27.0", - "@theia/markers": "1.27.0", - "@theia/monaco": "1.27.0", + "@theia/core": "1.28.0", + "@theia/editor": "1.28.0", + "@theia/filesystem": "1.28.0", + "@theia/markers": "1.28.0", + "@theia/monaco": "1.28.0", "@theia/monaco-editor-core": "1.67.2", - "@theia/process": "1.27.0", - "@theia/terminal": "1.27.0", - "@theia/userstorage": "1.27.0", - "@theia/variable-resolver": "1.27.0", - "@theia/workspace": "1.27.0", + "@theia/process": "1.28.0", + "@theia/terminal": "1.28.0", + "@theia/userstorage": "1.28.0", + "@theia/variable-resolver": "1.28.0", + "@theia/workspace": "1.28.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.27.0" + "@theia/ext-scripts": "1.28.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/task/src/browser/task-frontend-contribution.ts b/packages/task/src/browser/task-frontend-contribution.ts index 3bd7144acd7f0..7e2cc28703dbe 100644 --- a/packages/task/src/browser/task-frontend-contribution.ts +++ b/packages/task/src/browser/task-frontend-contribution.ts @@ -244,8 +244,7 @@ export class TaskFrontendContribution implements CommandContribution, MenuContri TaskCommands.TASK_RUN_BUILD, { isEnabled: () => this.workspaceService.opened, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - execute: (...args: any[]) => + execute: () => this.quickOpenTask.runBuildOrTestTask('build') } ); @@ -253,8 +252,7 @@ export class TaskFrontendContribution implements CommandContribution, MenuContri TaskCommands.TASK_RUN_TEST, { isEnabled: () => this.workspaceService.opened, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - execute: (...args: any[]) => + execute: () => this.quickOpenTask.runBuildOrTestTask('test') } ); diff --git a/packages/terminal/package.json b/packages/terminal/package.json index da0617d3a34a9..8420fdbb78b78 100644 --- a/packages/terminal/package.json +++ b/packages/terminal/package.json @@ -1,13 +1,13 @@ { "name": "@theia/terminal", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - Terminal Extension", "dependencies": { - "@theia/core": "1.27.0", - "@theia/editor": "1.27.0", - "@theia/filesystem": "1.27.0", - "@theia/process": "1.27.0", - "@theia/workspace": "1.27.0", + "@theia/core": "1.28.0", + "@theia/editor": "1.28.0", + "@theia/filesystem": "1.28.0", + "@theia/process": "1.28.0", + "@theia/workspace": "1.28.0", "xterm": "^4.16.0", "xterm-addon-fit": "^0.5.0", "xterm-addon-search": "^0.8.2" @@ -46,7 +46,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0" + "@theia/ext-scripts": "1.28.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/terminal/src/browser/terminal-frontend-contribution.ts b/packages/terminal/src/browser/terminal-frontend-contribution.ts index 2c20f921bdfd4..cecece4ca9665 100644 --- a/packages/terminal/src/browser/terminal-frontend-contribution.ts +++ b/packages/terminal/src/browser/terminal-frontend-contribution.ts @@ -129,6 +129,11 @@ export namespace TerminalCommands { category: TERMINAL_CATEGORY, label: 'Scroll Down (Page)' }); + export const TOGGLE_TERMINAL = Command.toDefaultLocalizedCommand({ + id: 'workbench.action.terminal.toggleTerminal', + category: TERMINAL_CATEGORY, + label: 'Toggle Terminal' + }); /** * Command that displays all terminals that are currently opened @@ -411,6 +416,37 @@ export class TerminalFrontendContribution implements FrontendApplicationContribu (this.shell.activeWidget as TerminalWidget).scrollPageDown(); } }); + commands.registerCommand(TerminalCommands.TOGGLE_TERMINAL, { + execute: () => this.toggleTerminal() + }); + } + + protected toggleTerminal(): void { + + const terminals = this.shell.getWidgets('bottom').filter(w => w instanceof TerminalWidget); + + if (terminals.length === 0) { + this.openTerminal(); + return; + } + + if (this.shell.bottomPanel.isHidden) { + this.shell.bottomPanel.setHidden(false); + terminals[0].activate(); + return; + } + + if (this.shell.bottomPanel.isVisible) { + const visibleTerminal = terminals.find(t => t.isVisible); + if (!visibleTerminal) { + this.shell.bottomPanel.activateWidget(terminals[0]); + } else if (this.shell.activeWidget !== visibleTerminal) { + this.shell.bottomPanel.activateWidget(visibleTerminal); + } else { + this.shell.bottomPanel.setHidden(true); + } + } + } async openInTerminal(uri: URI): Promise { @@ -593,6 +629,10 @@ export class TerminalFrontendContribution implements FrontendApplicationContribu keybinding: 'shift-pageDown', context: TerminalKeybindingContexts.terminalActive }); + keybindings.registerKeybinding({ + command: TerminalCommands.TOGGLE_TERMINAL.id, + keybinding: 'ctrl+`', + }); } async newTerminal(options: TerminalWidgetOptions): Promise { diff --git a/packages/terminal/src/browser/terminal-preferences.ts b/packages/terminal/src/browser/terminal-preferences.ts index e05f1a77bfe5e..48913d1676a8b 100644 --- a/packages/terminal/src/browser/terminal-preferences.ts +++ b/packages/terminal/src/browser/terminal-preferences.ts @@ -191,8 +191,7 @@ export type CursorStyleVSCode = CursorStyle | 'line'; export type TerminalRendererType = 'canvas' | 'dom'; export type ConfirmOnExitType = 'never' | 'always' | 'hasChildProcesses'; export const DEFAULT_TERMINAL_RENDERER_TYPE = 'canvas'; -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export function isTerminalRendererType(arg: any): arg is TerminalRendererType { +export function isTerminalRendererType(arg: unknown): arg is TerminalRendererType { return typeof arg === 'string' && (arg === 'canvas' || arg === 'dom'); } diff --git a/packages/terminal/src/node/buffering-stream.spec.ts b/packages/terminal/src/node/buffering-stream.spec.ts new file mode 100644 index 0000000000000..8332143490b17 --- /dev/null +++ b/packages/terminal/src/node/buffering-stream.spec.ts @@ -0,0 +1,46 @@ +// ***************************************************************************** +// Copyright (C) 2022 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 WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { wait } from '@theia/core/lib/common/promise-util'; +import { expect } from 'chai'; +import { BufferingStream } from './buffering-stream'; + +describe('BufferringStream', () => { + + it('should emit whatever data was buffered before the timeout', async () => { + const buffer = new BufferingStream({ emitInterval: 1000 }); + const chunkPromise = waitForChunk(buffer); + buffer.push(Buffer.from([0])); + await wait(100); + buffer.push(Buffer.from([1])); + await wait(100); + buffer.push(Buffer.from([2, 3, 4])); + const chunk = await chunkPromise; + expect(chunk).deep.eq(Buffer.from([0, 1, 2, 3, 4])); + }); + + it('should not emit chunks bigger than maxChunkSize', async () => { + const buffer = new BufferingStream({ maxChunkSize: 2 }); + buffer.push(Buffer.from([0, 1, 2, 3, 4, 5])); + expect(await waitForChunk(buffer)).deep.eq(Buffer.from([0, 1])); + expect(await waitForChunk(buffer)).deep.eq(Buffer.from([2, 3])); + expect(await waitForChunk(buffer)).deep.eq(Buffer.from([4, 5])); + }); + + function waitForChunk(buffer: BufferingStream): Promise { + return new Promise(resolve => buffer.onData(resolve)); + } +}); diff --git a/packages/terminal/src/node/buffering-stream.ts b/packages/terminal/src/node/buffering-stream.ts new file mode 100644 index 0000000000000..0a9d1c30688ac --- /dev/null +++ b/packages/terminal/src/node/buffering-stream.ts @@ -0,0 +1,78 @@ +// ***************************************************************************** +// Copyright (C) 2022 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 WITH Classpath-exception-2.0 +// ***************************************************************************** + +import { Emitter, Event } from '@theia/core/lib/common/event'; + +export interface BufferingStreamOptions { + /** + * Max size in bytes of the chunks being emitted. + */ + maxChunkSize?: number + /** + * Amount of time in milliseconds to wait between the moment we start + * buffering data and when we emit the buffered chunk. + */ + emitInterval?: number +} + +/** + * This component will buffer whatever is pushed to it and emit chunks back + * every {@link BufferingStreamOptions.emitInterval}. It will also ensure that + * the emitted chunks never exceed {@link BufferingStreamOptions.maxChunkSize}. + */ +export class BufferingStream { + + protected buffer?: Buffer; + protected timeout?: NodeJS.Timeout; + protected maxChunkSize: number; + protected emitInterval: number; + + protected onDataEmitter = new Emitter(); + + constructor(options?: BufferingStreamOptions) { + this.emitInterval = options?.emitInterval ?? 16; // ms + this.maxChunkSize = options?.maxChunkSize ?? (256 * 1024); // bytes + } + + get onData(): Event { + return this.onDataEmitter.event; + } + + push(chunk: Buffer): void { + if (this.buffer) { + this.buffer = Buffer.concat([this.buffer, chunk]); + } else { + this.buffer = chunk; + this.timeout = setTimeout(() => this.emitBufferedChunk(), this.emitInterval); + } + } + + dispose(): void { + clearTimeout(this.timeout); + this.buffer = undefined; + this.onDataEmitter.dispose(); + } + + protected emitBufferedChunk(): void { + this.onDataEmitter.fire(this.buffer!.slice(0, this.maxChunkSize)); + if (this.buffer!.byteLength <= this.maxChunkSize) { + this.buffer = undefined; + } else { + this.buffer = this.buffer!.slice(this.maxChunkSize); + this.timeout = setTimeout(() => this.emitBufferedChunk(), this.emitInterval); + } + } +} diff --git a/packages/terminal/src/node/terminal-backend-contribution.ts b/packages/terminal/src/node/terminal-backend-contribution.ts index dea4504e0ffea..fb2c0fe0ddce5 100644 --- a/packages/terminal/src/node/terminal-backend-contribution.ts +++ b/packages/terminal/src/node/terminal-backend-contribution.ts @@ -20,6 +20,7 @@ import { TerminalProcess, ProcessManager } from '@theia/process/lib/node'; import { terminalsPath } from '../common/terminal-protocol'; import { MessagingService } from '@theia/core/lib/node/messaging/messaging-service'; import { RpcProtocol } from '@theia/core/'; +import { BufferingStream } from './buffering-stream'; @injectable() export class TerminalBackendContribution implements MessagingService.Contribution { @@ -47,10 +48,13 @@ export class TerminalBackendContribution implements MessagingService.Contributio }; const rpc = new RpcProtocol(channel, requestHandler); - output.on('data', data => { - rpc.sendNotification('onData', [data]); + const buffer = new BufferingStream(); + buffer.onData(chunk => rpc.sendNotification('onData', [chunk.toString('utf8')])); + output.on('data', chunk => buffer.push(Buffer.from(chunk, 'utf8'))); + channel.onClose(() => { + buffer.dispose(); + output.dispose(); }); - channel.onClose(() => output.dispose()); } }); } diff --git a/packages/timeline/package.json b/packages/timeline/package.json index 879a32b07a4a1..c75628f21e1ab 100644 --- a/packages/timeline/package.json +++ b/packages/timeline/package.json @@ -1,10 +1,10 @@ { "name": "@theia/timeline", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - Timeline Extension", "dependencies": { - "@theia/core": "1.27.0", - "@theia/navigator": "1.27.0" + "@theia/core": "1.28.0", + "@theia/navigator": "1.28.0" }, "publishConfig": { "access": "public" @@ -39,7 +39,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0" + "@theia/ext-scripts": "1.28.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/toolbar/package.json b/packages/toolbar/package.json index 57e1b46a1375f..25513c670ab41 100644 --- a/packages/toolbar/package.json +++ b/packages/toolbar/package.json @@ -1,6 +1,6 @@ { "name": "@theia/toolbar", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - Toolbar", "keywords": [ "theia-extension" @@ -27,15 +27,15 @@ "watch": "theiaext watch" }, "dependencies": { - "@theia/core": "1.27.0", - "@theia/editor": "1.27.0", - "@theia/file-search": "1.27.0", - "@theia/filesystem": "1.27.0", - "@theia/monaco": "1.27.0", + "@theia/core": "1.28.0", + "@theia/editor": "1.28.0", + "@theia/file-search": "1.28.0", + "@theia/filesystem": "1.28.0", + "@theia/monaco": "1.28.0", "@theia/monaco-editor-core": "1.67.2", - "@theia/search-in-workspace": "1.27.0", - "@theia/userstorage": "1.27.0", - "@theia/workspace": "1.27.0", + "@theia/search-in-workspace": "1.28.0", + "@theia/userstorage": "1.28.0", + "@theia/workspace": "1.28.0", "ajv": "^6.5.3", "jsonc-parser": "^2.2.0", "perfect-scrollbar": "^1.3.0" diff --git a/packages/toolbar/src/browser/toolbar-icon-selector-dialog.tsx b/packages/toolbar/src/browser/toolbar-icon-selector-dialog.tsx index 559b52cfe392f..82d8fc9a6711d 100644 --- a/packages/toolbar/src/browser/toolbar-icon-selector-dialog.tsx +++ b/packages/toolbar/src/browser/toolbar-icon-selector-dialog.tsx @@ -15,7 +15,7 @@ // ***************************************************************************** import * as React from '@theia/core/shared/react'; -import * as ReactDOM from '@theia/core/shared/react-dom'; +import { createRoot, Root } from '@theia/core/shared/react-dom/client'; import { injectable, interfaces, inject, postConstruct } from '@theia/core/shared/inversify'; import debounce = require('@theia/core/shared/lodash.debounce'); import { ReactDialog } from '@theia/core/lib/browser/dialogs/react-dialog'; @@ -59,19 +59,19 @@ export class ToolbarIconSelectorDialog extends ReactDialog { protected filteredIcons: string[] = []; protected doShowFilterPlaceholder = false; protected debounceHandleSearch = debounce(this.doHandleSearch.bind(this), FIFTY_MS, { trailing: true }); + protected controlPanelRoot: Root; constructor( @inject(DialogProps) protected override readonly props: DialogProps, ) { super(props); - this.toDispose.push(Disposable.create(() => { - ReactDOM.unmountComponentAtNode(this.controlPanel); - })); + this.controlPanelRoot = createRoot(this.controlPanel); + this.toDispose.push(Disposable.create(() => this.controlPanelRoot.unmount())); } protected override onUpdateRequest(msg: Message): void { super.onUpdateRequest(msg); - ReactDOM.render(this.renderControls(), this.controlPanel); + this.controlPanelRoot.render(this.renderControls()); } @postConstruct() diff --git a/packages/toolbar/src/browser/toolbar.tsx b/packages/toolbar/src/browser/toolbar.tsx index 23da9cfdc73f2..7d3b412fb9b57 100644 --- a/packages/toolbar/src/browser/toolbar.tsx +++ b/packages/toolbar/src/browser/toolbar.tsx @@ -129,8 +129,8 @@ export class ToolbarImpl extends TabBarToolbar { return args; } - protected renderGroupsInColumn(groups: ToolbarItem[][], alignment: ToolbarAlignment): React.ReactNode { - const nodes: React.ReactNodeArray = []; + protected renderGroupsInColumn(groups: ToolbarItem[][], alignment: ToolbarAlignment): React.ReactNode[] { + const nodes: React.ReactNode[] = []; groups.forEach((group, groupIndex) => { if (nodes.length && group.length) { nodes.push(
); diff --git a/packages/typehierarchy/package.json b/packages/typehierarchy/package.json index b0a86858ce3f5..c4f2a83ad8937 100644 --- a/packages/typehierarchy/package.json +++ b/packages/typehierarchy/package.json @@ -1,10 +1,10 @@ { "name": "@theia/typehierarchy", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - Type Hierarchy Extension", "dependencies": { - "@theia/core": "1.27.0", - "@theia/editor": "1.27.0", + "@theia/core": "1.28.0", + "@theia/editor": "1.28.0", "@types/uuid": "^7.0.3", "uuid": "^8.0.0" }, @@ -41,7 +41,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0" + "@theia/ext-scripts": "1.28.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/typehierarchy/src/browser/tree/typehierarchy-tree.ts b/packages/typehierarchy/src/browser/tree/typehierarchy-tree.ts index e62eb2f92e05d..58c8c7578eb15 100644 --- a/packages/typehierarchy/src/browser/tree/typehierarchy-tree.ts +++ b/packages/typehierarchy/src/browser/tree/typehierarchy-tree.ts @@ -97,8 +97,7 @@ export namespace TypeHierarchyTree { export function is(node: TreeNode | undefined): node is RootNode { if (Node.is(node) && 'direction' in node) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const { direction } = (node as any); + const { direction } = (node as RootNode); return direction === TypeHierarchyDirection.Children || direction === TypeHierarchyDirection.Parents; } return false; @@ -122,8 +121,7 @@ export namespace TypeHierarchyTree { export function is(node: TreeNode | undefined): node is Node { if (!!node && 'resolved' in node && 'item' in node) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const { resolved, item } = (node as any); + const { resolved, item } = (node as Node); return typeof resolved === 'boolean' && !!item; } return false; diff --git a/packages/userstorage/package.json b/packages/userstorage/package.json index cbefcb3786054..6853d3ed827d7 100644 --- a/packages/userstorage/package.json +++ b/packages/userstorage/package.json @@ -1,10 +1,10 @@ { "name": "@theia/userstorage", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - User Storage Extension", "dependencies": { - "@theia/core": "1.27.0", - "@theia/filesystem": "1.27.0" + "@theia/core": "1.28.0", + "@theia/filesystem": "1.28.0" }, "publishConfig": { "access": "public" @@ -39,7 +39,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0" + "@theia/ext-scripts": "1.28.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/variable-resolver/package.json b/packages/variable-resolver/package.json index 7cb0fa51892fa..3462606b4632a 100644 --- a/packages/variable-resolver/package.json +++ b/packages/variable-resolver/package.json @@ -1,9 +1,9 @@ { "name": "@theia/variable-resolver", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - Variable Resolver Extension", "dependencies": { - "@theia/core": "1.27.0" + "@theia/core": "1.28.0" }, "publishConfig": { "access": "public" @@ -44,7 +44,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0" + "@theia/ext-scripts": "1.28.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/variable-resolver/src/browser/common-variable-contribution.ts b/packages/variable-resolver/src/browser/common-variable-contribution.ts index a5f768a8994e3..40cbcda2db6a6 100644 --- a/packages/variable-resolver/src/browser/common-variable-contribution.ts +++ b/packages/variable-resolver/src/browser/common-variable-contribution.ts @@ -87,6 +87,7 @@ export class CommonVariableContribution implements VariableContribution { if (result === null) { throw cancelled(); } + return result; } } }); diff --git a/packages/vsx-registry/package.json b/packages/vsx-registry/package.json index 52d4a496aca99..8f20fedba6b8c 100644 --- a/packages/vsx-registry/package.json +++ b/packages/vsx-registry/package.json @@ -1,15 +1,15 @@ { "name": "@theia/vsx-registry", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - VSX Registry", "dependencies": { - "@theia/core": "1.27.0", - "@theia/filesystem": "1.27.0", - "@theia/ovsx-client": "1.27.0", - "@theia/plugin-ext": "1.27.0", - "@theia/plugin-ext-vscode": "1.27.0", - "@theia/preferences": "1.27.0", - "@theia/workspace": "1.27.0", + "@theia/core": "1.28.0", + "@theia/filesystem": "1.28.0", + "@theia/ovsx-client": "1.28.0", + "@theia/plugin-ext": "1.28.0", + "@theia/plugin-ext-vscode": "1.28.0", + "@theia/preferences": "1.28.0", + "@theia/workspace": "1.28.0", "luxon": "^2.4.0", "p-debounce": "^2.1.0", "semver": "^5.4.1", @@ -49,7 +49,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0", + "@theia/ext-scripts": "1.28.0", "@types/luxon": "^2.3.2" }, "nyc": { diff --git a/packages/vsx-registry/src/browser/style/index.css b/packages/vsx-registry/src/browser/style/index.css index b6d498c7b5d22..fc051b7ab52f4 100644 --- a/packages/vsx-registry/src/browser/style/index.css +++ b/packages/vsx-registry/src/browser/style/index.css @@ -91,6 +91,12 @@ font-size: 110%; } +.theia-vsx-extension-content .title .stat .download-count, +.theia-vsx-extension-content .title .stat .average-rating { + display: inline-flex; + align-items: center; +} + .theia-vsx-extension-content .title .stat .average-rating > i { color: #ff8e00; } diff --git a/packages/vsx-registry/src/browser/vsx-extension.tsx b/packages/vsx-registry/src/browser/vsx-extension.tsx index de85d963b6401..e39a95d3cc7ed 100644 --- a/packages/vsx-registry/src/browser/vsx-extension.tsx +++ b/packages/vsx-registry/src/browser/vsx-extension.tsx @@ -271,18 +271,18 @@ export class VSXExtension implements VSXExtensionData, TreeElement { } get tooltip(): string { - let md = `__${this.displayName}__ ${VSXExtension.formatVersion(this.version)}\n\n${this.description}\n_____\n\nPublisher: ${this.publisher}`; + let md = `__${this.displayName}__ ${VSXExtension.formatVersion(this.version)}\n\n${this.description}\n_____\n\n${nls.localizeByDefault('Publisher: {0}', this.publisher)}`; if (this.license) { - md += ` \rLicense: ${this.license}`; + md += ` \r${nls.localize('theia/vsx-registry/license', 'License: {0}', this.license)}`; } if (this.downloadCount) { - md += ` \rDownload count: ${downloadCompactFormatter.format(this.downloadCount)}`; + md += ` \r${nls.localize('theia/vsx-registry/downloadCount', 'Download count: {0}', downloadCompactFormatter.format(this.downloadCount))}`; } if (this.averageRating) { - md += ` \rAverage Rating: ${this.averageRating.toFixed(1)}`; + md += ` \r${getAverageRatingTitle(this.averageRating)}`; } return markdownit().render(md); @@ -443,7 +443,10 @@ export namespace AbstractVSXExtensionComponent { const downloadFormatter = new Intl.NumberFormat(); // eslint-disable-next-line @typescript-eslint/no-explicit-any -const downloadCompactFormatter = new Intl.NumberFormat(undefined, { notation: 'compact', compactDisplay: 'short' } as any); +const downloadCompactFormatter = new Intl.NumberFormat('en-US', { notation: 'compact', compactDisplay: 'short' } as any); +const averageRatingFormatter = (averageRating: number): number => Math.round(averageRating * 2) / 2; +const getAverageRatingTitle = (averageRating: number): string => + nls.localize('theia/vsx-registry/averageRating', 'Average rating: {0} out of 5', averageRatingFormatter(averageRating)); export namespace VSXExtensionComponent { export interface Props extends AbstractVSXExtensionComponent.Props { @@ -466,7 +469,7 @@ export class VSXExtensionComponent
{!!downloadCount && {downloadCompactFormatter.format(downloadCount)}} - {!!averageRating && {averageRating.toFixed(1)}} + {!!averageRating && {averageRatingFormatter(averageRating)}}
{description}
@@ -516,7 +519,10 @@ export class VSXExtensionEditorComponent extends AbstractVSXExtensionComponent { {!!downloadCount && {downloadFormatter.format(downloadCount)}} - {averageRating !== undefined && {this.renderStars()}} + { + averageRating !== undefined && + {this.renderStars()} + } {repository && Repository} {license && {license}} {version && {VSXExtension.formatVersion(version)}} @@ -527,7 +533,7 @@ export class VSXExtensionEditorComponent extends AbstractVSXExtensionComponent {
{ sanitizedReadme && - < div className='scroll-container' +
this._scrollContainer = (ref || undefined)}>
this.fireDidChange(), 100, { leading: false, trailing: true }); + getModel(): VSXExtensionsModel { + return this.model; + } + *getElements(): IterableIterator { for (const id of this.doGetElements()) { const extension = this.model.getExtension(id); diff --git a/packages/vsx-registry/src/browser/vsx-extensions-widget.ts b/packages/vsx-registry/src/browser/vsx-extensions-widget.tsx similarity index 84% rename from packages/vsx-registry/src/browser/vsx-extensions-widget.ts rename to packages/vsx-registry/src/browser/vsx-extensions-widget.tsx index 1951a4fe0006c..7539e297b642f 100644 --- a/packages/vsx-registry/src/browser/vsx-extensions-widget.ts +++ b/packages/vsx-registry/src/browser/vsx-extensions-widget.tsx @@ -15,12 +15,14 @@ // ***************************************************************************** import { injectable, interfaces, postConstruct, inject } from '@theia/core/shared/inversify'; -import { TreeNode } from '@theia/core/lib/browser'; +import { TreeModel, TreeNode } from '@theia/core/lib/browser'; import { SourceTreeWidget } from '@theia/core/lib/browser/source-tree'; import { VSXExtensionsSource, VSXExtensionsSourceOptions } from './vsx-extensions-source'; import { nls } from '@theia/core/lib/common/nls'; import { BadgeWidget } from '@theia/core/lib/browser/view-container'; import { Emitter } from '@theia/core/lib/common'; +import { AlertMessage } from '@theia/core/lib/browser/widgets/alert-message'; +import * as React from '@theia/core/shared/react'; @injectable() export class VSXExtensionsWidgetOptions extends VSXExtensionsSourceOptions { @@ -93,7 +95,7 @@ export class VSXExtensionsWidget extends SourceTreeWidget implements BadgeWidget case VSXExtensionsSourceOptions.RECOMMENDED: return nls.localizeByDefault('Recommended'); case VSXExtensionsSourceOptions.SEARCH_RESULT: - return nls.localize('theia/vsx-registry/openVSX', 'Open VSX Registry'); + return 'Open VSX Registry'; default: return ''; } @@ -115,4 +117,18 @@ export class VSXExtensionsWidget extends SourceTreeWidget implements BadgeWidget protected override handleDblClickEvent(): void { // Don't open the editor view on a double click. } + + protected override renderTree(model: TreeModel): React.ReactNode { + if (this.options.id === VSXExtensionsSourceOptions.SEARCH_RESULT) { + const searchError = this.extensionsSource.getModel().searchError; + if (!!searchError) { + const message = nls.localize('theia/vsx-registry/errorFetching', 'Error fetching extensions.'); + return ; + } + } + return super.renderTree(model); + } } diff --git a/packages/vsx-registry/src/node/vsx-extension-resolver.ts b/packages/vsx-registry/src/node/vsx-extension-resolver.ts index 508b371e88312..95b4502cbc3db 100644 --- a/packages/vsx-registry/src/node/vsx-extension-resolver.ts +++ b/packages/vsx-registry/src/node/vsx-extension-resolver.ts @@ -14,38 +14,27 @@ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 // ***************************************************************************** -import * as os from 'os'; import * as path from 'path'; import * as semver from 'semver'; import * as fs from '@theia/core/shared/fs-extra'; -import { v4 as uuidv4 } from 'uuid'; import { injectable, inject } from '@theia/core/shared/inversify'; import URI from '@theia/core/lib/common/uri'; -import { PluginDeployerHandler, PluginDeployerResolver, PluginDeployerResolverContext, PluginDeployOptions } from '@theia/plugin-ext/lib/common/plugin-protocol'; +import { PluginDeployerHandler, PluginDeployerResolver, PluginDeployerResolverContext, PluginDeployOptions, PluginIdentifiers } from '@theia/plugin-ext/lib/common/plugin-protocol'; import { VSCodeExtensionUri } from '@theia/plugin-ext-vscode/lib/common/plugin-vscode-uri'; import { OVSXClientProvider } from '../common/ovsx-client-provider'; import { VSXExtensionRaw } from '@theia/ovsx-client'; import { RequestService } from '@theia/core/shared/@theia/request'; +import { PluginVSCodeEnvironment } from '@theia/plugin-ext-vscode/lib/common/plugin-vscode-environment'; +import { PluginUninstallationManager } from '@theia/plugin-ext/lib/main/node/plugin-uninstallation-manager'; @injectable() export class VSXExtensionResolver implements PluginDeployerResolver { - @inject(OVSXClientProvider) - protected clientProvider: OVSXClientProvider; - - @inject(PluginDeployerHandler) - protected pluginDeployerHandler: PluginDeployerHandler; - - @inject(RequestService) - protected requestService: RequestService; - - protected readonly downloadPath: string; - - constructor() { - this.downloadPath = path.resolve(os.tmpdir(), uuidv4()); - fs.ensureDirSync(this.downloadPath); - fs.emptyDirSync(this.downloadPath); - } + @inject(OVSXClientProvider) protected clientProvider: OVSXClientProvider; + @inject(PluginDeployerHandler) protected pluginDeployerHandler: PluginDeployerHandler; + @inject(RequestService) protected requestService: RequestService; + @inject(PluginVSCodeEnvironment) protected readonly environment: PluginVSCodeEnvironment; + @inject(PluginUninstallationManager) protected readonly uninstallationManager: PluginUninstallationManager; accept(pluginId: string): boolean { return !!VSCodeExtensionUri.toId(new URI(pluginId)); @@ -82,9 +71,10 @@ export class VSXExtensionResolver implements PluginDeployerResolver { return; } } - - const extensionPath = path.resolve(this.downloadPath, path.basename(downloadUrl)); - console.log(`[${resolvedId}]: trying to download from "${downloadUrl}"...`, 'to path', this.downloadPath); + const downloadPath = (await this.environment.getExtensionsDirUri()).path.fsPath(); + await fs.ensureDir(downloadPath); + const extensionPath = path.resolve(downloadPath, path.basename(downloadUrl)); + console.log(`[${resolvedId}]: trying to download from "${downloadUrl}"...`, 'to path', downloadPath); if (!await this.download(downloadUrl, extensionPath)) { console.log(`[${resolvedId}]: not found`); return; @@ -94,7 +84,8 @@ export class VSXExtensionResolver implements PluginDeployerResolver { } protected hasSameOrNewerVersion(id: string, extension: VSXExtensionRaw): string | undefined { - const existingPlugins = this.pluginDeployerHandler.getDeployedPluginsById(id); + const existingPlugins = this.pluginDeployerHandler.getDeployedPluginsById(id) + .filter(plugin => !this.uninstallationManager.isUninstalled(PluginIdentifiers.componentsToVersionedId(plugin.metadata.model))); const sufficientVersion = existingPlugins.find(existingPlugin => { const existingVersion = semver.clean(existingPlugin.metadata.model.version); const desiredVersion = semver.clean(extension.version); diff --git a/packages/workspace/package.json b/packages/workspace/package.json index 4703f94296888..7fbec35dfc32a 100644 --- a/packages/workspace/package.json +++ b/packages/workspace/package.json @@ -1,11 +1,11 @@ { "name": "@theia/workspace", - "version": "1.27.0", + "version": "1.28.0", "description": "Theia - Workspace Extension", "dependencies": { - "@theia/core": "1.27.0", - "@theia/filesystem": "1.27.0", - "@theia/variable-resolver": "1.27.0", + "@theia/core": "1.28.0", + "@theia/filesystem": "1.28.0", + "@theia/variable-resolver": "1.28.0", "jsonc-parser": "^2.2.0", "valid-filename": "^2.0.1" }, @@ -43,7 +43,7 @@ "watch": "theiaext watch" }, "devDependencies": { - "@theia/ext-scripts": "1.27.0" + "@theia/ext-scripts": "1.28.0" }, "nyc": { "extends": "../../configs/nyc.json" diff --git a/packages/workspace/src/browser/workspace-frontend-contribution.ts b/packages/workspace/src/browser/workspace-frontend-contribution.ts index 8c2b92f69390a..81c5f05b4c08e 100644 --- a/packages/workspace/src/browser/workspace-frontend-contribution.ts +++ b/packages/workspace/src/browser/workspace-frontend-contribution.ts @@ -39,6 +39,7 @@ import { BinaryBuffer } from '@theia/core/lib/common/buffer'; import { FileStat } from '@theia/filesystem/lib/common/files'; import { UntitledWorkspaceExitDialog } from './untitled-workspace-exit-dialog'; import { FilesystemSaveResourceService } from '@theia/filesystem/lib/browser/filesystem-save-resource-service'; +import { StopReason } from '@theia/core/lib/common/frontend-application-state'; export enum WorkspaceStates { /** @@ -482,11 +483,15 @@ export class WorkspaceFrontendContribution implements CommandContribution, Keybi return this.workspaceService.workspace?.resource; } - onWillStop(): OnWillStopAction | undefined { + onWillStop(): OnWillStopAction | undefined { const { workspace } = this.workspaceService; if (workspace && this.workspaceService.isUntitledWorkspace(workspace.resource)) { return { - action: async () => { + prepare: async reason => reason === StopReason.Reload && this.workspaceService.isSafeToReload(workspace.resource), + action: async alreadyConfirmedSafe => { + if (alreadyConfirmedSafe) { + return true; + } const shouldSaveFile = await new UntitledWorkspaceExitDialog({ title: nls.localizeByDefault('Do you want to save your workspace configuration as a file?') }).open(); diff --git a/packages/workspace/src/browser/workspace-schema-updater.ts b/packages/workspace/src/browser/workspace-schema-updater.ts index 0523641b5319c..8556243d92372 100644 --- a/packages/workspace/src/browser/workspace-schema-updater.ts +++ b/packages/workspace/src/browser/workspace-schema-updater.ts @@ -114,13 +114,12 @@ export class WorkspaceSchemaUpdater implements JsonSchemaContribution { export type WorkspaceSchema = Required>; export namespace WorkspaceSchema { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export const is = (candidate: any): candidate is WorkspaceSchema => !!candidate + export const is = (candidate: unknown): candidate is WorkspaceSchema => !!candidate && typeof candidate === 'object' && 'properties' in candidate - && typeof candidate.properties === 'object' + && typeof (candidate as WorkspaceSchema).properties === 'object' && 'required' in candidate - && Array.isArray(candidate.required); + && Array.isArray((candidate as WorkspaceSchema).required); } export const workspaceSchemaId = 'vscode://schemas/workspace'; diff --git a/packages/workspace/src/browser/workspace-service.ts b/packages/workspace/src/browser/workspace-service.ts index 7f6a1d55773e7..83d6905c43bf2 100644 --- a/packages/workspace/src/browser/workspace-service.ts +++ b/packages/workspace/src/browser/workspace-service.ts @@ -681,6 +681,10 @@ export class WorkspaceService implements FrontendApplicationContribution { return this.utils.isUntitledWorkspace(candidate); } + async isSafeToReload(withURI?: URI): Promise { + return !withURI || !this.utils.isUntitledWorkspace(withURI) || new URI(await this.getDefaultWorkspaceUri()).isEqual(withURI); + } + /** * * @param key the property key under which to store the schema (e.g. tasks, launch) @@ -709,12 +713,10 @@ export interface WorkspaceData { export namespace WorkspaceData { const validateSchema = new Ajv().compile(workspaceSchema); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function is(data: any): data is WorkspaceData { + export function is(data: unknown): data is WorkspaceData { return !!validateSchema(data); } - // eslint-disable-next-line @typescript-eslint/no-explicit-any export function buildWorkspaceData(folders: string[] | FileStat[], additionalFields?: Partial): WorkspaceData { let roots: string[] = []; if (folders.length > 0) { diff --git a/packages/workspace/src/node/default-workspace-server.ts b/packages/workspace/src/node/default-workspace-server.ts index 2bcd6649bc3bc..8be2f62899011 100644 --- a/packages/workspace/src/node/default-workspace-server.ts +++ b/packages/workspace/src/node/default-workspace-server.ts @@ -231,14 +231,12 @@ namespace RecentWorkspacePathsData { * * Returns undefined if the given `data` does not contain a `recentRoots` array property. */ - export function create(data: Object | undefined): RecentWorkspacePathsData | undefined { - // eslint-disable-next-line @typescript-eslint/no-explicit-any, no-null/no-null - if (typeof data !== 'object' || data === null || !Array.isArray((data as any)['recentRoots'])) { + export function create(data: unknown): RecentWorkspacePathsData | undefined { + if (typeof data !== 'object' || !data || !Array.isArray((data as RecentWorkspacePathsData).recentRoots)) { return; } return { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - recentRoots: (data as any)['recentRoots'].filter((root: unknown) => typeof root === 'string') + recentRoots: (data as RecentWorkspacePathsData).recentRoots.filter(root => typeof root === 'string') }; } } diff --git a/scripts/translate-monaco.js b/scripts/translate-monaco.js deleted file mode 100644 index 05ffb06a26efc..0000000000000 --- a/scripts/translate-monaco.js +++ /dev/null @@ -1,151 +0,0 @@ -// ***************************************************************************** -// Copyright (C) 2021 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 WITH Classpath-exception-2.0 -// ***************************************************************************** - -/* - * Translates the array based monaco localizations into key-value pair based localizations - * Call this script like this from the root directory: - * - * node scripts/translate-monaco.js node_modules/@theia/monaco-editor-core/dev/vs/editor/editor.main.nls.js packages/monaco/data/monaco-nls.json - * - * The script should preferably target the english monaco nls.js file. - * The is a translation file compatible with the used monaco version. - * With monaco 0.23, the compatible translations can be found in this repo: - * https://github.com/microsoft/vscode-loc/tree/1fe01ec761f24c40bb5a2d081889eb34c8d523de - * - * Change the commit hash as necessary when upgrading monaco - */ - -// @ts-check -'use-strict'; - -const fs = require('fs'); -const os = require('os'); - -const monacoFilePath = process.argv[2]; -const i18nFilePath = process.argv[3]; -const outputFilePath = process.argv[4]; - -const monacoInputStart = 'define("vs/editor/editor.main.nls", '; -/** @type {string} */ -let monacoFile = fs.readFileSync(monacoFilePath, 'utf8'); -monacoFile = monacoFile.substring(monacoFile.indexOf(monacoInputStart) + monacoInputStart.length, monacoFile.length - 2); - -/** @type {Record} */ -const monacoInput = JSON.parse(monacoFile); -/** @type {{ contents: Record> }} */ -const i18nInput = JSON.parse(fs.readFileSync(i18nFilePath, 'utf8')); -/** @type {Record>} */ -const outputContent = {}; - -// The following objects are translation items that cannot be successfully translated by the duplication algorithm -// Therefore they are written down explicitly - -const keybindingLabels = { - /* 0 */ 'ctrlKey': 'Ctrl', - /* 1 */ 'shiftKey': 'Shift', - /* 2 */ 'altKey': 'Alt', - /* 3 */ 'windowsKey': 'Windows', - /* 4 */ '_duplicate/0': 'Ctrl', - /* 5 */ '_duplicate/1': 'Shift', - /* 6 */ '_duplicate/2': 'Alt', - /* 7 */ 'superKey': 'Super', - /* 8 */ 'ctrlKey.long': 'Control', - /* 9 */ 'shiftKey.long': 'Shift', - /* 10 */ 'altKey.long': 'Alt', - /* 11 */ 'cmdKey.long': 'Command', - /* 12 */ '_duplicate/8': 'Control', - /* 13 */ '_duplicate/9': 'Shift', - /* 14 */ '_duplicate/10': 'Alt', - /* 15 */ 'windowsKey.long': 'Windows', - /* 16 */ '_duplicate/12': 'Control', - /* 17 */ '_duplicate/13': 'Shift', - /* 18 */ '_duplicate/14': 'Alt', - /* 19 */ 'superKey.long': 'Super' -} - -const findWidgets = { - 'findSelectionIcon': 'Icon for \'Find in Selection\' in the editor find widget.', - 'findCollapsedIcon': 'Icon to indicate that the editor find widget is collapsed.', - 'findExpandedIcon': 'Icon to indicate that the editor find widget is expanded.', - 'findReplaceIcon': 'Icon for \'Replace\' in the editor find widget.', - 'findReplaceAllIcon': 'Icon for \'Replace All\' in the editor find widget.', - 'findPreviousMatchIcon': 'Icon for \'Find Previous\' in the editor find widget.', - 'findNextMatchIcon': 'Icon for \'Find Next\' in the editor find widget.', - 'label.find': 'Find', - 'placeholder.find': 'Find', - 'label.previousMatchButton': 'Previous match', - 'label.nextMatchButton': 'Next match', - 'label.toggleSelectionFind': 'Find in selection', - 'label.closeButton': 'Close', - 'label.replace': 'Replace', - 'placeholder.replace': 'Replace', - 'label.replaceButton': 'Replace', - 'label.replaceAllButton': 'Replace All', - 'label.toggleReplaceButton': 'Toggle Replace mode', - 'title.matchesCountLimit': 'Only the first {0} results are highlighted, but all find operations work on the entire text.', - 'label.matchesLocation': '{0} of {1}', - 'label.noResults': 'No results', - 'ariaSearchNoResultEmpty': '{0} found', - 'ariaSearchNoResult': '{0} found for \'{1}\'', - 'ariaSearchNoResultWithLineNum': '{0} found for \'{1}\', at {2}', - 'ariaSearchNoResultWithLineNumNoCurrentMatch': '{0} found for \'{1}\'', - 'ctrlEnter.keybindingChanged': 'Ctrl+Enter now inserts line break instead of replacing all. You can modify the keybinding for editor.action.replaceAll to override this behavior.' -} - -const manualItems = { - 'vs/base/common/keybindingLabels': keybindingLabels, - 'vs/editor/contrib/find/findWidget': findWidgets -} - -const i18nContents = i18nInput.contents; - -for (const [key, original] of Object.entries(monacoInput)) { - const i18nContent = i18nContents[key]; - if (!i18nContent) { - console.error(`Entry for '${key}' does not exist in specified i18n file.`); - process.exit(1); - } - /** @type {Record} */ - const output = outputContent[key] = {}; - console.log(`translating: '${key}' with ${original.length} items.`); - if (key in manualItems) { - outputContent[key] = manualItems[key]; - continue; - } - const translationKeys = Object.keys(i18nContent); - let translationIndex = 0; - // We have to correctly deal with duplicates here - /** @type {Map} */ - const duplicateMap = new Map(); - for (let i = 0; i < original.length; i++) { - const originalValue = original[i]; - if (duplicateMap.has(originalValue)) { - const index = duplicateMap.get(originalValue); - output[`_duplicate/${index}`] = originalValue; - } else { - output[translationKeys[translationIndex++]] = originalValue; - } - duplicateMap.set(originalValue, i); - } - - if (Object.keys(output).length !== original.length) { - console.error(`Entry for '${key}' contains ${Object.keys(output).length} entries. Expected ${original.length}`); - process.exit(1); - } -} - -fs.writeFileSync(outputFilePath, JSON.stringify(outputContent, undefined, 4) + os.EOL); -console.log('Monaco translation successfully finished'); diff --git a/scripts/translation-update.js b/scripts/translation-update.js new file mode 100644 index 0000000000000..caec3cbaca59b --- /dev/null +++ b/scripts/translation-update.js @@ -0,0 +1,48 @@ +const cp = require('child_process'); + +console.log('Extracting all localization calls...'); +performNlsExtract(); +if (hasNlsFileChanged()) { + const token = getDeepLToken(); + if (token) { + console.log('Performing DeepL translation...'); + performDeepLTranslation(token); + console.log('Translation finished successfully!'); + } else { + console.log('No DeepL API token found in env'); + process.exit(1); + } +} else { + console.log('No localization changes found.'); +} + +function performNlsExtract() { + cp.spawnSync('yarn', [ + 'theia', 'nls-extract', + '-o', './packages/core/i18n/nls.json', + '-e', 'vscode', + '-f', './packages/**/browser/**/*.{ts,tsx}' + ], { + shell: true + }); +} + +function hasNlsFileChanged() { + const childProcess = cp.spawnSync('git', ['diff', '--exit-code', './packages/core/i18n/nls.json']); + return childProcess.status === 1; +} + +function getDeepLToken() { + return process.env['DEEPL_API_TOKEN']; +} + +function performDeepLTranslation(token) { + cp.spawnSync('yarn', [ + 'theia', 'nls-localize', + '-f', './packages/core/i18n/nls.json', + '--free-api', '-k', token, + 'cs', 'de', 'es', 'fr', 'hu', 'it', 'ja', 'pl', 'pt-br', 'pt-pt', 'ru', 'zh-cn' + ], { + shell: true + }); +} diff --git a/yarn.lock b/yarn.lock index af38075edd8d2..457291ffdcad8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17,402 +17,402 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" - integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== +"@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== dependencies: - "@babel/highlight" "^7.16.7" + "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.17.10": - version "7.17.10" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.10.tgz#711dc726a492dfc8be8220028b1b92482362baab" - integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw== +"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8": + version "7.18.8" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" + integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== "@babel/core@^7.10.0", "@babel/core@^7.7.5": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.2.tgz#87b2fcd7cce9becaa7f5acebdc4f09f3dd19d876" - integrity sha512-A8pri1YJiC5UnkdrWcmfZTJTV85b4UXTAfImGmCfYmax4TR9Cw8sDS0MOk++Gp2mE/BefVJ5nwy5yzqNJbP/DQ== + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.9.tgz#805461f967c77ff46c74ca0460ccf4fe933ddd59" + integrity sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g== dependencies: "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.18.2" - "@babel/helper-compilation-targets" "^7.18.2" - "@babel/helper-module-transforms" "^7.18.0" - "@babel/helpers" "^7.18.2" - "@babel/parser" "^7.18.0" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.18.2" - "@babel/types" "^7.18.2" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.9" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-module-transforms" "^7.18.9" + "@babel/helpers" "^7.18.9" + "@babel/parser" "^7.18.9" + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.1" semver "^6.3.0" -"@babel/generator@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.2.tgz#33873d6f89b21efe2da63fe554460f3df1c5880d" - integrity sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw== +"@babel/generator@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.9.tgz#68337e9ea8044d6ddc690fb29acae39359cca0a5" + integrity sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug== dependencies: - "@babel/types" "^7.18.2" - "@jridgewell/gen-mapping" "^0.3.0" + "@babel/types" "^7.18.9" + "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" - integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== +"@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== dependencies: - "@babel/types" "^7.16.7" + "@babel/types" "^7.18.6" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" - integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== +"@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== dependencies: - "@babel/helper-explode-assignable-expression" "^7.16.7" - "@babel/types" "^7.16.7" + "@babel/helper-explode-assignable-expression" "^7.18.6" + "@babel/types" "^7.18.9" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.10", "@babel/helper-compilation-targets@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz#67a85a10cbd5fc7f1457fec2e7f45441dc6c754b" - integrity sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ== +"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf" + integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== dependencies: - "@babel/compat-data" "^7.17.10" - "@babel/helper-validator-option" "^7.16.7" + "@babel/compat-data" "^7.18.8" + "@babel/helper-validator-option" "^7.18.6" browserslist "^4.20.2" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.17.12", "@babel/helper-create-class-features-plugin@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz#fac430912606331cb075ea8d82f9a4c145a4da19" - integrity sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg== +"@babel/helper-create-class-features-plugin@^7.18.6": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz#d802ee16a64a9e824fcbf0a2ffc92f19d58550ce" + integrity sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.17.9" - "@babel/helper-member-expression-to-functions" "^7.17.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-split-export-declaration" "^7.18.6" -"@babel/helper-create-regexp-features-plugin@^7.16.7", "@babel/helper-create-regexp-features-plugin@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz#bb37ca467f9694bbe55b884ae7a5cc1e0084e4fd" - integrity sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw== +"@babel/helper-create-regexp-features-plugin@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz#3e35f4e04acbbf25f1b3534a657610a000543d3c" + integrity sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - regexpu-core "^5.0.1" + "@babel/helper-annotate-as-pure" "^7.18.6" + regexpu-core "^5.1.0" -"@babel/helper-define-polyfill-provider@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" - integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== +"@babel/helper-define-polyfill-provider@^0.3.1", "@babel/helper-define-polyfill-provider@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz#bd10d0aca18e8ce012755395b05a79f45eca5073" + integrity sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg== dependencies: - "@babel/helper-compilation-targets" "^7.13.0" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/traverse" "^7.13.0" + "@babel/helper-compilation-targets" "^7.17.7" + "@babel/helper-plugin-utils" "^7.16.7" debug "^4.1.1" lodash.debounce "^4.0.8" resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-environment-visitor@^7.16.7", "@babel/helper-environment-visitor@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz#8a6d2dedb53f6bf248e31b4baf38739ee4a637bd" - integrity sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ== - -"@babel/helper-explode-assignable-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" - integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== +"@babel/helper-environment-visitor@^7.18.6", "@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.16.7" - -"@babel/helper-function-name@^7.16.7", "@babel/helper-function-name@^7.17.9": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" - integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== - dependencies: - "@babel/template" "^7.16.7" - "@babel/types" "^7.17.0" - -"@babel/helper-hoist-variables@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" - integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-member-expression-to-functions@^7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz#a34013b57d8542a8c4ff8ba3f747c02452a4d8c4" - integrity sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw== - dependencies: - "@babel/types" "^7.17.0" - -"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" - integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-module-transforms@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz#baf05dec7a5875fb9235bd34ca18bad4e21221cd" - integrity sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA== - dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-simple-access" "^7.17.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.18.0" - "@babel/types" "^7.18.0" - -"@babel/helper-optimise-call-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" - integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== - dependencies: - "@babel/types" "^7.16.7" - -"@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.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.17.12", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz#86c2347da5acbf5583ba0a10aed4c9bf9da9cf96" - integrity sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA== - -"@babel/helper-remap-async-to-generator@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" - integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-wrap-function" "^7.16.8" - "@babel/types" "^7.16.8" - -"@babel/helper-replace-supers@^7.16.7", "@babel/helper-replace-supers@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.18.2.tgz#41fdfcc9abaf900e18ba6e5931816d9062a7b2e0" - integrity sha512-XzAIyxx+vFnrOxiQrToSUOzUOn0e1J2Li40ntddek1Y69AXUTXoDJ40/D5RdjFu7s7qHiaeoTiempZcbuVXh2Q== - dependencies: - "@babel/helper-environment-visitor" "^7.18.2" - "@babel/helper-member-expression-to-functions" "^7.17.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/traverse" "^7.18.2" - "@babel/types" "^7.18.2" - -"@babel/helper-simple-access@^7.17.7", "@babel/helper-simple-access@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz#4dc473c2169ac3a1c9f4a51cfcd091d1c36fcff9" - integrity sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ== - dependencies: - "@babel/types" "^7.18.2" - -"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" - integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-split-export-declaration@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" - integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-validator-identifier@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" - integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== - -"@babel/helper-validator-option@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" - integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== - -"@babel/helper-wrap-function@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" - integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== - dependencies: - "@babel/helper-function-name" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.8" - "@babel/types" "^7.16.8" - -"@babel/helpers@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.2.tgz#970d74f0deadc3f5a938bfa250738eb4ac889384" - integrity sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg== - dependencies: - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.18.2" - "@babel/types" "^7.18.2" - -"@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.12.tgz#257de56ee5afbd20451ac0a75686b6b404257351" - integrity sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" + "@babel/types" "^7.18.6" + +"@babel/helper-function-name@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz#940e6084a55dee867d33b4e487da2676365e86b0" + integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A== + dependencies: + "@babel/template" "^7.18.6" + "@babel/types" "^7.18.9" + +"@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.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815" + integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== + dependencies: + "@babel/types" "^7.18.9" + +"@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.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz#5a1079c005135ed627442df31a42887e80fcb712" + integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.18.6" + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + +"@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.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz#4b8aea3b069d8cb8a72cdfe28ddf5ceca695ef2f" + integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w== + +"@babel/helper-remap-async-to-generator@^7.18.6": + 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.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz#1092e002feca980fbbb0bd4d51b74a65c6a500e6" + integrity sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/helper-simple-access@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" + integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-skip-transparent-expression-wrappers@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz#778d87b3a758d90b471e7b9918f34a9a02eb5818" + integrity sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw== + dependencies: + "@babel/types" "^7.18.9" + +"@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-validator-identifier@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" + integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== + +"@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.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.18.9.tgz#ae1feddc6ebbaa2fd79346b77821c3bd73a39646" + integrity sha512-cG2ru3TRAL6a60tfQflpEfs4ldiPwF6YW3zfJiRgmoFVIaC1vGnBBgatfec+ZUziPHkHSaXAuEck3Cdkf3eRpQ== + dependencies: + "@babel/helper-function-name" "^7.18.9" + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + +"@babel/helpers@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.9.tgz#4bef3b893f253a1eced04516824ede94dcfe7ff9" + integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== + dependencies: + "@babel/template" "^7.18.6" + "@babel/traverse" "^7.18.9" + "@babel/types" "^7.18.9" + +"@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" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.16.7", "@babel/parser@^7.18.0": - version "7.18.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.4.tgz#6774231779dd700e0af29f6ad8d479582d7ce5ef" - integrity sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow== +"@babel/parser@^7.18.6", "@babel/parser@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.9.tgz#f2dde0c682ccc264a9a8595efd030a5cc8fd2539" + integrity sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg== -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.17.12": - version "7.17.12" - 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.17.12.tgz#1dca338caaefca368639c9ffb095afbd4d420b1e" - integrity sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw== +"@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.17.12" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz#0d498ec8f0374b1e2eb54b9cb2c4c78714c77753" - integrity sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz#a11af19aa373d68d561f08e0a57242350ed0ec50" + integrity sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-proposal-optional-chaining" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/plugin-proposal-optional-chaining" "^7.18.9" -"@babel/plugin-proposal-async-generator-functions@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz#094a417e31ce7e692d84bab06c8e2a607cbeef03" - integrity sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ== +"@babel/plugin-proposal-async-generator-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz#aedac81e6fc12bb643374656dd5f2605bf743d17" + integrity sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-remap-async-to-generator" "^7.16.8" + "@babel/helper-environment-visitor" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-remap-async-to-generator" "^7.18.6" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-class-properties@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz#84f65c0cc247d46f40a6da99aadd6438315d80a4" - integrity sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw== +"@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.17.12" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-class-static-block@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz#7d02253156e3c3793bdb9f2faac3a1c05f0ba710" - integrity sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA== +"@babel/plugin-proposal-class-static-block@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz#8aa81d403ab72d3962fc06c26e222dacfc9b9020" + integrity sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.0" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-proposal-dynamic-import@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" - integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== +"@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.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz#b22864ccd662db9606edb2287ea5fd1709f05378" - integrity sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ== +"@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.17.12" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz#f4642951792437233216d8c1af370bb0fbff4664" - integrity sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg== +"@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.17.12" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz#c64a1bcb2b0a6d0ed2ff674fd120f90ee4b88a23" - integrity sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q== +"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz#8148cbb350483bf6220af06fa6db3690e14b2e23" + integrity sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz#1e93079bbc2cbc756f6db6a1925157c4a92b94be" - integrity sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag== +"@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.17.12" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" - integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== +"@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.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz#79f2390c892ba2a68ec112eb0d895cfbd11155e8" - integrity sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw== +"@babel/plugin-proposal-object-rest-spread@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz#f9434f6beb2c8cae9dfcf97d2a5941bbbf9ad4e7" + integrity sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q== dependencies: - "@babel/compat-data" "^7.17.10" - "@babel/helper-compilation-targets" "^7.17.10" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/compat-data" "^7.18.8" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.17.12" + "@babel/plugin-transform-parameters" "^7.18.8" -"@babel/plugin-proposal-optional-catch-binding@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" - integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== +"@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.16.7" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz#f96949e9bacace3a9066323a5cf90cfb9de67174" - integrity sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ== +"@babel/plugin-proposal-optional-chaining@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz#e8e8fe0723f2563960e4bf5e9690933691915993" + integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-private-methods@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz#c2ca3a80beb7539289938da005ad525a038a819c" - integrity sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A== +"@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== dependencies: - "@babel/helper-create-class-features-plugin" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-private-property-in-object@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz#b02efb7f106d544667d91ae97405a9fd8c93952d" - integrity sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg== +"@babel/plugin-proposal-private-property-in-object@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz#a64137b232f0aca3733a67eb1a144c192389c503" + integrity sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-create-class-features-plugin" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-proposal-unicode-property-regex@^7.17.12", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz#3dbd7a67bd7f94c8238b394da112d86aaf32ad4d" - integrity sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A== +"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@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== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -449,12 +449,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-import-assertions@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz#58096a92b11b2e4e54b24c6a0cc0e5e607abcedd" - integrity sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw== +"@babel/plugin-syntax-import-assertions@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz#cd6190500a4fa2fe31990a963ffab4b63e4505e4" + integrity sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" @@ -519,302 +519,302 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-arrow-functions@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz#dddd783b473b1b1537ef46423e3944ff24898c45" - integrity sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA== +"@babel/plugin-transform-arrow-functions@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz#19063fcf8771ec7b31d742339dac62433d0611fe" + integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-async-to-generator@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz#dbe5511e6b01eee1496c944e35cdfe3f58050832" - integrity sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ== +"@babel/plugin-transform-async-to-generator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz#ccda3d1ab9d5ced5265fdb13f1882d5476c71615" + integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag== dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-remap-async-to-generator" "^7.16.8" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-remap-async-to-generator" "^7.18.6" -"@babel/plugin-transform-block-scoped-functions@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" - integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== +"@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== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-block-scoping@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz#f9b7e018ac3f373c81452d6ada8bd5a18928926d" + integrity sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-block-scoping@^7.17.12": - version "7.18.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.4.tgz#7988627b3e9186a13e4d7735dc9c34a056613fb9" - integrity sha512-+Hq10ye+jlvLEogSOtq4mKvtk7qwcUQ1f0Mrueai866C82f844Yom2cttfJdMdqRLTxWpsbfbkIkOIfovyUQXw== - dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - -"@babel/plugin-transform-classes@^7.10.0", "@babel/plugin-transform-classes@^7.17.12": - version "7.18.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.4.tgz#51310b812a090b846c784e47087fa6457baef814" - integrity sha512-e42NSG2mlKWgxKUAD9EJJSkZxR67+wZqzNxLSpc51T8tRU5SLFHsPmgYR5yr7sdgX4u+iHA1C5VafJ6AyImV3A== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.18.2" - "@babel/helper-function-name" "^7.17.9" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-replace-supers" "^7.18.2" - "@babel/helper-split-export-declaration" "^7.16.7" +"@babel/plugin-transform-classes@^7.10.0", "@babel/plugin-transform-classes@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz#90818efc5b9746879b869d5ce83eb2aa48bbc3da" + integrity sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-replace-supers" "^7.18.9" + "@babel/helper-split-export-declaration" "^7.18.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz#bca616a83679698f3258e892ed422546e531387f" - integrity sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ== +"@babel/plugin-transform-computed-properties@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz#2357a8224d402dad623caf6259b611e56aec746e" + integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-destructuring@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz#dc4f92587e291b4daa78aa20cc2d7a63aa11e858" - integrity sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw== +"@babel/plugin-transform-destructuring@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz#68906549c021cb231bee1db21d3b5b095f8ee292" + integrity sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" - integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== +"@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== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-duplicate-keys@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz#a09aa709a3310013f8e48e0e23bc7ace0f21477c" - integrity sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw== +"@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== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-exponentiation-operator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" - integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== +"@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== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-for-of@^7.18.1": - version "7.18.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz#ed14b657e162b72afbbb2b4cdad277bf2bb32036" - integrity sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg== +"@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== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-function-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" - integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== +"@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== dependencies: - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-literals@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz#97131fbc6bbb261487105b4b3edbf9ebf9c830ae" - integrity sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ== +"@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== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-member-expression-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" - integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== +"@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== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-modules-amd@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz#7ef1002e67e36da3155edc8bf1ac9398064c02ed" - integrity sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA== +"@babel/plugin-transform-modules-amd@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz#8c91f8c5115d2202f277549848874027d7172d21" + integrity sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg== dependencies: - "@babel/helper-module-transforms" "^7.18.0" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz#1aa8efa2e2a6e818b6a7f2235fceaf09bdb31e9e" - integrity sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ== +"@babel/plugin-transform-modules-commonjs@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz#afd243afba166cca69892e24a8fd8c9f2ca87883" + integrity sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q== dependencies: - "@babel/helper-module-transforms" "^7.18.0" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-simple-access" "^7.18.2" + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-simple-access" "^7.18.6" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.18.0": - version "7.18.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.4.tgz#3d6fd9868c735cce8f38d6ae3a407fb7e61e6d46" - integrity sha512-lH2UaQaHVOAeYrUUuZ8i38o76J/FnO8vu21OE+tD1MyP9lxdZoSfz+pDbWkq46GogUrdrMz3tiz/FYGB+bVThg== +"@babel/plugin-transform-modules-systemjs@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz#545df284a7ac6a05125e3e405e536c5853099a06" + integrity sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A== dependencies: - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-module-transforms" "^7.18.0" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-validator-identifier" "^7.16.7" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-module-transforms" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-validator-identifier" "^7.18.6" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz#56aac64a2c2a1922341129a4597d1fd5c3ff020f" - integrity sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA== +"@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== dependencies: - "@babel/helper-module-transforms" "^7.18.0" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-module-transforms" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-named-capturing-groups-regex@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz#9c4a5a5966e0434d515f2675c227fd8cc8606931" - integrity sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA== +"@babel/plugin-transform-named-capturing-groups-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz#c89bfbc7cc6805d692f3a49bc5fc1b630007246d" + integrity sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.17.12" - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-new-target@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.17.12.tgz#10842cd605a620944e81ea6060e9e65c265742e3" - integrity sha512-CaOtzk2fDYisbjAD4Sd1MTKGVIpRtx9bWLyj24Y/k6p4s4gQ3CqDGJauFJxt8M/LEx003d0i3klVqnN73qvK3w== +"@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== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-object-super@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" - integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== +"@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== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-replace-supers" "^7.18.6" -"@babel/plugin-transform-parameters@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz#eb467cd9586ff5ff115a9880d6fdbd4a846b7766" - integrity sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA== +"@babel/plugin-transform-parameters@^7.18.8": + version "7.18.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz#ee9f1a0ce6d78af58d0956a9378ea3427cccb48a" + integrity sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-property-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" - integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== +"@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== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-regenerator@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz#44274d655eb3f1af3f3a574ba819d3f48caf99d5" - integrity sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw== +"@babel/plugin-transform-regenerator@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz#585c66cb84d4b4bf72519a34cfce761b8676ca73" + integrity sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.6" regenerator-transform "^0.15.0" -"@babel/plugin-transform-reserved-words@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz#7dbd349f3cdffba751e817cf40ca1386732f652f" - integrity sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA== +"@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== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-runtime@^7.10.0": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.2.tgz#04637de1e45ae8847ff14b9beead09c33d34374d" - integrity sha512-mr1ufuRMfS52ttq+1G1PD8OJNqgcTFjq3hwn8SZ5n1x1pBhi0E36rYMdTK0TsKtApJ4lDEdfXJwtGobQMHSMPg== - dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.17.12" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.5.0" - babel-plugin-polyfill-regenerator "^0.3.0" + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.9.tgz#d9e4b1b25719307bfafbf43065ed7fb3a83adb8f" + integrity sha512-wS8uJwBt7/b/mzE13ktsJdmS4JP/j7PQSaADtnb4I2wL0zK51MQ0pmF8/Jy0wUIS96fr+fXT6S/ifiPXnvrlSg== + dependencies: + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.9" + babel-plugin-polyfill-corejs2 "^0.3.1" + babel-plugin-polyfill-corejs3 "^0.5.2" + babel-plugin-polyfill-regenerator "^0.3.1" semver "^6.3.0" -"@babel/plugin-transform-shorthand-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" - integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== +"@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== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-spread@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz#c112cad3064299f03ea32afed1d659223935d1f5" - integrity sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg== +"@babel/plugin-transform-spread@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz#6ea7a6297740f381c540ac56caf75b05b74fb664" + integrity sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" -"@babel/plugin-transform-sticky-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" - integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== +"@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== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-template-literals@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz#31ed6915721864847c48b656281d0098ea1add28" - integrity sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g== +"@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== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-typeof-symbol@^7.17.12": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz#0f12f57ac35e98b35b4ed34829948d42bd0e6889" - integrity sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw== +"@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== dependencies: - "@babel/helper-plugin-utils" "^7.17.12" + "@babel/helper-plugin-utils" "^7.18.9" -"@babel/plugin-transform-unicode-escapes@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" - integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== +"@babel/plugin-transform-unicode-escapes@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz#0d01fb7fb2243ae1c033f65f6e3b4be78db75f27" + integrity sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-unicode-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" - integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== +"@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== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/preset-env@^7.10.0": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.18.2.tgz#f47d3000a098617926e674c945d95a28cb90977a" - integrity sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q== - dependencies: - "@babel/compat-data" "^7.17.10" - "@babel/helper-compilation-targets" "^7.18.2" - "@babel/helper-plugin-utils" "^7.17.12" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.17.12" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.17.12" - "@babel/plugin-proposal-async-generator-functions" "^7.17.12" - "@babel/plugin-proposal-class-properties" "^7.17.12" - "@babel/plugin-proposal-class-static-block" "^7.18.0" - "@babel/plugin-proposal-dynamic-import" "^7.16.7" - "@babel/plugin-proposal-export-namespace-from" "^7.17.12" - "@babel/plugin-proposal-json-strings" "^7.17.12" - "@babel/plugin-proposal-logical-assignment-operators" "^7.17.12" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.17.12" - "@babel/plugin-proposal-numeric-separator" "^7.16.7" - "@babel/plugin-proposal-object-rest-spread" "^7.18.0" - "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" - "@babel/plugin-proposal-optional-chaining" "^7.17.12" - "@babel/plugin-proposal-private-methods" "^7.17.12" - "@babel/plugin-proposal-private-property-in-object" "^7.17.12" - "@babel/plugin-proposal-unicode-property-regex" "^7.17.12" + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.18.9.tgz#9b3425140d724fbe590322017466580844c7eaff" + integrity sha512-75pt/q95cMIHWssYtyfjVlvI+QEZQThQbKvR9xH+F/Agtw/s4Wfc2V9Bwd/P39VtixB7oWxGdH4GteTTwYJWMg== + dependencies: + "@babel/compat-data" "^7.18.8" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-plugin-utils" "^7.18.9" + "@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.18.6" + "@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.18.9" + "@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" "@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.17.12" + "@babel/plugin-syntax-import-assertions" "^7.18.6" "@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" @@ -824,43 +824,43 @@ "@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.17.12" - "@babel/plugin-transform-async-to-generator" "^7.17.12" - "@babel/plugin-transform-block-scoped-functions" "^7.16.7" - "@babel/plugin-transform-block-scoping" "^7.17.12" - "@babel/plugin-transform-classes" "^7.17.12" - "@babel/plugin-transform-computed-properties" "^7.17.12" - "@babel/plugin-transform-destructuring" "^7.18.0" - "@babel/plugin-transform-dotall-regex" "^7.16.7" - "@babel/plugin-transform-duplicate-keys" "^7.17.12" - "@babel/plugin-transform-exponentiation-operator" "^7.16.7" - "@babel/plugin-transform-for-of" "^7.18.1" - "@babel/plugin-transform-function-name" "^7.16.7" - "@babel/plugin-transform-literals" "^7.17.12" - "@babel/plugin-transform-member-expression-literals" "^7.16.7" - "@babel/plugin-transform-modules-amd" "^7.18.0" - "@babel/plugin-transform-modules-commonjs" "^7.18.2" - "@babel/plugin-transform-modules-systemjs" "^7.18.0" - "@babel/plugin-transform-modules-umd" "^7.18.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.17.12" - "@babel/plugin-transform-new-target" "^7.17.12" - "@babel/plugin-transform-object-super" "^7.16.7" - "@babel/plugin-transform-parameters" "^7.17.12" - "@babel/plugin-transform-property-literals" "^7.16.7" - "@babel/plugin-transform-regenerator" "^7.18.0" - "@babel/plugin-transform-reserved-words" "^7.17.12" - "@babel/plugin-transform-shorthand-properties" "^7.16.7" - "@babel/plugin-transform-spread" "^7.17.12" - "@babel/plugin-transform-sticky-regex" "^7.16.7" - "@babel/plugin-transform-template-literals" "^7.18.2" - "@babel/plugin-transform-typeof-symbol" "^7.17.12" - "@babel/plugin-transform-unicode-escapes" "^7.16.7" - "@babel/plugin-transform-unicode-regex" "^7.16.7" + "@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.18.9" + "@babel/plugin-transform-classes" "^7.18.9" + "@babel/plugin-transform-computed-properties" "^7.18.9" + "@babel/plugin-transform-destructuring" "^7.18.9" + "@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.18.6" + "@babel/plugin-transform-modules-commonjs" "^7.18.6" + "@babel/plugin-transform-modules-systemjs" "^7.18.9" + "@babel/plugin-transform-modules-umd" "^7.18.6" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.18.6" + "@babel/plugin-transform-new-target" "^7.18.6" + "@babel/plugin-transform-object-super" "^7.18.6" + "@babel/plugin-transform-parameters" "^7.18.8" + "@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.18.9" + "@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.6" + "@babel/plugin-transform-unicode-regex" "^7.18.6" "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.18.2" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.5.0" - babel-plugin-polyfill-regenerator "^0.3.0" + "@babel/types" "^7.18.9" + babel-plugin-polyfill-corejs2 "^0.3.1" + babel-plugin-polyfill-corejs3 "^0.5.2" + babel-plugin-polyfill-regenerator "^0.3.1" core-js-compat "^3.22.1" semver "^6.3.0" @@ -876,43 +876,43 @@ esutils "^2.0.2" "@babel/runtime@^7.10.0", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.18.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.3.tgz#c7b654b57f6f63cf7f8b418ac9ca04408c4579f4" - integrity sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug== + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.9.tgz#b4fcfce55db3d2e5e080d2490f608a3b9f407f4a" + integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw== dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" - integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.18.0", "@babel/traverse@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.2.tgz#b77a52604b5cc836a9e1e08dca01cba67a12d2e8" - integrity sha512-9eNwoeovJ6KH9zcCNnENY7DMFwTU9JdGCFtqNLfUAqtUHRCOsTOqWoffosP8vKmNYeSBUv3yVJXjfd8ucwOjUA== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.18.2" - "@babel/helper-environment-visitor" "^7.18.2" - "@babel/helper-function-name" "^7.17.9" - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.18.0" - "@babel/types" "^7.18.2" +"@babel/template@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.6.tgz#1283f4993e00b929d6e2d3c72fdc9168a2977a31" + integrity sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.18.6" + "@babel/types" "^7.18.6" + +"@babel/traverse@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.9.tgz#deeff3e8f1bad9786874cb2feda7a2d77a904f98" + integrity sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.9" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.18.9" + "@babel/types" "^7.18.9" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.18.0", "@babel/types@^7.18.2", "@babel/types@^7.4.4": - version "7.18.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.4.tgz#27eae9b9fd18e9dccc3f9d6ad051336f307be354" - integrity sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw== +"@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.4.4": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.9.tgz#7148d64ba133d8d73a41b3172ac4b83a1452205f" + integrity sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg== dependencies: - "@babel/helper-validator-identifier" "^7.16.7" + "@babel/helper-validator-identifier" "^7.18.6" to-fast-properties "^2.0.0" "@discoveryjs/json-ext@^0.5.0": @@ -1004,24 +1004,24 @@ "@jridgewell/set-array" "^1.0.0" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/gen-mapping@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz#cf92a983c83466b8c0ce9124fadeaf09f7c66ea9" - integrity sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg== +"@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== dependencies: - "@jridgewell/set-array" "^1.0.0" + "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" "@jridgewell/resolve-uri@^3.0.3": - version "3.0.7" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz#30cd49820a962aff48c8fffc5cd760151fca61fe" - integrity sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA== + version "3.1.0" + 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": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea" - integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== +"@jridgewell/set-array@^1.0.0", "@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" @@ -1032,14 +1032,14 @@ "@jridgewell/trace-mapping" "^0.3.9" "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.13" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c" - integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== + 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.7", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.13" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea" - integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w== + version "0.3.14" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" + integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" @@ -1757,9 +1757,9 @@ semver "^7.3.5" "@npmcli/fs@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.0.tgz#f2a21c28386e299d1a9fae8051d35ad180e33109" - integrity sha512-DmfBvNXGaetMxj9LTp8NAN9vEidXURrf5ZTslQzEAi/6GbW+4yjaLFQc6Tue5cpZ9Frlk4OBo/Snf1Bh/S7qTQ== + version "2.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.1.tgz#c0c480b03450d8b9fc086816a50cb682668a48bf" + integrity sha512-1Q0uzx6c/NVNGszePbr5Gc2riSU1zLpNlo/1YWntH+eaPmMgBssAW0qXofCVkpdj3ce4swZtlDYQu+NKiYcptg== dependencies: "@gar/promisify" "^1.1.3" semver "^7.3.5" @@ -1862,10 +1862,10 @@ "@octokit/types" "^6.0.3" universal-user-agent "^6.0.0" -"@octokit/openapi-types@^11.2.0": - version "11.2.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-11.2.0.tgz#b38d7fc3736d52a1e96b230c1ccd4a58a2f400a6" - integrity sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA== +"@octokit/openapi-types@^12.10.0": + version "12.10.1" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-12.10.1.tgz#57b5cc6c7b4e55d8642c93d06401fb1af4839899" + integrity sha512-P+SukKanjFY0ZhsK6wSVnQmxTP2eVPPE8OPSNuxaMYtgVzwJZgfGdwlYjf4RlRU4vLEw4ts2fsE2icG4nZ5ddQ== "@octokit/plugin-enterprise-rest@^6.0.1": version "6.0.1" @@ -1873,11 +1873,11 @@ integrity sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw== "@octokit/plugin-paginate-rest@^2.16.8": - version "2.17.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.17.0.tgz#32e9c7cab2a374421d3d0de239102287d791bce7" - integrity sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw== + version "2.21.3" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz#7f12532797775640dbb8224da577da7dc210c87e" + integrity sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw== dependencies: - "@octokit/types" "^6.34.0" + "@octokit/types" "^6.40.0" "@octokit/plugin-request-log@^1.0.4": version "1.0.4" @@ -1885,11 +1885,11 @@ integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA== "@octokit/plugin-rest-endpoint-methods@^5.12.0": - version "5.13.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.13.0.tgz#8c46109021a3412233f6f50d28786f8e552427ba" - integrity sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA== + version "5.16.2" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz#7ee8bf586df97dd6868cf68f641354e908c25342" + integrity sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw== dependencies: - "@octokit/types" "^6.34.0" + "@octokit/types" "^6.39.0" deprecation "^2.3.1" "@octokit/request-error@^2.0.5", "@octokit/request-error@^2.1.0": @@ -1923,12 +1923,12 @@ "@octokit/plugin-request-log" "^1.0.4" "@octokit/plugin-rest-endpoint-methods" "^5.12.0" -"@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.34.0": - version "6.34.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.34.0.tgz#c6021333334d1ecfb5d370a8798162ddf1ae8218" - integrity sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw== +"@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.39.0", "@octokit/types@^6.40.0": + version "6.40.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.40.0.tgz#f2e665196d419e19bb4265603cf904a820505d0e" + integrity sha512-MFZOU5r8SwgJWDMhrLUSvyJPtVsqA6VnbVI3TNbsmw+Jnvrktzvq2fYES/6RiJA/5Ykdwq4mJmtlYUfW7CGjmw== dependencies: - "@octokit/openapi-types" "^11.2.0" + "@octokit/openapi-types" "^12.10.0" "@phosphor/algorithm@1", "@phosphor/algorithm@^1.2.0": version "1.2.0" @@ -2239,22 +2239,27 @@ integrity sha512-6dhZJLbA7aOwkYB2GDGdIqJ20wmHnkDzaxV9PJXe7O02I2dSFTERzRB6JrX6cWKaS+VqhhY7cQUMCbO5kloFUw== "@types/eslint-scope@^3.7.3": - version "3.7.3" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" - integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== + version "3.7.4" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" + integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== dependencies: "@types/eslint" "*" "@types/estree" "*" "@types/eslint@*": - version "8.4.2" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.2.tgz#48f2ac58ab9c631cb68845c3d956b28f79fad575" - integrity sha512-Z1nseZON+GEnFjJc04sv4NSALGjhFwy6K0HXt7qsn5ArfAKtb63dXNJHf+1YW6IpOIYRBGUbu3GwJdj8DGnCjA== + version "8.4.5" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.5.tgz#acdfb7dd36b91cc5d812d7c093811a8f3d9b31e4" + integrity sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ== dependencies: "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*", "@types/estree@^0.0.51": +"@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== @@ -2265,9 +2270,9 @@ integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== "@types/express-serve-static-core@^4.17.18": - version "4.17.28" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8" - integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== + version "4.17.29" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz#2a1795ea8e9e9c91b4a4bbe475034b20c1ec711c" + integrity sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q== dependencies: "@types/node" "*" "@types/qs" "*" @@ -2381,9 +2386,9 @@ integrity sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q== "@types/luxon@^2.3.2": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-2.3.2.tgz#8a3f2cdd4858ce698b56cd8597d9243b8e9d3c65" - integrity sha512-WOehptuhKIXukSUUkRgGbj2c997Uv/iUgYgII8U7XLJqq9W2oF0kQ6frEznRQbdurioz+L/cdaIm4GutTQfgmA== + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-2.4.0.tgz#897d3abc23b68d78b69d76a12c21e01eb5adab95" + integrity sha512-oCavjEjRXuR6URJEtQm0eBdfsBiEcGBZbq21of8iGkeKxU1+1xgKuFPClaBZl2KB8ZZBSWlgk61tH6Mf+nvZVw== "@types/markdown-it-anchor@^4.0.1": version "4.0.4" @@ -2443,9 +2448,9 @@ "@types/express" "*" "@types/mustache@^4.1.2": - version "4.1.3" - resolved "https://registry.yarnpkg.com/@types/mustache/-/mustache-4.1.3.tgz#467119da74ef48d9dd21c0a2f6dd398e1337421f" - integrity sha512-Bc3wzdDGfHE8kcf6HsDwqq/IDUginRlWLHbs8dYFAo/2jj91lip6/XJFgKvcCbFO6aEVpOBT1RGF72LZgNIbKQ== + version "4.2.1" + resolved "https://registry.yarnpkg.com/@types/mustache/-/mustache-4.2.1.tgz#724a2fca5763117dee626aa4ca3e3f6e546e7434" + integrity sha512-gFAlWL9Ik21nJioqjlGCnNYbf9zHi0sVbaZ/1hQEBcCEuxfLJDvz4bVJSV6v6CUaoLOz0XEIoP7mSrhJ6o237w== "@types/node-abi@*": version "3.0.0" @@ -2453,17 +2458,17 @@ integrity sha512-lhjcQxXaKhbP3SpIjJONnx4cy6cUW2bdCSwPJISuznG3S889TUPQZsYswxYhS4vg8eJDIG5/6pg533HorQI0rw== "@types/node-fetch@^2.5.7": - version "2.6.1" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.1.tgz#8f127c50481db65886800ef496f20bbf15518975" - integrity sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA== + version "2.6.2" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.2.tgz#d1a9c5fd049d9415dce61571557104dec3ec81da" + integrity sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A== dependencies: "@types/node" "*" form-data "^3.0.0" "@types/node@*", "@types/node@14", "@types/node@>=10.0.0", "@types/node@^10.14.22", "@types/node@^14.6.2": - version "14.18.18" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.18.tgz#5c9503030df484ccffcbb935ea9a9e1d6fad1a20" - integrity sha512-B9EoJFjhqcQ9OmQrNorItO+OwEOORNn3S31WuiHvZY/dm9ajkB7AKD/8toessEtHHNL+58jofbq7hMMY9v4yig== + version "14.18.22" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.22.tgz#fd2a15dca290fc9ad565b672fde746191cd0c6e6" + integrity sha512-qzaYbXVzin6EPjghf/hTdIbnVW1ErMx8rPzwRNJhlbyJhu2SyqlvjGOY/tbUt6VFyzg56lROcOeSQRInpt63Yw== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -2514,12 +2519,12 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== -"@types/react-dom@^16.8.0": - version "16.9.16" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.16.tgz#c591f2ed1c6f32e9759dfa6eb4abfd8041f29e39" - integrity sha512-Oqc0RY4fggGA3ltEgyPLc3IV9T73IGoWjkONbsyJ3ZBn+UPPCYpU2ec0i3cEbJuEdZtkqcCF2l1zf2pBdgUGSg== +"@types/react-dom@18.0.6", "@types/react-dom@^18.0.6": + version "18.0.6" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.6.tgz#36652900024842b74607a17786b6662dd1e103a1" + integrity sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA== dependencies: - "@types/react" "^16" + "@types/react" "*" "@types/react-virtualized@^9.18.3": version "9.21.21" @@ -2529,19 +2534,10 @@ "@types/prop-types" "*" "@types/react" "^17" -"@types/react@^16", "@types/react@^16.8.0": - version "16.14.26" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.14.26.tgz#82540a240ba7207ebe87d9579051bc19c9ef7605" - integrity sha512-c/5CYyciOO4XdFcNhZW1O2woVx86k4T+DO2RorHZL7EhitkNQgSD/SgpdZJAUJa/qjVgOmTM44gHkAdZSXeQuQ== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/react@^17": - version "17.0.45" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.45.tgz#9b3d5b661fd26365fefef0e766a1c6c30ccf7b3f" - integrity sha512-YfhQ22Lah2e3CHPsb93tRwIGNiSwkuz1/blk4e6QrWS0jQzCSNbGLtOEYhPg02W0yGTTmpajp7dCTbBAMN3qsg== +"@types/react@*", "@types/react@18.0.15", "@types/react@^17", "@types/react@^18.0.15": + version "18.0.15" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.15.tgz#d355644c26832dc27f3e6cbf0c4f4603fc4ab7fe" + integrity sha512-iz3BtLuIYH1uWdsv6wXYdhozhqj20oD4/Hk2DNXIn1kFsmp9x8d9QB6FnPhfkbhd2PgEONt9Q1x/ebkwjfFLow== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2595,9 +2591,9 @@ integrity sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ== "@types/semver@^7.3.8": - version "7.3.9" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.9.tgz#152c6c20a7688c30b967ec1841d31ace569863fc" - integrity sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ== + version "7.3.10" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.10.tgz#5f19ee40cbeff87d916eedc8c2bfe2305d957f73" + integrity sha512-zsv3fsC7S84NN6nPK06u79oWgrPVd0NvOyqgghV1haPaFcVxIrP4DLomRwGAXk0ui4HZA7mOcSFL98sMVW9viw== "@types/serve-static@*": version "1.13.10" @@ -2608,9 +2604,9 @@ "@types/node" "*" "@types/sinon@^10.0.6": - version "10.0.11" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.11.tgz#8245827b05d3fc57a6601bd35aee1f7ad330fc42" - integrity sha512-dmZsHlBsKUtBpHriNjlK0ndlvEh8dcb9uV9Afsbt89QIyydpC7NcR+nWlAhASfy3GHnxTl4FX/aKE7XZUt/B4g== + version "10.0.13" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.13.tgz#60a7a87a70d9372d0b7b38cc03e825f46981fb83" + integrity sha512-UVjDqJblVNQYvVNUsj0PuYYw0ELRmgt1Nt5Vk0pT5f16ROGfcKJY8o1HVuMOJOpD727RrGB9EGvoaTQE5tgxZQ== dependencies: "@types/sinonjs__fake-timers" "*" @@ -2809,9 +2805,9 @@ eslint-visitor-keys "^2.0.0" "@vscode/codicons@*": - version "0.0.30" - resolved "https://registry.yarnpkg.com/@vscode/codicons/-/codicons-0.0.30.tgz#67c265c1f3ff7214da475333efa6d381710b0335" - integrity sha512-/quu8pLXEyrShoDjTImQwJ2H28y1XhANigyw7E7JvN9NNWc3XCkoIWpcb/tUhdf7XQpopLVVYbkMjXpdPPuMXg== + version "0.0.31" + resolved "https://registry.yarnpkg.com/@vscode/codicons/-/codicons-0.0.31.tgz#1dc56f9442c3928b1c851965cf360e7e051e6511" + integrity sha512-fldpXy7pHsQAMlU1pnGI23ypQ6xLk5u6SiABMFoAmlj4f2MR0iwg7C19IB1xvAEGG+dkxOfRSrbKF8ry7QqGQA== "@vscode/ripgrep@^1.14.2": version "1.14.2" @@ -2943,21 +2939,21 @@ "@xtuc/long" "4.2.2" "@webpack-cli/configtest@^1.0.3": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.1.1.tgz#9f53b1b7946a6efc2a749095a4f450e2932e8356" - integrity sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg== + version "1.2.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5" + integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg== "@webpack-cli/info@^1.2.4": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.4.1.tgz#2360ea1710cbbb97ff156a3f0f24556e0fc1ebea" - integrity sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA== + version "1.5.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1" + integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ== dependencies: envinfo "^7.7.3" "@webpack-cli/serve@^1.4.0": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.6.1.tgz#0de2875ac31b46b6c5bb1ae0a7d7f0ba5678dffe" - integrity sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw== + version "1.7.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1" + integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== "@xtuc/ieee754@^1.2.0": version "1.2.0" @@ -3033,10 +3029,10 @@ acorn@^7.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.4.1, acorn@^8.5.0: - version "8.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" - integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== +acorn@^8.5.0, acorn@^8.7.1: + version "8.8.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" + integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== add-stream@^1.0.0: version "1.0.0" @@ -3112,25 +3108,25 @@ ajv@^8.0.0, ajv@^8.0.1, ajv@^8.6.3, ajv@^8.8.0: uri-js "^4.2.2" allure-commandline@^2.13.8: - version "2.17.2" - resolved "https://registry.yarnpkg.com/allure-commandline/-/allure-commandline-2.17.2.tgz#48c1064973619644011092d31294834210c6c433" - integrity sha512-2a0M0nX1KtVrg4y0rWEFn/OQkv7AaQSMBOEtlKfQl3heZoTEo0IdB08Uk5vU390+qPsEv3EO5igjyCrS0gX+FQ== + version "2.18.1" + resolved "https://registry.yarnpkg.com/allure-commandline/-/allure-commandline-2.18.1.tgz#c850e7bac4d19dd4dc509a583bd3f7de08202e7a" + integrity sha512-bB0jY00yXxROgaTkC/PTFzmT0sVuHGiOhm80onO+N/tr5MF3eQrBkwTOdvuefEWJ1NTACutvmzZSYn8o6W2evA== -allure-js-commons@2.0.0-beta.16: - version "2.0.0-beta.16" - resolved "https://registry.yarnpkg.com/allure-js-commons/-/allure-js-commons-2.0.0-beta.16.tgz#3637b581fee19846a77f53e027fcb7f689f6f991" - integrity sha512-biAFm8FugPMA0THZpsWLdi+F8n1BeUTYkkpmQ4ZqUAKeg2xcw5arM0Qa4rq6Qs0HPLbdVS9Jj8fb7e/ahCr/Ig== +allure-js-commons@2.0.0-beta.18: + version "2.0.0-beta.18" + resolved "https://registry.yarnpkg.com/allure-js-commons/-/allure-js-commons-2.0.0-beta.18.tgz#1a7559d32e20c8ed9df70dd1f37b2b55588a80b4" + integrity sha512-LKzfsESnaei/rMxrU7A6HRLg+MtTo9j/b0NPeAsCmEawKss3doOIjvpgrTPtO03mgUwre2+neztg8Lm3WmXsmQ== dependencies: mkdirp "^1.0.4" properties "^1.2.1" uuid "^8.3.0" allure-playwright@^2.0.0-beta.14: - version "2.0.0-beta.16" - resolved "https://registry.yarnpkg.com/allure-playwright/-/allure-playwright-2.0.0-beta.16.tgz#399f5aa8c94e4096800e0d619cd8535fbf261adb" - integrity sha512-0Nj2BLIIRFUCZn7CGSXYa7d1M+phmSzUwMD3fbHVxO+q10vNrY8Hf5IT2ITwWMtUHaTAE6uH58GPsa6DB9N3Xw== + version "2.0.0-beta.18" + resolved "https://registry.yarnpkg.com/allure-playwright/-/allure-playwright-2.0.0-beta.18.tgz#ab65168960fa087b19143f8d734dfcd469c5ed83" + integrity sha512-JUzmZawLWqpHc8iyJcwB5AVxqMVpjmiGwOh30g2PzsrjJv1/gLhHTHeS0fhVzhvM4zYgseTZmdVbpmnjdtxp7g== dependencies: - allure-js-commons "2.0.0-beta.16" + allure-js-commons "2.0.0-beta.18" anser@^2.0.1: version "2.1.1" @@ -3451,24 +3447,24 @@ babel-plugin-dynamic-import-node@^2.3.3: dependencies: object.assign "^4.1.0" -babel-plugin-polyfill-corejs2@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" - integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== +babel-plugin-polyfill-corejs2@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz#e4c31d4c89b56f3cf85b92558954c66b54bd972d" + integrity sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q== dependencies: - "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.3.1" + "@babel/compat-data" "^7.17.7" + "@babel/helper-define-polyfill-provider" "^0.3.2" semver "^6.1.1" -babel-plugin-polyfill-corejs3@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72" - integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ== +babel-plugin-polyfill-corejs3@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz#d7e09c9a899079d71a8b670c6181af56ec19c5c7" + integrity sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" + "@babel/helper-define-polyfill-provider" "^0.3.2" core-js-compat "^3.21.0" -babel-plugin-polyfill-regenerator@^0.3.0: +babel-plugin-polyfill-regenerator@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== @@ -3645,16 +3641,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.20.2, browserslist@^4.20.3: - version "4.20.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.3.tgz#eb7572f49ec430e054f56d52ff0ebe9be915f8bf" - integrity sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg== +browserslist@^4.14.5, browserslist@^4.20.2, browserslist@^4.21.2: + version "4.21.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.2.tgz#59a400757465535954946a400b841ed37e2b4ecf" + integrity sha512-MonuOgAtUB46uP5CezYbRaYKBNt2LxP0yX+Pmj4LkcDFGkn9Cbpi83d9sCjwQDErXsIJSzY5oKGDbgOlF/LPAA== dependencies: - caniuse-lite "^1.0.30001332" - electron-to-chromium "^1.4.118" - escalade "^3.1.1" - node-releases "^2.0.3" - picocolors "^1.0.0" + caniuse-lite "^1.0.30001366" + electron-to-chromium "^1.4.188" + node-releases "^2.0.6" + update-browserslist-db "^1.0.4" buffer-alloc-unsafe@^1.1.0: version "1.1.0" @@ -3863,10 +3858,10 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30001332: - version "1.0.30001346" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001346.tgz#e895551b46b9cc9cc9de852facd42f04839a8fbe" - integrity sha512-q6ibZUO2t88QCIPayP/euuDREq+aMAxFE5S70PkrLh0iTDj/zEhgvJRKC2+CvXY6EWc6oQwUR48lL5vCW6jiXQ== +caniuse-lite@^1.0.30001366: + version "1.0.30001370" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001370.tgz#0a30d4f20d38b9e108cc5ae7cc62df9fe66cd5ba" + integrity sha512-3PDmaP56wz/qz7G508xzjx8C+MC2qEm4SYhSEzC9IBROo+dGXFWRuaXkWti0A9tuI00g+toiriVqxtWMgl350g== caseless@~0.12.0: version "0.12.0" @@ -4010,9 +4005,9 @@ cli-cursor@^3.1.0: restore-cursor "^3.1.0" cli-spinners@^2.5.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" - integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== + version "2.7.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a" + integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== cli-width@^3.0.0: version "3.0.0" @@ -4056,9 +4051,9 @@ clone-deep@^4.0.1: shallow-clone "^3.0.0" clone-response@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" - integrity sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q== + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== dependencies: mimic-response "^1.0.0" @@ -4073,9 +4068,9 @@ clone@^2.1.2: integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== clsx@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" - integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== + version "1.2.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== cmd-shim@^4.1.0: version "4.1.0" @@ -4232,7 +4227,7 @@ concurrently@^3.5.0: supports-color "^3.2.3" tree-kill "^1.1.0" -conf@^10.0.3: +conf@^10.1.2: version "10.1.2" resolved "https://registry.yarnpkg.com/conf/-/conf-10.1.2.tgz#50132158f388756fa9dea3048f6b47935315c14e" integrity sha512-o9Fv1Mv+6A0JpoayQ8JleNp3hhkbOJP/Re/Q+QqxMPHPkABVsRjQGWZn9A5GcqLiTNC6d89p2PB5ZhHVDSMwyg== @@ -4398,11 +4393,11 @@ copy-webpack-plugin@^8.1.1: serialize-javascript "^5.0.1" core-js-compat@^3.21.0, core-js-compat@^3.22.1: - version "3.22.8" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.22.8.tgz#46fa34ce1ddf742acd7f95f575f66bbb21e05d62" - integrity sha512-pQnwg4xtuvc2Bs/5zYQPaEYYSuTxsF7LBWF0SvnVhthZo/Qe+rJpcEekrdNK5DWwDJ0gv0oI9NNX5Mppdy0ctg== + version "3.24.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.24.0.tgz#885958fac38bf3f4464a90f2663b4620f6aee6e3" + integrity sha512-F+2E63X3ff/nj8uIrf8Rf24UDGIz7p838+xjEp+Bx3y8OWXj+VTPPZNCtdqovPaS9o7Tka5mCH01Zn5vOd6UQg== dependencies: - browserslist "^4.20.3" + browserslist "^4.21.2" semver "7.0.0" core-js@^2.4.0, core-js@^2.5.0: @@ -4788,6 +4783,11 @@ detect-libc@^1.0.3: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== +detect-libc@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" + integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== + detect-node@^2.0.4: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" @@ -4860,9 +4860,9 @@ domexception@^1.0.1: webidl-conversions "^4.0.2" dompurify@^2.2.9: - version "2.3.8" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.8.tgz#224fe9ae57d7ebd9a1ae1ac18c1c1ca3f532226f" - integrity sha512-eVhaWoVibIzqdGYjwsBWodIQIaXFSB+cKDf4cfxLMsK0xiud6SE+/WCVx/Xw/UwQsa4cS3T2eITcdtmTg2UKcw== + version "2.3.10" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.10.tgz#901f7390ffe16a91a5a556b94043314cd4850385" + integrity sha512-o7Fg/AgC7p/XpKjf/+RC3Ok6k4St5F7Q6q6+Nnm3p2zGWioAY6dh0CbbuwOhH2UcSzKsdniE/YnE2/92JcsA+g== dot-prop@^5.1.0: version "5.3.0" @@ -4918,9 +4918,9 @@ duplexer2@~0.1.4: readable-stream "^2.0.2" duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha512-CEj8FwwNA4cVH2uFCoHUrmojhYh1vmCdOaneKJXwkeY1i9jnlslVo9dx+hQ5Hl9GnH/Bwy/IjxAyOePyPKYnzA== + version "0.1.5" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" + integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== duplexer@^0.1.1, duplexer@~0.1.1: version "0.1.2" @@ -4954,37 +4954,37 @@ electron-mocha@^8.2.0: yargs "^15.3.1" electron-rebuild@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/electron-rebuild/-/electron-rebuild-3.2.7.tgz#0f56c1cc99a6fec0a5b990532283c2a8c838c19b" - integrity sha512-WvaW1EgRinDQ61khHFZfx30rkPQG5ItaOT0wrI7iJv9A3SbghriQGfZQfHZs25fWLBe6/vkv05LOqg6aDw6Wzw== + version "3.2.8" + resolved "https://registry.yarnpkg.com/electron-rebuild/-/electron-rebuild-3.2.8.tgz#01fc262213caf12bef4dd3cd7f6fffa82c60cb40" + integrity sha512-+U/G5ZH9RNfvPQsEHevC3yDlgSB+wliNXnG6haqUeZBEq061pEgSTWK9ZBEfqMEq+PKxvniMNxfou/h6079s3A== dependencies: "@malept/cross-spawn-promise" "^2.0.0" chalk "^4.0.0" debug "^4.1.1" - detect-libc "^1.0.3" + detect-libc "^2.0.1" fs-extra "^10.0.0" got "^11.7.0" lzma-native "^8.0.5" node-abi "^3.0.0" node-api-version "^0.1.4" - node-gyp "^8.4.0" + node-gyp "^9.0.0" ora "^5.1.0" semver "^7.3.5" tar "^6.0.5" yargs "^17.0.1" electron-store@^8.0.0: - version "8.0.1" - resolved "https://registry.yarnpkg.com/electron-store/-/electron-store-8.0.1.tgz#9b598c1d2edeffebee9d8c1cd957ad368c528925" - integrity sha512-ZyLvNywiqSpbwC/pp89O/AycVWY/UJIkmtyzF2Bd0Nm/rLmcFc0NTGuLdg6+LE8mS8qsiK5JMoe4PnrecLHH5w== + version "8.0.2" + resolved "https://registry.yarnpkg.com/electron-store/-/electron-store-8.0.2.tgz#95c8cf81c1e1cf48b24f3ceeea24b921c1ff62d7" + integrity sha512-9GwUMv51w8ydbkaG7X0HrPlElXLApg63zYy1/VZ/a08ndl0gfm4iCoD3f0E1JvP3V16a+7KxqriCI0c122stiA== dependencies: - conf "^10.0.3" - type-fest "^1.0.2" + conf "^10.1.2" + type-fest "^2.12.2" -electron-to-chromium@^1.4.118: - version "1.4.146" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.146.tgz#fd20970c3def2f9e6b32ac13a2e7a6b64e1b0c48" - integrity sha512-4eWebzDLd+hYLm4csbyMU2EbBnqhwl8Oe9eF/7CBDPWcRxFmqzx4izxvHH+lofQxzieg8UbB8ZuzNTxeukzfTg== +electron-to-chromium@^1.4.188: + version "1.4.199" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.199.tgz#e0384fde79fdda89880e8be58196a9153e04db3b" + integrity sha512-WIGME0Cs7oob3mxsJwHbeWkH0tYkIE/sjkJ8ML2BYmuRcjhRl/q5kVDXG7W9LOOKwzPU5M0LBlXRq9rlSgnNlg== electron-window@^0.8.0: version "0.8.1" @@ -5072,10 +5072,10 @@ engine.io@~6.1.0: engine.io-parser "~5.0.3" ws "~8.2.3" -enhanced-resolve@^5.9.3: - version "5.9.3" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88" - integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow== +enhanced-resolve@^5.10.0: + version "5.10.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6" + integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -5273,9 +5273,9 @@ eslint-plugin-no-unsanitized@latest: integrity sha512-y/lAMWnPPC7RYuUdxlEL/XiCL8FehN9h9s3Kjqbp/Kv0i9NZs+IXSC2kS546Fa4Bumwy31HlVS/OdWX0Kxb5Xg== eslint-plugin-react@latest: - version "7.30.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.30.0.tgz#8e7b1b2934b8426ac067a0febade1b13bd7064e3" - integrity sha512-RgwH7hjW48BleKsYyHK5vUAvxtE9SMPDKmcPRQgtRCYaZA0XQPt5FSkrU3nhz5ifzMZcA8opwmRJ2cmOO8tr5A== + version "7.30.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.30.1.tgz#2be4ab23ce09b5949c6631413ba64b2810fd3e22" + integrity sha512-NbEvI9jtqO46yJA3wcRF9Mo0lF9T/jhdHqhCHXiXtD+Zcb98812wvokjWpU7Q4QH5edo6dmqrukxVvWWXHlsUg== dependencies: array-includes "^3.1.5" array.prototype.flatmap "^1.3.0" @@ -5593,9 +5593,9 @@ fast-plist@^0.1.2: integrity sha512-2HxzrqJhmMoxVzARjYFvkzkL2dCBB8sogU5sD8gqcZWv5UCivK9/cXM9KIPDRwU+eD3mbRDN/GhW8bO/4dtMfg== fastest-levenshtein@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" - integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== + version "1.0.14" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.14.tgz#9054384e4b7a78c88d01a4432dc18871af0ac859" + integrity sha512-tFfWHjnuUfKE186Tfgr+jtaFc0mZTApEgKDOeyN+FwOqRkO/zK/3h1AiRd8u8CY53owL3CUmGr/oI9p/RdyLTA== fastq@^1.6.0: version "1.13.0" @@ -5764,9 +5764,9 @@ flat@^4.1.0: is-buffer "~2.0.3" flatted@^3.1.0: - version "3.2.5" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" - integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== + version "3.2.6" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2" + integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ== follow-redirects@^1.14.0: version "1.15.1" @@ -5996,13 +5996,13 @@ get-func-name@^2.0.0: integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + version "1.1.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" + integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== dependencies: function-bind "^1.1.1" has "^1.0.3" - has-symbols "^1.0.1" + has-symbols "^1.0.3" get-package-type@^0.1.0: version "0.1.0" @@ -6207,9 +6207,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.6.0, globals@^13.9.0: - version "13.15.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.15.0.tgz#38113218c907d2f7e98658af246cef8b77e90bac" - integrity sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog== + version "13.17.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" + integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== dependencies: type-fest "^0.20.2" @@ -6388,9 +6388,9 @@ he@1.2.0: integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== highlight.js@*: - version "11.5.1" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.5.1.tgz#027c24e4509e2f4dcd00b4a6dda542ce0a1f7aea" - integrity sha512-LKzHqnxr4CrD2YsNoIf/o5nJ09j4yi/GcH5BnYz9UnVpZdS4ucMgvP61TDty5xJcFGRjnH4DpujkS9bHT3hq0Q== + version "11.6.0" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.6.0.tgz#a50e9da05763f1bb0c1322c8f4f755242cff3f5a" + integrity sha512-ig1eqDzJaB0pqEvlPVIpSSyMaO92bH1N2rJpLMN/nX396wTpDA4Eq0uK+7I/2XG17pFaaKE0kjV/XPeGt7Evjw== highlight.js@10.4.1: version "10.4.1" @@ -6678,10 +6678,10 @@ inversify@^5.1.1: resolved "https://registry.yarnpkg.com/inversify/-/inversify-5.1.1.tgz#6fbd668c591337404e005a1946bfe0d802c08730" integrity sha512-j8grHGDzv1v+8T1sAQ+3boTCntFPfvxLCkNcxB1J8qA0lUN+fAlSyYd+RXKvaPRL4AGyPxViutBEJHNXOyUdFQ== -ip@^1.1.5: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" - integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== +ip@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" + integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== ipaddr.js@1.9.1: version "1.9.1" @@ -6732,7 +6732,7 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.8.1: +is-core-module@^2.5.0, is-core-module@^2.8.1, is-core-module@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== @@ -6870,11 +6870,11 @@ is-shared-array-buffer@^1.0.2: call-bind "^1.0.2" is-ssh@^1.3.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.3.3.tgz#7f133285ccd7f2c2c7fc897b771b53d95a2b2c7e" - integrity sha512-NKzJmQzJfEEma3w5cJNcUMxoXfDjz0Zj0eyCalHn2E6VOwlzjZo0yuO2fcBSf8zhFuVCL/82/r5gRcoi6aEPVQ== + version "1.4.0" + resolved "https://registry.yarnpkg.com/is-ssh/-/is-ssh-1.4.0.tgz#4f8220601d2839d8fa624b3106f8e8884f01b8b2" + integrity sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ== dependencies: - protocols "^1.1.0" + protocols "^2.0.1" is-stream@^1.1.0: version "1.1.0" @@ -7012,9 +7012,9 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.0.2: - version "3.1.4" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" - integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== + version "3.1.5" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" @@ -7174,9 +7174,9 @@ jsonc-parser@^2.2.0: integrity sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg== jsonc-parser@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22" - integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.1.0.tgz#73b8f0e5c940b83d03476bc2e51a20ef0932615d" + integrity sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg== jsonfile@^4.0.0: version "4.0.0" @@ -7210,11 +7210,11 @@ jsprim@^1.2.2: verror "1.10.0" "jsx-ast-utils@^2.4.1 || ^3.0.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.0.tgz#e624f259143b9062c92b6413ff92a164c80d3ccb" - integrity sha512-XzO9luP6L0xkxwhIJMTJQpZo/eeN60K08jHdexfD569AGxeNug6UketeHXEhROoM8aR7EcUoOQmIhcJQjcuq8Q== + version "3.3.2" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.2.tgz#afe5efe4332cd3515c065072bd4d6b0aa22152bd" + integrity sha512-4ZCADZHRkno244xlNnn4AOG6sRQ7iBZ5BbgZ4vW4y5IZw7cVUD1PPeblm1xx/nfmMxPdt/LHsXZW8z/j58+l9Q== dependencies: - array-includes "^3.1.4" + array-includes "^3.1.5" object.assign "^4.1.2" just-extend@^4.0.2: @@ -7238,9 +7238,9 @@ keyv@^3.0.0: json-buffer "3.0.0" keyv@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.3.0.tgz#b4352e0e4fe7c94111947d6738a6d3fe7903027c" - integrity sha512-C30Un9+63J0CsR7Wka5quXKqYZsT6dcRQ2aOwGcSc3RiQ4HGWpTAHlCA+puNfw2jA/s11EsxA1nCXgZRuRKMQQ== + version "4.3.3" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.3.3.tgz#6c1bcda6353a9e96fc1b4e1aeb803a6e35090ba9" + integrity sha512-AcysI17RvakTh8ir03+a3zJr5r0ovnAH/XTXei/4HIv3bL2K/jzvgivLK9UuI/JbU1aJjM3NSAnVvVVd3n+4DQ== dependencies: compress-brotli "^1.3.8" json-buffer "3.0.1" @@ -7547,9 +7547,9 @@ lru-cache@^6.0.0: yallist "^4.0.0" lru-cache@^7.7.1: - version "7.10.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.10.1.tgz#db577f42a94c168f676b638d15da8fb073448cab" - integrity sha512-BQuhQxPuRl79J5zSXRP+uNzPOyZw2oFI9JLRQ80XswSvg21KMKNtQza9eF42rfI/3Z40RvzBdXgziEkudzjo8A== + version "7.13.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.13.1.tgz#267a81fbd0881327c46a81c5922606a2cfe336c4" + integrity sha512-CHqbAq7NFlW3RSnoWXLJBxCWaZVBrfa9UEHId2M3AW8iEBurbqduNexEUCGc3SHc6iCYXNJCDi903LajSVAEPQ== lunr@^2.3.9: version "2.3.9" @@ -7557,9 +7557,9 @@ lunr@^2.3.9: integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== luxon@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/luxon/-/luxon-2.4.0.tgz#9435806545bb32d4234dab766ab8a3d54847a765" - integrity sha512-w+NAwWOUL5hO0SgwOHsMBAmZ15SoknmQXhSO0hIbJCAmPKSsGeK8MlmhYh2w6Iib38IxN2M+/ooXWLbeis7GuA== + version "2.5.0" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-2.5.0.tgz#098090f67d690b247e83c090267a60b1aa8ea96c" + integrity sha512-IDkEPB80Rb6gCAU+FEib0t4FeJ4uVOuX1CQ9GsvU3O+JAGIgu0J7sf1OarXKaKDygTZIoJyU6YdZzTFRu+YR0A== lzma-native@^8.0.5: version "8.0.6" @@ -7598,9 +7598,9 @@ make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: semver "^6.0.0" make-fetch-happen@^10.0.3: - version "10.1.7" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.1.7.tgz#b1402cb3c9fad92b380ff3a863cdae5414a42f76" - integrity sha512-J/2xa2+7zlIUKqfyXDCXFpH3ypxO4k3rgkZHPSZkyUYcBT/hM80M3oyKLM/9dVriZFiGeGGS2Ei+0v2zfhqj3Q== + version "10.2.0" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.0.tgz#0bde3914f2f82750b5d48c6d2294d2c74f985e5b" + integrity sha512-OnEfCLofQVJ5zgKwGk55GaqosqKjaR6khQlJY3dBAA+hM25Bc5CmX5rKUfVut+rYA3uidA7zb7AvcglU87rPRg== dependencies: agentkeepalive "^4.2.1" cacache "^16.1.0" @@ -7640,7 +7640,7 @@ make-fetch-happen@^8.0.9: socks-proxy-agent "^5.0.0" ssri "^8.0.0" -make-fetch-happen@^9.0.1, make-fetch-happen@^9.1.0: +make-fetch-happen@^9.0.1: version "9.1.0" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== @@ -7694,9 +7694,9 @@ markdown-it@^12.3.2: uc.micro "^1.0.5" marked@^4.0.16: - version "4.0.16" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.0.16.tgz#9ec18fc1a723032eb28666100344d9428cf7a264" - integrity sha512-wahonIQ5Jnyatt2fn8KqF/nIqZM8mh3oRu2+l5EANGMhu6RFjiSG52QNE2eWzFMI94HqYSgN184NurgNG6CztA== + version "4.0.18" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.0.18.tgz#cd0ac54b2e5610cfb90e8fd46ccaa8292c9ed569" + integrity sha512-wbLDJ7Zh0sqA0Vdg6aqlbT+yPxqLblpAZh1mK2+AO2twQkPywvvqQNfEPVwSSRjZ7dZcdeVBIAgiO7MMp3Dszw== matcher@^3.0.0: version "3.0.0" @@ -7914,9 +7914,9 @@ minipass@^2.6.0, minipass@^2.9.0: yallist "^3.0.0" minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3, minipass@^3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee" - integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== + version "3.3.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.4.tgz#ca99f95dd77c43c7a76bf51e6d200025eee0ffae" + integrity sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw== dependencies: yallist "^4.0.0" @@ -8189,9 +8189,9 @@ node-fetch@^2.6.1, node-fetch@^2.6.7: whatwg-url "^5.0.0" node-gyp-build@^4.2.1: - version "4.4.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" - integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== + version "4.5.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.5.0.tgz#7a64eefa0b21112f89f58379da128ac177f20e40" + integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg== node-gyp@^5.0.2: version "5.1.1" @@ -8226,26 +8226,10 @@ node-gyp@^7.1.0: tar "^6.0.2" which "^2.0.2" -node-gyp@^8.4.0: - version "8.4.1" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.4.1.tgz#3d49308fc31f768180957d6b5746845fbd429937" - integrity sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w== - dependencies: - env-paths "^2.2.0" - glob "^7.1.4" - graceful-fs "^4.2.6" - make-fetch-happen "^9.1.0" - nopt "^5.0.0" - npmlog "^6.0.0" - rimraf "^3.0.2" - semver "^7.3.5" - tar "^6.1.2" - which "^2.0.2" - node-gyp@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.0.0.tgz#e1da2067427f3eb5bb56820cb62bc6b1e4bd2089" - integrity sha512-Ma6p4s+XCTPxCuAMrOA/IJRmVy16R8Sdhtwl4PrCr7IBlj4cPawF0vg/l7nOT1jPbuNS7lIRJpBSvVsXwEZuzw== + version "9.1.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.1.0.tgz#c8d8e590678ea1f7b8097511dedf41fc126648f8" + integrity sha512-HkmN0ZpQJU7FLbJauJTHkHlSVAXlNGDAzH/VYFZGDOnFyn/Na3GlNJfkudmufOdS6/jNFhy88ObzL7ERz9es1g== dependencies: env-paths "^2.2.0" glob "^7.1.4" @@ -8272,10 +8256,10 @@ node-pty@0.11.0-beta17: dependencies: nan "^2.14.0" -node-releases@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.5.tgz#280ed5bc3eba0d96ce44897d8aee478bfb3d9666" - integrity sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q== +node-releases@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" + integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== noop-logger@^0.1.1: version "0.1.1" @@ -8481,9 +8465,9 @@ npmlog@^6.0.0: set-blocking "^2.0.0" nsfw@^2.1.2: - version "2.2.1" - resolved "https://registry.yarnpkg.com/nsfw/-/nsfw-2.2.1.tgz#0d3292be1223731072c47d3f1901780e520f0870" - integrity sha512-xtkRpIu7t37t/fH4Hsx8RSgv24MIUMULY7DppJP+RgHpk0sl4JM4adbm/jXhjaGFy7k6HtB5RKAVrD9ARa1gKw== + version "2.2.2" + resolved "https://registry.yarnpkg.com/nsfw/-/nsfw-2.2.2.tgz#9fc64a0ca4bc38e180dd74935e0f295913e2153f" + integrity sha512-a2xt1Nx8Sz+E8eA5Ehgb3UONlrk1s5TpeoVh1XiqS0AI0wI94B7x4qoh6C11rNNX4fPOc3iC/wh4mcY9GWOgOQ== dependencies: node-addon-api "*" @@ -8493,9 +8477,9 @@ number-is-nan@^1.0.0: integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== nwsapi@^2.0.7: - version "2.2.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + version "2.2.1" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.1.tgz#10a9f268fbf4c461249ebcfe38e359aa36e2577c" + integrity sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg== nyc@^15.0.0: version "15.1.0" @@ -8896,9 +8880,9 @@ parse-json@^5.0.0: lines-and-columns "^1.1.6" parse-path@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.3.tgz#82d81ec3e071dcc4ab49aa9f2c9c0b8966bb22bf" - integrity sha512-9Cepbp2asKnWTJ9x2kpw6Fe8y9JDbqwahGCTvklzd/cEq5C5JC59x2Xb0Kx+x0QZ8bvNquGO8/BWP0cwBHzSAA== + version "4.0.4" + resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-4.0.4.tgz#4bf424e6b743fb080831f03b536af9fc43f0ffea" + integrity sha512-Z2lWUis7jlmXC1jeOG9giRO2+FsuyNipeQ43HAjqAZjwSe3SEf+q/84FGPHoso3kyntbxa4c4i77t3m6fGf8cw== dependencies: is-ssh "^1.3.0" protocols "^1.4.0" @@ -8906,9 +8890,9 @@ parse-path@^4.0.0: query-string "^6.13.8" parse-url@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-6.0.0.tgz#f5dd262a7de9ec00914939220410b66cff09107d" - integrity sha512-cYyojeX7yIIwuJzledIHeLUBVJ6COVLeT4eF+2P6aKVzwvgKQPndCBv3+yQ7pcWjqToYwaligxzSYNNmGoMAvw== + version "6.0.3" + resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-6.0.3.tgz#d8eab63c8c7e6dee850434763c4e6c5e7e57a45b" + integrity sha512-gxeYC5LVOWg1po3HjHF1JHyyI+kDp/ziEGWUv+smkonT//KRI8TM0zi+yj4e2EZWZ+WGiTPIG1WJSkWZE7isWg== dependencies: is-ssh "^1.3.0" normalize-url "^6.1.0" @@ -8970,7 +8954,7 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6, path-parse@^1.0.7: +path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== @@ -9251,7 +9235,7 @@ promzard@^0.3.0: dependencies: read "1" -prop-types@^15.5.6, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.5.6, prop-types@^15.6.1, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -9270,11 +9254,16 @@ proto-list@~1.2.1: resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== -protocols@^1.1.0, protocols@^1.4.0: +protocols@^1.4.0: version "1.4.8" resolved "https://registry.yarnpkg.com/protocols/-/protocols-1.4.8.tgz#48eea2d8f58d9644a4a32caae5d5db290a075ce8" integrity sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg== +protocols@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.1.tgz#8f155da3fc0f32644e83c5782c8e8212ccf70a86" + integrity sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q== + proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -9306,9 +9295,9 @@ pseudomap@^1.0.2: integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== psl@^1.1.28, psl@^1.1.33: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== pump@^1.0.0: version "1.0.3" @@ -9362,13 +9351,20 @@ q@^1.5.1: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== -qs@6.10.3, qs@^6.9.4: +qs@6.10.3: version "6.10.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== dependencies: side-channel "^1.0.4" +qs@^6.9.4: + 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.5.2: version "6.5.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" @@ -9440,15 +9436,13 @@ react-autosize-textarea@^7.0.0: line-height "^0.3.1" prop-types "^15.5.6" -react-dom@^16.8.0: - version "16.14.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89" - integrity sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw== +react-dom@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - scheduler "^0.19.1" + scheduler "^0.23.0" react-is@^16.13.1: version "16.13.1" @@ -9488,14 +9482,12 @@ react-virtualized@^9.20.0: prop-types "^15.7.2" react-lifecycles-compat "^3.0.4" -react@^16.8.0: - version "16.14.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" - integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== +react@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" read-cmd-shim@^2.0.0: version "2.0.0" @@ -9552,7 +9544,7 @@ read-package-tree@^5.3.1: read-pkg-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= + integrity sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw== dependencies: find-up "^2.0.0" read-pkg "^3.0.0" @@ -9569,7 +9561,7 @@ read-pkg-up@^7.0.1: read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== dependencies: load-json-file "^4.0.0" normalize-package-data "^2.3.2" @@ -9588,14 +9580,14 @@ read-pkg@^5.2.0: read@1, read@~1.0.1: version "1.0.7" resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" - integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= + integrity sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ== dependencies: mute-stream "~0.0.4" readable-stream@1.1.x: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= + integrity sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ== dependencies: core-util-is "~1.0.0" inherits "~2.0.1" @@ -9644,7 +9636,7 @@ readdirp@~3.2.0: recast@^0.11.17: version "0.11.23" resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" - integrity sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM= + integrity sha512-+nixG+3NugceyR8O1bLU45qs84JgI3+8EauyRZafLgC9XbdAOIVgwV1Pe2da0YzGo62KzWoZwUpVEQf6qNAXWA== dependencies: ast-types "0.9.6" esprima "~3.1.0" @@ -9686,7 +9678,7 @@ regenerate@^1.4.2: regenerator-runtime@^0.10.5: version "0.10.5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" - integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= + integrity sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w== regenerator-runtime@^0.11.0: version "0.11.1" @@ -9719,10 +9711,10 @@ regexpp@^3.1.0: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== -regexpu-core@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.0.1.tgz#c531122a7840de743dcf9c83e923b5560323ced3" - integrity sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw== +regexpu-core@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.1.0.tgz#2f8504c3fd0ebe11215783a41541e21c79942c6d" + integrity sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA== dependencies: regenerate "^1.4.2" regenerate-unicode-properties "^10.0.1" @@ -9746,7 +9738,7 @@ regjsparser@^0.8.2: release-zalgo@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" - integrity sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA= + integrity sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA== dependencies: es6-error "^4.0.1" @@ -9803,7 +9795,7 @@ requestretry@^7.0.0: require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-from-string@^2.0.2: version "2.0.2" @@ -9838,33 +9830,34 @@ resolve-from@^5.0.0: integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.3.2, resolve@^1.9.0: - version "1.22.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" - integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== dependencies: - is-core-module "^2.8.1" + is-core-module "^2.9.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" resolve@^2.0.0-next.3: - version "2.0.0-next.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" - integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== + version "2.0.0-next.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== dependencies: lowercase-keys "^1.0.0" responselike@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723" - integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" + integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== dependencies: lowercase-keys "^2.0.0" @@ -9879,7 +9872,7 @@ restore-cursor@^3.1.0: retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== reusify@^1.0.4: version "1.0.4" @@ -9922,7 +9915,7 @@ roarr@^2.15.3: route-parser@^0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/route-parser/-/route-parser-0.0.5.tgz#7d1d09d335e49094031ea16991a4a79b01bbe1f4" - integrity sha1-fR0J0zXkkJQDHqFpkaSnmwG74fQ= + integrity sha512-nsii+MXoNb7NyF05LP9kaktx6AoBVT/7zUgDnzIb5IoYAvYkbZOAuoLJjVdsyEVxWv0swCxWkKDK4cMva+WDBA== run-async@^2.4.0: version "2.4.1" @@ -9939,7 +9932,7 @@ run-parallel@^1.1.9: rx@2.3.24: version "2.3.24" resolved "https://registry.yarnpkg.com/rx/-/rx-2.3.24.tgz#14f950a4217d7e35daa71bbcbe58eff68ea4b2b7" - integrity sha1-FPlQpCF9fjXapxu8vljv9o6ksrc= + integrity sha512-Ue4ZB7Dzbn2I9sIj8ws536nOP2S53uypyCkCz9q0vlYD5Kn6/pu4dE+wt2ZfFzd9m73hiYKnnCb1OyKqc+MRkg== rxjs@^6.6.0: version "6.6.7" @@ -9968,13 +9961,12 @@ sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -scheduler@^0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" - integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" schema-utils@^2.6.5: version "2.7.1" @@ -10014,7 +10006,7 @@ seek-bzip@^1.0.5: semver-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" - integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= + integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: version "5.7.1" @@ -10091,12 +10083,12 @@ serve-static@1.15.0: set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== setimmediate@^1.0.5, setimmediate@~1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== setprototypeof@1.2.0: version "1.2.0" @@ -10125,7 +10117,7 @@ shebang-regex@^3.0.0: shell-env@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/shell-env/-/shell-env-0.3.0.tgz#2250339022989165bda4eb7bf383afeaaa92dc34" - integrity sha1-IlAzkCKYkWW9pOt784Ov6qqS3DQ= + integrity sha512-VrC6OSm5riGAFWvlYExA80Rrlfi4STsztNXjyet9Jf20hbiVeeKvJIesb92gJk7zlmpQjB0wOZpy8ClzVdPVWQ== dependencies: default-shell "^1.0.0" execa "^0.5.0" @@ -10134,7 +10126,7 @@ shell-env@^0.3.0: shell-path@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/shell-path/-/shell-path-2.1.0.tgz#ea7d06ae1070874a1bac5c65bb9bdd62e4f67a38" - integrity sha1-6n0GrhBwh0obrFxlu5vdYuT2ejg= + integrity sha512-w+mbrnpA+r5jSFS4MgFfxZJ1Wx8qMKkR4gvQ+wgaZEoZCMMYZ6Yl/dcNjW/zLMfmx5a9IVIFwGAtUJcnDMmFrg== dependencies: shell-env "^0.3.0" @@ -10195,7 +10187,7 @@ sinon@^12.0.0: slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + integrity sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg== slash@^3.0.0: version "3.0.0" @@ -10214,7 +10206,7 @@ slice-ansi@^4.0.0: slide@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= + integrity sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw== smart-buffer@^4.2.0: version "4.2.0" @@ -10239,9 +10231,9 @@ socket.io-client@4.4.1: socket.io-parser "~4.1.1" socket.io-parser@~4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.4.tgz#9ea21b0d61508d18196ef04a2c6b9ab630f4c2b0" - integrity sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g== + version "4.0.5" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.0.5.tgz#cb404382c32324cc962f27f3a44058cf6e0552df" + integrity sha512-sNjbT9dX63nqUFIOv95tTVm6elyIU4RvB1m8dOeZt+IgWwcWklFDOdmGcfo3zSiRsnR/3pJkjY5lfoGqEe4Eig== dependencies: "@types/component-emitter" "^1.2.10" component-emitter "~1.3.0" @@ -10295,17 +10287,17 @@ socks-proxy-agent@^7.0.0: socks "^2.6.2" socks@^2.3.3, socks@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.2.tgz#ec042d7960073d40d94268ff3bb727dc685f111a" - integrity sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA== + version "2.7.0" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.0.tgz#f9225acdb841e874dca25f870e9130990f3913d0" + integrity sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA== dependencies: - ip "^1.1.5" + ip "^2.0.0" smart-buffer "^4.2.0" sort-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" - integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= + integrity sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg== dependencies: is-plain-obj "^1.0.0" @@ -10351,12 +10343,12 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: source-map@~0.5.0: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== spawn-command@^0.0.2-1: version "0.0.2-1" resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" - integrity sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A= + integrity sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg== spawn-wrap@^2.0.0: version "2.0.0" @@ -10411,7 +10403,7 @@ split2@^3.0.0: split@0.3: version "0.3.3" resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" - integrity sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8= + integrity sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA== dependencies: through "2" @@ -10430,7 +10422,7 @@ sprintf-js@^1.1.2: sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== sshpk@^1.7.0: version "1.17.0" @@ -10469,12 +10461,12 @@ statuses@2.0.1: stealthy-require@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + integrity sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g== stream-combiner@~0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" - integrity sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ= + integrity sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw== dependencies: duplexer "~0.1.1" @@ -10486,7 +10478,7 @@ streamsearch@^1.1.0: strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" - integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= + integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== string-argv@^0.1.1: version "0.1.2" @@ -10496,7 +10488,7 @@ string-argv@^0.1.1: string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" @@ -10570,7 +10562,7 @@ string_decoder@^1.1.1: string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== string_decoder@~1.1.1: version "1.1.1" @@ -10582,14 +10574,14 @@ string_decoder@~1.1.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" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== dependencies: ansi-regex "^3.0.0" @@ -10610,7 +10602,7 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== strip-bom@^4.0.0: version "4.0.0" @@ -10627,7 +10619,7 @@ strip-dirs@^2.0.0: strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== strip-final-newline@^2.0.0: version "2.0.0" @@ -10644,7 +10636,7 @@ strip-indent@^3.0.0: strip-json-comments@2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" @@ -10692,7 +10684,7 @@ supports-color@6.0.0: supports-color@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= + integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== dependencies: has-flag "^1.0.0" @@ -10822,7 +10814,7 @@ tdigest@^0.1.1: temp-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" - integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= + integrity sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ== temp-write@^4.0.0: version "4.0.0" @@ -10862,9 +10854,9 @@ terser-webpack-plugin@^5.1.3: terser "^5.7.2" terser@^5.7.2: - version "5.14.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.0.tgz#eefeec9af5153f55798180ee2617f390bdd285e2" - integrity sha512-JC6qfIEkPBd9j1SMO3Pfn+A6w2kQV54tv+ABQLgZr7dA3k/DL/OBoYSWxzVpZev3J+bUHXfr55L8Mox7AaNo6g== + version "5.14.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.2.tgz#9ac9f22b06994d736174f4091aa368db896f1c10" + integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA== dependencies: "@jridgewell/source-map" "^0.3.2" acorn "^8.5.0" @@ -10888,7 +10880,7 @@ text-extensions@^1.0.0: text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== through2@^2.0.0: version "2.0.5" @@ -10908,7 +10900,7 @@ through2@^4.0.0: 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" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== tmp@^0.0.33: version "0.0.33" @@ -10925,7 +10917,7 @@ to-buffer@^1.1.1: to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-readable-stream@^1.0.0: version "1.0.0" @@ -10964,7 +10956,7 @@ tough-cookie@^4.0.0: tr46@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== dependencies: punycode "^2.1.0" @@ -10978,7 +10970,7 @@ tr46@^2.1.0: tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== trash@^6.1.1: version "6.1.1" @@ -10998,7 +10990,7 @@ trash@^6.1.1: "traverse@>=0.3.0 <0.4": version "0.3.9" resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" - integrity sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk= + integrity sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ== tree-kill@^1.1.0: version "1.2.2" @@ -11013,7 +11005,7 @@ trim-newlines@^3.0.0: trim-repeated@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" - integrity sha1-42RqLqTokTEr9+rObPsFOAvAHCE= + integrity sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg== dependencies: escape-string-regexp "^1.0.2" @@ -11078,7 +11070,7 @@ tsutils@^3.0.0, tsutils@^3.17.1, tsutils@^3.21.0: tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== dependencies: safe-buffer "^5.0.1" @@ -11090,7 +11082,7 @@ tunnel@^0.0.6: tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" @@ -11102,7 +11094,7 @@ type-check@^0.4.0, type-check@~0.4.0: type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== dependencies: prelude-ls "~1.1.2" @@ -11146,10 +11138,10 @@ type-fest@^0.8.0, type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -type-fest@^1.0.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" - integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== +type-fest@^2.12.2: + version "2.17.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.17.0.tgz#c677030ce61e5be0c90c077d52571eb73c506ea9" + integrity sha512-U+g3/JVXnOki1kLSc+xZGPRll3Ah9u2VIG6Sn9iH9YX6UkPERmt6O/0fIyTgsd2/whV0+gAaHAg8fz6sG1QzMA== type-is@^1.6.4, type-is@~1.6.18: version "1.6.18" @@ -11169,7 +11161,7 @@ typedarray-to-buffer@^3.1.5: typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== typedoc-plugin-external-module-map@1.3.2: version "1.3.2" @@ -11177,9 +11169,9 @@ typedoc-plugin-external-module-map@1.3.2: integrity sha512-xs+vQ7XeVOvXlomdAw3xpwm8W59pPQPmfHTl5WvH2OkPFEO7EhABikLlTzLRYCOCEdkRg4LcnCblKmARN0wCIA== typedoc@^0.22.11: - version "0.22.17" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.22.17.tgz#bc51cc95f569040112504300831cdac4f8089b7b" - integrity sha512-h6+uXHVVCPDaANzjwzdsj9aePBjZiBTpiMpBBeyh1zcN2odVsDCNajz8zyKnixF93HJeGpl34j/70yoEE5BfNg== + version "0.22.18" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.22.18.tgz#1d000c33b66b88fd8cdfea14a26113a83b7e6591" + integrity sha512-NK9RlLhRUGMvc6Rw5USEYgT4DVAUFk7IF7Q6MYfpJ88KnTZP7EneEa4RcP+tX1auAcz7QT1Iy0bUSZBYYHdoyA== dependencies: glob "^8.0.3" lunr "^2.3.9" @@ -11198,19 +11190,19 @@ uc.micro@^1.0.1, uc.micro@^1.0.5: integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== uglify-js@^3.1.4: - version "3.16.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.16.0.tgz#b778ba0831ca102c1d8ecbdec2d2bdfcc7353190" - integrity sha512-FEikl6bR30n0T3amyBh3LoiBdqHRy/f4H80+My34HOesOKyHfOsxAPAxOoqC0JUnC1amnO0IwkYC3sko51caSw== + version "3.16.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.16.3.tgz#94c7a63337ee31227a18d03b8a3041c210fd1f1d" + integrity sha512-uVbFqx9vvLhQg0iBaau9Z75AxWJ8tqM9AV890dIZCLApF4rTcyHwmAvLeEdYRs+BzYWu8Iw81F79ah0EfTXbaw== uid-number@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" - integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= + integrity sha512-c461FXIljswCuscZn67xq9PpszkPT6RjheWFQTgCyabJrTUozElanb0YEqv2UGgk247YpcJkFBuSGNvBlpXM9w== umask@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" - integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0= + integrity sha512-lE/rxOhmiScJu9L6RTNVgB/zZbF+vGC0/p6D3xnkAePI2o0sMyFG966iR5Ki50OI/0mNi2yaRnxfLsPmEZF/JA== umd-compat-loader@^2.1.2: version "2.1.2" @@ -11294,7 +11286,7 @@ universalify@^2.0.0: unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== unzip-stream@^0.3.0: version "0.3.1" @@ -11329,6 +11321,14 @@ upath@^2.0.1: resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== +update-browserslist-db@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz#be06a5eedd62f107b7c19eb5bcefb194411abf38" + integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -11339,33 +11339,33 @@ uri-js@^4.2.2: url-parse-lax@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== dependencies: prepend-http "^2.0.0" user-home@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" - integrity sha1-nHC/2Babwdy/SGBODwS4tJzenp8= + integrity sha512-KMWqdlOcjCYdtIJpicDSFBQ8nFwS2i9sslAd6f4+CBGcU4gist2REnr2fxj2YocvJFxSF3ZOHLYLVZnUxv4BZQ== dependencies: os-homedir "^1.0.0" util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== util-promisify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/util-promisify/-/util-promisify-2.1.0.tgz#3c2236476c4d32c5ff3c47002add7c13b9a82a53" - integrity sha1-PCI2R2xNMsX/PEcAKt18E7moKlM= + integrity sha512-K+5eQPYs14b3+E+hmE2J6gCZ4JmMl9DbYS6BeP2CHq6WMuNxErxf5B/n0fz85L8zUuoO6rIzNNmIQDu/j+1OcA== dependencies: object.getownpropertydescriptors "^2.0.3" utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== uuid@^3.3.2: version "3.4.0" @@ -11395,7 +11395,7 @@ v8-to-istanbul@^1.2.1: valid-filename@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/valid-filename/-/valid-filename-2.0.1.tgz#0768d6f364b1ed3bdf68f0d15abffb0d9d6cecaf" - integrity sha1-B2jW82Sx7TvfaPDRWr/7DZ1s7K8= + integrity sha512-7eF/iUZ5SPd3FighoKgatSjXDJ25Vopo/6yvEKGyX4FIeZVHcLjHmyvbQ1WdFD9RQZ9PoBA7nrSxxAz/oC64SQ== dependencies: filename-reserved-regex "^2.0.0" @@ -11410,19 +11410,19 @@ validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: validate-npm-package-name@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" - integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= + integrity sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw== dependencies: builtins "^1.0.3" vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" @@ -11431,7 +11431,7 @@ verror@1.10.0: vhost@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/vhost/-/vhost-3.0.2.tgz#2fb1decd4c466aa88b0f9341af33dc1aff2478d5" - integrity sha1-L7HezUxGaqiLD5NBrzPcGv8keNU= + integrity sha512-S3pJdWrpFWrKMboRU4dLYgMrTgoPALsmYwOvyebK2M6X95b9kQrjZy5rwl3uzzpfpENe/XrNYu/2U+e7/bmT5g== vscode-debugprotocol@^1.32.0: version "1.51.0" @@ -11515,7 +11515,7 @@ w3c-hr-time@^1.0.1: dependencies: browser-process-hrtime "^1.0.0" -watchpack@^2.3.1: +watchpack@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== @@ -11526,14 +11526,14 @@ watchpack@^2.3.1: wcwidth@^1.0.0, wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== dependencies: defaults "^1.0.3" webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== webidl-conversions@^4.0.2: version "4.0.2" @@ -11578,20 +11578,20 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.48.0: - version "5.73.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.73.0.tgz#bbd17738f8a53ee5760ea2f59dce7f3431d35d38" - integrity sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA== + version "5.74.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.74.0.tgz#02a5dac19a17e0bb47093f2be67c695102a55980" + integrity sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA== 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" - acorn "^8.4.1" + acorn "^8.7.1" acorn-import-assertions "^1.7.6" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.9.3" + enhanced-resolve "^5.10.0" es-module-lexer "^0.9.0" eslint-scope "5.1.1" events "^3.2.0" @@ -11604,7 +11604,7 @@ webpack@^5.48.0: schema-utils "^3.1.0" tapable "^2.1.1" terser-webpack-plugin "^5.1.3" - watchpack "^2.3.1" + watchpack "^2.4.0" webpack-sources "^3.2.3" whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: @@ -11622,7 +11622,7 @@ whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" webidl-conversions "^3.0.0" @@ -11668,7 +11668,7 @@ which-boxed-primitive@^1.0.2: which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== which-pm-runs@^1.0.0: version "1.1.0" @@ -11716,12 +11716,12 @@ word-wrap@^1.2.3, word-wrap@~1.2.3: wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= + integrity sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw== worker-loader@^3.0.8: version "3.0.8" @@ -11761,7 +11761,7 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@^2.0.0, write-file-atomic@^2.4.2: version "2.4.3" @@ -11785,7 +11785,7 @@ write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: 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" - integrity sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8= + integrity sha512-84+F0igFp2dPD6UpAQjOUX3CdKUOqUzn6oE9sDBNzUXINR5VceJ1rauZltqQB/bcYsx3EpKys4C7/PivKUAiWQ== dependencies: detect-indent "^5.0.0" graceful-fs "^4.1.2" @@ -11842,9 +11842,9 @@ ws@^6.1.0: async-limiter "~1.0.0" ws@^7.1.2: - version "7.5.8" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.8.tgz#ac2729881ab9e7cbaf8787fe3469a48c5c7f636a" - integrity sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw== + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== ws@~8.2.3: version "8.2.3" @@ -11854,7 +11854,7 @@ ws@~8.2.3: xdg-basedir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2" - integrity sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I= + integrity sha512-NF1pPn594TaRSUO/HARoB4jK8I+rWgcpVlpQCK6/6o5PHyLUt2CSiDrpUZbQ6rROck+W2EwF8mBJcTs+W98J9w== dependencies: os-homedir "^1.0.0" @@ -11882,7 +11882,7 @@ xmlhttprequest-ssl@~2.0.0: xregexp@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" - integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM= + integrity sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA== xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" @@ -11900,9 +11900,9 @@ xterm-addon-search@^0.8.2: integrity sha512-I1863mjn8P6uVrqm/X+btalVsqjAKLhnhpbP7SavAOpEkI1jJhbHU2UTp7NjeRtcKTks6UWk/ycgds5snDSejg== xterm@^4.16.0: - version "4.18.0" - resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.18.0.tgz#a1f6ab2c330c3918fb094ae5f4c2562987398ea1" - integrity sha512-JQoc1S0dti6SQfI0bK1AZvGnAxH4MVw45ZPFSO6FHTInAiau3Ix77fSxNx3mX4eh9OL4AYa8+4C8f5UvnSfppQ== + version "4.19.0" + resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.19.0.tgz#c0f9d09cd61de1d658f43ca75f992197add9ef6d" + integrity sha512-c3Cp4eOVsYY5Q839dR5IejghRPpxciGmLWWaP9g+ppfMeBChMeLa1DCA+pmX/jyDZ+zxFOmlJL/82qVdayVoGQ== y18n@^4.0.0: version "4.0.3" @@ -11917,7 +11917,7 @@ y18n@^5.0.5: yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== yallist@^3.0.0, yallist@^3.1.1: version "3.1.1" @@ -12036,7 +12036,7 @@ yargs@^17.0.1: yauzl@^2.10.0, yauzl@^2.4.2: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" - integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== dependencies: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" @@ -12044,7 +12044,7 @@ yauzl@^2.10.0, yauzl@^2.4.2: yeast@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" - integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= + integrity sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg== yocto-queue@^0.1.0: version "0.1.0"