diff --git a/.configurations/configuration.dsc.yaml b/.configurations/configuration.dsc.yaml
index 780b1dfa959..c41f115aff9 100644
--- a/.configurations/configuration.dsc.yaml
+++ b/.configurations/configuration.dsc.yaml
@@ -18,17 +18,6 @@ properties:
id: OpenJS.NodeJS.LTS
version: "20.14.0"
source: winget
- - resource: NpmDsc/NpmPackage
- id: yarn
- dependsOn:
- - npm
- directives:
- description: Install Yarn
- allowPrerelease: true
- settings:
- Name: 'yarn'
- Global: true
- PackageDirectory: '${WinGetConfigRoot}\..\'
- resource: Microsoft.WinGet.DSC/WinGetPackage
directives:
description: Install Python 3.10
@@ -56,7 +45,7 @@ properties:
includeRecommended: true
components:
- Microsoft.VisualStudio.Workload.VCTools
- - resource: YarnDsc/YarnInstall
+ - resource: NpmDsc/NpmInstall
dependsOn:
- npm
directives:
diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
index 31d67db5fac..9be15a6afa1 100644
--- a/.devcontainer/Dockerfile
+++ b/.devcontainer/Dockerfile
@@ -1,4 +1,4 @@
-FROM mcr.microsoft.com/devcontainers/typescript-node:18-bookworm
+FROM mcr.microsoft.com/devcontainers/typescript-node:20-bookworm
ADD install-vscode.sh /root/
RUN /root/install-vscode.sh
@@ -7,8 +7,8 @@ RUN git config --system codespaces-theme.hide-status 1
USER node
RUN npm install -g node-gyp
-RUN YARN_CACHE="$(yarn cache dir)" && rm -rf "$YARN_CACHE" && ln -s /vscode-dev/yarn-cache "$YARN_CACHE"
+RUN NPM_CACHE="$(npm config get cache)" && rm -rf "$NPM_CACHE" && ln -s /vscode-dev/npm-cache "$NPM_CACHE"
RUN echo 'export DISPLAY="${DISPLAY:-:1}"' | tee -a ~/.bashrc >> ~/.zshrc
USER root
-CMD chown node:node /vscode-dev && sudo -u node mkdir -p /vscode-dev/yarn-cache && sleep inf
+CMD chown node:node /vscode-dev && sudo -u node mkdir -p /vscode-dev/npm-cache && sleep inf
diff --git a/.devcontainer/README.md b/.devcontainer/README.md
index 44965693380..5f6e1cd99f3 100644
--- a/.devcontainer/README.md
+++ b/.devcontainer/README.md
@@ -24,7 +24,7 @@ If you already have VS Code and Docker installed, you can click the badge above
4. Press Ctrl/Cmd + Shift + P or F1 and select **Dev Containers: Clone Repository in Container Volume...**.
- > **Tip:** While you can use your local source tree instead, operations like `yarn install` can be slow on macOS or when using the Hyper-V engine on Windows. We recommend using the WSL filesystem on Windows or the "clone repository in container" approach on Windows and macOS instead since it uses "named volume" rather than the local filesystem.
+ > **Tip:** While you can use your local source tree instead, operations like `npm i` can be slow on macOS or when using the Hyper-V engine on Windows. We recommend using the WSL filesystem on Windows or the "clone repository in container" approach on Windows and macOS instead since it uses "named volume" rather than the local filesystem.
5. Type `https://github.com/microsoft/vscode` (or a branch or PR URL) in the input box and press Enter.
@@ -85,7 +85,7 @@ To start working with Code - OSS, follow these steps:
1. In your local VS Code client, open a terminal (Ctrl/Cmd + Shift + \`) and type the following commands:
```bash
- yarn install
+ npm i
bash scripts/code.sh
```
diff --git a/.devcontainer/devcontainer-lock.json b/.devcontainer/devcontainer-lock.json
index cbcde9bb109..fdd03c400cc 100644
--- a/.devcontainer/devcontainer-lock.json
+++ b/.devcontainer/devcontainer-lock.json
@@ -4,6 +4,11 @@
"version": "1.0.8",
"resolved": "ghcr.io/devcontainers/features/desktop-lite@sha256:e7dc4d37ab9e3d6e7ebb221bac741f5bfe07dae47025399d038b17af2ed8ddb7",
"integrity": "sha256:e7dc4d37ab9e3d6e7ebb221bac741f5bfe07dae47025399d038b17af2ed8ddb7"
+ },
+ "ghcr.io/devcontainers/features/rust:1": {
+ "version": "1.1.3",
+ "resolved": "ghcr.io/devcontainers/features/rust@sha256:aba6f47303b197976902bf544c786b5efecc03c238ff593583e5e74dfa9c7ccb",
+ "integrity": "sha256:aba6f47303b197976902bf544c786b5efecc03c238ff593583e5e74dfa9c7ccb"
}
}
}
\ No newline at end of file
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index f5adc4e1c46..75076a0f8b6 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -4,7 +4,8 @@
"dockerfile": "Dockerfile"
},
"features": {
- "ghcr.io/devcontainers/features/desktop-lite:1": {}
+ "ghcr.io/devcontainers/features/desktop-lite:1": {},
+ "ghcr.io/devcontainers/features/rust:1": {}
},
"containerEnv": {
"DISPLAY": "" // Allow the Dev Containers extension to set DISPLAY, post-create.sh will add it back in ~/.bashrc and ~/.zshrc if not set.
diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh
index 5b2deee6674..4e39a71c49d 100755
--- a/.devcontainer/post-create.sh
+++ b/.devcontainer/post-create.sh
@@ -1,4 +1,4 @@
#!/bin/sh
-yarn install --network-timeout 180000
-yarn electron
+npm i
+npm run electron
diff --git a/.eslintignore b/.eslintignore
index 12da4a432e1..a742b0ae304 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -31,6 +31,7 @@
**/src/vs/base/test/common/filters.perf.data.js
**/src/vs/loader.js
**/test/unit/assert.js
+**/test/unit/assert-esm.js
**/test/automation/out/**
**/typings/**
!.vscode
diff --git a/.eslintplugin/code-ensure-no-disposables-leak-in-test.ts b/.eslintplugin/code-ensure-no-disposables-leak-in-test.ts
index ae3089036a6..9d3044f50f4 100644
--- a/.eslintplugin/code-ensure-no-disposables-leak-in-test.ts
+++ b/.eslintplugin/code-ensure-no-disposables-leak-in-test.ts
@@ -12,7 +12,8 @@ export = new class EnsureNoDisposablesAreLeakedInTestSuite implements eslint.Rul
type: 'problem',
messages: {
ensure: 'Suites should include a call to `ensureNoDisposablesAreLeakedInTestSuite()` to ensure no disposables are leaked in tests.'
- }
+ },
+ fixable: 'code'
};
create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
@@ -30,6 +31,10 @@ export = new class EnsureNoDisposablesAreLeakedInTestSuite implements eslint.Rul
context.report({
node,
messageId: 'ensure',
+ fix: (fixer) => {
+ const updatedSrc = src.replace(/(suite\(.*\n)/, '$1\n\tensureNoDisposablesAreLeakedInTestSuite();\n');
+ return fixer.replaceText(node, updatedSrc);
+ }
});
}
},
diff --git a/.eslintplugin/code-import-patterns.ts b/.eslintplugin/code-import-patterns.ts
index 1f08bb4a4e8..460409514bc 100644
--- a/.eslintplugin/code-import-patterns.ts
+++ b/.eslintplugin/code-import-patterns.ts
@@ -12,19 +12,19 @@ import { createImportRuleListener } from './utils';
const REPO_ROOT = path.normalize(path.join(__dirname, '../'));
interface ConditionalPattern {
- when?: 'hasBrowser' | 'hasNode' | 'test';
+ when?: 'hasBrowser' | 'hasNode' | 'hasElectron' | 'test';
pattern: string;
}
interface RawImportPatternsConfig {
target: string;
- layer?: 'common' | 'worker' | 'browser' | 'electron-sandbox' | 'node' | 'electron-main';
+ layer?: 'common' | 'worker' | 'browser' | 'electron-sandbox' | 'node' | 'electron-utility' | 'electron-main';
test?: boolean;
restrictions: string | (string | ConditionalPattern)[];
}
interface LayerAllowRule {
- when: 'hasBrowser' | 'hasNode' | 'test';
+ when: 'hasBrowser' | 'hasNode' | 'hasElectron' | 'test';
allow: string[];
}
@@ -44,7 +44,9 @@ export = new class implements eslint.Rule.RuleModule {
readonly meta: eslint.Rule.RuleMetaData = {
messages: {
badImport: 'Imports violates \'{{restrictions}}\' restrictions. See https://github.com/microsoft/vscode/wiki/Source-Code-Organization',
- badFilename: 'Missing definition in `code-import-patterns` for this file. Define rules at https://github.com/microsoft/vscode/blob/main/.eslintrc.json'
+ badFilename: 'Missing definition in `code-import-patterns` for this file. Define rules at https://github.com/microsoft/vscode/blob/main/.eslintrc.json',
+ badAbsolute: 'Imports have to be relative to support ESM',
+ badExtension: 'Imports have to end with `.js` or `.css` to support ESM',
},
docs: {
url: 'https://github.com/microsoft/vscode/wiki/Source-Code-Organization'
@@ -77,13 +79,14 @@ export = new class implements eslint.Rule.RuleModule {
return this._optionsCache.get(options)!;
}
- type Layer = 'common' | 'worker' | 'browser' | 'electron-sandbox' | 'node' | 'electron-main';
+ type Layer = 'common' | 'worker' | 'browser' | 'electron-sandbox' | 'node' | 'electron-utility' | 'electron-main';
interface ILayerRule {
layer: Layer;
deps: string;
isBrowser?: boolean;
isNode?: boolean;
+ isElectron?: boolean;
}
function orSegment(variants: Layer[]): string {
@@ -96,11 +99,13 @@ export = new class implements eslint.Rule.RuleModule {
{ layer: 'browser', deps: orSegment(['common', 'browser']), isBrowser: true },
{ layer: 'electron-sandbox', deps: orSegment(['common', 'browser', 'electron-sandbox']), isBrowser: true },
{ layer: 'node', deps: orSegment(['common', 'node']), isNode: true },
- { layer: 'electron-main', deps: orSegment(['common', 'node', 'electron-main']), isNode: true },
+ { layer: 'electron-utility', deps: orSegment(['common', 'node', 'electron-utility']), isNode: true, isElectron: true },
+ { layer: 'electron-main', deps: orSegment(['common', 'node', 'electron-utility', 'electron-main']), isNode: true, isElectron: true },
];
let browserAllow: string[] = [];
let nodeAllow: string[] = [];
+ let electronAllow: string[] = [];
let testAllow: string[] = [];
for (const option of options) {
if (isLayerAllowRule(option)) {
@@ -108,6 +113,8 @@ export = new class implements eslint.Rule.RuleModule {
browserAllow = option.allow.slice(0);
} else if (option.when === 'hasNode') {
nodeAllow = option.allow.slice(0);
+ } else if (option.when === 'hasElectron') {
+ electronAllow = option.allow.slice(0);
} else if (option.when === 'test') {
testAllow = option.allow.slice(0);
}
@@ -135,9 +142,13 @@ export = new class implements eslint.Rule.RuleModule {
restrictions.push(...nodeAllow);
}
+ if (layerRule.isElectron) {
+ restrictions.push(...electronAllow);
+ }
+
for (const rawRestriction of rawRestrictions) {
let importPattern: string;
- let when: 'hasBrowser' | 'hasNode' | 'test' | undefined = undefined;
+ let when: 'hasBrowser' | 'hasNode' | 'hasElectron' | 'test' | undefined = undefined;
if (typeof rawRestriction === 'string') {
importPattern = rawRestriction;
} else {
@@ -147,6 +158,7 @@ export = new class implements eslint.Rule.RuleModule {
if (typeof when === 'undefined'
|| (when === 'hasBrowser' && layerRule.isBrowser)
|| (when === 'hasNode' && layerRule.isNode)
+ || (when === 'hasElectron' && layerRule.isElectron)
) {
restrictions.push(importPattern.replace(/\/\~$/, `/${layerRule.deps}/**`));
testRestrictions.push(importPattern.replace(/\/\~$/, `/test/${layerRule.deps}/**`));
@@ -181,8 +193,8 @@ export = new class implements eslint.Rule.RuleModule {
if (targetIsVS) {
// Always add "vs/nls" and "vs/amdX"
- restrictions.push('vs/nls');
- restrictions.push('vs/amdX'); // TODO@jrieken remove after ESM is real
+ restrictions.push('vs/nls.js');
+ restrictions.push('vs/amdX.js'); // TODO@jrieken remove after ESM is real
}
if (targetIsVS && option.layer) {
@@ -212,6 +224,25 @@ export = new class implements eslint.Rule.RuleModule {
}
private _checkImport(context: eslint.Rule.RuleContext, config: ImportPatternsConfig, node: TSESTree.Node, importPath: string) {
+ const targetIsVS = /^src\/vs\//.test(getRelativeFilename(context));
+ if (targetIsVS) {
+
+ // ESM: check for import ending with ".js" or ".css"
+ if (importPath[0] === '.' && !importPath.endsWith('.js') && !importPath.endsWith('.css')) {
+ context.report({
+ loc: node.loc,
+ messageId: 'badExtension',
+ });
+ }
+
+ // check for import being relative
+ if (importPath.startsWith('vs/')) {
+ context.report({
+ loc: node.loc,
+ messageId: 'badAbsolute',
+ });
+ }
+ }
// resolve relative paths
if (importPath[0] === '.') {
diff --git a/.eslintplugin/code-limited-top-functions.ts b/.eslintplugin/code-limited-top-functions.ts
new file mode 100644
index 00000000000..97eef9a6e9d
--- /dev/null
+++ b/.eslintplugin/code-limited-top-functions.ts
@@ -0,0 +1,70 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+import * as eslint from 'eslint';
+import { dirname, relative } from 'path';
+import minimatch from 'minimatch';
+
+export = new class implements eslint.Rule.RuleModule {
+
+ readonly meta: eslint.Rule.RuleMetaData = {
+ messages: {
+ layerbreaker: 'You are only allowed to define limited top level functions.'
+ },
+ schema: {
+ type: "array",
+ items: {
+ type: "object",
+ additionalProperties: {
+ type: "array",
+ items: {
+ type: "string"
+ }
+ }
+ }
+ }
+ };
+
+ create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
+ let fileRelativePath = relative(dirname(__dirname), context.getFilename());
+ if (!fileRelativePath.endsWith('/')) {
+ fileRelativePath += '/';
+ }
+ const ruleArgs = >context.options[0];
+
+ const matchingKey = Object.keys(ruleArgs).find(key => fileRelativePath.startsWith(key) || minimatch(fileRelativePath, key));
+ if (!matchingKey) {
+ // nothing
+ return {};
+ }
+
+ const restrictedFunctions = ruleArgs[matchingKey];
+
+ return {
+ FunctionDeclaration: (node: any) => {
+ const isTopLevel = node.parent.type === 'Program';
+ const functionName = node.id.name;
+ if (isTopLevel && !restrictedFunctions.includes(node.id.name)) {
+ context.report({
+ node,
+ message: `Top-level function '${functionName}' is restricted in this file. Allowed functions are: ${restrictedFunctions.join(', ')}.`
+ });
+ }
+ },
+ ExportNamedDeclaration(node: any) {
+ if (node.declaration && node.declaration.type === 'FunctionDeclaration') {
+ const functionName = node.declaration.id.name;
+ const isTopLevel = node.parent.type === 'Program';
+ if (isTopLevel && !restrictedFunctions.includes(node.declaration.id.name)) {
+ context.report({
+ node,
+ message: `Top-level function '${functionName}' is restricted in this file. Allowed functions are: ${restrictedFunctions.join(', ')}.`
+ });
+ }
+ }
+ }
+ }
+ }
+};
diff --git a/.eslintplugin/code-no-look-behind-regex.ts b/.eslintplugin/code-no-look-behind-regex.ts
deleted file mode 100644
index 800b59b6479..00000000000
--- a/.eslintplugin/code-no-look-behind-regex.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-/*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
-
-import * as eslint from 'eslint';
-import { TSESTree } from '@typescript-eslint/experimental-utils';
-import * as ESTree from 'estree';
-
-//------------------------------------------------------------------------------
-// Rule Definition
-//------------------------------------------------------------------------------
-
-const _positiveLookBehind = /\(\?<=.+/;
-const _negativeLookBehind = /\(\? {
- type RegexLiteral = TSESTree.Literal & { regex: { pattern: string; flags: string } };
- const pattern = (node).regex?.pattern;
- if (_containsLookBehind(pattern)) {
- context.report({
- node,
- message: 'Look behind assertions are not yet supported in all browsers'
- });
- }
- },
- // new Regex("...")
- ['NewExpression[callee.name="RegExp"] Literal']: (node: ESTree.Literal) => {
- if (_containsLookBehind(node.value)) {
- context.report({
- node,
- message: 'Look behind assertions are not yet supported in all browsers'
- });
- }
- }
- };
- }
-};
diff --git a/.eslintplugin/code-no-static-self-ref.ts b/.eslintplugin/code-no-static-self-ref.ts
new file mode 100644
index 00000000000..7c6e13032ae
--- /dev/null
+++ b/.eslintplugin/code-no-static-self-ref.ts
@@ -0,0 +1,56 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+import * as eslint from 'eslint';
+import { TSESTree } from '@typescript-eslint/experimental-utils';
+
+/**
+ * WORKAROUND for https://github.com/evanw/esbuild/issues/3823
+ */
+export = new class implements eslint.Rule.RuleModule {
+
+ create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
+
+ function checkProperty(inNode: any) {
+
+ const classDeclaration = context.getAncestors().find(node => node.type === 'ClassDeclaration');
+ const propertyDefinition = inNode;
+
+ if (!classDeclaration || !classDeclaration.id?.name) {
+ return;
+ }
+
+ if (!propertyDefinition.value) {
+ return;
+ }
+
+ const classCtor = classDeclaration.body.body.find(node => node.type === 'MethodDefinition' && node.kind === 'constructor')
+
+ if (!classCtor) {
+ return;
+ }
+
+ const name = classDeclaration.id.name;
+ const valueText = context.getSourceCode().getText(propertyDefinition.value)
+
+ if (valueText.includes(name + '.')) {
+
+ if (classCtor.value?.type === 'FunctionExpression' && !classCtor.value.params.find((param: any) => param.type === 'TSParameterProperty' && param.decorators?.length > 0)) {
+ return
+ }
+
+ context.report({
+ loc: propertyDefinition.value.loc,
+ message: `Static properties in decorated classes should not reference the class they are defined in. Use 'this' instead. This is a workaround for https://github.com/evanw/esbuild/issues/3823.`
+ });
+ }
+
+ }
+
+ return {
+ 'PropertyDefinition[static=true]': checkProperty,
+ };
+ }
+};
diff --git a/.eslintrc.json b/.eslintrc.json
index 1a9117cfaeb..89c0b00d8ce 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -92,9 +92,14 @@
"common",
"browser"
],
- "electron-main": [
+ "electron-utility": [
"common",
"node"
+ ],
+ "electron-main": [
+ "common",
+ "node",
+ "electron-utility"
]
}
],
@@ -141,6 +146,14 @@
]
}
},
+ {
+ "files": [
+ "src/**/*.ts"
+ ],
+ "rules": {
+ "local/code-no-static-self-ref": "warn"
+ }
+ },
{
"files": [
"src/vs/**/*.test.ts"
@@ -603,12 +616,64 @@
]
}
},
+ {
+ "files": [
+ "src/**/electron-utility/**/*.ts"
+ ],
+ "rules": {
+ "no-restricted-imports": [
+ "warn",
+ {
+ "paths": [
+ {
+ "name": "electron",
+ "importNames": [
+ "app",
+ "autoUpdater",
+ "BaseWindow",
+ "BrowserWindow",
+ "contentTracing",
+ "desktopCapturer",
+ "dialog",
+ "globalShortcut",
+ "inAppPurchase",
+ "ipcMain",
+ "Menu",
+ "MenuItem",
+ "MessageChannelMain",
+ "MessagePortMain",
+ "nativeTheme",
+ "netLog",
+ "Notification",
+ "powerMonitor",
+ "powerSaveBlocker",
+ "protocol",
+ "pushNotifications",
+ "safeStorage",
+ "screen",
+ "session",
+ "ShareMenu",
+ "TouchBar",
+ "Tray",
+ "utilityProcess",
+ "View",
+ "webContents",
+ "webFrameMain",
+ "webContentsView",
+ "default"
+ ],
+ "message": "Only net and system-preferences are allowed to be imported from electron"
+ }
+ ]
+ }
+ ]
+ }
+ },
{
"files": [
"src/**/*.ts"
],
"rules": {
- "local/code-no-look-behind-regex": "warn",
"local/code-import-patterns": [
"warn",
{
@@ -616,13 +681,12 @@
// - browser
// - electron-sandbox
"when": "hasBrowser",
- "allow": [
- "vs/css!./**/*"
- ]
+ "allow": []
},
{
// imports that are allowed in all files of layers:
// - node
+ // - electron-utility
// - electron-main
"when": "hasNode",
"allow": [
@@ -641,13 +705,13 @@
"cookie",
"crypto",
"dns",
- "electron",
"events",
"fs",
"fs/promises",
"http",
"https",
"minimist",
+ "node:module",
"native-keymap",
"native-watchdog",
"net",
@@ -679,11 +743,20 @@
"zlib"
]
},
+ {
+ // imports that are allowed in all files of layers:
+ // - electron-utility
+ // - electron-main
+ "when": "hasElectron",
+ "allow": [
+ "electron"
+ ]
+ },
{
// imports that are allowed in all /test/ files
"when": "test",
"allow": [
- "vs/css.build",
+ "vs/css.build.js",
"assert",
"sinon",
"sinon-test"
@@ -738,7 +811,8 @@
"vs/platform/*/~",
"tas-client-umd", // node module allowed even in /common/
"@microsoft/1ds-core-js", // node module allowed even in /common/
- "@microsoft/1ds-post-js" // node module allowed even in /common/
+ "@microsoft/1ds-post-js", // node module allowed even in /common/
+ "@xterm/headless" // node module allowed even in /common/
]
},
{
@@ -747,7 +821,8 @@
"vs/base/~",
"vs/base/parts/*/~",
"vs/platform/*/~",
- "vs/editor/~"
+ "vs/editor/~",
+ "@vscode/tree-sitter-wasm" // node module allowed even in /common/
]
},
{
@@ -768,7 +843,8 @@
"vs/platform/*/~",
"vs/editor/~",
"vs/editor/contrib/*/~",
- "vs/editor/standalone/~"
+ "vs/editor/standalone/~",
+ "@vscode/tree-sitter-wasm" // type import
]
},
{
@@ -854,6 +930,7 @@
"tas-client-umd", // node module allowed even in /common/
"vscode-textmate", // node module allowed even in /common/
"@vscode/vscode-languagedetection", // node module allowed even in /common/
+ "@vscode/tree-sitter-wasm", // type import
{
"when": "hasBrowser",
"pattern": "@xterm/xterm"
@@ -871,7 +948,10 @@
"vs/workbench/~",
"vs/workbench/services/*/~",
"vs/workbench/contrib/*/~",
+ "vs/workbench/contrib/terminal/terminalContribChatExports*",
+ "vs/workbench/contrib/terminal/terminalContribExports*",
"vscode-notebook-renderer", // Type only import
+ "@vscode/tree-sitter-wasm", // type import
{
"when": "hasBrowser",
"pattern": "@xterm/xterm"
@@ -912,7 +992,8 @@
{
"when": "hasBrowser",
"pattern": "vscode-textmate"
- } // node module allowed even in /browser/
+ }, // node module allowed even in /browser/
+ "@xterm/headless" // node module allowed even in /common/ and /browser/
]
},
{
@@ -926,7 +1007,11 @@
"vs/code/~",
{
"when": "hasBrowser",
- "pattern": "vs/workbench/workbench.web.main"
+ "pattern": "vs/workbench/workbench.web.main.js"
+ },
+ {
+ "when": "hasBrowser",
+ "pattern": "vs/workbench/workbench.web.main.internal.js"
},
{
"when": "hasBrowser",
@@ -958,6 +1043,21 @@
"vs/workbench/contrib/**"
]
},
+ {
+ "target": "src/vs/workbench/contrib/terminal/terminalContribChatExports.ts",
+ "layer": "browser",
+ "restrictions": [
+ "vs/workbench/contrib/terminalContrib/*/~"
+ ]
+ },
+ {
+ "target": "src/vs/workbench/contrib/terminal/terminalContribExports.ts",
+ "layer": "browser",
+ "restrictions": [
+ "vs/platform/*/~",
+ "vs/workbench/contrib/terminalContrib/*/~"
+ ]
+ },
{
"target": "src/vs/workbench/workbench.common.main.ts",
"layer": "browser",
@@ -967,12 +1067,12 @@
"vs/platform/*/~",
"vs/editor/~",
"vs/editor/contrib/*/~",
- "vs/editor/editor.all",
+ "vs/editor/editor.all.js",
"vs/workbench/~",
"vs/workbench/api/~",
"vs/workbench/services/*/~",
"vs/workbench/contrib/*/~",
- "vs/workbench/contrib/terminal/terminal.all"
+ "vs/workbench/contrib/terminal/terminal.all.js"
]
},
{
@@ -984,12 +1084,29 @@
"vs/platform/*/~",
"vs/editor/~",
"vs/editor/contrib/*/~",
- "vs/editor/editor.all",
+ "vs/editor/editor.all.js",
"vs/workbench/~",
"vs/workbench/api/~",
"vs/workbench/services/*/~",
"vs/workbench/contrib/*/~",
- "vs/workbench/workbench.common.main"
+ "vs/workbench/workbench.common.main.js"
+ ]
+ },
+ {
+ "target": "src/vs/workbench/workbench.web.main.internal.ts",
+ "layer": "browser",
+ "restrictions": [
+ "vs/base/~",
+ "vs/base/parts/*/~",
+ "vs/platform/*/~",
+ "vs/editor/~",
+ "vs/editor/contrib/*/~",
+ "vs/editor/editor.all.js",
+ "vs/workbench/~",
+ "vs/workbench/api/~",
+ "vs/workbench/services/*/~",
+ "vs/workbench/contrib/*/~",
+ "vs/workbench/workbench.common.main.js"
]
},
{
@@ -1001,12 +1118,12 @@
"vs/platform/*/~",
"vs/editor/~",
"vs/editor/contrib/*/~",
- "vs/editor/editor.all",
+ "vs/editor/editor.all.js",
"vs/workbench/~",
"vs/workbench/api/~",
"vs/workbench/services/*/~",
"vs/workbench/contrib/*/~",
- "vs/workbench/workbench.common.main"
+ "vs/workbench/workbench.common.main.js"
]
},
{
@@ -1016,11 +1133,7 @@
]
},
{
- "target": "src/vs/workbench/{workbench.desktop.main.nls.js,workbench.web.main.nls.js}",
- "restrictions": []
- },
- {
- "target": "src/vs/{loader.d.ts,css.ts,css.build.ts,monaco.d.ts,nls.ts,nls.build.ts,nls.mock.ts}",
+ "target": "src/vs/{loader.d.ts,css.ts,css.build.ts,monaco.d.ts,nls.ts,nls.messages.ts}",
"restrictions": []
},
{
@@ -1028,8 +1141,18 @@
"restrictions": []
},
{
- "target": "src/{bootstrap-amd.js,bootstrap-fork.js,bootstrap-node.js,bootstrap-window.js,bootstrap.js,cli.js,main.js,server-cli.js,server-main.js}",
+ "target": "src/bootstrap-window.ts",
"restrictions": []
+ },
+ {
+ "target": "src/{bootstrap-cli.ts,bootstrap-esm.ts,bootstrap-fork.ts,bootstrap-import.ts,bootstrap-meta.ts,bootstrap-node.ts,bootstrap-server.ts,cli.ts,main.ts,server-cli.ts,server-main.ts}",
+ "restrictions": [
+ "vs/**/common/*",
+ "vs/**/node/*",
+ "vs/nls.js",
+ "src/*.js",
+ "*" // node.js
+ ]
}
]
}
@@ -1094,7 +1217,18 @@
"local/code-no-runtime-import": [
"error",
{
- "src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts": ["**/*"]
+ "src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts": [
+ "**/*"
+ ]
+ }
+ ],
+ "local/code-limited-top-functions": [
+ "error",
+ {
+ "src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts": [
+ "webviewPreloads",
+ "preloadsScriptStr"
+ ]
}
]
}
diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs
index c0c9a544148..203e213b629 100644
--- a/.git-blame-ignore-revs
+++ b/.git-blame-ignore-revs
@@ -26,3 +26,6 @@ ee1655a82ebdfd38bf8792088a6602c69f7bbd94
# jrieken: new eslint-rule
4a130c40ed876644ed8af2943809d08221375408
+
+# bpasero: ESM migration
+6b924c51528e663dda5091a1493229a361676aca
diff --git a/.github/classifier.json b/.github/classifier.json
index 44514039e1e..5f322e25edd 100644
--- a/.github/classifier.json
+++ b/.github/classifier.json
@@ -32,7 +32,7 @@
"debug": {"assign": ["roblourens"]},
"debug-disassembly": {"assign": []},
"dialogs": {"assign": ["sbatten"]},
- "diff-editor": {"assign": ["alexdima"]},
+ "diff-editor": {"assign": ["hediet"]},
"dropdown": {"assign": ["lramos15"]},
"editor-api": {"assign": ["alexdima"]},
"editor-autoclosing": {"assign": ["alexdima"]},
@@ -116,7 +116,7 @@
"json": {"assign": ["aeschli"]},
"json-sorting": {"assign": ["aiday-mar"]},
"keybindings": {"assign": ["ulugbekna"]},
- "keybindings-editor": {"assign": ["sandy081"]},
+ "keybindings-editor": {"assign": ["ulugbekna"]},
"keyboard-layout": {"assign": ["ulugbekna"]},
"L10N": {"assign": ["TylerLeonhardt", "csigs"]},
"l10n-platform": {"assign": ["TylerLeonhardt"]},
@@ -124,7 +124,7 @@
"languages-basic": {"assign": ["aeschli"]},
"languages-diagnostics": {"assign": ["jrieken"]},
"languages-guessing": {"assign": ["TylerLeonhardt"]},
- "layout": {"assign": ["sbatten"]},
+ "layout": {"assign": ["benibenj"]},
"lcd-text-rendering": {"assign": []},
"list-widget": {"assign": ["joaomoreno"]},
"live-preview": {"assign": ["andreamah"]},
@@ -249,7 +249,7 @@
"timeline": {"assign": ["lramos15"]},
"timeline-git": {"assign": ["lszomoru"]},
"timeline-local-history": {"assign": ["bpasero"]},
- "titlebar": {"assign": ["sbatten"]},
+ "titlebar": {"assign": ["benibenj"]},
"tokenization": {"assign": ["alexdima"]},
"touch/pointer": {"assign": []},
"trackpad/scroll": {"assign": []},
@@ -278,7 +278,7 @@
"workbench-cli": {"assign": ["bpasero"]},
"workbench-diagnostics": {"assign": ["Tyriar"]},
"workbench-dnd": {"assign": ["bpasero"]},
- "workbench-editor-grid": {"assign": ["sbatten"]},
+ "workbench-editor-grid": {"assign": ["benibenj"]},
"workbench-editor-groups": {"assign": ["bpasero"]},
"workbench-editor-resolver": {"assign": ["lramos15"]},
"workbench-editors": {"assign": ["bpasero"]},
@@ -299,11 +299,11 @@
"workbench-tabs": {"assign": ["benibenj"]},
"workbench-touchbar": {"assign": ["bpasero"]},
"workbench-untitled-editors": {"assign": ["bpasero"]},
- "workbench-views": {"assign": ["sbatten"]},
+ "workbench-views": {"assign": ["benibenj"]},
"workbench-welcome": {"assign": ["lramos15"]},
"workbench-window": {"assign": ["bpasero"]},
"workbench-workspace": {"assign": []},
- "workbench-zen": {"assign": ["sbatten"]},
+ "workbench-zen": {"assign": ["benibenj"]},
"workspace-edit": {"assign": ["jrieken"]},
"workspace-symbols": {"assign": []},
"workspace-trust": {"assign": ["lszomoru", "sbatten"]},
diff --git a/.github/commands.json b/.github/commands.json
index df9fc791fd5..38da97915a2 100644
--- a/.github/commands.json
+++ b/.github/commands.json
@@ -156,6 +156,37 @@
"addLabel": "confirmation-pending",
"removeLabel": "confirmed"
},
+ {
+ "type": "comment",
+ "name": "needsMoreInfo",
+ "allowUsers": [
+ "cleidigh",
+ "usernamehw",
+ "gjsjohnmurray",
+ "IllusionMH"
+ ],
+ "action": "updateLabels",
+ "addLabel": "~info-needed"
+ },
+ {
+ "type": "comment",
+ "name": "needsPerfInfo",
+ "allowUsers": [
+ "cleidigh",
+ "usernamehw",
+ "gjsjohnmurray",
+ "IllusionMH"
+ ],
+ "addLabel": "info-needed",
+ "comment": "Thanks for creating this issue regarding performance! Please follow this guide to help us diagnose performance issues: https://github.com/microsoft/vscode/wiki/Performance-Issues \n\nHappy Coding!"
+ },
+ {
+ "type": "comment",
+ "name": "jsDebugLogs",
+ "action": "updateLabels",
+ "addLabel": "info-needed",
+ "comment": "Please collect trace logs using the following instructions:\n\n> If you're able to, add `\"trace\": true` to your `launch.json` and reproduce the issue. The location of the log file on your disk will be written to the Debug Console. Share that with us.\n>\n> ⚠️ This log file will not contain source code, but will contain file paths. You can drop it into https://microsoft.github.io/vscode-pwa-analyzer/index.html to see what it contains. If you'd rather not share the log publicly, you can email it to connor@xbox.com"
+ },
{
"type": "comment",
"name": "closedWith",
@@ -169,6 +200,19 @@
"reason": "completed",
"addLabel": "unreleased"
},
+ {
+ "type": "comment",
+ "name": "spam",
+ "allowUsers": [
+ "cleidigh",
+ "usernamehw",
+ "gjsjohnmurray",
+ "IllusionMH"
+ ],
+ "action": "close",
+ "reason": "not_planned",
+ "addLabel": "invalid"
+ },
{
"type": "comment",
"name": "a11ymas",
@@ -414,6 +458,32 @@
"addLabel": "*caused-by-extension",
"comment": "It looks like this is caused by the Copilot extension. Please file the issue in the [Copilot Discussion Forum](https://github.com/community/community/discussions/categories/copilot). Make sure to check their issue reporting template and provide them relevant information such as the extension version you're using. See also our [issue reporting guidelines](https://aka.ms/vscodeissuereporting) for more information.\n\nHappy Coding!"
},
+ {
+ "type": "comment",
+ "name": "gifPlease",
+ "allowUsers": [
+ "cleidigh",
+ "usernamehw",
+ "gjsjohnmurray",
+ "IllusionMH"
+ ],
+ "action": "comment",
+ "addLabel": "info-needed",
+ "comment": "Thanks for reporting this issue! Unfortunately, it's hard for us to understand what issue you're seeing. Please help us out by providing a screen recording showing exactly what isn't working as expected. While we can work with most standard formats, `.gif` files are preferred as they are displayed inline on GitHub. You may find https://gifcap.dev helpful as a browser-based gif recording tool.\n\nIf the issue depends on keyboard input, you can help us by enabling screencast mode for the recording (`Developer: Toggle Screencast Mode` in the command palette). Lastly, please attach this file via the GitHub web interface as emailed responses will strip files out from the issue.\n\nHappy coding!"
+ },
+ {
+ "type": "comment",
+ "name": "confirmPlease",
+ "allowUsers": [
+ "cleidigh",
+ "usernamehw",
+ "gjsjohnmurray",
+ "IllusionMH"
+ ],
+ "action": "comment",
+ "addLabel": "info-needed",
+ "comment": "Please diagnose the root cause of the issue by running the command `F1 > Help: Troubleshoot Issue` and following the instructions. Once you have done that, please update the issue with the results.\n\nHappy Coding!"
+ },
{
"__comment__": "Allows folks on the team to label issues by commenting: `\\label My-Label` ",
"type": "comment",
@@ -444,5 +514,29 @@
"addLabel": "verification-steps-needed",
"removeLabel": "~verification-steps-needed",
"comment": "Friendly ping! Looks like this issue requires some further steps to be verified. Please provide us with the steps necessary to verify this issue."
+ },
+ {
+ "type": "label",
+ "name": "~info-needed",
+ "action": "updateLabels",
+ "addLabel": "info-needed",
+ "removeLabel": "~info-needed",
+ "comment": "Thanks for creating this issue! We figured it's missing some basic information or in some other way doesn't follow our [issue reporting guidelines](https://aka.ms/vscodeissuereporting). Please take the time to review these and update the issue.\n\nHappy Coding!"
+ },
+ {
+ "type": "label",
+ "name": "~version-info-needed",
+ "action": "updateLabels",
+ "addLabel": "info-needed",
+ "removeLabel": "~version-info-needed",
+ "comment": "Thanks for creating this issue! We figured it's missing some basic information, such as a version number, or in some other way doesn't follow our [issue reporting guidelines](https://aka.ms/vscodeissuereporting). Please take the time to review these and update the issue.\n\nHappy Coding!"
+ },
+ {
+ "type": "label",
+ "name": "~confirmation-needed",
+ "action": "updateLabels",
+ "addLabel": "info-needed",
+ "removeLabel": "~confirmation-needed",
+ "comment": "Please diagnose the root cause of the issue by running the command `F1 > Help: Troubleshoot Issue` and following the instructions. Once you have done that, please update the issue with the results.\n\nHappy Coding!"
}
]
diff --git a/.github/workflows/author-verified.yml b/.github/workflows/author-verified.yml
deleted file mode 100644
index f914be2f71b..00000000000
--- a/.github/workflows/author-verified.yml
+++ /dev/null
@@ -1,30 +0,0 @@
-name: Author Verified
-on:
- issues:
- types: [closed]
-
-# also make changes in ./on-label.yml
-jobs:
- main:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout Actions
- if: contains(github.event.issue.labels.*.name, 'author-verification-requested') && contains(github.event.issue.labels.*.name, 'insiders-released')
- uses: actions/checkout@v4
- with:
- repository: "microsoft/vscode-github-triage-actions"
- ref: stable
- path: ./actions
- - name: Install Actions
- if: contains(github.event.issue.labels.*.name, 'author-verification-requested') && contains(github.event.issue.labels.*.name, 'insiders-released')
- run: npm install --production --prefix ./actions
- - name: Run Author Verified
- if: contains(github.event.issue.labels.*.name, 'author-verification-requested') && contains(github.event.issue.labels.*.name, 'insiders-released')
- uses: ./actions/author-verified
- with:
- appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}}
- token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}}
- requestVerificationComment: "This bug has been fixed in the latest release of [VS Code Insiders](https://code.visualstudio.com/insiders/)!\n\n@${author}, you can help us out by commenting `/verified` if things are now working as expected.\n\nIf things still don't seem right, please ensure you're on version ${commit} of Insiders (today's or later - you can use `Help: About` in the command palette to check), and leave a comment letting us know what isn't working as expected.\n\nHappy Coding!"
- releasedLabel: insiders-released
- verifiedLabel: verified
- authorVerificationRequestedLabel: author-verification-requested
diff --git a/.github/workflows/bad-tag.yml b/.github/workflows/bad-tag.yml
deleted file mode 100644
index bc964fb0582..00000000000
--- a/.github/workflows/bad-tag.yml
+++ /dev/null
@@ -1,22 +0,0 @@
-name: Bad Tag
-on:
- create
-
-jobs:
- main:
- runs-on: ubuntu-latest
- if: github.event.ref == '1.999.0'
- steps:
- - name: Checkout Actions
- uses: actions/checkout@v4
- with:
- repository: "microsoft/vscode-github-triage-actions"
- ref: stable
- path: ./actions
- - name: Install Actions
- run: npm install --production --prefix ./actions
- - name: Run Bad Tag
- uses: ./actions/tag-alert
- with:
- token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}}
- tag-name: '1.999.0'
diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml
index 8448d05c3b8..d5f166a4aae 100644
--- a/.github/workflows/basic.yml
+++ b/.github/workflows/basic.yml
@@ -42,26 +42,26 @@ jobs:
with:
path: "**/node_modules"
key: ${{ runner.os }}-cacheNodeModulesLinux-${{ steps.nodeModulesCacheKey.outputs.value }}
- - name: Get yarn cache directory path
- id: yarnCacheDirPath
+ - name: Get npm cache directory path
+ id: npmCacheDirPath
if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }}
- run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
- - name: Cache yarn directory
+ run: echo "dir=$(npm config get cache)" >> $GITHUB_OUTPUT
+ - name: Cache npm directory
if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }}
uses: actions/cache@v4
with:
- path: ${{ steps.yarnCacheDirPath.outputs.dir }}
- key: ${{ runner.os }}-yarnCacheDir-${{ steps.nodeModulesCacheKey.outputs.value }}
- restore-keys: ${{ runner.os }}-yarnCacheDir-
- - name: Execute yarn
+ path: ${{ steps.npmCacheDirPath.outputs.dir }}
+ key: ${{ runner.os }}-npmCacheDir-${{ steps.nodeModulesCacheKey.outputs.value }}
+ restore-keys: ${{ runner.os }}-npmCacheDir-
+ - name: Execute npm
if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }}
env:
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
ELECTRON_SKIP_BINARY_DOWNLOAD: 1
- run: yarn --frozen-lockfile --network-timeout 180000
+ run: npm ci
- name: Compile and Download
- run: yarn npm-run-all --max-old-space-size=4095 -lp compile "electron x64"
+ run: npm exec -- npm-run-all -lp compile "electron x64"
- name: Run Unit Tests
id: electron-unit-tests
@@ -94,44 +94,45 @@ jobs:
with:
path: "**/node_modules"
key: ${{ runner.os }}-cacheNodeModulesLinux-${{ steps.nodeModulesCacheKey.outputs.value }}
- - name: Get yarn cache directory path
- id: yarnCacheDirPath
+ - name: Get npm cache directory path
+ id: npmCacheDirPath
if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }}
- run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
- - name: Cache yarn directory
+ run: echo "dir=$(npm config get cache)" >> $GITHUB_OUTPUT
+ - name: Cache npm directory
if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }}
uses: actions/cache@v4
with:
- path: ${{ steps.yarnCacheDirPath.outputs.dir }}
- key: ${{ runner.os }}-yarnCacheDir-${{ steps.nodeModulesCacheKey.outputs.value }}
- restore-keys: ${{ runner.os }}-yarnCacheDir-
- - name: Execute yarn
+ path: ${{ steps.npmCacheDirPath.outputs.dir }}
+ key: ${{ runner.os }}-npmCacheDir-${{ steps.nodeModulesCacheKey.outputs.value }}
+ restore-keys: ${{ runner.os }}-npmCacheDir-
+ - name: Execute npm
if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }}
env:
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
ELECTRON_SKIP_BINARY_DOWNLOAD: 1
- run: yarn --frozen-lockfile --network-timeout 180000
+ run: npm ci
- name: Run Hygiene Checks
- run: yarn gulp hygiene
+ run: npm run gulp hygiene
- name: Run Valid Layers Checks
- run: yarn valid-layers-check
+ run: npm run valid-layers-check
- name: Compile /build/
- run: yarn --cwd build compile
+ run: npm run compile
+ working-directory: build
- name: Check clean git state
run: ./.github/workflows/check-clean-git-state.sh
- name: Run eslint
- run: yarn eslint
+ run: npm run eslint
- name: Run vscode-dts Compile Checks
- run: yarn vscode-dts-compile-check
+ run: npm run vscode-dts-compile-check
- name: Run Trusted Types Checks
- run: yarn tsec-compile-check
+ run: npm run tsec-compile-check
warm-cache:
name: Warm up node modules cache
@@ -156,20 +157,20 @@ jobs:
with:
path: "**/node_modules"
key: ${{ runner.os }}-cacheNodeModulesLinux-${{ steps.nodeModulesCacheKey.outputs.value }}
- - name: Get yarn cache directory path
- id: yarnCacheDirPath
+ - name: Get npm cache directory path
+ id: npmCacheDirPath
if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }}
- run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
- - name: Cache yarn directory
+ run: echo "dir=$(npm config get cache)" >> $GITHUB_OUTPUT
+ - name: Cache npm directory
if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }}
uses: actions/cache@v4
with:
- path: ${{ steps.yarnCacheDirPath.outputs.dir }}
- key: ${{ runner.os }}-yarnCacheDir-${{ steps.nodeModulesCacheKey.outputs.value }}
- restore-keys: ${{ runner.os }}-yarnCacheDir-
- - name: Execute yarn
+ path: ${{ steps.npmCacheDirPath.outputs.dir }}
+ key: ${{ runner.os }}-npmCacheDir-${{ steps.nodeModulesCacheKey.outputs.value }}
+ restore-keys: ${{ runner.os }}-npmCacheDir-
+ - name: Execute npm
if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }}
env:
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
ELECTRON_SKIP_BINARY_DOWNLOAD: 1
- run: yarn --frozen-lockfile --network-timeout 180000
+ run: npm ci
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 097bdcf8c2c..b80196eab08 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -43,23 +43,23 @@ jobs:
- name: Extract node_modules archive
if: ${{ steps.cacheNodeModules.outputs.cache-hit == 'true' }}
run: 7z.exe x .build/node_modules_cache/cache.7z -aos
- - name: Get yarn cache directory path
- id: yarnCacheDirPath
+ - name: Get npm cache directory path
+ id: npmCacheDirPath
if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }}
- run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
- - name: Cache yarn directory
+ run: echo "dir=$(npm config get cache)" >> $GITHUB_OUTPUT
+ - name: Cache npm directory
if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }}
uses: actions/cache@v4
with:
- path: ${{ steps.yarnCacheDirPath.outputs.dir }}
- key: ${{ runner.os }}-yarnCacheDir-${{ steps.nodeModulesCacheKey.outputs.value }}
- restore-keys: ${{ runner.os }}-yarnCacheDir-
- - name: Execute yarn
+ path: ${{ steps.npmCacheDirPath.outputs.dir }}
+ key: ${{ runner.os }}-npmCacheDir-${{ steps.nodeModulesCacheKey.outputs.value }}
+ restore-keys: ${{ runner.os }}-npmCacheDir-
+ - name: Execute npm
if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }}
env:
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
ELECTRON_SKIP_BINARY_DOWNLOAD: 1
- run: yarn --frozen-lockfile --network-timeout 180000
+ run: npm ci
- name: Create node_modules archive
if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }}
run: |
@@ -69,19 +69,20 @@ jobs:
7z.exe a .build/node_modules_cache/cache.7z -mx3 `@.build/node_modules_list.txt
- name: Compile and Download
- run: yarn npm-run-all --max-old-space-size=4095 -lp compile "electron x64" playwright-install download-builtin-extensions
+ run: npm exec -- npm-run-all -lp compile "electron x64" playwright-install download-builtin-extensions
- name: Compile Integration Tests
- run: yarn --cwd test/integration/browser compile
+ run: npm run compile
+ working-directory: test/integration/browser
- name: Run Unit Tests (Electron)
run: .\scripts\test.bat
- name: Run Unit Tests (node.js)
- run: yarn test-node
+ run: npm run test-node
- name: Run Unit Tests (Browser, Chromium)
- run: yarn test-browser-no-install --browser chromium
+ run: npm run test-browser-no-install --browser chromium
- name: Run Integration Tests (Electron)
run: .\scripts\test-integration.bat
@@ -126,29 +127,30 @@ jobs:
with:
path: "**/node_modules"
key: ${{ runner.os }}-cacheNodeModulesLinux-${{ steps.nodeModulesCacheKey.outputs.value }}
- - name: Get yarn cache directory path
- id: yarnCacheDirPath
+ - name: Get npm cache directory path
+ id: npmCacheDirPath
if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }}
- run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
- - name: Cache yarn directory
+ run: echo "dir=$(npm config get cache)" >> $GITHUB_OUTPUT
+ - name: Cache npm directory
if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }}
uses: actions/cache@v4
with:
- path: ${{ steps.yarnCacheDirPath.outputs.dir }}
- key: ${{ runner.os }}-yarnCacheDir-${{ steps.nodeModulesCacheKey.outputs.value }}
- restore-keys: ${{ runner.os }}-yarnCacheDir-
- - name: Execute yarn
+ path: ${{ steps.npmCacheDirPath.outputs.dir }}
+ key: ${{ runner.os }}-npmCacheDir-${{ steps.nodeModulesCacheKey.outputs.value }}
+ restore-keys: ${{ runner.os }}-npmCacheDir-
+ - name: Execute npm
if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }}
env:
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
ELECTRON_SKIP_BINARY_DOWNLOAD: 1
- run: yarn --frozen-lockfile --network-timeout 180000
+ run: npm ci
- name: Compile and Download
- run: yarn npm-run-all --max-old-space-size=4095 -lp compile "electron x64" playwright-install download-builtin-extensions
+ run: npm exec -- npm-run-all -lp compile "electron x64" playwright-install download-builtin-extensions
- name: Compile Integration Tests
- run: yarn --cwd test/integration/browser compile
+ run: npm run compile
+ working-directory: test/integration/browser
- name: Run Unit Tests (Electron)
id: electron-unit-tests
@@ -156,11 +158,11 @@ jobs:
- name: Run Unit Tests (node.js)
id: nodejs-unit-tests
- run: yarn test-node
+ run: npm run test-node
- name: Run Unit Tests (Browser, Chromium)
id: browser-unit-tests
- run: DISPLAY=:10 yarn test-browser-no-install --browser chromium
+ run: DISPLAY=:10 npm run test-browser-no-install --browser chromium
- name: Run Integration Tests (Electron)
id: electron-integration-tests
@@ -197,29 +199,30 @@ jobs:
with:
path: "**/node_modules"
key: ${{ runner.os }}-cacheNodeModulesMacOS-${{ steps.nodeModulesCacheKey.outputs.value }}
- - name: Get yarn cache directory path
- id: yarnCacheDirPath
+ - name: Get npm cache directory path
+ id: npmCacheDirPath
if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }}
- run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
- - name: Cache yarn directory
+ run: echo "dir=$(npm config get cache)" >> $GITHUB_OUTPUT
+ - name: Cache npm directory
if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }}
uses: actions/cache@v4
with:
- path: ${{ steps.yarnCacheDirPath.outputs.dir }}
- key: ${{ runner.os }}-yarnCacheDir-${{ steps.nodeModulesCacheKey.outputs.value }}
- restore-keys: ${{ runner.os }}-yarnCacheDir-
- - name: Execute yarn
+ path: ${{ steps.npmCacheDirPath.outputs.dir }}
+ key: ${{ runner.os }}-npmCacheDir-${{ steps.nodeModulesCacheKey.outputs.value }}
+ restore-keys: ${{ runner.os }}-npmCacheDir-
+ - name: Execute npm
if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }}
env:
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
ELECTRON_SKIP_BINARY_DOWNLOAD: 1
- run: yarn --frozen-lockfile --network-timeout 180000
+ run: npm ci
- name: Compile and Download
- run: yarn npm-run-all --max-old-space-size=4095 -lp compile "electron x64" playwright-install download-builtin-extensions
+ run: npm exec -- npm-run-all -lp compile "electron x64" playwright-install download-builtin-extensions
- name: Compile Integration Tests
- run: yarn --cwd test/integration/browser compile
+ run: npm run compile
+ working-directory: test/integration/browser
# This is required for SecretStorage unittests
- name: Create temporary keychain
@@ -232,10 +235,10 @@ jobs:
run: DISPLAY=:10 ./scripts/test.sh
- name: Run Unit Tests (node.js)
- run: yarn test-node
+ run: npm run test-node
- name: Run Unit Tests (Browser, Chromium)
- run: DISPLAY=:10 yarn test-browser-no-install --browser chromium
+ run: DISPLAY=:10 npm run test-browser-no-install --browser chromium
- name: Run Integration Tests (Electron)
run: DISPLAY=:10 ./scripts/test-integration.sh
@@ -269,44 +272,45 @@ jobs:
with:
path: "**/node_modules"
key: ${{ runner.os }}-cacheNodeModulesLinux-${{ steps.nodeModulesCacheKey.outputs.value }}
- - name: Get yarn cache directory path
- id: yarnCacheDirPath
+ - name: Get npm cache directory path
+ id: npmCacheDirPath
if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }}
- run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
- - name: Cache yarn directory
+ run: echo "dir=$(npm config get cache)" >> $GITHUB_OUTPUT
+ - name: Cache npm directory
if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }}
uses: actions/cache@v4
with:
- path: ${{ steps.yarnCacheDirPath.outputs.dir }}
- key: ${{ runner.os }}-yarnCacheDir-${{ steps.nodeModulesCacheKey.outputs.value }}
- restore-keys: ${{ runner.os }}-yarnCacheDir-
- - name: Execute yarn
+ path: ${{ steps.npmCacheDirPath.outputs.dir }}
+ key: ${{ runner.os }}-npmCacheDir-${{ steps.nodeModulesCacheKey.outputs.value }}
+ restore-keys: ${{ runner.os }}-npmCacheDir-
+ - name: Execute npm
if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }}
env:
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
ELECTRON_SKIP_BINARY_DOWNLOAD: 1
- run: yarn --frozen-lockfile --network-timeout 180000
+ run: npm ci
- name: Download Playwright
- run: yarn playwright-install
+ run: npm run playwright-install
- name: Run Hygiene Checks
- run: yarn gulp hygiene
+ run: npm run gulp hygiene
- name: Run Valid Layers Checks
- run: yarn valid-layers-check
+ run: npm run valid-layers-check
- name: Compile /build/
- run: yarn --cwd build compile
+ run: npm run compile
+ working-directory: build
- name: Check clean git state
run: ./.github/workflows/check-clean-git-state.sh
- name: Run eslint
- run: yarn eslint
+ run: npm run eslint
- name: Run vscode-dts Compile Checks
- run: yarn vscode-dts-compile-check
+ run: npm run vscode-dts-compile-check
- name: Run Trusted Types Checks
- run: yarn tsec-compile-check
+ run: npm run tsec-compile-check
diff --git a/.github/workflows/deep-classifier-assign-monitor.yml b/.github/workflows/deep-classifier-assign-monitor.yml
deleted file mode 100644
index cfd9abc374a..00000000000
--- a/.github/workflows/deep-classifier-assign-monitor.yml
+++ /dev/null
@@ -1,24 +0,0 @@
-name: "Deep Classifier: Assign Monitor"
-on:
- issues:
- types: [assigned]
-
-jobs:
- main:
- runs-on: ubuntu-latest
- if: ${{ contains(github.event.issue.labels.*.name, 'triage-needed') }}
- steps:
- - name: Checkout Actions
- uses: actions/checkout@v4
- with:
- repository: "microsoft/vscode-github-triage-actions"
- ref: stable
- path: ./actions
- - name: Install Actions
- run: npm install --production --prefix ./actions
- - name: "Run Classifier: Monitor"
- uses: ./actions/classifier-deep/monitor
- with:
- botName: VSCodeTriageBot
- token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}}
- appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}}
diff --git a/.github/workflows/deep-classifier-runner.yml b/.github/workflows/deep-classifier-runner.yml
deleted file mode 100644
index 81fd3516751..00000000000
--- a/.github/workflows/deep-classifier-runner.yml
+++ /dev/null
@@ -1,61 +0,0 @@
-name: "Deep Classifier: Runner"
-
-permissions:
- id-token: write
- contents: read
-
-on:
- schedule:
- - cron: 0 * * * *
- workflow_dispatch:
- repository_dispatch:
- types: [trigger-deep-classifier-runner]
-
-jobs:
- main:
- runs-on: ubuntu-latest
- environment: main
- steps:
- - uses: azure/login@v2
- with:
- client-id: ${{ vars.AZURE_CLIENT_ID }}
- tenant-id: ${{ vars.AZURE_TENANT_ID }}
- allow-no-subscriptions: true
- - name: Checkout Actions
- uses: actions/checkout@v4
- with:
- repository: "microsoft/vscode-github-triage-actions"
- ref: stable
- path: ./actions
- - name: Install Actions
- run: npm install --production --prefix ./actions
- - name: Install Additional Dependencies
- # Pulls in a bunch of other packages that arent needed for the rest of the actions
- run: npm install @azure/storage-blob@12.1.1 mongodb@2.2.31
- - name: "Run Classifier: Scraper"
- uses: ./actions/classifier-deep/apply/fetch-sources
- with:
- # slightly overlapping to protect against issues slipping through the cracks if a run is delayed
- until: 5
- excludeLabels: feature-request|testplan-item
- configPath: classifier
- blobContainerName: vscode-issue-classifier
- blobStorageKey: ${{secrets.AZURE_BLOB_STORAGE_CONNECTION_STRING}}
- token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}}
- appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}}
- - name: Set up Python 3.7
- uses: actions/setup-python@v5
- with:
- python-version: 3.7
- - name: Install dependencies
- run: |
- python -m pip install --upgrade pip
- pip install --upgrade numpy==1.20.0 scipy==1.6.0 scikit-learn==0.24.1 joblib==1.0.0 nltk==3.5 simpletransformers==0.51.16 torch==1.7.1 torchvision==0.8.2
- - name: "Run Classifier: Generator"
- run: python ./actions/classifier-deep/apply/generate-labels/main.py
- - name: "Run Classifier: Labeler"
- uses: ./actions/classifier-deep/apply/apply-labels
- with:
- configPath: classifier
- allowLabels: "info-needed|new release|error-telemetry|*english-please|translation-required"
- token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}}
diff --git a/.github/workflows/deep-classifier-scraper.yml b/.github/workflows/deep-classifier-scraper.yml
deleted file mode 100644
index e21061549d9..00000000000
--- a/.github/workflows/deep-classifier-scraper.yml
+++ /dev/null
@@ -1,30 +0,0 @@
-name: "Deep Classifier: Scraper"
-on:
- schedule:
- - cron: 0 0 15 * * # 15th of the month
- workflow_dispatch:
- repository_dispatch:
- types: [trigger-deep-classifier-scraper]
-
-jobs:
- main:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout Actions
- uses: actions/checkout@v4
- with:
- repository: "microsoft/vscode-github-triage-actions"
- ref: stable
- path: ./actions
- - name: Install Actions
- run: npm install --production --prefix ./actions
- - name: Install Additional Dependencies
- # Pulls in a bunch of other packages that arent needed for the rest of the actions
- run: npm install @azure/storage-blob@12.1.1
- - name: "Run Classifier: Scraper"
- uses: ./actions/classifier-deep/train/fetch-issues
- with:
- blobContainerName: vscode-issue-classifier
- blobStorageKey: ${{secrets.AZURE_BLOB_STORAGE_CONNECTION_STRING}}
- token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}}
- appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}}
diff --git a/.github/workflows/deep-classifier-unassign-monitor.yml b/.github/workflows/deep-classifier-unassign-monitor.yml
deleted file mode 100644
index d0e14e936c2..00000000000
--- a/.github/workflows/deep-classifier-unassign-monitor.yml
+++ /dev/null
@@ -1,24 +0,0 @@
-name: "Deep Classifier: Unassign Monitor"
-on:
- issues:
- types: [unassigned]
-
-jobs:
- main:
- runs-on: ubuntu-latest
- if: ${{ ! contains(github.event.issue.labels.*.name, 'triage-needed') }}
- steps:
- - name: Checkout Actions
- uses: actions/checkout@v4
- with:
- repository: "microsoft/vscode-github-triage-actions"
- ref: stable
- path: ./actions
- - name: Install Actions
- run: npm install --production --prefix ./actions
- - name: "Run Classifier: Monitor"
- uses: ./actions/classifier-deep/monitor
- with:
- botName: VSCodeTriageBot
- token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}}
- appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}}
diff --git a/.github/workflows/english-please.yml b/.github/workflows/english-please.yml
deleted file mode 100644
index 9e04d6d549c..00000000000
--- a/.github/workflows/english-please.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-name: English Please
-on:
- issues:
- types: [edited]
-
-# also make changes in ./on-label.yml and ./on-open.yml
-jobs:
- main:
- runs-on: ubuntu-latest
- if: contains(github.event.issue.labels.*.name, '*english-please')
- steps:
- - name: Checkout Actions
- uses: actions/checkout@v4
- with:
- repository: "microsoft/vscode-github-triage-actions"
- ref: stable
- path: ./actions
- - name: Install Actions
- run: npm install --production --prefix ./actions
- - name: Run English Please
- uses: ./actions/english-please
- with:
- appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}}
- token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}}
- cognitiveServicesAPIKey: ${{secrets.AZURE_TEXT_TRANSLATOR_KEY}}
- nonEnglishLabel: "*english-please"
- needsMoreInfoLabel: "info-needed"
- translatorRequestedLabelPrefix: "translation-required-"
- translatorRequestedLabelColor: "c29cff"
diff --git a/.github/workflows/feature-request.yml b/.github/workflows/feature-request.yml
deleted file mode 100644
index 83c0a9705c5..00000000000
--- a/.github/workflows/feature-request.yml
+++ /dev/null
@@ -1,43 +0,0 @@
-name: Feature Request Manager
-on:
- repository_dispatch:
- types: [trigger-feature-request-manager]
- issues:
- types: [milestoned]
- schedule:
- - cron: 20 2 * * * # 4:20am Zurich
-
-# also make changes in ./on-label.yml
-jobs:
- main:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout Actions
- if: github.event_name != 'issues' || contains(github.event.issue.labels.*.name, 'feature-request')
- uses: actions/checkout@v4
- with:
- repository: "microsoft/vscode-github-triage-actions"
- path: ./actions
- ref: stable
- - name: Install Actions
- if: github.event_name != 'issues' || contains(github.event.issue.labels.*.name, 'feature-request')
- run: npm install --production --prefix ./actions
- - name: Run Feature Request Manager
- if: github.event_name != 'issues' || contains(github.event.issue.labels.*.name, 'feature-request')
- uses: ./actions/feature-request
- with:
- appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}}
- token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}}
- candidateMilestoneID: 107
- candidateMilestoneName: Backlog Candidates
- backlogMilestoneID: 8
- featureRequestLabel: feature-request
- upvotesRequired: 20
- numCommentsOverride: 20
- initComment: "This feature request is now a candidate for our backlog. The community has 60 days to [upvote](https://github.com/microsoft/vscode/wiki/Issues-Triaging#up-voting-a-feature-request) the issue. If it receives 20 upvotes we will move it to our backlog. If not, we will close it. To learn more about how we handle feature requests, please see our [documentation](https://aka.ms/vscode-issue-lifecycle).\n\nHappy Coding!"
- warnComment: "This feature request has not yet received the 20 community [upvotes](https://github.com/microsoft/vscode/wiki/Issues-Triaging#up-voting-a-feature-request) it takes to make to our backlog. 10 days to go. To learn more about how we handle feature requests, please see our [documentation](https://aka.ms/vscode-issue-lifecycle).\n\nHappy Coding!"
- acceptComment: ":slightly_smiling_face: This feature request received a sufficient number of community upvotes and we moved it to our backlog. To learn more about how we handle feature requests, please see our [documentation](https://aka.ms/vscode-issue-lifecycle).\n\nHappy Coding!"
- rejectComment: ":slightly_frowning_face: In the last 60 days, this feature request has received less than 20 community upvotes and we closed it. Still a big Thank You to you for taking the time to create this issue! To learn more about how we handle feature requests, please see our [documentation](https://aka.ms/vscode-issue-lifecycle).\n\nHappy Coding!"
- warnDays: 10
- closeDays: 60
- milestoneDelaySeconds: 60
diff --git a/.github/workflows/latest-release-monitor.yml b/.github/workflows/latest-release-monitor.yml
deleted file mode 100644
index f7392dc24a8..00000000000
--- a/.github/workflows/latest-release-monitor.yml
+++ /dev/null
@@ -1,27 +0,0 @@
-name: Latest Release Monitor
-on:
- schedule:
- - cron: 0/5 * * * *
- repository_dispatch:
- types: [trigger-latest-release-monitor]
-
-jobs:
- main:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout Actions
- uses: actions/checkout@v4
- with:
- repository: "microsoft/vscode-github-triage-actions"
- path: ./actions
- ref: stable
- - name: Install Actions
- run: npm install --production --prefix ./actions
- - name: Install Storage Module
- run: npm install @azure/storage-blob@12.1.1
- - name: Run Latest Release Monitor
- uses: ./actions/latest-release-monitor
- with:
- storageKey: ${{secrets.AZURE_BLOB_STORAGE_CONNECTION_STRING}}
- appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}}
- token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}}
diff --git a/.github/workflows/locker.yml b/.github/workflows/locker.yml
deleted file mode 100644
index ef775ce8fdf..00000000000
--- a/.github/workflows/locker.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-name: Locker
-on:
- schedule:
- - cron: 20 23 * * * # 4:20pm Redmond
- repository_dispatch:
- types: [trigger-locker]
-
-jobs:
- main:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout Actions
- uses: actions/checkout@v4
- with:
- repository: "microsoft/vscode-github-triage-actions"
- path: ./actions
- ref: stable
- - name: Install Actions
- run: npm install --production --prefix ./actions
- - name: Run Locker
- uses: ./actions/locker
- with:
- token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}}
- daysSinceClose: 45
- daysSinceUpdate: 3
- ignoredLabel: "*out-of-scope,accessibility"
- ignoreLabelUntil: "author-verification-requested"
- ignoredMilestones: "Backlog Candidates"
- labelUntil: "verified"
diff --git a/.github/workflows/monaco-editor.yml b/.github/workflows/monaco-editor.yml
index 8c8ae7b743d..426999ce43b 100644
--- a/.github/workflows/monaco-editor.yml
+++ b/.github/workflows/monaco-editor.yml
@@ -34,43 +34,42 @@ jobs:
path: "**/node_modules"
key: ${{ runner.os }}-cacheNodeModules20-${{ steps.nodeModulesCacheKey.outputs.value }}
restore-keys: ${{ runner.os }}-cacheNodeModules20-
- - name: Get yarn cache directory path
- id: yarnCacheDirPath
+ - name: Get npm cache directory path
+ id: npmCacheDirPath
if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }}
- run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
- - name: Cache yarn directory
+ run: echo "dir=$(npm config get cache)" >> $GITHUB_OUTPUT
+ - name: Cache npm directory
if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }}
uses: actions/cache@v4
with:
- path: ${{ steps.yarnCacheDirPath.outputs.dir }}
- key: ${{ runner.os }}-yarnCacheDir-${{ steps.nodeModulesCacheKey.outputs.value }}
- restore-keys: ${{ runner.os }}-yarnCacheDir-
+ path: ${{ steps.npmCacheDirPath.outputs.dir }}
+ key: ${{ runner.os }}-npmCacheDir-${{ steps.nodeModulesCacheKey.outputs.value }}
+ restore-keys: ${{ runner.os }}-npmCacheDir-
- name: Install libkrb5-dev
if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }}
run: |
sudo apt update
sudo apt install -y libkrb5-dev
- - name: Execute yarn
+ - name: Execute npm
if: ${{ steps.cacheNodeModules.outputs.cache-hit != 'true' }}
env:
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
ELECTRON_SKIP_BINARY_DOWNLOAD: 1
run: |
- npm i -g node-gyp@9.4.0
- yarn --frozen-lockfile --network-timeout 180000
+ npm ci
- name: Download Playwright
- run: yarn playwright-install
+ run: npm run playwright-install
- name: Run Monaco Editor Checks
- run: yarn monaco-compile-check
+ run: npm run monaco-compile-check
- name: Editor Distro & ESM
- run: yarn gulp editor-esm
+ run: npm run gulp editor-esm
- name: Editor ESM sources check
working-directory: ./test/monaco
- run: yarn run esm-check
+ run: npm run esm-check
- name: Typings validation prep
run: |
@@ -79,20 +78,20 @@ jobs:
- name: Typings validation
working-directory: ./typings-test
run: |
- yarn init -yp
+ npm init -yp
../node_modules/.bin/tsc --init
echo "import '../out-monaco-editor-core';" > a.ts
../node_modules/.bin/tsc --noEmit
- name: Package Editor with Webpack
working-directory: ./test/monaco
- run: yarn run bundle-webpack
+ run: npm run bundle-webpack
- name: Compile Editor Tests
working-directory: ./test/monaco
- run: yarn run compile
+ run: npm run compile
- name: Run Editor Tests
timeout-minutes: 5
working-directory: ./test/monaco
- run: yarn test
+ run: npm run test
diff --git a/.github/workflows/needs-more-info-closer.yml b/.github/workflows/needs-more-info-closer.yml
deleted file mode 100644
index 8db8a4246a3..00000000000
--- a/.github/workflows/needs-more-info-closer.yml
+++ /dev/null
@@ -1,30 +0,0 @@
-name: info-needed Closer
-on:
- schedule:
- - cron: 20 11 * * * # 4:20am Redmond
- repository_dispatch:
- types: [trigger-needs-more-info]
-
-jobs:
- main:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout Actions
- uses: actions/checkout@v4
- with:
- repository: "microsoft/vscode-github-triage-actions"
- path: ./actions
- ref: stable
- - name: Install Actions
- run: npm install --production --prefix ./actions
- - name: Run info-needed Closer
- uses: ./actions/needs-more-info-closer
- with:
- appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}}
- token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}}
- label: info-needed
- closeDays: 7
- additionalTeam: "cleidigh|usernamehw|gjsjohnmurray|IllusionMH"
- closeComment: "This issue has been closed automatically because it needs more information and has not had recent activity. See also our [issue reporting](https://aka.ms/vscodeissuereporting) guidelines.\n\nHappy Coding!"
- pingDays: 80
- pingComment: "Hey @${assignee}, this issue might need further attention.\n\n@${author}, you can help us out by closing this issue if the problem no longer exists, or adding more information."
diff --git a/.github/workflows/no-package-lock-changes.yml b/.github/workflows/no-package-lock-changes.yml
new file mode 100644
index 00000000000..45d5d17407b
--- /dev/null
+++ b/.github/workflows/no-package-lock-changes.yml
@@ -0,0 +1,31 @@
+name: Prevent package-lock.json changes in PRs
+on: [pull_request]
+
+jobs:
+ main:
+ name: Prevent package-lock.json changes in PRs
+ runs-on: ubuntu-latest
+ steps:
+ - uses: octokit/request-action@v2.x
+ id: get_permissions
+ with:
+ route: GET /repos/microsoft/vscode/collaborators/{username}/permission
+ username: ${{ github.event.pull_request.user.login }}
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ - name: Set control output variable
+ id: control
+ run: |
+ echo "user: ${{ github.event.pull_request.user.login }}"
+ echo "role: ${{ fromJson(steps.get_permissions.outputs.data).permission }}"
+ echo "is dependabot: ${{ github.event.pull_request.user.login == 'dependabot[bot]' }}"
+ echo "should_run: ${{ !contains(fromJson('["admin", "maintain", "write"]'), fromJson(steps.get_permissions.outputs.data).permission) }}"
+ echo "should_run=${{ !contains(fromJson('["admin", "maintain", "write"]'), fromJson(steps.get_permissions.outputs.data).permission) && github.event.pull_request.user.login != 'dependabot[bot]' }}" >> $GITHUB_OUTPUT
+ - name: Get file changes
+ uses: trilom/file-changes-action@ce38c8ce2459ca3c303415eec8cb0409857b4272
+ if: ${{ steps.control.outputs.should_run == 'true' }}
+ - name: Check for lockfile changes
+ if: ${{ steps.control.outputs.should_run == 'true' }}
+ run: |
+ cat $HOME/files.json | jq -e 'any(test("package-lock\\.json$|Cargo\\.lock$")) | not' \
+ || (echo "Changes to package-lock.json/Cargo.lock files aren't allowed in PRs." && exit 1)
diff --git a/.github/workflows/on-comment.yml b/.github/workflows/on-comment.yml
deleted file mode 100644
index 089aa77c1e7..00000000000
--- a/.github/workflows/on-comment.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-name: On Comment
-on:
- issue_comment:
- types: [created]
-
-# also make changes in ./on-label.yml
-jobs:
- main:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout Actions
- uses: actions/checkout@v4
- with:
- repository: "microsoft/vscode-github-triage-actions"
- path: ./actions
- ref: stable
- - name: Install Actions
- run: npm install --production --prefix ./actions
- - name: Run Commands
- uses: ./actions/commands
- with:
- appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}}
- token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}}
- config-path: commands
- - name: "Run Release Pipeline Labeler"
- uses: ./actions/release-pipeline
- with:
- token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}}
- appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}}
- notYetReleasedLabel: unreleased
- insidersReleasedLabel: insiders-released
diff --git a/.github/workflows/on-label.yml b/.github/workflows/on-label.yml
deleted file mode 100644
index bf563734017..00000000000
--- a/.github/workflows/on-label.yml
+++ /dev/null
@@ -1,83 +0,0 @@
-name: On Label
-on:
- issues:
- types: [labeled]
-
-jobs:
- main:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout Actions
- uses: actions/checkout@v4
- with:
- repository: "microsoft/vscode-github-triage-actions"
- ref: stable
- path: ./actions
- - name: Install Actions
- run: npm install --production --prefix ./actions
-
- # source of truth in ./author-verified.yml
- - name: Run Author Verified
- if: contains(github.event.issue.labels.*.name, 'author-verification-requested') && contains(github.event.issue.labels.*.name, 'insiders-released')
- uses: ./actions/author-verified
- with:
- appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}}
- token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}}
- requestVerificationComment: "This bug has been fixed in the latest release of [VS Code Insiders](https://code.visualstudio.com/insiders/)!\n\n@${author}, you can help us out by commenting `/verified` if things are now working as expected.\n\nIf things still don't seem right, please ensure you're on version ${commit} of Insiders (today's or later - you can use `Help: About` in the command palette to check), and leave a comment letting us know what isn't working as expected.\n\nHappy Coding!"
- releasedLabel: insiders-released
- verifiedLabel: verified
- authorVerificationRequestedLabel: author-verification-requested
-
-
- # also make changes in ./on-comment.yml
- - name: Run Commands
- uses: ./actions/commands
- with:
- appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}}
- token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}}
- config-path: commands
-
- # source of truth in ./feature-request.yml
- - name: Run Feature Request Manager
- if: contains(github.event.issue.labels.*.name, 'feature-request')
- uses: ./actions/feature-request
- with:
- appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}}
- token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}}
- candidateMilestoneID: 107
- candidateMilestoneName: Backlog Candidates
- backlogMilestoneID: 8
- featureRequestLabel: feature-request
- upvotesRequired: 20
- numCommentsOverride: 20
- initComment: "This feature request is now a candidate for our backlog. The community has 60 days to upvote the issue. If it receives 20 upvotes we will move it to our backlog. If not, we will close it. To learn more about how we handle feature requests, please see our [documentation](https://aka.ms/vscode-issue-lifecycle).\n\nHappy Coding!"
- warnComment: "This feature request has not yet received the 20 community upvotes it takes to make to our backlog. 10 days to go. To learn more about how we handle feature requests, please see our [documentation](https://aka.ms/vscode-issue-lifecycle).\n\nHappy Coding"
- acceptComment: ":slightly_smiling_face: This feature request received a sufficient number of community upvotes and we moved it to our backlog. To learn more about how we handle feature requests, please see our [documentation](https://aka.ms/vscode-issue-lifecycle).\n\nHappy Coding!"
- rejectComment: ":slightly_frowning_face: In the last 60 days, this feature request has received less than 20 community upvotes and we closed it. Still a big Thank You to you for taking the time to create this issue! To learn more about how we handle feature requests, please see our [documentation](https://aka.ms/vscode-issue-lifecycle).\n\nHappy Coding!"
- warnDays: 10
- closeDays: 60
- milestoneDelaySeconds: 60
-
- # source of truth in ./test-plan-item-validator.yml
- - name: Run Test Plan Item Validator
- if: contains(github.event.issue.labels.*.name, 'testplan-item') || contains(github.event.issue.labels.*.name, 'invalid-testplan-item')
- uses: ./actions/test-plan-item-validator
- with:
- token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}}
- refLabel: on-testplan
- label: testplan-item
- invalidLabel: invalid-testplan-item
- comment: Invalid test plan item. See errors below and the [test plan item spec](https://github.com/microsoft/vscode/wiki/Writing-Test-Plan-Items) for more information. This comment will go away when the issues are resolved.
-
- # source of truth in ./english-please.yml
- - name: Run English Please
- if: contains(github.event.issue.labels.*.name, '*english-please')
- uses: ./actions/english-please
- with:
- appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}}
- token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}}
- cognitiveServicesAPIKey: ${{secrets.AZURE_TEXT_TRANSLATOR_KEY}}
- nonEnglishLabel: "*english-please"
- needsMoreInfoLabel: "info-needed"
- translatorRequestedLabelPrefix: "translation-required-"
- translatorRequestedLabelColor: "c29cff"
diff --git a/.github/workflows/on-open.yml b/.github/workflows/on-open.yml
deleted file mode 100644
index 361ac11b946..00000000000
--- a/.github/workflows/on-open.yml
+++ /dev/null
@@ -1,74 +0,0 @@
-name: On Open
-on:
- issues:
- types: [opened]
-
-jobs:
- main:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout Actions
- uses: actions/checkout@v4
- with:
- repository: "microsoft/vscode-github-triage-actions"
- ref: stable
- path: ./actions
- - name: Install Actions
- run: npm install --production --prefix ./actions
-
- - name: Run CopyCat (VSCodeTriageBot/testissues)
- uses: ./actions/copycat
- with:
- appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}}
- token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}}
- owner: VSCodeTriageBot
- repo: testissues
-
- - name: Run New Release
- uses: ./actions/new-release
- with:
- label: new release
- token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}}
- appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}}
- labelColor: "006b75"
- labelDescription: Issues found in a recent release of VS Code
- oldVersionMessage: "Thanks for creating this issue! It looks like you may be using an old version of VS Code, the latest stable release is {currentVersion}. Please try upgrading to the latest version and checking whether this issue remains.\n\nHappy Coding!"
- days: 5
-
- - name: Run Clipboard Labeler
- uses: ./actions/regex-labeler
- with:
- appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}}
- label: "invalid"
- mustNotMatch: "^We have written the needed data into your clipboard because it was too large to send\\. Please paste\\.$"
- comment: "It looks like you're using the VS Code Issue Reporter but did not paste the text generated into the created issue. We've closed this issue, please open a new one containing the text we placed in your clipboard.\n\nHappy Coding!"
-
- - name: Run Clipboard Labeler (Chinese)
- uses: ./actions/regex-labeler
- with:
- appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}}
- label: "invalid"
- mustNotMatch: "^所需的数据太大,无法直接发送。我们已经将其写入剪贴板,请粘贴。$"
- comment: "看起来您正在使用 VS Code 问题报告程序,但是没有将生成的文本粘贴到创建的问题中。我们将关闭这个问题,请使用剪贴板中的内容创建一个新的问题。\n\n祝您使用愉快!"
-
- # source of truth in ./english-please.yml
- - name: Run English Please
- uses: ./actions/english-please
- with:
- token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}}
- appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}}
- cognitiveServicesAPIKey: ${{secrets.AZURE_TEXT_TRANSLATOR_KEY}}
- nonEnglishLabel: "*english-please"
- needsMoreInfoLabel: "info-needed"
- translatorRequestedLabelPrefix: "translation-required-"
- translatorRequestedLabelColor: "c29cff"
- # source of truth in ./test-plan-item-validator.yml
- - name: Run Test Plan Item Validator
- uses: ./actions/test-plan-item-validator
- with:
- token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}}
- refLabel: on-testplan
- label: testplan-item
- invalidLabel: invalid-testplan-item
- comment: Invalid test plan item. See errors below and the [test plan item spec](https://github.com/microsoft/vscode/wiki/Writing-Test-Plan-Items) for more information. This comment will go away when the issues are resolved.
-
diff --git a/.github/workflows/release-pipeline-labeler.yml b/.github/workflows/release-pipeline-labeler.yml
deleted file mode 100644
index 87e188a02ab..00000000000
--- a/.github/workflows/release-pipeline-labeler.yml
+++ /dev/null
@@ -1,32 +0,0 @@
-name: "Release Pipeline Labeler"
-on:
- issues:
- types: [closed, reopened]
- repository_dispatch:
- types: [released-insider]
-
-jobs:
- main:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout Actions
- uses: actions/checkout@v4
- with:
- repository: "microsoft/vscode-github-triage-actions"
- ref: stable
- path: ./actions
- - name: Checkout Repo
- if: github.event_name != 'issues'
- uses: actions/checkout@v4
- with:
- path: ./repo
- fetch-depth: 0
- - name: Install Actions
- run: npm install --production --prefix ./actions
- - name: "Run Release Pipeline Labeler"
- uses: ./actions/release-pipeline
- with:
- token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}}
- appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}}
- notYetReleasedLabel: unreleased
- insidersReleasedLabel: insiders-released
diff --git a/.github/workflows/rich-navigation.yml.off b/.github/workflows/rich-navigation.yml.off
index 73d073f4d7b..cc22d83030d 100644
--- a/.github/workflows/rich-navigation.yml.off
+++ b/.github/workflows/rich-navigation.yml.off
@@ -18,7 +18,7 @@ jobs:
name: Cache VS Code dependencies
with:
path: node_modules
- key: ${{ runner.os }}-dependencies-${{ hashfiles('yarn.lock') }}
+ key: ${{ runner.os }}-dependencies-${{ hashfiles('package-lock.json') }}
restore-keys: ${{ runner.os }}-dependencies-
- uses: actions/setup-node@v3
@@ -27,7 +27,7 @@ jobs:
- name: Install dependencies
if: steps.caching-stage.outputs.cache-hit != 'true'
- run: yarn --frozen-lockfile
+ run: npm ci
env:
CHILD_CONCURRENCY: 1
diff --git a/.github/workflows/telemetry.yml b/.github/workflows/telemetry.yml
index d463a0e2eca..d29ea6c58da 100644
--- a/.github/workflows/telemetry.yml
+++ b/.github/workflows/telemetry.yml
@@ -16,4 +16,4 @@ jobs:
- name: 'Run vscode-telemetry-extractor'
run: 'npx --package=@vscode/telemetry-extractor --yes vscode-telemetry-extractor -s .'
env:
- GITHUB_TOKEN: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}}
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/test-plan-item-validator.yml b/.github/workflows/test-plan-item-validator.yml
deleted file mode 100644
index 117eaf6908a..00000000000
--- a/.github/workflows/test-plan-item-validator.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-name: Test Plan Item Validator
-on:
- issues:
- types: [edited]
-
-# also edit in ./on-label.yml and ./on-open.yml
-jobs:
- main:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout Actions
- if: contains(github.event.issue.labels.*.name, 'testplan-item') || contains(github.event.issue.labels.*.name, 'invalid-testplan-item')
- uses: actions/checkout@v4
- with:
- repository: "microsoft/vscode-github-triage-actions"
- path: ./actions
- ref: stable
- - name: Install Actions
- if: contains(github.event.issue.labels.*.name, 'testplan-item') || contains(github.event.issue.labels.*.name, 'invalid-testplan-item')
- run: npm install --production --prefix ./actions
- - name: Run Test Plan Item Validator
- if: contains(github.event.issue.labels.*.name, 'testplan-item') || contains(github.event.issue.labels.*.name, 'invalid-testplan-item')
- uses: ./actions/test-plan-item-validator
- with:
- token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}}
- refLabel: on-testplan
- label: testplan-item
- invalidLabel: invalid-testplan-item
- comment: Invalid test plan item. See errors below and the [test plan item spec](https://github.com/microsoft/vscode/wiki/Writing-Test-Plan-Items) for more information. This comment will go away when the issues are resolved.
diff --git a/.gitignore b/.gitignore
index 123b3567059..b73ce578e7f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,7 +12,7 @@ build/node_modules
coverage/
test_data/
test-results/
-yarn-error.log
+test-results.xml
vscode.lsif
vscode.db
/.profile-oss
diff --git a/.npmrc b/.npmrc
new file mode 100644
index 00000000000..b54679bde3c
--- /dev/null
+++ b/.npmrc
@@ -0,0 +1,7 @@
+disturl="https://electronjs.org/headers"
+target="30.5.1"
+ms_build_id="10306386"
+runtime="electron"
+build_from_source="true"
+legacy-peer-deps="true"
+timeout=180000
diff --git a/.nvmrc b/.nvmrc
index bc78e9f2695..8ce7030825b 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-20.12.1
+20.16.0
diff --git a/.vscode-test.js b/.vscode-test.js
index f2db8d695fe..89e1b855ee0 100644
--- a/.vscode-test.js
+++ b/.vscode-test.js
@@ -45,6 +45,10 @@ const extensions = [
label: 'github-authentication',
workspaceFolder: path.join(os.tmpdir(), `msft-auth-${Math.floor(Math.random() * 100000)}`),
mocha: { timeout: 60_000 }
+ },
+ {
+ label: 'microsoft-authentication',
+ mocha: { timeout: 60_000 }
}
];
diff --git a/.vscode/extensions/vscode-selfhost-import-aid/.vscode/launch.json b/.vscode/extensions/vscode-selfhost-import-aid/.vscode/launch.json
new file mode 100644
index 00000000000..50b8aedaf72
--- /dev/null
+++ b/.vscode/extensions/vscode-selfhost-import-aid/.vscode/launch.json
@@ -0,0 +1,16 @@
+{
+ "configurations": [
+ {
+ "args": [
+ "--extensionDevelopmentPath=${workspaceFolder}",
+ "--enable-proposed-api=ms-vscode.vscode-selfhost-import-aid"
+ ],
+ "name": "Launch Extension",
+ "outFiles": [
+ "${workspaceFolder}/out/**/*.js"
+ ],
+ "request": "launch",
+ "type": "extensionHost"
+ }
+ ]
+}
diff --git a/.vscode/extensions/vscode-selfhost-import-aid/.vscode/settings.json b/.vscode/extensions/vscode-selfhost-import-aid/.vscode/settings.json
new file mode 100644
index 00000000000..e4429caeee4
--- /dev/null
+++ b/.vscode/extensions/vscode-selfhost-import-aid/.vscode/settings.json
@@ -0,0 +1,7 @@
+{
+ "editor.formatOnSave": true,
+ "editor.defaultFormatter": "vscode.typescript-language-features",
+ "editor.codeActionsOnSave": {
+ "source.organizeImports": "always"
+ }
+}
diff --git a/.vscode/extensions/vscode-selfhost-import-aid/package-lock.json b/.vscode/extensions/vscode-selfhost-import-aid/package-lock.json
new file mode 100644
index 00000000000..5f526aca3e9
--- /dev/null
+++ b/.vscode/extensions/vscode-selfhost-import-aid/package-lock.json
@@ -0,0 +1,31 @@
+{
+ "name": "vscode-selfhost-import-aid",
+ "version": "0.0.1",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "vscode-selfhost-import-aid",
+ "version": "0.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "typescript": "5.5.4"
+ },
+ "engines": {
+ "vscode": "^1.88.0"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.5.4",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz",
+ "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ }
+ }
+}
diff --git a/.vscode/extensions/vscode-selfhost-import-aid/package.json b/.vscode/extensions/vscode-selfhost-import-aid/package.json
new file mode 100644
index 00000000000..30f09f9c8e5
--- /dev/null
+++ b/.vscode/extensions/vscode-selfhost-import-aid/package.json
@@ -0,0 +1,29 @@
+{
+ "name": "vscode-selfhost-import-aid",
+ "displayName": "VS Code Selfhost Import Aid",
+ "description": "Util to improve dealing with imports",
+ "engines": {
+ "vscode": "^1.88.0"
+ },
+ "version": "0.0.1",
+ "publisher": "ms-vscode",
+ "categories": [
+ "Other"
+ ],
+ "activationEvents": [
+ "onLanguage:typescript"
+ ],
+ "main": "./out/extension.js",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/microsoft/vscode.git"
+ },
+ "license": "MIT",
+ "scripts": {
+ "compile": "gulp compile-extension:vscode-selfhost-import-aid",
+ "watch": "gulp watch-extension:vscode-selfhost-import-aid"
+ },
+ "dependencies": {
+ "typescript": "5.5.4"
+ }
+}
diff --git a/.vscode/extensions/vscode-selfhost-import-aid/src/extension.ts b/.vscode/extensions/vscode-selfhost-import-aid/src/extension.ts
new file mode 100644
index 00000000000..91627e69f34
--- /dev/null
+++ b/.vscode/extensions/vscode-selfhost-import-aid/src/extension.ts
@@ -0,0 +1,234 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+import * as vscode from 'vscode';
+import * as ts from 'typescript';
+import * as path from 'path';
+
+export async function activate(context: vscode.ExtensionContext) {
+
+ const fileIndex = new class {
+
+ private _currentRun?: Thenable;
+
+ private _disposables: vscode.Disposable[] = [];
+
+ private readonly _index = new Map();
+
+ constructor() {
+ const watcher = vscode.workspace.createFileSystemWatcher('**/*.ts', false, true, false);
+ this._disposables.push(watcher.onDidChange(e => { this._index.set(e.toString(), e); }));
+ this._disposables.push(watcher.onDidDelete(e => { this._index.delete(e.toString()); }));
+ this._disposables.push(watcher);
+
+ this._refresh(false);
+ }
+
+ dispose(): void {
+ for (const disposable of this._disposables) {
+ disposable.dispose();
+ }
+ this._disposables = [];
+ this._index.clear();
+ }
+
+ async all(token: vscode.CancellationToken) {
+
+ await Promise.race([this._currentRun, new Promise(resolve => token.onCancellationRequested(resolve))]);
+
+ if (token.isCancellationRequested) {
+ return undefined;
+ }
+
+ return Array.from(this._index.values());
+ }
+
+ private _refresh(clear: boolean) {
+ // TODO@jrieken LATEST API! findFiles2New
+ this._currentRun = vscode.workspace.findFiles('src/vs/**/*.ts', '{**/node_modules/**,**/extensions/**}').then(all => {
+ if (clear) {
+ this._index.clear();
+ }
+ for (const item of all) {
+ this._index.set(item.toString(), item);
+ }
+ });
+ }
+ };
+
+ const selector: vscode.DocumentSelector = 'typescript';
+
+ function findNodeAtPosition(document: vscode.TextDocument, node: ts.Node, position: vscode.Position): ts.Node | undefined {
+ if (node.getStart() <= document.offsetAt(position) && node.getEnd() >= document.offsetAt(position)) {
+ return ts.forEachChild(node, child => findNodeAtPosition(document, child, position)) || node;
+ }
+ return undefined;
+ }
+
+ function findImportAt(document: vscode.TextDocument, position: vscode.Position): ts.ImportDeclaration | undefined {
+ const sourceFile = ts.createSourceFile(document.fileName, document.getText(), ts.ScriptTarget.Latest, true);
+ const node = findNodeAtPosition(document, sourceFile, position);
+ if (node && ts.isStringLiteral(node) && ts.isImportDeclaration(node.parent)) {
+ return node.parent;
+ }
+ return undefined;
+ }
+
+ const completionProvider = new class implements vscode.CompletionItemProvider {
+ async provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken): Promise {
+
+ const index = document.getText().lastIndexOf(' from \'');
+ if (index < 0 || document.positionAt(index).line < position.line) {
+ // line after last import is before position
+ // -> no completion, safe a parse call
+ return undefined;
+ }
+
+ const node = findImportAt(document, position);
+ if (!node) {
+ return undefined;
+ }
+
+ const range = new vscode.Range(document.positionAt(node.moduleSpecifier.pos), document.positionAt(node.moduleSpecifier.end));
+ const uris = await fileIndex.all(token);
+
+ if (!uris) {
+ return undefined;
+ }
+
+ const result = new vscode.CompletionList();
+ result.isIncomplete = true;
+
+ for (const item of uris) {
+
+ if (!item.path.endsWith('.ts')) {
+ continue;
+ }
+
+ let relativePath = path.relative(path.dirname(document.uri.path), item.path);
+ relativePath = relativePath.startsWith('.') ? relativePath : `./${relativePath}`;
+
+ const label = path.basename(item.path, path.extname(item.path));
+ const insertText = ` '${relativePath.replace(/\.ts$/, '.js')}'`;
+ const filterText = ` '${label}'`;
+
+ const completion = new vscode.CompletionItem({
+ label: label,
+ description: vscode.workspace.asRelativePath(item),
+ });
+ completion.kind = vscode.CompletionItemKind.File;
+ completion.insertText = insertText;
+ completion.filterText = filterText;
+ completion.range = range;
+
+ result.items.push(completion);
+ }
+
+ return result;
+ }
+ };
+
+ class ImportCodeActions implements vscode.CodeActionProvider {
+
+ static FixKind = vscode.CodeActionKind.QuickFix.append('esmImport');
+
+ static SourceKind = vscode.CodeActionKind.SourceFixAll.append('esmImport');
+
+ async provideCodeActions(document: vscode.TextDocument, range: vscode.Range | vscode.Selection, context: vscode.CodeActionContext, token: vscode.CancellationToken): Promise {
+
+ if (context.only && ImportCodeActions.SourceKind.intersects(context.only)) {
+ return this._provideFixAll(document, context, token);
+ }
+
+ return this._provideFix(document, range, context, token);
+ }
+
+ private async _provideFixAll(document: vscode.TextDocument, context: vscode.CodeActionContext, token: vscode.CancellationToken): Promise {
+
+ const diagnostics = context.diagnostics
+ .filter(d => d.code === 2307)
+ .sort((a, b) => b.range.start.compareTo(a.range.start));
+
+ if (diagnostics.length === 0) {
+ return undefined;
+ }
+
+ const uris = await fileIndex.all(token);
+ if (!uris) {
+ return undefined;
+ }
+
+ const result = new vscode.CodeAction(`Fix All ESM Imports`, ImportCodeActions.SourceKind);
+ result.edit = new vscode.WorkspaceEdit();
+ result.diagnostics = [];
+
+ for (const diag of diagnostics) {
+
+ const actions = this._provideFixesForDiag(document, diag, uris);
+
+ if (actions.length === 0) {
+ console.log(`ESM: no fixes for "${diag.message}"`);
+ continue;
+ }
+
+ if (actions.length > 1) {
+ console.log(`ESM: more than one fix for "${diag.message}", taking first`);
+ console.log(actions);
+ }
+
+ const [first] = actions;
+ result.diagnostics.push(diag);
+
+ for (const [uri, edits] of first.edit!.entries()) {
+ result.edit.set(uri, edits);
+ }
+ }
+ // console.log(result.edit.get(document.uri));
+ return [result];
+ }
+
+ private async _provideFix(document: vscode.TextDocument, range: vscode.Range | vscode.Selection, context: vscode.CodeActionContext, token: vscode.CancellationToken): Promise {
+ const uris = await fileIndex.all(token);
+ if (!uris) {
+ return [];
+ }
+
+ const diag = context.diagnostics.find(d => d.code === 2307 && d.range.intersection(range));
+ return diag && this._provideFixesForDiag(document, diag, uris);
+ }
+
+ private _provideFixesForDiag(document: vscode.TextDocument, diag: vscode.Diagnostic, uris: Iterable): vscode.CodeAction[] {
+
+ const node = findImportAt(document, diag.range.start)?.moduleSpecifier;
+ if (!node || !ts.isStringLiteral(node)) {
+ return [];
+ }
+
+ const nodeRange = new vscode.Range(document.positionAt(node.pos), document.positionAt(node.end));
+ const name = path.basename(node.text, path.extname(node.text));
+
+ const result: vscode.CodeAction[] = [];
+
+ for (const item of uris) {
+ if (path.basename(item.path, path.extname(item.path)) === name) {
+ let relativePath = path.relative(path.dirname(document.uri.path), item.path).replace(/\.ts$/, '.js');
+ relativePath = relativePath.startsWith('.') ? relativePath : `./${relativePath}`;
+
+ const action = new vscode.CodeAction(`Fix to '${relativePath}'`, ImportCodeActions.FixKind);
+ action.edit = new vscode.WorkspaceEdit();
+ action.edit.replace(document.uri, nodeRange, ` '${relativePath}'`);
+ action.diagnostics = [diag];
+ result.push(action);
+ }
+ }
+
+ return result;
+ }
+ }
+
+ context.subscriptions.push(fileIndex);
+ context.subscriptions.push(vscode.languages.registerCompletionItemProvider(selector, completionProvider));
+ context.subscriptions.push(vscode.languages.registerCodeActionsProvider(selector, new ImportCodeActions(), { providedCodeActionKinds: [ImportCodeActions.FixKind, ImportCodeActions.SourceKind] }));
+}
diff --git a/.vscode/extensions/vscode-selfhost-import-aid/tsconfig.json b/.vscode/extensions/vscode-selfhost-import-aid/tsconfig.json
new file mode 100644
index 00000000000..bbca76708ca
--- /dev/null
+++ b/.vscode/extensions/vscode-selfhost-import-aid/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "extends": "../../../extensions/tsconfig.base.json",
+ "compilerOptions": {
+ "outDir": "./out",
+ "types": [
+ "node",
+ "mocha",
+ ]
+ },
+ "include": [
+ "src/**/*",
+ "../../../src/vscode-dts/vscode.d.ts"
+ ]
+}
diff --git a/.vscode/extensions/vscode-selfhost-test-provider/package-lock.json b/.vscode/extensions/vscode-selfhost-test-provider/package-lock.json
new file mode 100644
index 00000000000..a71a68e4e36
--- /dev/null
+++ b/.vscode/extensions/vscode-selfhost-test-provider/package-lock.json
@@ -0,0 +1,101 @@
+{
+ "name": "vscode-selfhost-test-provider",
+ "version": "0.4.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "vscode-selfhost-test-provider",
+ "version": "0.4.0",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "ansi-styles": "^5.2.0",
+ "cockatiel": "^3.1.3",
+ "istanbul-to-vscode": "^2.0.1"
+ },
+ "devDependencies": {
+ "@types/mocha": "^10.0.6",
+ "@types/node": "20.x"
+ },
+ "engines": {
+ "vscode": "^1.88.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@types/istanbul-lib-coverage": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
+ "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w=="
+ },
+ "node_modules/@types/mocha": {
+ "version": "10.0.6",
+ "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.6.tgz",
+ "integrity": "sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==",
+ "dev": true
+ },
+ "node_modules/@types/node": {
+ "version": "20.12.11",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.11.tgz",
+ "integrity": "sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==",
+ "dev": true,
+ "dependencies": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/cockatiel": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/cockatiel/-/cockatiel-3.1.3.tgz",
+ "integrity": "sha512-xC759TpZ69d7HhfDp8m2WkRwEUiCkxY8Ee2OQH/3H6zmy2D/5Sm+zSTbPRa+V2QyjDtpMvjOIAOVjA2gp6N1kQ==",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/istanbul-to-vscode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-to-vscode/-/istanbul-to-vscode-2.0.1.tgz",
+ "integrity": "sha512-V9Hhr7kX3UvkvkaT1lK3AmCRPkaIAIogQBrduTpNiLTkp1eVsybnJhWiDSVeCQap/3aGeZ2019oIivhX9MNsCQ==",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.6"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+ "dev": true
+ }
+ }
+}
diff --git a/.vscode/extensions/vscode-selfhost-test-provider/package.json b/.vscode/extensions/vscode-selfhost-test-provider/package.json
index f472098cd14..3548b00ba81 100644
--- a/.vscode/extensions/vscode-selfhost-test-provider/package.json
+++ b/.vscode/extensions/vscode-selfhost-test-provider/package.json
@@ -4,6 +4,7 @@
"description": "Test provider for the VS Code project",
"enabledApiProposals": [
"testObserver",
+ "testRelatedCode",
"attributableCoverage"
],
"engines": {
@@ -83,6 +84,7 @@
"dependencies": {
"@jridgewell/trace-mapping": "^0.3.25",
"ansi-styles": "^5.2.0",
+ "cockatiel": "^3.1.3",
"istanbul-to-vscode": "^2.0.1"
}
}
diff --git a/.vscode/extensions/vscode-selfhost-test-provider/src/coverageProvider.ts b/.vscode/extensions/vscode-selfhost-test-provider/src/coverageProvider.ts
index 7280782c10a..3fff7c5b637 100644
--- a/.vscode/extensions/vscode-selfhost-test-provider/src/coverageProvider.ts
+++ b/.vscode/extensions/vscode-selfhost-test-provider/src/coverageProvider.ts
@@ -5,7 +5,7 @@
import { IstanbulCoverageContext } from 'istanbul-to-vscode';
import * as vscode from 'vscode';
-import { SourceLocationMapper, SourceMapStore } from './testOutputScanner';
+import { SearchStrategy, SourceLocationMapper, SourceMapStore } from './testOutputScanner';
import { IScriptCoverage, OffsetToPosition, RangeCoverageTracker } from './v8CoverageWrangling';
export const istanbulCoverageContext = new IstanbulCoverageContext();
@@ -18,7 +18,7 @@ export const istanbulCoverageContext = new IstanbulCoverageContext();
export class PerTestCoverageTracker {
private readonly scripts = new Map* script ID */ string, Script>();
- constructor(private readonly maps: SourceMapStore) {}
+ constructor(private readonly maps: SourceMapStore) { }
public add(coverage: IScriptCoverage, test?: vscode.TestItem) {
const script = this.scripts.get(coverage.scriptId);
@@ -71,11 +71,7 @@ class Script {
public async report(run: vscode.TestRun) {
const mapper = await this.maps.getSourceLocationMapper(this.uri.toString());
const originalUri = (await this.maps.getSourceFile(this.uri.toString())) || this.uri;
-
- run.addCoverage(this.overall.report(originalUri, this.converter, mapper));
- for (const [test, projection] of this.perItem) {
- run.addCoverage(projection.report(originalUri, this.converter, mapper, test));
- }
+ run.addCoverage(this.overall.report(originalUri, this.converter, mapper, this.perItem));
}
}
@@ -88,6 +84,43 @@ class ScriptCoverageTracker {
}
}
+ public *toDetails(
+ uri: vscode.Uri,
+ convert: OffsetToPosition,
+ mapper: SourceLocationMapper | undefined,
+ ) {
+ for (const range of this.coverage) {
+ if (range.start === range.end) {
+ continue;
+ }
+
+ const startCov = convert.toLineColumn(range.start);
+ let start = new vscode.Position(startCov.line, startCov.column);
+
+ const endCov = convert.toLineColumn(range.end);
+ let end = new vscode.Position(endCov.line, endCov.column);
+ if (mapper) {
+ const startMap = mapper(start.line, start.character, SearchStrategy.FirstAfter);
+ const endMap = startMap && mapper(end.line, end.character, SearchStrategy.FirstBefore);
+ if (!endMap || uri.toString().toLowerCase() !== endMap.uri.toString().toLowerCase()) {
+ continue;
+ }
+ start = startMap.range.start;
+ end = endMap.range.end;
+ }
+
+ for (let i = start.line; i <= end.line; i++) {
+ yield new vscode.StatementCoverage(
+ range.covered,
+ new vscode.Range(
+ new vscode.Position(i, i === start.line ? start.character : 0),
+ new vscode.Position(i, i === end.line ? end.character : Number.MAX_SAFE_INTEGER)
+ )
+ );
+ }
+ }
+ }
+
/**
* Generates the script's coverage for the test run.
*
@@ -98,53 +131,27 @@ class ScriptCoverageTracker {
uri: vscode.Uri,
convert: OffsetToPosition,
mapper: SourceLocationMapper | undefined,
- item?: vscode.TestItem
+ items: Map,
): V8CoverageFile {
- const file = new V8CoverageFile(uri, item);
-
- for (const range of this.coverage) {
- if (range.start === range.end) {
- continue;
- }
-
- const startCov = convert.toLineColumn(range.start);
- let start = new vscode.Position(startCov.line, startCov.column);
-
- const endCov = convert.toLineColumn(range.end);
- let end = new vscode.Position(endCov.line, endCov.column);
- if (mapper) {
- const startMap = mapper(start.line, start.character);
- const endMap = startMap && mapper(end.line, end.character);
- if (!endMap || uri.toString().toLowerCase() !== endMap.uri.toString().toLowerCase()) {
- continue;
- }
- start = startMap.range.start;
- end = endMap.range.end;
- }
-
- for (let i = start.line; i <= end.line; i++) {
- file.add(
- new vscode.StatementCoverage(
- range.covered,
- new vscode.Range(
- new vscode.Position(i, i === start.line ? start.character : 0),
- new vscode.Position(i, i === end.line ? end.character : Number.MAX_SAFE_INTEGER)
- )
- )
- );
- }
+ const file = new V8CoverageFile(uri, items, convert, mapper);
+ for (const detail of this.toDetails(uri, convert, mapper)) {
+ file.add(detail);
}
return file;
}
}
-export class V8CoverageFile extends vscode.FileCoverage {
+export class V8CoverageFile extends vscode.FileCoverage2 {
public details: vscode.StatementCoverage[] = [];
- constructor(uri: vscode.Uri, item?: vscode.TestItem) {
- super(uri, { covered: 0, total: 0 });
- (this as vscode.FileCoverage2).testItem = item;
+ constructor(
+ uri: vscode.Uri,
+ private readonly perTest: Map,
+ private readonly convert: OffsetToPosition,
+ private readonly mapper: SourceLocationMapper | undefined,
+ ) {
+ super(uri, { covered: 0, total: 0 }, undefined, undefined, [...perTest.keys()]);
}
public add(detail: vscode.StatementCoverage) {
@@ -154,4 +161,9 @@ export class V8CoverageFile extends vscode.FileCoverage {
this.statementCoverage.covered++;
}
}
+
+ public testDetails(test: vscode.TestItem): vscode.FileCoverageDetail[] {
+ const t = this.perTest.get(test);
+ return t ? [...t.toDetails(this.uri, this.convert, this.mapper)] : [];
+ }
}
diff --git a/.vscode/extensions/vscode-selfhost-test-provider/src/extension.ts b/.vscode/extensions/vscode-selfhost-test-provider/src/extension.ts
index c61fd565146..2732ef3b3f6 100644
--- a/.vscode/extensions/vscode-selfhost-test-provider/src/extension.ts
+++ b/.vscode/extensions/vscode-selfhost-test-provider/src/extension.ts
@@ -20,6 +20,7 @@ import {
itemData,
} from './testTree';
import { BrowserTestRunner, PlatformTestRunner, VSCodeTestRunner } from './vscodeTestRunner';
+import { ImportGraph } from './importGraph';
const TEST_FILE_PATTERN = 'src/vs/**/*.{test,integrationTest}.ts';
@@ -44,17 +45,22 @@ export async function activate(context: vscode.ExtensionContext) {
context.subscriptions.push(vscode.tests.registerTestFollowupProvider({
async provideFollowup(_result, test, taskIndex, messageIndex, _token) {
return [{
- title: '$(sparkle) Ask copilot for help',
+ title: '$(sparkle) Fix with Copilot',
command: 'github.copilot.tests.fixTestFailure',
arguments: [{ source: 'peekFollowup', test, message: test.taskStates[taskIndex].messages[messageIndex] }]
}];
},
}));
-
- ctrl.resolveHandler = async test => {
+ let initialWatchPromise: Promise | undefined;
+ const resolveHandler = async (test?: vscode.TestItem) => {
if (!test) {
- context.subscriptions.push(await startWatchingWorkspace(ctrl, fileChangedEmitter));
+ if (!initialWatchPromise) {
+ initialWatchPromise = startWatchingWorkspace(ctrl, fileChangedEmitter);
+ context.subscriptions.push(await initialWatchPromise);
+ } else {
+ await initialWatchPromise;
+ }
return;
}
@@ -66,10 +72,24 @@ export async function activate(context: vscode.ExtensionContext) {
}
};
+ ctrl.resolveHandler = resolveHandler;
+
guessWorkspaceFolder().then(folder => {
- if (folder) {
- context.subscriptions.push(new FailureTracker(context, folder.uri.fsPath));
+ if (!folder) {
+ return;
}
+
+ const graph = new ImportGraph(
+ folder.uri, async () => {
+ await resolveHandler();
+ return [...ctrl.items].map(([, item]) => item);
+ }, uri => ctrl.items.get(uri.toString().toLowerCase()));
+ ctrl.relatedCodeProvider = graph;
+
+ context.subscriptions.push(
+ new FailureTracker(context, folder.uri.fsPath),
+ fileChangedEmitter.event(e => graph.didChange(e.uri, e.removed)),
+ );
});
const createRunHandler = (
@@ -196,13 +216,8 @@ export async function activate(context: vscode.ExtensionContext) {
true
);
- coverage.loadDetailedCoverage = async (_run, coverage) => {
- if (coverage instanceof V8CoverageFile) {
- return coverage.details;
- }
-
- return [];
- };
+ coverage.loadDetailedCoverage = async (_run, coverage) => coverage instanceof V8CoverageFile ? coverage.details : [];
+ coverage.loadDetailedCoverageForTest = async (_run, coverage, test) => coverage instanceof V8CoverageFile ? coverage.testDetails(test) : [];
for (const [name, arg] of browserArgs) {
const cfg = ctrl.createRunProfile(
diff --git a/.vscode/extensions/vscode-selfhost-test-provider/src/importGraph.ts b/.vscode/extensions/vscode-selfhost-test-provider/src/importGraph.ts
new file mode 100644
index 00000000000..ab3c25720ac
--- /dev/null
+++ b/.vscode/extensions/vscode-selfhost-test-provider/src/importGraph.ts
@@ -0,0 +1,239 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+import { join } from 'path';
+import * as vscode from 'vscode';
+import { bulkhead } from 'cockatiel';
+import { promises as fs } from 'fs';
+
+const maxInt32 = 2 ** 31 - 1;
+
+// limit concurrency to avoid overwhelming the filesystem during discovery
+const discoverLimiter = bulkhead(8, Infinity);
+
+// Max import distance when listing related code to improve relevancy.
+const defaultMaxDistance = 3;
+
+/**
+ * Maintains a graph of imports in the codebase. This works lazily resolving
+ * imports and re-parsing files only on request.
+ *
+ * This is a rough, file-level graph derived from simple regex matching on
+ * source files to avoid having to parse the AST of every file in the codebase,
+ * which is possible but more intensive. (See: all the years of work from the
+ * TS language server.)
+ *
+ * A more advanced implementation could use references from the language server.
+ */
+export class ImportGraph implements vscode.TestRelatedCodeProvider {
+ private graph = new Map();
+
+ constructor(
+ private readonly root: vscode.Uri,
+ private readonly discoverWorkspaceTests: () => Thenable,
+ private readonly getTestNodeForDoc: (uri: vscode.Uri) => vscode.TestItem | undefined,
+ ) { }
+
+ /** @inheritdoc */
+ public async provideRelatedCode(test: vscode.TestItem, token: vscode.CancellationToken): Promise {
+ // this is kind of a stub for this implementation. Naive following imports
+ // isn't that useful for finding a test's related code.
+ const node = await this.discoverOutwards(test.uri, new Set(), defaultMaxDistance, token);
+ if (!node) {
+ return [];
+ }
+
+ const imports = new Set();
+ const queue = [{ distance: 0, next: node.imports }];
+ while (queue.length) {
+ const { distance, next } = queue.shift()!;
+ for (const imp of next) {
+ if (imports.has(imp.path)) {
+ continue;
+ }
+
+ imports.add(imp.path);
+ if (distance < defaultMaxDistance) {
+ queue.push({ next: imp.imports, distance: distance + 1 });
+ }
+ }
+ }
+
+ return [...imports].map(importPath =>
+ new vscode.Location(
+ vscode.Uri.file(join(this.root.fsPath, 'src', `${importPath}.ts`)),
+ new vscode.Range(0, 0, maxInt32, 0),
+ ),
+ );
+ }
+
+ /** @inheritdoc */
+ public async provideRelatedTests(document: vscode.TextDocument, _position: vscode.Position, token: vscode.CancellationToken): Promise {
+ // Expand all known tests to ensure imports of this file are realized.
+ const rootTests = await this.discoverWorkspaceTests();
+ const seen = new Set();
+ await Promise.all(rootTests.map(v => v.uri && this.discoverOutwards(v.uri, seen, defaultMaxDistance, token)));
+
+ const node = this.getNode(document.uri);
+ if (!node) {
+ return [];
+ }
+
+ const tests: vscode.TestItem[] = [];
+ const queue: { next: FileNode; distance: number }[] = [{ next: node, distance: 0 }];
+ const visited = new Set();
+ let maxDistance = Infinity;
+
+ while (queue.length) {
+ const { next, distance } = queue.shift()!;
+ if (visited.has(next)) {
+ continue;
+ }
+
+ visited.add(next);
+ const testForDoc = this.getTestNodeForDoc(next.uri);
+ if (testForDoc) {
+ tests.push(testForDoc);
+ // only look for tests half again as far away as the closest test to keep things relevant
+ if (!Number.isFinite(maxDistance)) {
+ maxDistance = distance * 3 / 2;
+ }
+ }
+
+ if (distance < maxDistance) {
+ for (const importedByNode of next.importedBy) {
+ queue.push({ next: importedByNode, distance: distance + 1 });
+ }
+ }
+ }
+
+ return tests;
+ }
+
+ public didChange(uri: vscode.Uri, deleted: boolean) {
+ const rel = this.uriToImportPath(uri);
+ const node = rel && this.graph.get(rel);
+ if (!node) {
+ return;
+ }
+
+ if (deleted) {
+ this.graph.delete(rel);
+ for (const imp of node.imports) {
+ imp.importedBy.delete(node);
+ }
+ } else {
+ node.isSynced = false;
+ }
+ }
+
+ private getNode(uri: vscode.Uri | undefined): FileNode | undefined {
+ const rel = this.uriToImportPath(uri);
+ return rel ? this.graph.get(rel) : undefined;
+ }
+
+ /** Discover all nodes that import the file */
+ private async discoverOutwards(uri: vscode.Uri | undefined, seen: Set, maxDistance: number, token: vscode.CancellationToken): Promise {
+ const rel = this.uriToImportPath(uri);
+ if (!rel) {
+ return undefined;
+ }
+
+ let node = this.graph.get(rel);
+ if (!node) {
+ node = new FileNode(uri!, rel);
+ this.graph.set(rel, node);
+ }
+
+ await this.discoverOutwardsInner(node, seen, maxDistance, token);
+ return node;
+ }
+
+ private async discoverOutwardsInner(node: FileNode, seen: Set, maxDistance: number, token: vscode.CancellationToken) {
+ if (seen.has(node.path) || maxDistance === 0) {
+ return;
+ }
+
+ seen.add(node.path);
+ if (node.isSynced === false) {
+ await this.syncNode(node);
+ } else if (node.isSynced instanceof Promise) {
+ await node.isSynced;
+ }
+
+ if (token.isCancellationRequested) {
+ return;
+ }
+ await Promise.all([...node.imports].map(i => this.discoverOutwardsInner(i, seen, maxDistance - 1, token)));
+ }
+
+ private async syncNode(node: FileNode) {
+ node.isSynced = discoverLimiter.execute(async () => {
+ const doc = vscode.workspace.textDocuments.find(d => d.uri.toString() === node.uri.toString());
+
+ let text: string;
+ if (doc) {
+ text = doc.getText();
+ } else {
+ try {
+ text = await fs.readFile(node.uri.fsPath, 'utf8');
+ } catch {
+ text = '';
+ }
+ }
+
+ for (const imp of node.imports) {
+ imp.importedBy.delete(node);
+ }
+ node.imports.clear();
+
+ for (const [, importPath] of text.matchAll(IMPORT_RE)) {
+ let imp = this.graph.get(importPath);
+ if (!imp) {
+ imp = new FileNode(this.importPathToUri(importPath), importPath);
+ this.graph.set(importPath, imp);
+ }
+
+ imp.importedBy.add(node);
+ node.imports.add(imp);
+ }
+
+ node.isSynced = true;
+ });
+
+ await node.isSynced;
+ }
+
+ private uriToImportPath(uri: vscode.Uri | undefined) {
+ if (!uri) {
+ return undefined;
+ }
+
+ const relativePath = vscode.workspace.asRelativePath(uri).replaceAll('\\', '/');
+ if (!relativePath.startsWith('src/vs/') || !relativePath.endsWith('.ts')) {
+ return undefined;
+ }
+
+ return relativePath.slice('src/'.length, -'.ts'.length);
+ }
+
+ private importPathToUri(importPath: string) {
+ return vscode.Uri.file(join(this.root.fsPath, 'src', `${importPath}.ts`));
+ }
+}
+
+const IMPORT_RE = /import .*? from ["'](vs\/[^"']+)/g;
+
+class FileNode {
+ public imports = new Set();
+ public importedBy = new Set();
+ public isSynced: boolean | Promise = false;
+
+ // Path is the *import path* starting with `vs/`
+ constructor(
+ public readonly uri: vscode.Uri,
+ public readonly path: string,
+ ) { }
+}
diff --git a/.vscode/extensions/vscode-selfhost-test-provider/src/sourceUtils.ts b/.vscode/extensions/vscode-selfhost-test-provider/src/sourceUtils.ts
index 56b26cafda8..3ed21cf5810 100644
--- a/.vscode/extensions/vscode-selfhost-test-provider/src/sourceUtils.ts
+++ b/.vscode/extensions/vscode-selfhost-test-provider/src/sourceUtils.ts
@@ -8,6 +8,7 @@ import * as vscode from 'vscode';
import { TestCase, TestConstruct, TestSuite, VSCodeTest } from './testTree';
const suiteNames = new Set(['suite', 'flakySuite']);
+const testNames = new Set(['test']);
export const enum Action {
Skip,
@@ -19,22 +20,19 @@ export const extractTestFromNode = (src: ts.SourceFile, node: ts.Node, parent: V
return Action.Recurse;
}
- let lhs = node.expression;
- if (isSkipCall(lhs)) {
+ const asSuite = identifyCall(node.expression, suiteNames);
+ const asTest = identifyCall(node.expression, testNames);
+ const either = asSuite || asTest;
+ if (either === IdentifiedCall.Skipped) {
return Action.Skip;
}
-
- if (isPropertyCall(lhs) && lhs.name.text === 'only') {
- lhs = lhs.expression;
+ if (either === IdentifiedCall.Nothing) {
+ return Action.Recurse;
}
const name = node.arguments[0];
const func = node.arguments[1];
- if (!name || !ts.isIdentifier(lhs) || !ts.isStringLiteralLike(name)) {
- return Action.Recurse;
- }
-
- if (!func) {
+ if (!name || !ts.isStringLiteralLike(name) || !func) {
return Action.Recurse;
}
@@ -46,23 +44,45 @@ export const extractTestFromNode = (src: ts.SourceFile, node: ts.Node, parent: V
);
const cparent = parent instanceof TestConstruct ? parent : undefined;
- if (lhs.escapedText === 'test') {
+
+ // we know this is either a suite or a test because we checked for skipped/nothing above
+
+ if (asTest) {
return new TestCase(name.text, range, cparent);
}
- if (suiteNames.has(lhs.escapedText.toString())) {
+ if (asSuite) {
return new TestSuite(name.text, range, cparent);
}
- return Action.Recurse;
+ throw new Error('unreachable');
+};
+
+const enum IdentifiedCall {
+ Nothing,
+ Skipped,
+ IsThing,
+}
+
+const identifyCall = (lhs: ts.Node, needles: ReadonlySet): IdentifiedCall => {
+ if (ts.isIdentifier(lhs)) {
+ return needles.has(lhs.escapedText || lhs.text) ? IdentifiedCall.IsThing : IdentifiedCall.Nothing;
+ }
+
+ if (isPropertyCall(lhs) && lhs.name.text === 'skip') {
+ return needles.has(lhs.expression.text) ? IdentifiedCall.Skipped : IdentifiedCall.Nothing;
+ }
+
+ if (ts.isParenthesizedExpression(lhs) && ts.isConditionalExpression(lhs.expression)) {
+ return Math.max(identifyCall(lhs.expression.whenTrue, needles), identifyCall(lhs.expression.whenFalse, needles));
+ }
+
+ return IdentifiedCall.Nothing;
};
const isPropertyCall = (
- lhs: ts.LeftHandSideExpression
+ lhs: ts.Node
): lhs is ts.PropertyAccessExpression & { expression: ts.Identifier; name: ts.Identifier } =>
ts.isPropertyAccessExpression(lhs) &&
ts.isIdentifier(lhs.expression) &&
ts.isIdentifier(lhs.name);
-
-const isSkipCall = (lhs: ts.LeftHandSideExpression) =>
- isPropertyCall(lhs) && suiteNames.has(lhs.expression.text) && lhs.name.text === 'skip';
diff --git a/.vscode/extensions/vscode-selfhost-test-provider/src/stackTraceParser.ts b/.vscode/extensions/vscode-selfhost-test-provider/src/stackTraceParser.ts
new file mode 100644
index 00000000000..ca3236ce96a
--- /dev/null
+++ b/.vscode/extensions/vscode-selfhost-test-provider/src/stackTraceParser.ts
@@ -0,0 +1,60 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+// Copied from https://github.com/microsoft/vscode-js-debug/blob/1d104b5184736677ab5cc280c70bbd227403850c/src/common/stackTraceParser.ts#L18
+
+// Either match lines like
+// " at fulfilled (/Users/roblou/code/testapp-node2/out/app.js:5:58)"
+// or
+// " at /Users/roblou/code/testapp-node2/out/app.js:60:23"
+// and replace the path in them
+const re1 = /^(\W*at .*\()(.*):(\d+):(\d+)(\))$/;
+const re2 = /^(\W*at )(.*):(\d+):(\d+)$/;
+
+const getLabelRe = /^\W*at (.*) \($/;
+
+/**
+ * Parses a textual stack trace.
+ */
+export class StackTraceParser {
+ /** Gets whether the stacktrace has any locations in it. */
+ public static isStackLike(str: string) {
+ return re1.test(str) || re2.test(str);
+ }
+ constructor(private readonly stack: string) { }
+
+ /** Iterates over segments of text and locations in the stack. */
+ *[Symbol.iterator]() {
+ for (const line of this.stack.split('\n')) {
+ const match = re1.exec(line) || re2.exec(line);
+ if (!match) {
+ yield line + '\n';
+ continue;
+ }
+
+ const [, prefix, url, lineNo, columnNo, suffix] = match;
+ if (prefix) {
+ yield prefix;
+ }
+
+ yield new StackTraceLocation(getLabelRe.exec(prefix)?.[1], url, Number(lineNo), Number(columnNo));
+
+ if (suffix) {
+ yield suffix;
+ }
+
+ yield '\n';
+ }
+ }
+}
+
+export class StackTraceLocation {
+ constructor(
+ public readonly label: string | undefined,
+ public readonly path: string,
+ public readonly lineBase1: number,
+ public readonly columnBase1: number,
+ ) { }
+}
\ No newline at end of file
diff --git a/.vscode/extensions/vscode-selfhost-test-provider/src/testOutputScanner.ts b/.vscode/extensions/vscode-selfhost-test-provider/src/testOutputScanner.ts
index 74013dcd561..296ed1e9f12 100644
--- a/.vscode/extensions/vscode-selfhost-test-provider/src/testOutputScanner.ts
+++ b/.vscode/extensions/vscode-selfhost-test-provider/src/testOutputScanner.ts
@@ -16,6 +16,7 @@ import * as vscode from 'vscode';
import { istanbulCoverageContext, PerTestCoverageTracker } from './coverageProvider';
import { attachTestMessageMetadata } from './metadata';
import { snapshotComment } from './snapshot';
+import { StackTraceLocation, StackTraceParser } from './stackTraceParser';
import { StreamSplitter } from './streamSplitter';
import { getContentFromFilesystem } from './testTree';
import { IScriptCoverage } from './v8CoverageWrangling';
@@ -288,7 +289,7 @@ export async function scanTestOutput(
enqueueExitBlocker(
(async () => {
- const location = await tryDeriveStackLocation(store, rawErr, tcase!);
+ const stackInfo = await deriveStackLocations(store, rawErr, tcase!);
let message: vscode.TestMessage;
if (hasDiff) {
@@ -310,7 +311,8 @@ export async function scanTestOutput(
);
}
- message.location = location ?? testFirstLine;
+ message.location = stackInfo.primary ?? testFirstLine;
+ message.stackTrace = stackInfo.stack;
task.failed(tcase!, message, duration);
})()
);
@@ -424,36 +426,62 @@ const tryMakeMarkdown = (message: string) => {
const inlineSourcemapRe = /^\/\/# sourceMappingURL=data:application\/json;base64,(.+)/m;
const sourceMapBiases = [GREATEST_LOWER_BOUND, LEAST_UPPER_BOUND] as const;
-export type SourceLocationMapper = (line: number, col: number) => vscode.Location | undefined;
+export const enum SearchStrategy {
+ FirstBefore = -1,
+ FirstAfter = 1,
+}
+
+export type SourceLocationMapper = (line: number, col: number, strategy: SearchStrategy) => vscode.Location | undefined;
export class SourceMapStore {
private readonly cache = new Map* file uri */ string, Promise>();
- async getSourceLocationMapper(fileUri: string) {
+ async getSourceLocationMapper(fileUri: string): Promise {
const sourceMap = await this.loadSourceMap(fileUri);
- return (line: number, col: number) => {
+ return (line, col, strategy) => {
if (!sourceMap) {
return undefined;
}
- let smLine = line + 1;
+ // 1. Look for the ideal position on this line if it exists
+ const idealPosition = originalPositionFor(sourceMap, { column: col, line: line + 1, bias: SearchStrategy.FirstAfter ? GREATEST_LOWER_BOUND : LEAST_UPPER_BOUND });
+ if (idealPosition.line !== null && idealPosition.column !== null && idealPosition.source !== null) {
+ return new vscode.Location(
+ this.completeSourceMapUrl(sourceMap, idealPosition.source),
+ new vscode.Position(idealPosition.line - 1, idealPosition.column)
+ );
+ }
- // if the range is after the end of mappings, adjust it to the last mapped line
+ // Otherwise get the first/last valid mapping on another line.
const decoded = decodedMappings(sourceMap);
- if (decoded.length <= line) {
- smLine = decoded.length; // base 1, no -1 needed
- col = Number.MAX_SAFE_INTEGER;
+ const enum MapField {
+ COLUMN = 0,
+ SOURCES_INDEX = 1,
+ SOURCE_LINE = 2,
+ SOURCE_COLUMN = 3,
}
- for (const bias of sourceMapBiases) {
- const position = originalPositionFor(sourceMap, { column: col, line: smLine, bias });
- if (position.line !== null && position.column !== null && position.source !== null) {
- return new vscode.Location(
- this.completeSourceMapUrl(sourceMap, position.source),
- new vscode.Position(position.line - 1, position.column)
- );
+ do {
+ line += strategy;
+ const segments = decoded[line];
+ if (!segments?.length) {
+ continue;
}
- }
+
+ const index = strategy === SearchStrategy.FirstBefore
+ ? findLastIndex(segments, s => s.length !== 1)
+ : segments.findIndex(s => s.length !== 1);
+ const segment = segments[index];
+
+ if (!segment || segment.length === 1) {
+ continue;
+ }
+
+ return new vscode.Location(
+ this.completeSourceMapUrl(sourceMap, sourceMap.sources[segment[MapField.SOURCES_INDEX]]!),
+ new vscode.Position(segment[MapField.SOURCE_LINE] - 1, segment[MapField.SOURCE_COLUMN])
+ );
+ } while (strategy === SearchStrategy.FirstBefore ? line > 0 : line < decoded.length);
return undefined;
};
@@ -461,7 +489,31 @@ export class SourceMapStore {
/** Gets an original location from a base 0 line and column */
async getSourceLocation(fileUri: string, line: number, col = 0) {
- return this.getSourceLocationMapper(fileUri).then(m => m(line, col));
+ const sourceMap = await this.loadSourceMap(fileUri);
+ if (!sourceMap) {
+ return undefined;
+ }
+
+ let smLine = line + 1;
+
+ // if the range is after the end of mappings, adjust it to the last mapped line
+ const decoded = decodedMappings(sourceMap);
+ if (decoded.length <= line) {
+ smLine = decoded.length; // base 1, no -1 needed
+ col = Number.MAX_SAFE_INTEGER;
+ }
+
+ for (const bias of sourceMapBiases) {
+ const position = originalPositionFor(sourceMap, { column: col, line: smLine, bias });
+ if (position.line !== null && position.column !== null && position.source !== null) {
+ return new vscode.Location(
+ this.completeSourceMapUrl(sourceMap, position.source),
+ new vscode.Position(position.line - 1, position.column)
+ );
+ }
+ }
+
+ return undefined;
}
async getSourceFile(compiledUri: string) {
@@ -558,47 +610,51 @@ async function replaceAllLocations(store: SourceMapStore, str: string) {
return values.join('');
}
-async function tryDeriveStackLocation(
+async function deriveStackLocations(
store: SourceMapStore,
stack: string,
tcase: vscode.TestItem
) {
locationRe.lastIndex = 0;
- return new Promise(resolve => {
- const matches = [...stack.matchAll(locationRe)];
- let todo = matches.length;
- if (todo === 0) {
- return resolve(undefined);
- }
+ const locationsRaw = [...new StackTraceParser(stack)].filter(t => t instanceof StackTraceLocation);
+ const locationsMapped = await Promise.all(locationsRaw.map(async location => {
+ const mapped = location.path.startsWith('file:') ? await store.getSourceLocation(location.path, location.lineBase1 - 1, location.columnBase1 - 1) : undefined;
+ const stack = new vscode.TestMessageStackFrame(location.label || '', mapped?.uri, mapped?.range.start || new vscode.Position(location.lineBase1 - 1, location.columnBase1 - 1));
+ return { location: mapped, stack };
+ }));
- let best: undefined | { location: vscode.Location; i: number; score: number };
- for (const [i, match] of matches.entries()) {
- deriveSourceLocation(store, match)
- .catch(() => undefined)
- .then(location => {
- if (location) {
- let score = 0;
- if (tcase.uri && tcase.uri.toString() === location.uri.toString()) {
- score = 1;
- if (tcase.range && tcase.range.contains(location?.range)) {
- score = 2;
- }
- }
- if (!best || score > best.score || (score === best.score && i < best.i)) {
- best = { location, i, score };
- }
- }
-
- if (!--todo) {
- resolve(best?.location);
- }
- });
+ let best: undefined | { location: vscode.Location; score: number };
+ for (const { location } of locationsMapped) {
+ if (!location) {
+ continue;
}
- });
+ let score = 0;
+ if (tcase.uri && tcase.uri.toString() === location.uri.toString()) {
+ score = 1;
+ if (tcase.range && tcase.range.contains(location?.range)) {
+ score = 2;
+ }
+ }
+ if (!best || score > best.score) {
+ best = { location, score };
+ }
+ }
+
+ return { stack: locationsMapped.map(s => s.stack), primary: best?.location };
}
async function deriveSourceLocation(store: SourceMapStore, parts: RegExpMatchArray) {
const [, fileUri, line, col] = parts;
return store.getSourceLocation(fileUri, Number(line) - 1, Number(col));
}
+
+function findLastIndex(arr: T[], predicate: (value: T) => boolean) {
+ for (let i = arr.length - 1; i >= 0; i--) {
+ if (predicate(arr[i])) {
+ return i;
+ }
+ }
+
+ return -1;
+}
diff --git a/.vscode/extensions/vscode-selfhost-test-provider/src/vscodeTestRunner.ts b/.vscode/extensions/vscode-selfhost-test-provider/src/vscodeTestRunner.ts
index 954b847f4a8..b5ffd440b33 100644
--- a/.vscode/extensions/vscode-selfhost-test-provider/src/vscodeTestRunner.ts
+++ b/.vscode/extensions/vscode-selfhost-test-provider/src/vscodeTestRunner.ts
@@ -63,7 +63,7 @@ export abstract class VSCodeTestRunner {
const cp = spawn(await this.binaryPath(), args, {
cwd: this.repoLocation.uri.fsPath,
stdio: 'pipe',
- env: this.getEnvironment(),
+ env: this.getEnvironment(port),
});
// Register a descriptor factory that signals the server when any
@@ -139,7 +139,7 @@ export abstract class VSCodeTestRunner {
});
}
- protected getEnvironment(): NodeJS.ProcessEnv {
+ protected getEnvironment(_remoteDebugPort?: number): NodeJS.ProcessEnv {
return {
...process.env,
ELECTRON_RUN_AS_NODE: undefined,
@@ -261,9 +261,10 @@ export class BrowserTestRunner extends VSCodeTestRunner {
}
/** @override */
- protected override getEnvironment() {
+ protected override getEnvironment(remoteDebugPort?: number) {
return {
- ...super.getEnvironment(),
+ ...super.getEnvironment(remoteDebugPort),
+ PLAYWRIGHT_CHROMIUM_DEBUG_PORT: remoteDebugPort ? String(remoteDebugPort) : undefined,
ELECTRON_RUN_AS_NODE: '1',
};
}
diff --git a/.vscode/extensions/vscode-selfhost-test-provider/tsconfig.json b/.vscode/extensions/vscode-selfhost-test-provider/tsconfig.json
index b95a70145c0..56d6859c3e3 100644
--- a/.vscode/extensions/vscode-selfhost-test-provider/tsconfig.json
+++ b/.vscode/extensions/vscode-selfhost-test-provider/tsconfig.json
@@ -11,7 +11,7 @@
"src/**/*",
"../../../src/vscode-dts/vscode.d.ts",
"../../../src/vscode-dts/vscode.proposed.testObserver.d.ts",
- "../../../src/vscode-dts/vscode.proposed.attributableCoverage.d.ts",
- "../../../src/vscode-dts/vscode.proposed.testRunInDebug.d.ts",
+ "../../../src/vscode-dts/vscode.proposed.testRelatedCode.d.ts",
+ "../../../src/vscode-dts/vscode.proposed.attributableCoverage.d.ts"
]
}
diff --git a/.vscode/extensions/vscode-selfhost-test-provider/yarn.lock b/.vscode/extensions/vscode-selfhost-test-provider/yarn.lock
deleted file mode 100644
index 50478f52c73..00000000000
--- a/.vscode/extensions/vscode-selfhost-test-provider/yarn.lock
+++ /dev/null
@@ -1,55 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"@jridgewell/resolve-uri@^3.1.0":
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6"
- integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
-
-"@jridgewell/sourcemap-codec@^1.4.14":
- version "1.4.15"
- resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
- integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
-
-"@jridgewell/trace-mapping@^0.3.25":
- version "0.3.25"
- resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0"
- integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
- dependencies:
- "@jridgewell/resolve-uri" "^3.1.0"
- "@jridgewell/sourcemap-codec" "^1.4.14"
-
-"@types/istanbul-lib-coverage@^2.0.6":
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7"
- integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==
-
-"@types/mocha@^10.0.6":
- version "10.0.6"
- resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.6.tgz#818551d39113081048bdddbef96701b4e8bb9d1b"
- integrity sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==
-
-"@types/node@20.x":
- version "20.12.11"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.11.tgz#c4ef00d3507000d17690643278a60dc55a9dc9be"
- integrity sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==
- dependencies:
- undici-types "~5.26.4"
-
-ansi-styles@^5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b"
- integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==
-
-istanbul-to-vscode@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/istanbul-to-vscode/-/istanbul-to-vscode-2.0.1.tgz#84994d06e604b68cac7301840f338b1e74eb888b"
- integrity sha512-V9Hhr7kX3UvkvkaT1lK3AmCRPkaIAIogQBrduTpNiLTkp1eVsybnJhWiDSVeCQap/3aGeZ2019oIivhX9MNsCQ==
- dependencies:
- "@types/istanbul-lib-coverage" "^2.0.6"
-
-undici-types@~5.26.4:
- version "5.26.5"
- resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
- integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
diff --git a/.vscode/notebooks/api.github-issues b/.vscode/notebooks/api.github-issues
index 2ac7d699582..6b6a41f5135 100644
--- a/.vscode/notebooks/api.github-issues
+++ b/.vscode/notebooks/api.github-issues
@@ -7,7 +7,7 @@
{
"kind": 2,
"language": "github-issues",
- "value": "$REPO=repo:microsoft/vscode\n$MILESTONE=milestone:\"May 2024\""
+ "value": "$REPO=repo:microsoft/vscode\n$MILESTONE=milestone:\"September 2024\""
},
{
"kind": 1,
diff --git a/.vscode/notebooks/endgame.github-issues b/.vscode/notebooks/endgame.github-issues
index d7836922bad..9f6624a1323 100644
--- a/.vscode/notebooks/endgame.github-issues
+++ b/.vscode/notebooks/endgame.github-issues
@@ -7,7 +7,7 @@
{
"kind": 2,
"language": "github-issues",
- "value": "$REPOS=repo:microsoft/lsprotocol repo:microsoft/monaco-editor repo:microsoft/vscode repo:microsoft/vscode-anycode repo:microsoft/vscode-autopep8 repo:microsoft/vscode-black-formatter repo:microsoft/vscode-copilot repo:microsoft/vscode-copilot-release repo:microsoft/vscode-dev repo:microsoft/vscode-dev-chrome-launcher repo:microsoft/vscode-emmet-helper repo:microsoft/vscode-extension-telemetry repo:microsoft/vscode-flake8 repo:microsoft/vscode-github-issue-notebooks repo:microsoft/vscode-hexeditor repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-isort repo:microsoft/vscode-js-debug repo:microsoft/vscode-jupyter repo:microsoft/vscode-jupyter-internal repo:microsoft/vscode-l10n repo:microsoft/vscode-livepreview repo:microsoft/vscode-markdown-languageservice repo:microsoft/vscode-markdown-tm-grammar repo:microsoft/vscode-mypy repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-pylint repo:microsoft/vscode-python repo:microsoft/vscode-python-debugger repo:microsoft/vscode-python-tools-extension-template repo:microsoft/vscode-references-view repo:microsoft/vscode-remote-release repo:microsoft/vscode-remote-repositories-github repo:microsoft/vscode-remote-tunnels repo:microsoft/vscode-remotehub repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-unpkg repo:microsoft/vscode-vsce\n\n$MILESTONE=milestone:\"May 2024\""
+ "value": "$REPOS=repo:microsoft/lsprotocol repo:microsoft/monaco-editor repo:microsoft/vscode repo:microsoft/vscode-anycode repo:microsoft/vscode-autopep8 repo:microsoft/vscode-black-formatter repo:microsoft/vscode-copilot repo:microsoft/vscode-copilot-release repo:microsoft/vscode-dev repo:microsoft/vscode-dev-chrome-launcher repo:microsoft/vscode-emmet-helper repo:microsoft/vscode-extension-telemetry repo:microsoft/vscode-flake8 repo:microsoft/vscode-github-issue-notebooks repo:microsoft/vscode-hexeditor repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-isort repo:microsoft/vscode-js-debug repo:microsoft/vscode-jupyter repo:microsoft/vscode-jupyter-internal repo:microsoft/vscode-l10n repo:microsoft/vscode-livepreview repo:microsoft/vscode-markdown-languageservice repo:microsoft/vscode-markdown-tm-grammar repo:microsoft/vscode-mypy repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-pylint repo:microsoft/vscode-python repo:microsoft/vscode-python-debugger repo:microsoft/vscode-python-tools-extension-template repo:microsoft/vscode-references-view repo:microsoft/vscode-remote-release repo:microsoft/vscode-remote-repositories-github repo:microsoft/vscode-remote-tunnels repo:microsoft/vscode-remotehub repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-unpkg repo:microsoft/vscode-vsce\n\n$MILESTONE=milestone:\"September 2024\""
},
{
"kind": 1,
@@ -32,7 +32,7 @@
{
"kind": 2,
"language": "github-issues",
- "value": "$REPOS -$MILESTONE is:issue is:closed reason:completed label:bug label:insiders-released -label:verified -label:*duplicate -label:*as-designed -label:z-author-verified -label:on-testplan"
+ "value": "$REPOS -$MILESTONE is:issue is:closed reason:completed label:bug label:insiders-released -label:verified -label:*duplicate -label:*as-designed -label:z-author-verified -label:on-testplan -label:error-telemetry"
},
{
"kind": 1,
diff --git a/.vscode/notebooks/my-endgame.github-issues b/.vscode/notebooks/my-endgame.github-issues
index 3bf56fffce4..f17345ed7f6 100644
--- a/.vscode/notebooks/my-endgame.github-issues
+++ b/.vscode/notebooks/my-endgame.github-issues
@@ -7,7 +7,7 @@
{
"kind": 2,
"language": "github-issues",
- "value": "$REPOS=repo:microsoft/lsprotocol repo:microsoft/monaco-editor repo:microsoft/vscode repo:microsoft/vscode-anycode repo:microsoft/vscode-autopep8 repo:microsoft/vscode-black-formatter repo:microsoft/vscode-copilot repo:microsoft/vscode-copilot-release repo:microsoft/vscode-dev repo:microsoft/vscode-dev-chrome-launcher repo:microsoft/vscode-emmet-helper repo:microsoft/vscode-extension-telemetry repo:microsoft/vscode-flake8 repo:microsoft/vscode-github-issue-notebooks repo:microsoft/vscode-hexeditor repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-isort repo:microsoft/vscode-js-debug repo:microsoft/vscode-jupyter repo:microsoft/vscode-jupyter-internal repo:microsoft/vscode-l10n repo:microsoft/vscode-livepreview repo:microsoft/vscode-markdown-languageservice repo:microsoft/vscode-markdown-tm-grammar repo:microsoft/vscode-mypy repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-pylint repo:microsoft/vscode-python repo:microsoft/vscode-python-debugger repo:microsoft/vscode-python-tools-extension-template repo:microsoft/vscode-references-view repo:microsoft/vscode-remote-release repo:microsoft/vscode-remote-repositories-github repo:microsoft/vscode-remote-tunnels repo:microsoft/vscode-remotehub repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-unpkg repo:microsoft/vscode-vsce\n\n$MILESTONE=milestone:\"May 2024\"\n\n$MINE=assignee:@me"
+ "value": "$REPOS=repo:microsoft/lsprotocol repo:microsoft/monaco-editor repo:microsoft/vscode repo:microsoft/vscode-anycode repo:microsoft/vscode-autopep8 repo:microsoft/vscode-black-formatter repo:microsoft/vscode-copilot repo:microsoft/vscode-copilot-release repo:microsoft/vscode-dev repo:microsoft/vscode-dev-chrome-launcher repo:microsoft/vscode-emmet-helper repo:microsoft/vscode-extension-telemetry repo:microsoft/vscode-flake8 repo:microsoft/vscode-github-issue-notebooks repo:microsoft/vscode-hexeditor repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-isort repo:microsoft/vscode-js-debug repo:microsoft/vscode-jupyter repo:microsoft/vscode-jupyter-internal repo:microsoft/vscode-l10n repo:microsoft/vscode-livepreview repo:microsoft/vscode-markdown-languageservice repo:microsoft/vscode-markdown-tm-grammar repo:microsoft/vscode-mypy repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-pylint repo:microsoft/vscode-python repo:microsoft/vscode-python-debugger repo:microsoft/vscode-python-tools-extension-template repo:microsoft/vscode-references-view repo:microsoft/vscode-remote-release repo:microsoft/vscode-remote-repositories-github repo:microsoft/vscode-remote-tunnels repo:microsoft/vscode-remotehub repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-unpkg repo:microsoft/vscode-vsce\n\n$MILESTONE=milestone:\"September 2024\"\n\n$MINE=assignee:@me"
},
{
"kind": 1,
@@ -157,7 +157,7 @@
{
"kind": 2,
"language": "github-issues",
- "value": "$REPOS $MILESTONE -$MINE is:issue is:closed reason:completed sort:updated-asc label:bug -label:unreleased -label:verified -label:z-author-verified -label:on-testplan -label:*duplicate -label:duplicate -label:invalid -label:*as-designed -label:*out-of-scope -label:error-telemetry -label:verification-steps-needed -label:verification-found -author:aeschli -author:alexdima -author:alexr00 -author:AmandaSilver -author:andreamah -author:bamurtaugh -author:bpasero -author:chrisdias -author:chrmarti -author:Chuxel -author:claudiaregio -author:connor4312 -author:dbaeumer -author:deepak1556 -author:devinvalenciano -author:digitarald -author:DonJayamanne -author:egamma -author:fiveisprime -author:gregvanl -author:hediet -author:isidorn -author:joaomoreno -author:joyceerhl -author:jrieken -author:kieferrm -author:lramos15 -author:lszomoru -author:meganrogge -author:misolori -author:mjbvz -author:rebornix -author:roblourens -author:rzhao271 -author:sandy081 -author:sbatten -author:stevencl -author:tanhakabir -author:TylerLeonhardt -author:Tyriar -author:weinand -author:amunger -author:karthiknadig -author:eleanorjboyd -author:Yoyokrazy -author:paulacamargo25 -author:ulugbekna -author:aiday-mar -author:daviddossett -author:bhavyaus -author:justschen -author:benibenj -author:luabud"
+ "value": "$REPOS $MILESTONE -$MINE is:issue is:closed reason:completed sort:updated-asc label:bug -label:unreleased -label:verified -label:z-author-verified -label:on-testplan -label:*duplicate -label:duplicate -label:invalid -label:*as-designed -label:*out-of-scope -label:error-telemetry -label:verification-steps-needed -label:verification-found -author:aeschli -author:alexdima -author:alexr00 -author:AmandaSilver -author:andreamah -author:bamurtaugh -author:bpasero -author:chrisdias -author:chrmarti -author:Chuxel -author:claudiaregio -author:connor4312 -author:dbaeumer -author:deepak1556 -author:devinvalenciano -author:digitarald -author:DonJayamanne -author:egamma -author:fiveisprime -author:gregvanl -author:hediet -author:isidorn -author:joaomoreno -author:joyceerhl -author:jrieken -author:kieferrm -author:lramos15 -author:lszomoru -author:meganrogge -author:misolori -author:mjbvz -author:rebornix -author:roblourens -author:rzhao271 -author:sandy081 -author:sbatten -author:stevencl -author:tanhakabir -author:TylerLeonhardt -author:Tyriar -author:weinand -author:amunger -author:karthiknadig -author:eleanorjboyd -author:Yoyokrazy -author:paulacamargo25 -author:ulugbekna -author:aiday-mar -author:daviddossett -author:bhavyaus -author:justschen -author:benibenj -author:luabud -author:anthonykim1 -author:joshspicer"
},
{
"kind": 1,
diff --git a/.vscode/notebooks/my-work.github-issues b/.vscode/notebooks/my-work.github-issues
index 091c6e8a886..5f54a2e5d91 100644
--- a/.vscode/notebooks/my-work.github-issues
+++ b/.vscode/notebooks/my-work.github-issues
@@ -7,7 +7,7 @@
{
"kind": 2,
"language": "github-issues",
- "value": "// list of repos we work in\n$REPOS=repo:microsoft/lsprotocol repo:microsoft/monaco-editor repo:microsoft/vscode repo:microsoft/vscode-anycode repo:microsoft/vscode-autopep8 repo:microsoft/vscode-black-formatter repo:microsoft/vscode-copilot repo:microsoft/vscode-copilot-release repo:microsoft/vscode-dev repo:microsoft/vscode-dev-chrome-launcher repo:microsoft/vscode-emmet-helper repo:microsoft/vscode-extension-telemetry repo:microsoft/vscode-flake8 repo:microsoft/vscode-github-issue-notebooks repo:microsoft/vscode-hexeditor repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-isort repo:microsoft/vscode-js-debug repo:microsoft/vscode-jupyter repo:microsoft/vscode-jupyter-internal repo:microsoft/vscode-l10n repo:microsoft/vscode-livepreview repo:microsoft/vscode-markdown-languageservice repo:microsoft/vscode-markdown-tm-grammar repo:microsoft/vscode-mypy repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-pylint repo:microsoft/vscode-python repo:microsoft/vscode-python-debugger repo:microsoft/vscode-python-tools-extension-template repo:microsoft/vscode-references-view repo:microsoft/vscode-remote-release repo:microsoft/vscode-remote-repositories-github repo:microsoft/vscode-remote-tunnels repo:microsoft/vscode-remotehub repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-unpkg repo:microsoft/vscode-vsce\n\n// current milestone name\n$MILESTONE=milestone:\"May 2024\"\n"
+ "value": "// list of repos we work in\n$REPOS=repo:microsoft/lsprotocol repo:microsoft/monaco-editor repo:microsoft/vscode repo:microsoft/vscode-anycode repo:microsoft/vscode-autopep8 repo:microsoft/vscode-black-formatter repo:microsoft/vscode-copilot repo:microsoft/vscode-copilot-release repo:microsoft/vscode-dev repo:microsoft/vscode-dev-chrome-launcher repo:microsoft/vscode-emmet-helper repo:microsoft/vscode-extension-telemetry repo:microsoft/vscode-flake8 repo:microsoft/vscode-github-issue-notebooks repo:microsoft/vscode-hexeditor repo:microsoft/vscode-internalbacklog repo:microsoft/vscode-isort repo:microsoft/vscode-js-debug repo:microsoft/vscode-jupyter repo:microsoft/vscode-jupyter-internal repo:microsoft/vscode-l10n repo:microsoft/vscode-livepreview repo:microsoft/vscode-markdown-languageservice repo:microsoft/vscode-markdown-tm-grammar repo:microsoft/vscode-mypy repo:microsoft/vscode-pull-request-github repo:microsoft/vscode-pylint repo:microsoft/vscode-python repo:microsoft/vscode-python-debugger repo:microsoft/vscode-python-tools-extension-template repo:microsoft/vscode-references-view repo:microsoft/vscode-remote-release repo:microsoft/vscode-remote-repositories-github repo:microsoft/vscode-remote-tunnels repo:microsoft/vscode-remotehub repo:microsoft/vscode-settings-sync-server repo:microsoft/vscode-unpkg repo:microsoft/vscode-vsce\n\n// current milestone name\n$MILESTONE=milestone:\"September 2024\"\n"
},
{
"kind": 1,
@@ -102,7 +102,7 @@
{
"kind": 2,
"language": "github-issues",
- "value": "repo:microsoft/vscode assignee:@me is:open type:issue -label:\"info-needed\" -label:api -label:api-finalization -label:api-proposal -label:authentication -label:bisect-ext -label:bracket-pair-colorization -label:bracket-pair-guides -label:breadcrumbs -label:callhierarchy -label:chrome-devtools -label:code-lens -label:command-center -label:comments -label:config -label:context-keys -label:custom-editors -label:debug -label:debug-console -label:debug-disassembly -label:dialogs -label:diff-editor -label:dropdown -label:editor-api -label:editor-autoclosing -label:editor-autoindent -label:editor-bracket-matching -label:editor-clipboard -label:editor-code-actions -label:editor-color-picker -label:editor-columnselect -label:editor-commands -label:editor-comments -label:editor-contrib -label:editor-core -label:editor-drag-and-drop -label:editor-error-widget -label:editor-find -label:editor-folding -label:editor-highlight -label:editor-hover -label:editor-indent-detection -label:editor-indent-guides -label:editor-input -label:editor-input-IME -label:editor-insets -label:editor-minimap -label:editor-multicursor -label:editor-parameter-hints -label:editor-render-whitespace -label:editor-rendering -label:editor-RTL -label:editor-scrollbar -label:editor-sorting -label:editor-sticky-scroll -label:editor-sticky-scroll-decorations -label:editor-symbols -label:editor-synced-region -label:editor-textbuffer -label:editor-theming -label:editor-wordnav -label:editor-wrapping -label:emmet-parse -label:extension-activation -label:extension-host -label:extension-prerelease -label:extension-recommendations -label:extension-signature -label:extensions -label:extensions-development -label:file-decorations -label:file-encoding -label:file-explorer -label:file-glob -label:file-io -label:file-nesting -label:file-watcher -label:font-rendering -label:formatting -label:getting-started -label:ghost-text -label:git -label:github -label:github-repositories -label:gpu -label:grammar -label:grid-widget -label:icon-brand -label:icons-product -label:icons-widget -label:inlay-hints -label:inline-chat -label:inline-completions -label:install-update -label:intellisense-config -label:interactive-playground -label:interactive-window -label:javascript -label:json -label:json-sorting -label:keybindings -label:keybindings-editor -label:keyboard-layout -label:L10N -label:l10n-platform -label:label-provider -label:languages-basic -label:languages-diagnostics -label:languages-guessing -label:layout -label:lcd-text-rendering -label:list-widget -label:live-preview -label:log -label:markdown -label:marketplace -label:menus -label:merge-conflict -label:merge-editor -label:merge-editor-workbench -label:monaco-editor -label:multi-monitor -label:native-file-dialog -label:network -label:notebook -label:notebook-accessibility -label:notebook-api -label:notebook-builtin-renderers -label:notebook-cell-editor -label:notebook-celltoolbar -label:notebook-clipboard -label:notebook-commands -label:notebook-commenting -label:notebook-debugging -label:notebook-diff -label:notebook-dnd -label:notebook-execution -label:notebook-find -label:notebook-folding -label:notebook-getting-started -label:notebook-globaltoolbar -label:notebook-ipynb -label:notebook-kernel -label:notebook-kernel-picker -label:notebook-language -label:notebook-layout -label:notebook-markdown -label:notebook-math -label:notebook-minimap -label:notebook-multiselect -label:notebook-output -label:notebook-perf -label:notebook-remote -label:notebook-rendering -label:notebook-serialization -label:notebook-serverless-web -label:notebook-statusbar -label:notebook-sticky-scroll -label:notebook-toc-outline -label:notebook-undo-redo -label:notebook-variables -label:notebook-workbench-integration -label:notebook-workflow -label:open-editors -label:opener -label:outline -label:output -label:packaging -label:panel-chat -label:perf -label:perf-bloat -label:perf-startup -label:php -label:portable-mode -label:proxy -label:quick-open -label:quick-pick -label:quickpick-chat -label:references-viewlet -label:release-notes -label:remote -label:remote-connection -label:remote-desktop -label:remote-explorer -label:remote-tunnel -label:rename -label:runCommands -label:sandbox -label:sash-widget -label:scm -label:screencast-mode -label:search -label:search-api -label:search-editor -label:search-replace -label:semantic-tokens -label:server -label:settings-editor -label:settings-search -label:settings-sync -label:settings-sync-server -label:shared-process -label:simple-file-dialog -label:smart-select -label:snap -label:snippets -label:splitview-widget -label:ssh -label:suggest -label:system-context-menu -label:table-widget -label:tasks -label:telemetry -label:terminal -label:terminal-accessibility -label:terminal-conpty -label:terminal-editors -label:terminal-external -label:terminal-find -label:terminal-input -label:terminal-layout -label:terminal-links -label:terminal-local-echo -label:terminal-persistence -label:terminal-process -label:terminal-profiles -label:terminal-quick-fix -label:terminal-rendering -label:terminal-shell-bash -label:terminal-shell-cmd -label:terminal-shell-fish -label:terminal-shell-git-bash -label:terminal-shell-integration -label:terminal-shell-pwsh -label:terminal-shell-zsh -label:terminal-tabs -label:terminal-winpty -label:testing -label:themes -label:timeline -label:timeline-git -label:timeline-local-history -label:titlebar -label:tokenization -label:touch/pointer -label:trackpad/scroll -label:tree-views -label:tree-widget -label:typescript -label:unc -label:undo-redo -label:unicode-highlight -label:uri -label:user-profiles -label:ux -label:variable-resolving -label:VIM -label:virtual-documents -label:virtual-workspaces -label:vscode-website -label:vscode.dev -label:web -label:webview -label:webview-views -label:workbench-actions -label:workbench-auxwindow -label:workbench-banner -label:workbench-cli -label:workbench-diagnostics -label:workbench-dnd -label:workbench-editor-grid -label:workbench-editor-groups -label:workbench-editor-resolver -label:workbench-editors -label:workbench-electron -label:workbench-feedback -label:workbench-fonts -label:workbench-history -label:workbench-hot-exit -label:workbench-hover -label:workbench-launch -label:workbench-link -label:workbench-multiroot -label:workbench-notifications -label:workbench-os-integration -label:workbench-rapid-render -label:workbench-run-as-admin -label:workbench-state -label:workbench-status -label:workbench-tabs -label:workbench-touchbar -label:workbench-untitled-editors -label:workbench-views -label:workbench-voice -label:workbench-welcome -label:workbench-window -label:workbench-workspace -label:workbench-zen -label:workspace-edit -label:workspace-symbols -label:workspace-trust -label:zoom -label:error-list -label:winget"
+ "value": "repo:microsoft/vscode assignee:@me is:open type:issue -label:\"info-needed\" -label:api -label:api-finalization -label:api-proposal -label:authentication -label:bisect-ext -label:bracket-pair-colorization -label:bracket-pair-guides -label:breadcrumbs -label:callhierarchy -label:chrome-devtools -label:code-lens -label:command-center -label:comments -label:config -label:context-keys -label:custom-editors -label:debug -label:debug-console -label:debug-disassembly -label:dialogs -label:diff-editor -label:dropdown -label:editor-api -label:editor-autoclosing -label:editor-autoindent -label:editor-bracket-matching -label:editor-clipboard -label:editor-code-actions -label:editor-color-picker -label:editor-columnselect -label:editor-commands -label:editor-comments -label:editor-contrib -label:editor-core -label:editor-drag-and-drop -label:editor-error-widget -label:editor-find -label:editor-folding -label:editor-highlight -label:editor-hover -label:editor-indent-detection -label:editor-indent-guides -label:editor-input -label:editor-input-IME -label:editor-insets -label:editor-minimap -label:editor-multicursor -label:editor-parameter-hints -label:editor-render-whitespace -label:editor-rendering -label:editor-RTL -label:editor-scrollbar -label:editor-sorting -label:editor-sticky-scroll -label:editor-sticky-scroll-decorations -label:editor-symbols -label:editor-synced-region -label:editor-textbuffer -label:editor-theming -label:editor-wordnav -label:editor-wrapping -label:emmet-parse -label:extension-activation -label:extension-host -label:extension-prerelease -label:extension-recommendations -label:extension-signature -label:extensions -label:extensions-development -label:file-decorations -label:file-encoding -label:file-explorer -label:file-glob -label:file-io -label:file-nesting -label:file-watcher -label:font-rendering -label:formatting -label:getting-started -label:ghost-text -label:git -label:github -label:github-repositories -label:gpu -label:grammar -label:grid-widget -label:icon-brand -label:icons-product -label:icons-widget -label:inlay-hints -label:inline-chat -label:inline-completions -label:install-update -label:intellisense-config -label:interactive-playground -label:interactive-window -label:javascript -label:json -label:json-sorting -label:keybindings -label:keybindings-editor -label:keyboard-layout -label:L10N -label:l10n-platform -label:label-provider -label:languages-basic -label:languages-diagnostics -label:languages-guessing -label:layout -label:lcd-text-rendering -label:list-widget -label:live-preview -label:log -label:markdown -label:marketplace -label:menus -label:merge-conflict -label:merge-editor -label:merge-editor-workbench -label:monaco-editor -label:multi-monitor -label:native-file-dialog -label:network -label:notebook -label:notebook-accessibility -label:notebook-api -label:notebook-builtin-renderers -label:notebook-cell-editor -label:notebook-celltoolbar -label:notebook-clipboard -label:notebook-code-actions -label:notebook-commands -label:notebook-commenting -label:notebook-debugging -label:notebook-diff -label:notebook-dnd -label:notebook-execution -label:notebook-find -label:notebook-folding -label:notebook-format -label:notebook-getting-started -label:notebook-globaltoolbar -label:notebook-ipynb -label:notebook-kernel -label:notebook-kernel-picker -label:notebook-language -label:notebook-layout -label:notebook-markdown -label:notebook-minimap -label:notebook-multiselect -label:notebook-output -label:notebook-perf -label:notebook-remote -label:notebook-rendering -label:notebook-serialization -label:notebook-statusbar -label:notebook-sticky-scroll -label:notebook-toc-outline -label:notebook-undo-redo -label:notebook-variables -label:notebook-workbench-integration -label:notebook-workflow -label:open-editors -label:opener -label:outline -label:output -label:packaging -label:panel-chat -label:perf -label:perf-bloat -label:perf-startup -label:php -label:portable-mode -label:proxy -label:quick-open -label:quick-pick -label:quickpick-chat -label:references-viewlet -label:release-notes -label:remote -label:remote-connection -label:remote-desktop -label:remote-explorer -label:remote-tunnel -label:rename -label:runCommands -label:sandbox -label:sash-widget -label:scm -label:screencast-mode -label:search -label:search-api -label:search-editor -label:search-replace -label:semantic-tokens -label:server -label:settings-editor -label:settings-search -label:settings-sync -label:settings-sync-server -label:shared-process -label:simple-file-dialog -label:smart-select -label:snap -label:snippets -label:splitview-widget -label:ssh -label:suggest -label:system-context-menu -label:table-widget -label:tasks -label:telemetry -label:terminal -label:terminal-accessibility -label:terminal-conpty -label:terminal-editors -label:terminal-external -label:terminal-find -label:terminal-input -label:terminal-layout -label:terminal-links -label:terminal-local-echo -label:terminal-persistence -label:terminal-process -label:terminal-profiles -label:terminal-quick-fix -label:terminal-rendering -label:terminal-shell-bash -label:terminal-shell-cmd -label:terminal-shell-fish -label:terminal-shell-git-bash -label:terminal-shell-integration -label:terminal-shell-pwsh -label:terminal-shell-zsh -label:terminal-tabs -label:testing -label:themes -label:timeline -label:timeline-git -label:timeline-local-history -label:titlebar -label:tokenization -label:touch/pointer -label:trackpad/scroll -label:tree-views -label:tree-widget -label:typescript -label:unc -label:undo-redo -label:unicode-highlight -label:uri -label:user-profiles -label:ux -label:variable-resolving -label:VIM -label:virtual-documents -label:virtual-workspaces -label:vscode-website -label:vscode.dev -label:web -label:webview -label:webview-views -label:workbench-actions -label:workbench-auxwindow -label:workbench-banner -label:workbench-cli -label:workbench-diagnostics -label:workbench-dnd -label:workbench-editor-grid -label:workbench-editor-groups -label:workbench-editor-resolver -label:workbench-editors -label:workbench-electron -label:workbench-fonts -label:workbench-history -label:workbench-hot-exit -label:workbench-hover -label:workbench-launch -label:workbench-link -label:workbench-multiroot -label:workbench-notifications -label:workbench-os-integration -label:workbench-rapid-render -label:workbench-run-as-admin -label:workbench-state -label:workbench-status -label:workbench-tabs -label:workbench-touchbar -label:workbench-untitled-editors -label:workbench-views -label:workbench-voice -label:workbench-welcome -label:workbench-window -label:workbench-workspace -label:workbench-zen -label:workspace-edit -label:workspace-symbols -label:workspace-trust -label:zoom -label:error-list -label:winget"
},
{
"kind": 1,
diff --git a/.vscode/notebooks/vscode-dev.github-issues b/.vscode/notebooks/vscode-dev.github-issues
index 53fad82e6d9..db480b64bd8 100644
--- a/.vscode/notebooks/vscode-dev.github-issues
+++ b/.vscode/notebooks/vscode-dev.github-issues
@@ -2,7 +2,7 @@
{
"kind": 2,
"language": "github-issues",
- "value": "$milestone=milestone:\"November 2023\""
+ "value": "$milestone=milestone:\"August 2024\""
},
{
"kind": 1,
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 5d5d1f27589..14236b479e2 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -8,6 +8,7 @@
"**/.DS_Store": true,
".vscode-test": true,
"cli/target": true,
+ "build/**/*.js.map": true,
"build/**/*.js": {
"when": "$(basename).ts"
}
@@ -32,16 +33,15 @@
"src/vs/base/test/common/filters.perf.data.js": true,
"src/vs/base/test/node/uri.perf.data.txt": true,
"src/vs/workbench/api/test/browser/extHostDocumentData.test.perf-data.ts": true,
+ "src/vs/base/test/node/uri.test.data.txt": true,
"src/vs/editor/test/node/diffing/fixtures/**": true,
+ "build/loader.min": true
},
"files.readonlyInclude": {
"**/node_modules/**/*.*": true,
"**/yarn.lock": true,
+ "**/package-lock.json": true,
"**/Cargo.lock": true,
- "src/vs/workbench/workbench.web.main.css": true,
- "src/vs/workbench/workbench.desktop.main.css": true,
- "src/vs/workbench/workbench.desktop.main.nls.js": true,
- "src/vs/workbench/workbench.web.main.nls.js": true,
"build/**/*.js": true,
"out/**": true,
"out-build/**": true,
@@ -51,7 +51,7 @@
"extensions/**/out/**": true,
"test/smoke/out/**": true,
"test/automation/out/**": true,
- "test/integration/browser/out/**": true,
+ "test/integration/browser/out/**": true
},
"files.readonlyExclude": {
"build/builtin/*.js": true,
@@ -74,9 +74,8 @@
],
"typescript.tsdk": "node_modules/typescript/lib",
"npm.exclude": "**/extensions/**",
- "npm.packageManager": "yarn",
"emmet.excludeLanguages": [],
- "typescript.preferences.importModuleSpecifier": "non-relative",
+ "typescript.preferences.importModuleSpecifier": "relative",
"typescript.preferences.quoteStyle": "single",
"json.schemas": [
{
@@ -162,13 +161,12 @@
"@xterm/headless",
"node-pty",
"vscode-notebook-renderer",
- "src/vs/workbench/workbench.web.main.ts",
- "src/vs/workbench/api/common/extHostTypes.ts"
+ "src/vs/workbench/workbench.web.main.internal.ts"
],
"[github-issues]": {
"editor.wordWrap": "on"
},
"css.format.spaceAroundSelectorSeparator": true,
- "inlineChat.mode": "live",
- "typescript.enablePromptUseWorkspaceTsdk": true
+ "typescript.enablePromptUseWorkspaceTsdk": true,
+ "chat.commandCenter.enabled": true
}
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
index 666edb3fb2c..3bcb5d5c6fc 100644
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -113,7 +113,7 @@
"problemMatcher": []
},
{
- "label": "Kill VS Code - Build, Yarn, VS Code - Build",
+ "label": "Kill VS Code - Build, Npm, VS Code - Build",
"dependsOn": [
"Kill VS Code - Build",
"npm: install",
diff --git a/.yarnrc b/.yarnrc
deleted file mode 100644
index b40fb7e7f58..00000000000
--- a/.yarnrc
+++ /dev/null
@@ -1,5 +0,0 @@
-disturl "https://electronjs.org/headers"
-target "29.4.0"
-ms_build_id "9593362"
-runtime "electron"
-build_from_source "true"
diff --git a/ThirdPartyNotices.txt b/ThirdPartyNotices.txt
index 2e3f2610f46..da3989dd371 100644
--- a/ThirdPartyNotices.txt
+++ b/ThirdPartyNotices.txt
@@ -263,6 +263,34 @@ suitability for any purpose.
---------------------------------------------------------
+cacheable-request 7.0.4 - MIT
+
+
+Copyright (c) cacheable-request authors
+
+MIT License
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+---------------------------------------------------------
+
+---------------------------------------------------------
+
Colorsublime-Themes 0.1.0
https://github.com/Colorsublime/Colorsublime-Themes
@@ -412,6 +440,580 @@ Title to copyright in this work will at all times remain with copyright holders.
---------------------------------------------------------
+dompurify 3.0.5 - Apache 2.0
+https://github.com/cure53/DOMPurify
+
+DOMPurify
+Copyright 2024 Dr.-Ing. Mario Heiderich, Cure53
+
+DOMPurify is free software; you can redistribute it and/or modify it under the
+terms of either:
+
+a) the Apache License Version 2.0, or
+b) the Mozilla Public License Version 2.0
+
+-----------------------------------------------------------------------------
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-----------------------------------------------------------------------------
+Mozilla Public License, version 2.0
+
+1. Definitions
+
+1.1. "Contributor"
+
+ means each individual or legal entity that creates, contributes to the
+ creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+
+ means the combination of the Contributions of others (if any) used by a
+ Contributor and that particular Contributor’s Contribution.
+
+1.3. "Contribution"
+
+ means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+
+ means Source Code Form to which the initial Contributor has attached the
+ notice in Exhibit A, the Executable Form of such Source Code Form, and
+ Modifications of such Source Code Form, in each case including portions
+ thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+ means
+
+ a. that the initial Contributor has attached the notice described in
+ Exhibit B to the Covered Software; or
+
+ b. that the Covered Software was made available under the terms of version
+ 1.1 or earlier of the License, but not also under the terms of a
+ Secondary License.
+
+1.6. "Executable Form"
+
+ means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+
+ means a work that combines Covered Software with other material, in a separate
+ file or files, that is not Covered Software.
+
+1.8. "License"
+
+ means this document.
+
+1.9. "Licensable"
+
+ means having the right to grant, to the maximum extent possible, whether at the
+ time of the initial grant or subsequently, any and all of the rights conveyed by
+ this License.
+
+1.10. "Modifications"
+
+ means any of the following:
+
+ a. any file in Source Code Form that results from an addition to, deletion
+ from, or modification of the contents of Covered Software; or
+
+ b. any new file in Source Code Form that contains any Covered Software.
+
+1.11. "Patent Claims" of a Contributor
+
+ means any patent claim(s), including without limitation, method, process,
+ and apparatus claims, in any patent Licensable by such Contributor that
+ would be infringed, but for the grant of the License, by the making,
+ using, selling, offering for sale, having made, import, or transfer of
+ either its Contributions or its Contributor Version.
+
+1.12. "Secondary License"
+
+ means either the GNU General Public License, Version 2.0, the GNU Lesser
+ General Public License, Version 2.1, the GNU Affero General Public
+ License, Version 3.0, or any later versions of those licenses.
+
+1.13. "Source Code Form"
+
+ means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+
+ means an individual or a legal entity exercising rights under this
+ License. For legal entities, "You" includes any entity that controls, is
+ controlled by, or is under common control with You. For purposes of this
+ definition, "control" means (a) the power, direct or indirect, to cause
+ the direction or management of such entity, whether by contract or
+ otherwise, or (b) ownership of more than fifty percent (50%) of the
+ outstanding shares or beneficial ownership of such entity.
+
+
+2. License Grants and Conditions
+
+2.1. Grants
+
+ Each Contributor hereby grants You a world-wide, royalty-free,
+ non-exclusive license:
+
+ a. under intellectual property rights (other than patent or trademark)
+ Licensable by such Contributor to use, reproduce, make available,
+ modify, display, perform, distribute, and otherwise exploit its
+ Contributions, either on an unmodified basis, with Modifications, or as
+ part of a Larger Work; and
+
+ b. under Patent Claims of such Contributor to make, use, sell, offer for
+ sale, have made, import, and otherwise transfer either its Contributions
+ or its Contributor Version.
+
+2.2. Effective Date
+
+ The licenses granted in Section 2.1 with respect to any Contribution become
+ effective for each Contribution on the date the Contributor first distributes
+ such Contribution.
+
+2.3. Limitations on Grant Scope
+
+ The licenses granted in this Section 2 are the only rights granted under this
+ License. No additional rights or licenses will be implied from the distribution
+ or licensing of Covered Software under this License. Notwithstanding Section
+ 2.1(b) above, no patent license is granted by a Contributor:
+
+ a. for any code that a Contributor has removed from Covered Software; or
+
+ b. for infringements caused by: (i) Your and any other third party’s
+ modifications of Covered Software, or (ii) the combination of its
+ Contributions with other software (except as part of its Contributor
+ Version); or
+
+ c. under Patent Claims infringed by Covered Software in the absence of its
+ Contributions.
+
+ This License does not grant any rights in the trademarks, service marks, or
+ logos of any Contributor (except as may be necessary to comply with the
+ notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+ No Contributor makes additional grants as a result of Your choice to
+ distribute the Covered Software under a subsequent version of this License
+ (see Section 10.2) or under the terms of a Secondary License (if permitted
+ under the terms of Section 3.3).
+
+2.5. Representation
+
+ Each Contributor represents that the Contributor believes its Contributions
+ are its original creation(s) or it has sufficient rights to grant the
+ rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+ This License is not intended to limit any rights You have under applicable
+ copyright doctrines of fair use, fair dealing, or other equivalents.
+
+2.7. Conditions
+
+ Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in
+ Section 2.1.
+
+
+3. Responsibilities
+
+3.1. Distribution of Source Form
+
+ All distribution of Covered Software in Source Code Form, including any
+ Modifications that You create or to which You contribute, must be under the
+ terms of this License. You must inform recipients that the Source Code Form
+ of the Covered Software is governed by the terms of this License, and how
+ they can obtain a copy of this License. You may not attempt to alter or
+ restrict the recipients’ rights in the Source Code Form.
+
+3.2. Distribution of Executable Form
+
+ If You distribute Covered Software in Executable Form then:
+
+ a. such Covered Software must also be made available in Source Code Form,
+ as described in Section 3.1, and You must inform recipients of the
+ Executable Form how they can obtain a copy of such Source Code Form by
+ reasonable means in a timely manner, at a charge no more than the cost
+ of distribution to the recipient; and
+
+ b. You may distribute such Executable Form under the terms of this License,
+ or sublicense it under different terms, provided that the license for
+ the Executable Form does not attempt to limit or alter the recipients’
+ rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+ You may create and distribute a Larger Work under terms of Your choice,
+ provided that You also comply with the requirements of this License for the
+ Covered Software. If the Larger Work is a combination of Covered Software
+ with a work governed by one or more Secondary Licenses, and the Covered
+ Software is not Incompatible With Secondary Licenses, this License permits
+ You to additionally distribute such Covered Software under the terms of
+ such Secondary License(s), so that the recipient of the Larger Work may, at
+ their option, further distribute the Covered Software under the terms of
+ either this License or such Secondary License(s).
+
+3.4. Notices
+
+ You may not remove or alter the substance of any license notices (including
+ copyright notices, patent notices, disclaimers of warranty, or limitations
+ of liability) contained within the Source Code Form of the Covered
+ Software, except that You may alter any license notices to the extent
+ required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+ You may choose to offer, and to charge a fee for, warranty, support,
+ indemnity or liability obligations to one or more recipients of Covered
+ Software. However, You may do so only on Your own behalf, and not on behalf
+ of any Contributor. You must make it absolutely clear that any such
+ warranty, support, indemnity, or liability obligation is offered by You
+ alone, and You hereby agree to indemnify every Contributor for any
+ liability incurred by such Contributor as a result of warranty, support,
+ indemnity or liability terms You offer. You may include additional
+ disclaimers of warranty and limitations of liability specific to any
+ jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+
+ If it is impossible for You to comply with any of the terms of this License
+ with respect to some or all of the Covered Software due to statute, judicial
+ order, or regulation then You must: (a) comply with the terms of this License
+ to the maximum extent possible; and (b) describe the limitations and the code
+ they affect. Such description must be placed in a text file included with all
+ distributions of the Covered Software under this License. Except to the
+ extent prohibited by statute or regulation, such description must be
+ sufficiently detailed for a recipient of ordinary skill to be able to
+ understand it.
+
+5. Termination
+
+5.1. The rights granted under this License will terminate automatically if You
+ fail to comply with any of its terms. However, if You become compliant,
+ then the rights granted under this License from a particular Contributor
+ are reinstated (a) provisionally, unless and until such Contributor
+ explicitly and finally terminates Your grants, and (b) on an ongoing basis,
+ if such Contributor fails to notify You of the non-compliance by some
+ reasonable means prior to 60 days after You have come back into compliance.
+ Moreover, Your grants from a particular Contributor are reinstated on an
+ ongoing basis if such Contributor notifies You of the non-compliance by
+ some reasonable means, this is the first time You have received notice of
+ non-compliance with this License from such Contributor, and You become
+ compliant prior to 30 days after Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+ infringement claim (excluding declaratory judgment actions, counter-claims,
+ and cross-claims) alleging that a Contributor Version directly or
+ indirectly infringes any patent, then the rights granted to You by any and
+ all Contributors for the Covered Software under Section 2.1 of this License
+ shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user
+ license agreements (excluding distributors and resellers) which have been
+ validly granted by You or Your distributors under this License prior to
+ termination shall survive termination.
+
+6. Disclaimer of Warranty
+
+ Covered Software is provided under this License on an "as is" basis, without
+ warranty of any kind, either expressed, implied, or statutory, including,
+ without limitation, warranties that the Covered Software is free of defects,
+ merchantable, fit for a particular purpose or non-infringing. The entire
+ risk as to the quality and performance of the Covered Software is with You.
+ Should any Covered Software prove defective in any respect, You (not any
+ Contributor) assume the cost of any necessary servicing, repair, or
+ correction. This disclaimer of warranty constitutes an essential part of this
+ License. No use of any Covered Software is authorized under this License
+ except under this disclaimer.
+
+7. Limitation of Liability
+
+ Under no circumstances and under no legal theory, whether tort (including
+ negligence), contract, or otherwise, shall any Contributor, or anyone who
+ distributes Covered Software as permitted above, be liable to You for any
+ direct, indirect, special, incidental, or consequential damages of any
+ character including, without limitation, damages for lost profits, loss of
+ goodwill, work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses, even if such party shall have been
+ informed of the possibility of such damages. This limitation of liability
+ shall not apply to liability for death or personal injury resulting from such
+ party’s negligence to the extent applicable law prohibits such limitation.
+ Some jurisdictions do not allow the exclusion or limitation of incidental or
+ consequential damages, so this exclusion and limitation may not apply to You.
+
+8. Litigation
+
+ Any litigation relating to this License may be brought only in the courts of
+ a jurisdiction where the defendant maintains its principal place of business
+ and such litigation shall be governed by laws of that jurisdiction, without
+ reference to its conflict-of-law provisions. Nothing in this Section shall
+ prevent a party’s ability to bring cross-claims or counter-claims.
+
+9. Miscellaneous
+
+ This License represents the complete agreement concerning the subject matter
+ hereof. If any provision of this License is held to be unenforceable, such
+ provision shall be reformed only to the extent necessary to make it
+ enforceable. Any law or regulation which provides that the language of a
+ contract shall be construed against the drafter shall not be used to construe
+ this License against a Contributor.
+
+
+10. Versions of the License
+
+10.1. New Versions
+
+ Mozilla Foundation is the license steward. Except as provided in Section
+ 10.3, no one other than the license steward has the right to modify or
+ publish new versions of this License. Each version will be given a
+ distinguishing version number.
+
+10.2. Effect of New Versions
+
+ You may distribute the Covered Software under the terms of the version of
+ the License under which You originally received the Covered Software, or
+ under the terms of any subsequent version published by the license
+ steward.
+
+10.3. Modified Versions
+
+ If you create software not governed by this License, and you want to
+ create a new license for such software, you may create and use a modified
+ version of this License if you rename the license and remove any
+ references to the name of the license steward (except to note that such
+ modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses
+ If You choose to distribute Source Code Form that is Incompatible With
+ Secondary Licenses under the terms of this version of the License, the
+ notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+
+ This Source Code Form is subject to the
+ terms of the Mozilla Public License, v.
+ 2.0. If a copy of the MPL was not
+ distributed with this file, You can
+ obtain one at
+ http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular file, then
+You may include the notice in a location (such as a LICENSE file in a relevant
+directory) where a recipient would be likely to look for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+
+ This Source Code Form is "Incompatible
+ With Secondary Licenses", as defined by
+ the Mozilla Public License, v. 2.0.
+---------------------------------------------------------
+
+---------------------------------------------------------
+
dotnet/csharp-tmLanguage 0.1.0 - MIT
https://github.com/dotnet/csharp-tmLanguage
@@ -517,7 +1119,7 @@ to the base-name name of the original file, and an extension of txt, html, or si
---------------------------------------------------------
-go-syntax 0.6.6 - MIT
+go-syntax 0.7.6 - MIT
https://github.com/worlpaker/go-syntax
MIT License
@@ -833,7 +1435,7 @@ SOFTWARE.
---------------------------------------------------------
-jlelong/vscode-latex-basics 1.7.0 - MIT
+jlelong/vscode-latex-basics 1.9.0 - MIT
https://github.com/jlelong/vscode-latex-basics
Copyright (c) vscode-latex-basics authors
@@ -890,7 +1492,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
---------------------------------------------------------
-JuliaEditorSupport/atom-language-julia 0.22.1 - MIT
+JuliaEditorSupport/atom-language-julia 0.23.0 - MIT
https://github.com/JuliaEditorSupport/atom-language-julia
The atom-language-julia package is licensed under the MIT "Expat" License:
@@ -1241,7 +1843,7 @@ THE SOFTWARE.
---------------------------------------------------------
-marked 4.1.0 - MIT
+marked 14.0.0 - MIT
https://github.com/markedjs/marked
information
@@ -1506,6 +2108,22 @@ SOFTWARE.
---------------------------------------------------------
+RedCMD/YAML-Syntax-Highlighter 1.1.2 - MIT
+https://github.com/RedCMD/YAML-Syntax-Highlighter
+
+MIT License
+
+Copyright 2024 RedCMD
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+---------------------------------------------------------
+
+---------------------------------------------------------
+
redhat-developer/vscode-java 1.26.0 - MIT
https://github.com/redhat-developer/vscode-java
@@ -1928,31 +2546,6 @@ to the base-name name of the original file, and an extension of txt, html, or si
---------------------------------------------------------
-textmate/yaml.tmbundle 0.0.0 - TextMate Bundle License
-https://github.com/textmate/yaml.tmbundle
-
-Copyright (c) 2015 FichteFoll
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
----------------------------------------------------------
-
----------------------------------------------------------
-
trond-snekvik/vscode-rst 1.5.3 - MIT
https://github.com/trond-snekvik/vscode-rst
diff --git a/build/.cachesalt b/build/.cachesalt
index 4a19f329eb1..3c6029dc2f4 100644
--- a/build/.cachesalt
+++ b/build/.cachesalt
@@ -1 +1 @@
-2024-05-25T03:29:59.419Z
+2024-09-04T10:21:29.952Z
diff --git a/build/.gitignore b/build/.gitignore
index 7cc357379e5..61cf49cb9a1 100644
--- a/build/.gitignore
+++ b/build/.gitignore
@@ -1,2 +1 @@
-.yarnrc
*.js.map
diff --git a/build/.moduleignore b/build/.moduleignore
index 32fb3bd21c5..97b504d8522 100644
--- a/build/.moduleignore
+++ b/build/.moduleignore
@@ -96,10 +96,13 @@ node-pty/lib/*.test.js
node-pty/tools/**
node-pty/deps/**
node-pty/scripts/**
+node-pty/third_party/**
!node-pty/build/Release/spawn-helper
!node-pty/build/Release/*.exe
!node-pty/build/Release/*.dll
!node-pty/build/Release/*.node
+!node-pty/build/Release/conpty/conpty.dll
+!node-pty/build/Release/conpty/OpenConsole.exe
@parcel/watcher/binding.gyp
@parcel/watcher/build/**
diff --git a/build/.npmrc b/build/.npmrc
new file mode 100644
index 00000000000..1b073e71a83
--- /dev/null
+++ b/build/.npmrc
@@ -0,0 +1,5 @@
+disturl="https://nodejs.org/dist"
+runtime="node"
+build_from_source="true"
+legacy-peer-deps="true"
+timeout=180000
diff --git a/build/.webignore b/build/.webignore
index 15935edce8a..d42f9775ba9 100644
--- a/build/.webignore
+++ b/build/.webignore
@@ -38,6 +38,7 @@ vscode-textmate/webpack.config.js
# This makes sure the model is included in the package
!@vscode/vscode-languagedetection/model/**
+!@vscode/tree-sitter-wasm/wasm/**
# Ensure only the required telemetry pieces are loaded in web to reduce bundle size
@microsoft/1ds-core-js/**
@@ -45,7 +46,9 @@ vscode-textmate/webpack.config.js
@microsoft/applicationinsights-core-js/**
@microsoft/applicationinsights-shims/**
!@microsoft/1ds-core-js/dist/ms.core.min.js
+!@microsoft/1ds-core-js/bundle/ms.core.min.js
!@microsoft/1ds-post-js/dist/ms.post.min.js
+!@microsoft/1ds-post-js/bundle/ms.post.min.js
!@microsoft/applicationinsights-core-js/browser/applicationinsights-core-js.min.js
!@microsoft/applicationinsights-shims/dist/umd/applicationinsights-shims.min.js
diff --git a/build/azure-pipelines/alpine/cli-build-alpine.yml b/build/azure-pipelines/alpine/cli-build-alpine.yml
index a6442dfe290..07321ebcd97 100644
--- a/build/azure-pipelines/alpine/cli-build-alpine.yml
+++ b/build/azure-pipelines/alpine/cli-build-alpine.yml
@@ -19,17 +19,9 @@ steps:
nodejsMirror: https://github.com/joaomoreno/node-mirror/releases/download
- ${{ if ne(parameters.VSCODE_QUALITY, 'oss') }}:
- # Install yarn as the ARM64 build agent is using vanilla Ubuntu
- - ${{ if eq(parameters.VSCODE_BUILD_ALPINE_ARM64, true) }}:
- - task: Npm@1
- displayName: Install yarn
- inputs:
- command: custom
- customCommand: install --global yarn
-
- script: |
set -e
- yarn --frozen-lockfile --ignore-optional
+ npm ci
workingDirectory: build
displayName: Install pipeline build
diff --git a/build/azure-pipelines/alpine/product-build-alpine.yml b/build/azure-pipelines/alpine/product-build-alpine.yml
index 2c55132a9f9..077ec0ba11b 100644
--- a/build/azure-pipelines/alpine/product-build-alpine.yml
+++ b/build/azure-pipelines/alpine/product-build-alpine.yml
@@ -7,7 +7,7 @@ steps:
- template: ../distro/download-distro.yml@self
- - task: AzureKeyVault@1
+ - task: AzureKeyVault@2
displayName: "Azure Key Vault: Get Secrets"
inputs:
azureSubscription: "vscode-builds-subscription"
@@ -27,12 +27,12 @@ steps:
condition: and(succeeded(), ne(variables['NPM_REGISTRY'], 'none'))
displayName: Setup NPM Registry
- - script: mkdir -p .build && node build/azure-pipelines/common/computeNodeModulesCacheKey.js alpine $VSCODE_ARCH > .build/yarnlockhash
+ - script: mkdir -p .build && node build/azure-pipelines/common/computeNodeModulesCacheKey.js alpine $VSCODE_ARCH > .build/packagelockhash
displayName: Prepare node_modules cache key
- task: Cache@2
inputs:
- key: '"node_modules" | .build/yarnlockhash'
+ key: '"node_modules" | .build/packagelockhash'
path: .build/node_modules_cache
cacheHitVar: NODE_MODULES_RESTORED
displayName: Restore node_modules cache
@@ -43,18 +43,17 @@ steps:
- script: |
set -e
- npm config set registry "$NPM_REGISTRY" --location=project
- # npm >v7 deprecated the `always-auth` config option, refs npm/cli@72a7eeb
- # following is a workaround for yarn to send authorization header
- # for GET requests to the registry.
- echo "always-auth=true" >> .npmrc
- yarn config set registry "$NPM_REGISTRY"
+ # Set the private NPM registry to the global npmrc file
+ # so that authentication works for subfolders like build/, remote/, extensions/ etc
+ # which does not have their own .npmrc file
+ npm config set registry "$NPM_REGISTRY"
+ echo "##vso[task.setvariable variable=NPMRC_PATH]$(npm config get userconfig)"
condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none'))
- displayName: Setup NPM & Yarn
+ displayName: Setup NPM
- task: npmAuthenticate@0
inputs:
- workingFile: .npmrc
+ workingFile: $(NPMRC_PATH)
condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none'))
displayName: Setup NPM Authentication
@@ -75,12 +74,12 @@ steps:
- script: |
set -e
for i in {1..5}; do # try 5 times
- yarn --frozen-lockfile --check-files && break
- if [ $i -eq 3 ]; then
- echo "Yarn failed too many times" >&2
+ npm ci && break
+ if [ $i -eq 5 ]; then
+ echo "Npm install failed too many times" >&2
exit 1
fi
- echo "Yarn failed $i, trying again..."
+ echo "Npm install failed $i, trying again..."
done
env:
npm_config_arch: $(NPM_ARCH)
@@ -89,7 +88,7 @@ steps:
GITHUB_TOKEN: "$(github-distro-mixin-password)"
VSCODE_REMOTE_DEPENDENCIES_CONTAINER_NAME: vscodehub.azurecr.io/vscode-linux-build-agent:alpine-$(VSCODE_ARCH)
VSCODE_HOST_MOUNT: "/mnt/vss/_work/1/s"
- displayName: Install build dependencies
+ displayName: Install dependencies
condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'))
- script: node build/azure-pipelines/distro/mixin-npm
@@ -112,7 +111,7 @@ steps:
- script: |
set -e
TARGET=$([ "$VSCODE_ARCH" == "x64" ] && echo "linux-alpine" || echo "alpine-arm64") # TODO@joaomoreno
- yarn gulp vscode-reh-$TARGET-min-ci
+ npm run gulp vscode-reh-$TARGET-min-ci
(cd .. && mv vscode-reh-$TARGET vscode-server-$TARGET) # TODO@joaomoreno
ARCHIVE_PATH=".build/linux/server/vscode-server-$TARGET.tar.gz"
DIR_PATH="$(realpath ../vscode-server-$TARGET)"
@@ -127,7 +126,7 @@ steps:
- script: |
set -e
TARGET=$([ "$VSCODE_ARCH" == "x64" ] && echo "linux-alpine" || echo "alpine-arm64")
- yarn gulp vscode-reh-web-$TARGET-min-ci
+ npm run gulp vscode-reh-web-$TARGET-min-ci
(cd .. && mv vscode-reh-web-$TARGET vscode-server-$TARGET-web) # TODO@joaomoreno
ARCHIVE_PATH=".build/linux/web/vscode-server-$TARGET-web.tar.gz"
DIR_PATH="$(realpath ../vscode-server-$TARGET-web)"
diff --git a/build/azure-pipelines/cli/cli-compile.yml b/build/azure-pipelines/cli/cli-compile.yml
index 267682f7f6d..e77ba78a999 100644
--- a/build/azure-pipelines/cli/cli-compile.yml
+++ b/build/azure-pipelines/cli/cli-compile.yml
@@ -49,16 +49,22 @@ steps:
export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER="$VSCODE_SYSROOT_DIR/aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc"
export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_RUSTFLAGS="-C link-arg=--sysroot=$VSCODE_SYSROOT_DIR/aarch64-linux-gnu/aarch64-linux-gnu/sysroot"
export CC_aarch64_unknown_linux_gnu="$VSCODE_SYSROOT_DIR/aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc --sysroot=$VSCODE_SYSROOT_DIR/aarch64-linux-gnu/aarch64-linux-gnu/sysroot"
+ export PKG_CONFIG_LIBDIR_aarch64_unknown_linux_gnu="$VSCODE_SYSROOT_DIR/aarch64-linux-gnu/aarch64-linux-gnu/sysroot/usr/lib/aarch64-linux-gnu/pkgconfig:$VSCODE_SYSROOT_DIR/aarch64-linux-gnu/aarch64-linux-gnu/sysroot/usr/share/pkgconfig"
+ export PKG_CONFIG_SYSROOT_DIR_aarch64_unknown_linux_gnu="$VSCODE_SYSROOT_DIR/aarch64-linux-gnu/aarch64-linux-gnu/sysroot"
export OBJDUMP="$VSCODE_SYSROOT_DIR/aarch64-linux-gnu/aarch64-linux-gnu/bin/objdump"
elif [ "$SYSROOT_ARCH" == "amd64" ]; then
export CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER="$VSCODE_SYSROOT_DIR/x86_64-linux-gnu/bin/x86_64-linux-gnu-gcc"
export CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUSTFLAGS="-C link-arg=--sysroot=$VSCODE_SYSROOT_DIR/x86_64-linux-gnu/x86_64-linux-gnu/sysroot -C link-arg=-L$VSCODE_SYSROOT_DIR/x86_64-linux-gnu/x86_64-linux-gnu/sysroot/usr/lib/x86_64-linux-gnu"
export CC_x86_64_unknown_linux_gnu="$VSCODE_SYSROOT_DIR/x86_64-linux-gnu/bin/x86_64-linux-gnu-gcc --sysroot=$VSCODE_SYSROOT_DIR/x86_64-linux-gnu/x86_64-linux-gnu/sysroot"
+ export PKG_CONFIG_LIBDIR_x86_64_unknown_linux_gnu="$VSCODE_SYSROOT_DIR/x86_64-linux-gnu/x86_64-linux-gnu/sysroot/usr/lib/x86_64-linux-gnu/pkgconfig:$VSCODE_SYSROOT_DIR/x86_64-linux-gnu/x86_64-linux-gnu/sysroot/usr/share/pkgconfig"
+ export PKG_CONFIG_SYSROOT_DIR_x86_64_unknown_linux_gnu="$VSCODE_SYSROOT_DIR/x86_64-linux-gnu/x86_64-linux-gnu/sysroot"
export OBJDUMP="$VSCODE_SYSROOT_DIR/x86_64-linux-gnu/x86_64-linux-gnu/bin/objdump"
elif [ "$SYSROOT_ARCH" == "armhf" ]; then
export CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER="$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/bin/arm-rpi-linux-gnueabihf-gcc"
export CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_RUSTFLAGS="-C link-arg=--sysroot=$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot"
export CC_armv7_unknown_linux_gnueabihf="$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/bin/arm-rpi-linux-gnueabihf-gcc --sysroot=$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot"
+ export PKG_CONFIG_LIBDIR_armv7_unknown_linux_gnueabihf="$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot/usr/lib/arm-rpi-linux-gnueabihf/pkgconfig:$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot/usr/share/pkgconfig"
+ export PKG_CONFIG_SYSROOT_DIR_armv7_unknown_linux_gnueabihf="$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot"
export OBJDUMP="$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/bin/objdump"
fi
fi
@@ -78,7 +84,7 @@ steps:
fi
done < <("$OBJDUMP" -T "$PWD/target/${{ parameters.VSCODE_CLI_TARGET }}/release/code")
if [[ "$glibc_version" != "2.17" ]]; then
- echo "Error: binary has dependency on GLIBC > 2.17"
+ echo "Error: binary has dependency on GLIBC > 2.17, found $glibc_version"
exit 1
fi
fi
diff --git a/build/azure-pipelines/cli/cli-darwin-sign.yml b/build/azure-pipelines/cli/cli-darwin-sign.yml
index 75a8235ff3a..b6dc424d690 100644
--- a/build/azure-pipelines/cli/cli-darwin-sign.yml
+++ b/build/azure-pipelines/cli/cli-darwin-sign.yml
@@ -4,7 +4,7 @@ parameters:
default: []
steps:
- - task: AzureKeyVault@1
+ - task: AzureKeyVault@2
displayName: "Azure Key Vault: Get Secrets"
inputs:
azureSubscription: "vscode-builds-subscription"
diff --git a/build/azure-pipelines/cli/cli-win32-sign.yml b/build/azure-pipelines/cli/cli-win32-sign.yml
index f8d11e806f2..e39df13c998 100644
--- a/build/azure-pipelines/cli/cli-win32-sign.yml
+++ b/build/azure-pipelines/cli/cli-win32-sign.yml
@@ -4,7 +4,7 @@ parameters:
default: []
steps:
- - task: AzureKeyVault@1
+ - task: AzureKeyVault@2
displayName: "Azure Key Vault: Get Secrets"
inputs:
azureSubscription: "vscode-builds-subscription"
diff --git a/build/azure-pipelines/cli/install-rust-posix.yml b/build/azure-pipelines/cli/install-rust-posix.yml
index 89867143938..fee56e028f7 100644
--- a/build/azure-pipelines/cli/install-rust-posix.yml
+++ b/build/azure-pipelines/cli/install-rust-posix.yml
@@ -1,7 +1,7 @@
parameters:
- name: channel
type: string
- default: 1.77
+ default: 1.81
- name: targets
default: []
type: object
diff --git a/build/azure-pipelines/cli/install-rust-win32.yml b/build/azure-pipelines/cli/install-rust-win32.yml
index 22fba8d7f6a..45a1cfd188e 100644
--- a/build/azure-pipelines/cli/install-rust-win32.yml
+++ b/build/azure-pipelines/cli/install-rust-win32.yml
@@ -1,7 +1,7 @@
parameters:
- name: channel
type: string
- default: 1.77
+ default: 1.81
- name: targets
default: []
type: object
diff --git a/build/azure-pipelines/common/computeNodeModulesCacheKey.js b/build/azure-pipelines/common/computeNodeModulesCacheKey.js
index fe84d03e1d7..976e096fad2 100644
--- a/build/azure-pipelines/common/computeNodeModulesCacheKey.js
+++ b/build/azure-pipelines/common/computeNodeModulesCacheKey.js
@@ -11,9 +11,10 @@ const { dirs } = require('../../npm/dirs');
const ROOT = path.join(__dirname, '../../../');
const shasum = crypto.createHash('sha256');
shasum.update(fs.readFileSync(path.join(ROOT, 'build/.cachesalt')));
-shasum.update(fs.readFileSync(path.join(ROOT, '.yarnrc')));
-shasum.update(fs.readFileSync(path.join(ROOT, 'remote/.yarnrc')));
-// Add `package.json` and `yarn.lock` files
+shasum.update(fs.readFileSync(path.join(ROOT, '.npmrc')));
+shasum.update(fs.readFileSync(path.join(ROOT, 'build', '.npmrc')));
+shasum.update(fs.readFileSync(path.join(ROOT, 'remote', '.npmrc')));
+// Add `package.json` and `package-lock.json` files
for (const dir of dirs) {
const packageJsonPath = path.join(ROOT, dir, 'package.json');
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath).toString());
@@ -25,8 +26,8 @@ for (const dir of dirs) {
distro: packageJson.distro
};
shasum.update(JSON.stringify(relevantPackageJsonSections));
- const yarnLockPath = path.join(ROOT, dir, 'yarn.lock');
- shasum.update(fs.readFileSync(yarnLockPath));
+ const packageLockPath = path.join(ROOT, dir, 'package-lock.json');
+ shasum.update(fs.readFileSync(packageLockPath));
}
// Add any other command line arguments
for (let i = 2; i < process.argv.length; i++) {
diff --git a/build/azure-pipelines/common/computeNodeModulesCacheKey.ts b/build/azure-pipelines/common/computeNodeModulesCacheKey.ts
index 16bf76796f9..0940c929b54 100644
--- a/build/azure-pipelines/common/computeNodeModulesCacheKey.ts
+++ b/build/azure-pipelines/common/computeNodeModulesCacheKey.ts
@@ -13,10 +13,11 @@ const ROOT = path.join(__dirname, '../../../');
const shasum = crypto.createHash('sha256');
shasum.update(fs.readFileSync(path.join(ROOT, 'build/.cachesalt')));
-shasum.update(fs.readFileSync(path.join(ROOT, '.yarnrc')));
-shasum.update(fs.readFileSync(path.join(ROOT, 'remote/.yarnrc')));
+shasum.update(fs.readFileSync(path.join(ROOT, '.npmrc')));
+shasum.update(fs.readFileSync(path.join(ROOT, 'build', '.npmrc')));
+shasum.update(fs.readFileSync(path.join(ROOT, 'remote', '.npmrc')));
-// Add `package.json` and `yarn.lock` files
+// Add `package.json` and `package-lock.json` files
for (const dir of dirs) {
const packageJsonPath = path.join(ROOT, dir, 'package.json');
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath).toString());
@@ -29,8 +30,8 @@ for (const dir of dirs) {
};
shasum.update(JSON.stringify(relevantPackageJsonSections));
- const yarnLockPath = path.join(ROOT, dir, 'yarn.lock');
- shasum.update(fs.readFileSync(yarnLockPath));
+ const packageLockPath = path.join(ROOT, dir, 'package-lock.json');
+ shasum.update(fs.readFileSync(packageLockPath));
}
// Add any other command line arguments
diff --git a/build/azure-pipelines/common/publish.js b/build/azure-pipelines/common/publish.js
index c990e3a7146..aa185ed8369 100644
--- a/build/azure-pipelines/common/publish.js
+++ b/build/azure-pipelines/common/publish.js
@@ -389,14 +389,8 @@ function getPlatform(product, os, arch, type, isLegacy) {
}
}
case 'server':
- if (arch === 'arm64') {
- throw new Error(`Unrecognized: ${product} ${os} ${arch} ${type}`);
- }
return `server-win32-${arch}`;
case 'web':
- if (arch === 'arm64') {
- throw new Error(`Unrecognized: ${product} ${os} ${arch} ${type}`);
- }
return `server-win32-${arch}-web`;
case 'cli':
return `cli-win32-${arch}`;
diff --git a/build/azure-pipelines/common/publish.ts b/build/azure-pipelines/common/publish.ts
index 75065ffa2d3..652cd168335 100644
--- a/build/azure-pipelines/common/publish.ts
+++ b/build/azure-pipelines/common/publish.ts
@@ -550,14 +550,8 @@ function getPlatform(product: string, os: string, arch: string, type: string, is
}
}
case 'server':
- if (arch === 'arm64') {
- throw new Error(`Unrecognized: ${product} ${os} ${arch} ${type}`);
- }
return `server-win32-${arch}`;
case 'web':
- if (arch === 'arm64') {
- throw new Error(`Unrecognized: ${product} ${os} ${arch} ${type}`);
- }
return `server-win32-${arch}-web`;
case 'cli':
return `cli-win32-${arch}`;
diff --git a/build/azure-pipelines/darwin/helper-plugin-entitlements.plist b/build/azure-pipelines/darwin/helper-plugin-entitlements.plist
index 1cc1a152c74..48f7bf5cece 100644
--- a/build/azure-pipelines/darwin/helper-plugin-entitlements.plist
+++ b/build/azure-pipelines/darwin/helper-plugin-entitlements.plist
@@ -6,8 +6,6 @@
com.apple.security.cs.allow-unsigned-executable-memory
- com.apple.security.cs.allow-dyld-environment-variables
-
com.apple.security.cs.disable-library-validation
diff --git a/build/azure-pipelines/darwin/product-build-darwin-cli-sign.yml b/build/azure-pipelines/darwin/product-build-darwin-cli-sign.yml
index 80e90a52bac..32615c58463 100644
--- a/build/azure-pipelines/darwin/product-build-darwin-cli-sign.yml
+++ b/build/azure-pipelines/darwin/product-build-darwin-cli-sign.yml
@@ -17,31 +17,30 @@ steps:
- script: |
set -e
- npm config set registry "$NPM_REGISTRY" --location=project
- # npm >v7 deprecated the `always-auth` config option, refs npm/cli@72a7eeb
- # following is a workaround for yarn to send authorization header
- # for GET requests to the registry.
- echo "always-auth=true" >> .npmrc
- yarn config set registry "$NPM_REGISTRY"
- workingDirectory: build
+ # Set the private NPM registry to the global npmrc file
+ # so that authentication works for subfolders like build/, remote/, extensions/ etc
+ # which does not have their own .npmrc file
+ npm config set registry "$NPM_REGISTRY"
+ echo "##vso[task.setvariable variable=NPMRC_PATH]$(npm config get userconfig)"
condition: and(succeeded(), ne(variables['NPM_REGISTRY'], 'none'))
- displayName: Setup NPM & Yarn
+ displayName: Setup NPM
- task: npmAuthenticate@0
inputs:
- workingFile: build/.npmrc
+ workingFile: $(NPMRC_PATH)
condition: and(succeeded(), ne(variables['NPM_REGISTRY'], 'none'))
displayName: Setup NPM Authentication
- script: |
set -e
+
for i in {1..5}; do # try 5 times
- yarn --frozen-lockfile --check-files && break
- if [ $i -eq 3 ]; then
- echo "Yarn failed too many times" >&2
+ npm ci && break
+ if [ $i -eq 5 ]; then
+ echo "Npm install failed too many times" >&2
exit 1
fi
- echo "Yarn failed $i, trying again..."
+ echo "Npm install failed $i, trying again..."
done
workingDirectory: build
displayName: Install build dependencies
diff --git a/build/azure-pipelines/darwin/product-build-darwin-sign.yml b/build/azure-pipelines/darwin/product-build-darwin-sign.yml
index fb8cf8341c3..82a1e89f2ab 100644
--- a/build/azure-pipelines/darwin/product-build-darwin-sign.yml
+++ b/build/azure-pipelines/darwin/product-build-darwin-sign.yml
@@ -13,7 +13,7 @@ steps:
continueOnError: true
displayName: Download ESRPClient
- - task: AzureKeyVault@1
+ - task: AzureKeyVault@2
displayName: "Azure Key Vault: Get Secrets"
inputs:
azureSubscription: "vscode-builds-subscription"
diff --git a/build/azure-pipelines/darwin/product-build-darwin-test.yml b/build/azure-pipelines/darwin/product-build-darwin-test.yml
index ed6d0236516..359aa460a59 100644
--- a/build/azure-pipelines/darwin/product-build-darwin-test.yml
+++ b/build/azure-pipelines/darwin/product-build-darwin-test.yml
@@ -9,7 +9,7 @@ parameters:
type: boolean
steps:
- - script: yarn npm-run-all -lp "electron $(VSCODE_ARCH)" "playwright-install"
+ - script: npm exec -- npm-run-all -lp "electron $(VSCODE_ARCH)" "playwright-install"
env:
GITHUB_TOKEN: "$(github-distro-mixin-password)"
displayName: Download Electron and Playwright
@@ -20,12 +20,10 @@ steps:
- script: ./scripts/test.sh --tfs "Unit Tests"
displayName: Run unit tests (Electron)
timeoutInMinutes: 15
-
- - script: yarn test-node
+ - script: npm run test-node
displayName: Run unit tests (node.js)
timeoutInMinutes: 15
-
- - script: yarn test-browser-no-install --sequential --browser chromium --browser webkit --tfs "Browser Unit Tests"
+ - script: npm run test-browser-no-install -- --sequential --browser chromium --browser webkit --tfs "Browser Unit Tests"
env:
DEBUG: "*browser*"
displayName: Run unit tests (Browser, Chromium & Webkit)
@@ -35,12 +33,10 @@ steps:
- script: ./scripts/test.sh --build --tfs "Unit Tests"
displayName: Run unit tests (Electron)
timeoutInMinutes: 15
-
- - script: yarn test-node --build
+ - script: npm run test-node -- --build
displayName: Run unit tests (node.js)
timeoutInMinutes: 15
-
- - script: yarn test-browser-no-install --sequential --build --browser chromium --browser webkit --tfs "Browser Unit Tests"
+ - script: npm run test-browser-no-install -- --sequential --build --browser chromium --browser webkit --tfs "Browser Unit Tests"
env:
DEBUG: "*browser*"
displayName: Run unit tests (Browser, Chromium & Webkit)
@@ -49,7 +45,7 @@ steps:
- ${{ if eq(parameters.VSCODE_RUN_INTEGRATION_TESTS, true) }}:
- script: |
set -e
- yarn gulp \
+ npm run gulp \
compile-extension:configuration-editing \
compile-extension:css-language-features-server \
compile-extension:emmet \
@@ -59,7 +55,6 @@ steps:
compile-extension:ipynb \
compile-extension:notebook-renderers \
compile-extension:json-language-features-server \
- compile-extension:markdown-language-features-server \
compile-extension:markdown-language-features \
compile-extension-media \
compile-extension:microsoft-authentication \
@@ -70,7 +65,7 @@ steps:
displayName: Build integration tests
- ${{ if eq(parameters.VSCODE_QUALITY, 'oss') }}:
- - script: ./scripts/test-integration.sh --tfs "Integration Tests"
+ - script: ./scripts/test-integration --tfs "Integration Tests"
displayName: Run integration tests (Electron)
timeoutInMinutes: 20
@@ -113,13 +108,14 @@ steps:
condition: succeededOrFailed()
- ${{ if eq(parameters.VSCODE_QUALITY, 'oss') }}:
- - script: yarn --cwd test/smoke compile
+ - script: npm run compile
+ workingDirectory: test/smoke
displayName: Compile smoke tests
- - script: yarn gulp compile-extension-media
+ - script: npm run gulp compile-extension-media
displayName: Compile extensions for smoke tests
- - script: yarn smoketest-no-compile --tracing
+ - script: npm run smoketest-no-compile -- --tracing
timeoutInMinutes: 20
displayName: Run smoke tests (Electron)
@@ -128,11 +124,11 @@ steps:
set -e
APP_ROOT=$(agent.builddirectory)/VSCode-darwin-$(VSCODE_ARCH)
APP_NAME="`ls $APP_ROOT | head -n 1`"
- yarn smoketest-no-compile --tracing --build "$APP_ROOT/$APP_NAME"
+ npm run smoketest-no-compile -- --tracing --build "$APP_ROOT/$APP_NAME"
timeoutInMinutes: 20
displayName: Run smoke tests (Electron)
- - script: yarn smoketest-no-compile --web --tracing --headless
+ - script: npm run smoketest-no-compile -- --web --tracing --headless
env:
VSCODE_REMOTE_SERVER_PATH: $(agent.builddirectory)/vscode-server-darwin-$(VSCODE_ARCH)-web
timeoutInMinutes: 20
@@ -140,10 +136,10 @@ steps:
- script: |
set -e
- yarn gulp compile-extension:vscode-test-resolver
+ npm run gulp compile-extension:vscode-test-resolver
APP_ROOT=$(agent.builddirectory)/VSCode-darwin-$(VSCODE_ARCH)
APP_NAME="`ls $APP_ROOT | head -n 1`"
- yarn smoketest-no-compile --tracing --remote --build "$APP_ROOT/$APP_NAME"
+ npm run smoketest-no-compile -- --tracing --remote --build "$APP_ROOT/$APP_NAME"
env:
VSCODE_REMOTE_SERVER_PATH: $(agent.builddirectory)/vscode-server-darwin-$(VSCODE_ARCH)
timeoutInMinutes: 20
diff --git a/build/azure-pipelines/darwin/product-build-darwin-universal.yml b/build/azure-pipelines/darwin/product-build-darwin-universal.yml
index f8b201f40d4..f8c10a03cec 100644
--- a/build/azure-pipelines/darwin/product-build-darwin-universal.yml
+++ b/build/azure-pipelines/darwin/product-build-darwin-universal.yml
@@ -7,7 +7,7 @@ steps:
- template: ../distro/download-distro.yml@self
- - task: AzureKeyVault@1
+ - task: AzureKeyVault@2
displayName: "Azure Key Vault: Get Secrets"
inputs:
azureSubscription: "vscode-builds-subscription"
@@ -20,31 +20,30 @@ steps:
- script: |
set -e
- npm config set registry "$NPM_REGISTRY" --location=project
- # npm >v7 deprecated the `always-auth` config option, refs npm/cli@72a7eeb
- # following is a workaround for yarn to send authorization header
- # for GET requests to the registry.
- echo "always-auth=true" >> .npmrc
- yarn config set registry "$NPM_REGISTRY"
- workingDirectory: build
+ # Set the private NPM registry to the global npmrc file
+ # so that authentication works for subfolders like build/, remote/, extensions/ etc
+ # which does not have their own .npmrc file
+ npm config set registry "$NPM_REGISTRY"
+ echo "##vso[task.setvariable variable=NPMRC_PATH]$(npm config get userconfig)"
condition: and(succeeded(), ne(variables['NPM_REGISTRY'], 'none'))
- displayName: Setup NPM & Yarn
+ displayName: Setup NPM
- task: npmAuthenticate@0
inputs:
- workingFile: build/.npmrc
+ workingFile: $(NPMRC_PATH)
condition: and(succeeded(), ne(variables['NPM_REGISTRY'], 'none'))
displayName: Setup NPM Authentication
- script: |
set -e
+
for i in {1..5}; do # try 5 times
- yarn --frozen-lockfile --check-files && break
- if [ $i -eq 3 ]; then
- echo "Yarn failed too many times" >&2
+ npm ci && break
+ if [ $i -eq 5 ]; then
+ echo "Npm install failed too many times" >&2
exit 1
fi
- echo "Yarn failed $i, trying again..."
+ echo "Npm install failed $i, trying again..."
done
workingDirectory: build
displayName: Install build dependencies
diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml
index 8b4bda1c6a2..c863c60d502 100644
--- a/build/azure-pipelines/darwin/product-build-darwin.yml
+++ b/build/azure-pipelines/darwin/product-build-darwin.yml
@@ -25,7 +25,7 @@ steps:
- ${{ if ne(parameters.VSCODE_QUALITY, 'oss') }}:
- template: ../distro/download-distro.yml@self
- - task: AzureKeyVault@1
+ - task: AzureKeyVault@2
displayName: "Azure Key Vault: Get Secrets"
inputs:
azureSubscription: "vscode-builds-subscription"
@@ -45,12 +45,12 @@ steps:
condition: and(succeeded(), ne(variables['NPM_REGISTRY'], 'none'))
displayName: Setup NPM Registry
- - script: mkdir -p .build && node build/azure-pipelines/common/computeNodeModulesCacheKey.js darwin $VSCODE_ARCH > .build/yarnlockhash
+ - script: mkdir -p .build && node build/azure-pipelines/common/computeNodeModulesCacheKey.js darwin $VSCODE_ARCH > .build/packagelockhash
displayName: Prepare node_modules cache key
- task: Cache@2
inputs:
- key: '"node_modules" | .build/yarnlockhash'
+ key: '"node_modules" | .build/packagelockhash'
path: .build/node_modules_cache
cacheHitVar: NODE_MODULES_RESTORED
displayName: Restore node_modules cache
@@ -61,38 +61,50 @@ steps:
- script: |
set -e
- npm config set registry "$NPM_REGISTRY" --location=project
- # npm >v7 deprecated the `always-auth` config option, refs npm/cli@72a7eeb
- # following is a workaround for yarn to send authorization header
- # for GET requests to the registry.
- echo "always-auth=true" >> .npmrc
- yarn config set registry "$NPM_REGISTRY"
+ # Set the private NPM registry to the global npmrc file
+ # so that authentication works for subfolders like build/, remote/, extensions/ etc
+ # which does not have their own .npmrc file
+ npm config set registry "$NPM_REGISTRY"
+ echo "##vso[task.setvariable variable=NPMRC_PATH]$(npm config get userconfig)"
condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none'))
- displayName: Setup NPM & Yarn
+ displayName: Setup NPM
- task: npmAuthenticate@0
inputs:
- workingFile: .npmrc
+ workingFile: $(NPMRC_PATH)
condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none'))
displayName: Setup NPM Authentication
- script: |
set -e
+ # Refs https://github.com/microsoft/vscode/issues/219893#issuecomment-2209313109
+ sudo xcode-select --switch /Applications/Xcode_15.2.app
+ condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'))
+ displayName: Switch to Xcode >= 15.1
+
+ - script: |
+ set -e
+ c++ --version
python3 -m pip install setuptools
for i in {1..5}; do # try 5 times
- yarn --frozen-lockfile --check-files && break
- if [ $i -eq 3 ]; then
- echo "Yarn failed too many times" >&2
+ npm ci && break
+ if [ $i -eq 5 ]; then
+ echo "Npm install failed too many times" >&2
exit 1
fi
- echo "Yarn failed $i, trying again..."
+ echo "Npm install failed $i, trying again..."
done
env:
npm_config_arch: $(VSCODE_ARCH)
ELECTRON_SKIP_BINARY_DOWNLOAD: 1
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
GITHUB_TOKEN: "$(github-distro-mixin-password)"
+ # Avoid using dlopen to load Kerberos on macOS which can cause missing libraries
+ # https://github.com/mongodb-js/kerberos/commit/04044d2814ad1d01e77f1ce87f26b03d86692cf2
+ # flipped the default to support legacy linux distros which shouldn't happen
+ # on macOS.
+ GYP_DEFINES: "kerberos_use_rtld=false"
displayName: Install dependencies
condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'))
@@ -118,7 +130,7 @@ steps:
- ${{ if ne(parameters.VSCODE_QUALITY, 'oss') }}:
- script: |
set -e
- yarn gulp vscode-darwin-$(VSCODE_ARCH)-min-ci
+ npm run gulp vscode-darwin-$(VSCODE_ARCH)-min-ci
echo "##vso[task.setvariable variable=BUILT_CLIENT]true"
env:
GITHUB_TOKEN: "$(github-distro-mixin-password)"
@@ -126,7 +138,7 @@ steps:
- script: |
set -e
- yarn gulp vscode-reh-darwin-$(VSCODE_ARCH)-min-ci
+ npm run gulp vscode-reh-darwin-$(VSCODE_ARCH)-min-ci
mv ../vscode-reh-darwin-$(VSCODE_ARCH) ../vscode-server-darwin-$(VSCODE_ARCH) # TODO@joaomoreno
ARCHIVE_PATH=".build/darwin/server/vscode-server-darwin-$(VSCODE_ARCH).zip"
mkdir -p $(dirname $ARCHIVE_PATH)
@@ -138,7 +150,7 @@ steps:
- script: |
set -e
- yarn gulp vscode-reh-web-darwin-$(VSCODE_ARCH)-min-ci
+ npm run gulp vscode-reh-web-darwin-$(VSCODE_ARCH)-min-ci
mv ../vscode-reh-web-darwin-$(VSCODE_ARCH) ../vscode-server-darwin-$(VSCODE_ARCH)-web # TODO@joaomoreno
ARCHIVE_PATH=".build/darwin/server/vscode-server-darwin-$(VSCODE_ARCH)-web.zip"
mkdir -p $(dirname $ARCHIVE_PATH)
@@ -149,7 +161,7 @@ steps:
displayName: Build server (web)
- ${{ else }}:
- - script: yarn gulp transpile-client-swc transpile-extensions
+ - script: npm run gulp transpile-client-swc transpile-extensions
env:
GITHUB_TOKEN: "$(github-distro-mixin-password)"
displayName: Transpile
diff --git a/build/azure-pipelines/distro-build.yml b/build/azure-pipelines/distro-build.yml
index ee5dd5d9919..ae11345bb6d 100644
--- a/build/azure-pipelines/distro-build.yml
+++ b/build/azure-pipelines/distro-build.yml
@@ -1,5 +1,6 @@
pool:
- vmImage: "ubuntu-latest"
+ name: 1es-ubuntu-22.04-x64
+ os: linux
trigger:
branches:
diff --git a/build/azure-pipelines/distro/download-distro.yml b/build/azure-pipelines/distro/download-distro.yml
index a703992aab2..92325762a60 100644
--- a/build/azure-pipelines/distro/download-distro.yml
+++ b/build/azure-pipelines/distro/download-distro.yml
@@ -1,5 +1,5 @@
steps:
- - task: AzureKeyVault@1
+ - task: AzureKeyVault@2
displayName: "Azure Key Vault: Get Secrets"
inputs:
azureSubscription: "vscode-builds-subscription"
@@ -51,6 +51,5 @@ steps:
unzip $ArchivePath -d .build
mv .build/microsoft-vscode-distro-$DistroVersion .build/distro
- cp remote/.yarnrc .build/distro/npm/remote/.yarnrc
condition: and(succeeded(), not(contains(variables['Agent.OS'], 'windows')))
displayName: Download distro (non-Windows)
diff --git a/build/azure-pipelines/linux/apt-retry.sh b/build/azure-pipelines/linux/apt-retry.sh
new file mode 100755
index 00000000000..358f34cd308
--- /dev/null
+++ b/build/azure-pipelines/linux/apt-retry.sh
@@ -0,0 +1,42 @@
+#!/bin/sh
+################################################################################
+## Copied from https://github.com/actions/runner-images/blob/ubuntu22/20240825.1/images/ubuntu/scripts/build/configure-apt-mock.sh
+################################################################################
+
+i=1
+while [ $i -le 30 ];do
+ err=$(mktemp)
+ "$@" 2>$err
+
+ # no errors, break the loop and continue normal flow
+ test -f $err || break
+ cat $err >&2
+
+ retry=false
+
+ if grep -q 'Could not get lock' $err;then
+ # apt db locked needs retry
+ retry=true
+ elif grep -q 'Could not open file /var/lib/apt/lists' $err;then
+ # apt update is not completed, needs retry
+ retry=true
+ elif grep -q 'IPC connect call failed' $err;then
+ # the delay should help with gpg-agent not ready
+ retry=true
+ elif grep -q 'Temporary failure in name resolution' $err;then
+ # It looks like DNS is not updated with random generated hostname yet
+ retry=true
+ elif grep -q 'dpkg frontend is locked by another process' $err;then
+ # dpkg process is busy by another process
+ retry=true
+ fi
+
+ rm $err
+ if [ $retry = false ]; then
+ break
+ fi
+
+ sleep 5
+ echo "...retry $i"
+ i=$((i + 1))
+done
diff --git a/build/azure-pipelines/linux/cli-build-linux.yml b/build/azure-pipelines/linux/cli-build-linux.yml
index f3e2ef88b9d..89bc8a39e24 100644
--- a/build/azure-pipelines/linux/cli-build-linux.yml
+++ b/build/azure-pipelines/linux/cli-build-linux.yml
@@ -40,24 +40,23 @@ steps:
displayName: Extract openssl prebuilt
- ${{ if ne(parameters.VSCODE_QUALITY, 'oss') }}:
- - script: node build/setup-npm-registry.js $NPM_REGISTRY
+ - script: node build/setup-npm-registry.js $NPM_REGISTRY build
condition: and(succeeded(), ne(variables['NPM_REGISTRY'], 'none'))
displayName: Setup NPM Registry
- script: |
set -e
- npm config set registry "$NPM_REGISTRY" --location=project
- # npm >v7 deprecated the `always-auth` config option, refs npm/cli@72a7eeb
- # following is a workaround for yarn to send authorization header
- # for GET requests to the registry.
- echo "always-auth=true" >> .npmrc
- yarn config set registry "$NPM_REGISTRY"
+ # Set the private NPM registry to the global npmrc file
+ # so that authentication works for subfolders like build/, remote/, extensions/ etc
+ # which does not have their own .npmrc file
+ npm config set registry "$NPM_REGISTRY"
+ echo "##vso[task.setvariable variable=NPMRC_PATH]$(npm config get userconfig)"
condition: and(succeeded(), ne(variables['NPM_REGISTRY'], 'none'))
- displayName: Setup NPM & Yarn
+ displayName: Setup NPM
- task: npmAuthenticate@0
inputs:
- workingFile: .npmrc
+ workingFile: $(NPMRC_PATH)
condition: and(succeeded(), ne(variables['NPM_REGISTRY'], 'none'))
displayName: Setup NPM Authentication
@@ -65,13 +64,14 @@ steps:
set -e
for i in {1..5}; do # try 5 times
- yarn --cwd build --frozen-lockfile --check-files && break
- if [ $i -eq 3 ]; then
- echo "Yarn failed too many times" >&2
+ npm ci && break
+ if [ $i -eq 5 ]; then
+ echo "Npm install failed too many times" >&2
exit 1
fi
- echo "Yarn failed $i, trying again..."
+ echo "Npm install failed $i, trying again..."
done
+ workingDirectory: build
displayName: Install build dependencies
- script: |
diff --git a/build/azure-pipelines/linux/product-build-linux-legacy-server.yml b/build/azure-pipelines/linux/product-build-linux-legacy-server.yml
index dc8424f26ee..649a3d224d9 100644
--- a/build/azure-pipelines/linux/product-build-linux-legacy-server.yml
+++ b/build/azure-pipelines/linux/product-build-linux-legacy-server.yml
@@ -15,7 +15,7 @@ steps:
- template: ../distro/download-distro.yml
- - task: AzureKeyVault@1
+ - task: AzureKeyVault@2
displayName: "Azure Key Vault: Get Secrets"
inputs:
azureSubscription: "vscode-builds-subscription"
@@ -34,8 +34,8 @@ steps:
- script: |
set -e
# Start X server
- sudo apt-get update
- sudo apt-get install -y pkg-config \
+ ./build/azure-pipelines/linux/apt-retry.sh sudo apt-get update
+ ./build/azure-pipelines/linux/apt-retry.sh sudo apt-get install -y pkg-config \
dbus \
xvfb \
libgtk-3-0 \
@@ -59,18 +59,17 @@ steps:
- script: |
set -e
- npm config set registry "$NPM_REGISTRY" --location=project
- # npm >v7 deprecated the `always-auth` config option, refs npm/cli@72a7eeb
- # following is a workaround for yarn to send authorization header
- # for GET requests to the registry.
- echo "always-auth=true" >> .npmrc
- yarn config set registry "$NPM_REGISTRY"
+ # Set the private NPM registry to the global npmrc file
+ # so that authentication works for subfolders like build/, remote/, extensions/ etc
+ # which does not have their own .npmrc file
+ npm config set registry "$NPM_REGISTRY"
+ echo "##vso[task.setvariable variable=NPMRC_PATH]$(npm config get userconfig)"
condition: and(succeeded(), ne(variables['NPM_REGISTRY'], 'none'))
- displayName: Setup NPM & Yarn
+ displayName: Setup NPM
- task: npmAuthenticate@0
inputs:
- workingFile: .npmrc
+ workingFile: $(NPMRC_PATH)
condition: and(succeeded(), ne(variables['NPM_REGISTRY'], 'none'))
displayName: Setup NPM Authentication
@@ -84,40 +83,33 @@ steps:
imageName: vscode-linux-build-agent:centos7-devtoolset8-$(VSCODE_ARCH)
containerCommand: uname
- - ${{ if eq(parameters.VSCODE_ARCH, 'armhf') }}:
- - task: Docker@1
- displayName: "Pull Docker image"
- inputs:
- azureSubscriptionEndpoint: "vscode-builds-subscription"
- azureContainerRegistry: vscodehub.azurecr.io
- command: "Run an image"
- imageName: vscode-linux-build-agent:bionic-arm32v7
- containerCommand: uname
+ - script: |
+ set -e
+
+ for i in {1..5}; do # try 5 times
+ npm ci && break
+ if [ $i -eq 5 ]; then
+ echo "Npm install failed too many times" >&2
+ exit 1
+ fi
+ echo "Npm install failed $i, trying again..."
+ done
+ workingDirectory: build
+ displayName: Install build dependencies
- script: |
set -e
- # To workaround the issue of yarn not respecting the registry value from .npmrc
- yarn config set registry "$NPM_REGISTRY"
-
- for i in {1..5}; do # try 5 times
- yarn --cwd build --frozen-lockfile --check-files && break
- if [ $i -eq 3 ]; then
- echo "Yarn failed too many times" >&2
- exit 1
- fi
- echo "Yarn failed $i, trying again..."
- done
export VSCODE_SYSROOT_PREFIX='-glibc-2.17'
source ./build/azure-pipelines/linux/setup-env.sh --only-remote
for i in {1..5}; do # try 5 times
- yarn --frozen-lockfile --check-files && break
- if [ $i -eq 3 ]; then
- echo "Yarn failed too many times" >&2
+ npm ci && break
+ if [ $i -eq 5 ]; then
+ echo "Npm install failed too many times" >&2
exit 1
fi
- echo "Yarn failed $i, trying again..."
+ echo "Npm install failed $i, trying again..."
done
env:
npm_config_arch: $(NPM_ARCH)
@@ -129,18 +121,8 @@ steps:
VSCODE_HOST_MOUNT: "/mnt/vss/_work/1/s"
${{ if or(eq(parameters.VSCODE_ARCH, 'x64'), eq(parameters.VSCODE_ARCH, 'arm64')) }}:
VSCODE_REMOTE_DEPENDENCIES_CONTAINER_NAME: vscodehub.azurecr.io/vscode-linux-build-agent:centos7-devtoolset8-$(VSCODE_ARCH)
- ${{ if eq(parameters.VSCODE_ARCH, 'armhf') }}:
- VSCODE_REMOTE_DEPENDENCIES_CONTAINER_NAME: vscodehub.azurecr.io/vscode-linux-build-agent:bionic-arm32v7
displayName: Install dependencies
- - ${{ if or(eq(parameters.VSCODE_ARCH, 'x64'), eq(parameters.VSCODE_ARCH, 'arm64')) }}:
- - script: |
- set -e
- EXPECTED_GLIBC_VERSION="2.17" \
- EXPECTED_GLIBCXX_VERSION="3.4.19" \
- ./build/azure-pipelines/linux/verify-glibc-requirements.sh
- displayName: Check GLIBC and GLIBCXX dependencies in remote/node_modules
-
- script: node build/azure-pipelines/distro/mixin-npm
displayName: Mixin distro node modules
@@ -151,7 +133,7 @@ steps:
- script: |
set -e
- yarn gulp vscode-linux-$(VSCODE_ARCH)-min-ci
+ npm run gulp vscode-linux-$(VSCODE_ARCH)-min-ci
ARCHIVE_PATH=".build/linux/client/code-${{ parameters.VSCODE_QUALITY }}-$(VSCODE_ARCH)-$(date +%s).tar.gz"
mkdir -p $(dirname $ARCHIVE_PATH)
echo "##vso[task.setvariable variable=CLIENT_PATH]$ARCHIVE_PATH"
@@ -169,12 +151,14 @@ steps:
- script: |
set -e
export VSCODE_NODE_GLIBC="-glibc-2.17"
- yarn gulp vscode-reh-linux-$(VSCODE_ARCH)-min-ci
+ npm run gulp vscode-reh-linux-$(VSCODE_ARCH)-min-ci
mv ../vscode-reh-linux-$(VSCODE_ARCH) ../vscode-server-linux-$(VSCODE_ARCH) # TODO@joaomoreno
ARCHIVE_PATH=".build/linux/server/vscode-server-linux-legacy-$(VSCODE_ARCH).tar.gz"
+ UNARCHIVE_PATH="`pwd`/../vscode-server-linux-$(VSCODE_ARCH)"
mkdir -p $(dirname $ARCHIVE_PATH)
tar --owner=0 --group=0 -czf $ARCHIVE_PATH -C .. vscode-server-linux-$(VSCODE_ARCH)
echo "##vso[task.setvariable variable=SERVER_PATH]$ARCHIVE_PATH"
+ echo "##vso[task.setvariable variable=SERVER_UNARCHIVE_PATH]$UNARCHIVE_PATH"
env:
GITHUB_TOKEN: "$(github-distro-mixin-password)"
displayName: Build server
@@ -182,7 +166,7 @@ steps:
- script: |
set -e
export VSCODE_NODE_GLIBC="-glibc-2.17"
- yarn gulp vscode-reh-web-linux-$(VSCODE_ARCH)-min-ci
+ npm run gulp vscode-reh-web-linux-$(VSCODE_ARCH)-min-ci
mv ../vscode-reh-web-linux-$(VSCODE_ARCH) ../vscode-server-linux-$(VSCODE_ARCH)-web # TODO@joaomoreno
ARCHIVE_PATH=".build/linux/web/vscode-server-linux-legacy-$(VSCODE_ARCH)-web.tar.gz"
mkdir -p $(dirname $ARCHIVE_PATH)
@@ -192,6 +176,26 @@ steps:
GITHUB_TOKEN: "$(github-distro-mixin-password)"
displayName: Build server (web)
+ - ${{ if or(eq(parameters.VSCODE_ARCH, 'x64'), eq(parameters.VSCODE_ARCH, 'arm64')) }}:
+ - script: |
+ set -e
+ EXPECTED_GLIBC_VERSION="2.17" \
+ EXPECTED_GLIBCXX_VERSION="3.4.19" \
+ ./build/azure-pipelines/linux/verify-glibc-requirements.sh
+ env:
+ SEARCH_PATH: $(SERVER_UNARCHIVE_PATH)
+ displayName: Check GLIBC and GLIBCXX dependencies in server archive
+
+ - ${{ else }}:
+ - script: |
+ set -e
+ EXPECTED_GLIBC_VERSION="2.17" \
+ EXPECTED_GLIBCXX_VERSION="3.4.22" \
+ ./build/azure-pipelines/linux/verify-glibc-requirements.sh
+ env:
+ SEARCH_PATH: $(SERVER_UNARCHIVE_PATH)
+ displayName: Check GLIBC and GLIBCXX dependencies in server archive
+
- ${{ if eq(parameters.VSCODE_RUN_INTEGRATION_TESTS, true) }}:
- template: product-build-linux-test.yml
parameters:
diff --git a/build/azure-pipelines/linux/product-build-linux-test.yml b/build/azure-pipelines/linux/product-build-linux-test.yml
index f5c00aa0cf0..5f7381d487c 100644
--- a/build/azure-pipelines/linux/product-build-linux-test.yml
+++ b/build/azure-pipelines/linux/product-build-linux-test.yml
@@ -12,7 +12,7 @@ parameters:
default: PublishPipelineArtifact@0
steps:
- - script: yarn npm-run-all -lp "electron $(VSCODE_ARCH)" "playwright-install"
+ - script: npm exec -- npm-run-all -lp "electron $(VSCODE_ARCH)" "playwright-install"
env:
GITHUB_TOKEN: "$(github-distro-mixin-password)"
displayName: Download Electron and Playwright
@@ -38,27 +38,24 @@ steps:
DISPLAY: ":10"
displayName: Run unit tests (Electron)
timeoutInMinutes: 15
-
- - script: yarn test-node
+ - script: npm run test-node
displayName: Run unit tests (node.js)
timeoutInMinutes: 15
-
- - script: yarn test-browser-no-install --browser chromium --tfs "Browser Unit Tests"
+ - script: npm run test-browser-no-install -- --browser chromium --tfs "Browser Unit Tests"
env:
DEBUG: "*browser*"
displayName: Run unit tests (Browser, Chromium)
timeoutInMinutes: 15
+
- ${{ if ne(parameters.VSCODE_QUALITY, 'oss') }}:
- script: ./scripts/test.sh --build --tfs "Unit Tests"
displayName: Run unit tests (Electron)
timeoutInMinutes: 15
-
- - script: yarn test-node --build
+ - script: npm run test-node -- --build
displayName: Run unit tests (node.js)
timeoutInMinutes: 15
-
- - script: yarn test-browser-no-install --build --browser chromium --tfs "Browser Unit Tests"
+ - script: npm run test-browser-no-install -- --build --browser chromium --tfs "Browser Unit Tests"
env:
DEBUG: "*browser*"
displayName: Run unit tests (Browser, Chromium)
@@ -67,7 +64,7 @@ steps:
- ${{ if eq(parameters.VSCODE_RUN_INTEGRATION_TESTS, true) }}:
- script: |
set -e
- yarn gulp \
+ npm run gulp \
compile-extension:configuration-editing \
compile-extension:css-language-features-server \
compile-extension:emmet \
@@ -77,7 +74,6 @@ steps:
compile-extension:ipynb \
compile-extension:notebook-renderers \
compile-extension:json-language-features-server \
- compile-extension:markdown-language-features-server \
compile-extension:markdown-language-features \
compile-extension-media \
compile-extension:microsoft-authentication \
@@ -148,34 +144,35 @@ steps:
condition: succeededOrFailed()
- ${{ if eq(parameters.VSCODE_QUALITY, 'oss') }}:
- - script: yarn --cwd test/smoke compile
+ - script: npm run compile
+ workingDirectory: test/smoke
displayName: Compile smoke tests
- - script: yarn gulp compile-extension:markdown-language-features compile-extension-media compile-extension:vscode-test-resolver
+ - script: npm run gulp compile-extension:markdown-language-features compile-extension:ipynb compile-extension-media compile-extension:vscode-test-resolver
displayName: Build extensions for smoke tests
- - script: yarn gulp node
+ - script: npm run gulp node
displayName: Download node.js for remote smoke tests
retryCountOnTaskFailure: 3
- - script: yarn smoketest-no-compile --tracing
+ - script: npm run smoketest-no-compile -- --tracing
timeoutInMinutes: 20
displayName: Run smoke tests (Electron)
- - script: yarn smoketest-no-compile --web --tracing --headless --electronArgs="--disable-dev-shm-usage"
+ - script: npm run smoketest-no-compile -- --web --tracing --headless --electronArgs="--disable-dev-shm-usage"
timeoutInMinutes: 20
displayName: Run smoke tests (Browser, Chromium)
- - script: yarn smoketest-no-compile --remote --tracing
+ - script: npm run smoketest-no-compile -- --remote --tracing
timeoutInMinutes: 20
displayName: Run smoke tests (Remote)
- ${{ if ne(parameters.VSCODE_QUALITY, 'oss') }}:
- - script: yarn smoketest-no-compile --tracing --build "$(agent.builddirectory)/VSCode-linux-$(VSCODE_ARCH)"
+ - script: npm run smoketest-no-compile -- --tracing --build "$(agent.builddirectory)/VSCode-linux-$(VSCODE_ARCH)"
timeoutInMinutes: 20
displayName: Run smoke tests (Electron)
- - script: yarn smoketest-no-compile --web --tracing --headless --electronArgs="--disable-dev-shm-usage"
+ - script: npm run smoketest-no-compile -- --web --tracing --headless --electronArgs="--disable-dev-shm-usage"
env:
VSCODE_REMOTE_SERVER_PATH: $(agent.builddirectory)/vscode-server-linux-$(VSCODE_ARCH)-web
timeoutInMinutes: 20
@@ -183,10 +180,10 @@ steps:
- script: |
set -e
- yarn gulp compile-extension:vscode-test-resolver
+ npm run gulp compile-extension:vscode-test-resolver
APP_PATH=$(agent.builddirectory)/VSCode-linux-$(VSCODE_ARCH)
VSCODE_REMOTE_SERVER_PATH="$(agent.builddirectory)/vscode-server-linux-$(VSCODE_ARCH)" \
- yarn smoketest-no-compile --tracing --remote --build "$APP_PATH"
+ npm run smoketest-no-compile -- --tracing --remote --build "$APP_PATH"
timeoutInMinutes: 20
displayName: Run smoke tests (Remote)
diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml
index 352b31360f8..3fb7b4fe679 100644
--- a/build/azure-pipelines/linux/product-build-linux.yml
+++ b/build/azure-pipelines/linux/product-build-linux.yml
@@ -27,7 +27,7 @@ steps:
- ${{ if ne(parameters.VSCODE_QUALITY, 'oss') }}:
- template: ../distro/download-distro.yml@self
- - task: AzureKeyVault@1
+ - task: AzureKeyVault@2
displayName: "Azure Key Vault: Get Secrets"
inputs:
azureSubscription: "vscode-builds-subscription"
@@ -46,8 +46,8 @@ steps:
- script: |
set -e
# Start X server
- sudo apt-get update
- sudo apt-get install -y pkg-config \
+ ./build/azure-pipelines/linux/apt-retry.sh sudo apt-get update
+ ./build/azure-pipelines/linux/apt-retry.sh sudo apt-get install -y pkg-config \
dbus \
xvfb \
libgtk-3-0 \
@@ -69,12 +69,12 @@ steps:
condition: and(succeeded(), ne(variables['NPM_REGISTRY'], 'none'))
displayName: Setup NPM Registry
- - script: mkdir -p .build && node build/azure-pipelines/common/computeNodeModulesCacheKey.js linux $VSCODE_ARCH > .build/yarnlockhash
+ - script: mkdir -p .build && node build/azure-pipelines/common/computeNodeModulesCacheKey.js linux $VSCODE_ARCH > .build/packagelockhash
displayName: Prepare node_modules cache key
- task: Cache@2
inputs:
- key: '"node_modules" | .build/yarnlockhash'
+ key: '"node_modules" | .build/packagelockhash'
path: .build/node_modules_cache
cacheHitVar: NODE_MODULES_RESTORED
displayName: Restore node_modules cache
@@ -85,18 +85,17 @@ steps:
- script: |
set -e
- npm config set registry "$NPM_REGISTRY" --location=project
- # npm >v7 deprecated the `always-auth` config option, refs npm/cli@72a7eeb
- # following is a workaround for yarn to send authorization header
- # for GET requests to the registry.
- echo "always-auth=true" >> .npmrc
- yarn config set registry "$NPM_REGISTRY"
+ # Set the private NPM registry to the global npmrc file
+ # so that authentication works for subfolders like build/, remote/, extensions/ etc
+ # which does not have their own .npmrc file
+ npm config set registry "$NPM_REGISTRY"
+ echo "##vso[task.setvariable variable=NPMRC_PATH]$(npm config get userconfig)"
condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none'))
- displayName: Setup NPM & Yarn
+ displayName: Setup NPM
- task: npmAuthenticate@0
inputs:
- workingFile: .npmrc
+ workingFile: $(NPMRC_PATH)
condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none'))
displayName: Setup NPM Authentication
@@ -104,23 +103,44 @@ steps:
set -e
for i in {1..5}; do # try 5 times
- yarn --cwd build --frozen-lockfile --check-files && break
- if [ $i -eq 3 ]; then
- echo "Yarn failed too many times" >&2
+ npm ci && break
+ if [ $i -eq 5 ]; then
+ echo "Npm install failed too many times" >&2
exit 1
fi
- echo "Yarn failed $i, trying again..."
+ echo "Npm install failed $i, trying again..."
done
+ workingDirectory: build
+ displayName: Install build dependencies
+ condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'))
+
+ # Step will be used by both Install dependencies and building rpm package,
+ # hence avoid adding it behind NODE_MODULES_RESTORED condition.
+ - script: |
+ set -e
+ SYSROOT_ARCH=$VSCODE_ARCH
+ if [ "$SYSROOT_ARCH" == "x64" ]; then
+ SYSROOT_ARCH="amd64"
+ fi
+ export VSCODE_SYSROOT_DIR=$(Build.SourcesDirectory)/.build/sysroots
+ SYSROOT_ARCH="$SYSROOT_ARCH" node -e '(async () => { const { getVSCodeSysroot } = require("./build/linux/debian/install-sysroot.js"); await getVSCodeSysroot(process.env["SYSROOT_ARCH"]); })()'
+ env:
+ VSCODE_ARCH: $(VSCODE_ARCH)
+ GITHUB_TOKEN: "$(github-distro-mixin-password)"
+ displayName: Download vscode sysroots
+
+ - script: |
+ set -e
source ./build/azure-pipelines/linux/setup-env.sh
for i in {1..5}; do # try 5 times
- yarn --frozen-lockfile --check-files && break
- if [ $i -eq 3 ]; then
- echo "Yarn failed too many times" >&2
+ npm ci && break
+ if [ $i -eq 5 ]; then
+ echo "Npm install failed too many times" >&2
exit 1
fi
- echo "Yarn failed $i, trying again..."
+ echo "Npm install failed $i, trying again..."
done
env:
npm_config_arch: $(NPM_ARCH)
@@ -131,16 +151,6 @@ steps:
displayName: Install dependencies
condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'))
- - script: |
- set -e
-
- EXPECTED_GLIBC_VERSION="2.28" \
- EXPECTED_GLIBCXX_VERSION="3.4.25" \
- ./build/azure-pipelines/linux/verify-glibc-requirements.sh
- condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'))
- displayName: Check GLIBC and GLIBCXX dependencies in remote/node_modules
-
-
- ${{ if ne(parameters.VSCODE_QUALITY, 'oss') }}:
- script: node build/azure-pipelines/distro/mixin-npm
condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'))
@@ -177,7 +187,7 @@ steps:
- ${{ if ne(parameters.VSCODE_QUALITY, 'oss') }}:
- script: |
set -e
- yarn gulp vscode-linux-$(VSCODE_ARCH)-min-ci
+ npm run gulp vscode-linux-$(VSCODE_ARCH)-min-ci
ARCHIVE_PATH=".build/linux/client/code-${{ parameters.VSCODE_QUALITY }}-$(VSCODE_ARCH)-$(date +%s).tar.gz"
mkdir -p $(dirname $ARCHIVE_PATH)
echo "##vso[task.setvariable variable=CLIENT_PATH]$ARCHIVE_PATH"
@@ -210,19 +220,21 @@ steps:
- script: |
set -e
- yarn gulp vscode-reh-linux-$(VSCODE_ARCH)-min-ci
+ npm run gulp vscode-reh-linux-$(VSCODE_ARCH)-min-ci
mv ../vscode-reh-linux-$(VSCODE_ARCH) ../vscode-server-linux-$(VSCODE_ARCH) # TODO@joaomoreno
ARCHIVE_PATH=".build/linux/server/vscode-server-linux-$(VSCODE_ARCH).tar.gz"
+ UNARCHIVE_PATH="`pwd`/../vscode-server-linux-$(VSCODE_ARCH)"
mkdir -p $(dirname $ARCHIVE_PATH)
tar --owner=0 --group=0 -czf $ARCHIVE_PATH -C .. vscode-server-linux-$(VSCODE_ARCH)
echo "##vso[task.setvariable variable=SERVER_PATH]$ARCHIVE_PATH"
+ echo "##vso[task.setvariable variable=SERVER_UNARCHIVE_PATH]$UNARCHIVE_PATH"
env:
GITHUB_TOKEN: "$(github-distro-mixin-password)"
displayName: Build server
- script: |
set -e
- yarn gulp vscode-reh-web-linux-$(VSCODE_ARCH)-min-ci
+ npm run gulp vscode-reh-web-linux-$(VSCODE_ARCH)-min-ci
mv ../vscode-reh-web-linux-$(VSCODE_ARCH) ../vscode-server-linux-$(VSCODE_ARCH)-web # TODO@joaomoreno
ARCHIVE_PATH=".build/linux/web/vscode-server-linux-$(VSCODE_ARCH)-web.tar.gz"
mkdir -p $(dirname $ARCHIVE_PATH)
@@ -232,8 +244,38 @@ steps:
GITHUB_TOKEN: "$(github-distro-mixin-password)"
displayName: Build server (web)
+ - ${{ if or(eq(parameters.VSCODE_ARCH, 'x64'), eq(parameters.VSCODE_ARCH, 'arm64')) }}:
+ - script: |
+ set -e
+
+ source ./build/azure-pipelines/linux/setup-env.sh
+
+ EXPECTED_GLIBC_VERSION="2.28" \
+ EXPECTED_GLIBCXX_VERSION="3.4.25" \
+ ./build/azure-pipelines/linux/verify-glibc-requirements.sh
+ env:
+ SEARCH_PATH: $(SERVER_UNARCHIVE_PATH)
+ npm_config_arch: $(NPM_ARCH)
+ VSCODE_ARCH: $(VSCODE_ARCH)
+ displayName: Check GLIBC and GLIBCXX dependencies in server archive
+
+ - ${{ else }}:
+ - script: |
+ set -e
+
+ source ./build/azure-pipelines/linux/setup-env.sh
+
+ EXPECTED_GLIBC_VERSION="2.28" \
+ EXPECTED_GLIBCXX_VERSION="3.4.26" \
+ ./build/azure-pipelines/linux/verify-glibc-requirements.sh
+ env:
+ SEARCH_PATH: $(SERVER_UNARCHIVE_PATH)
+ npm_config_arch: $(NPM_ARCH)
+ VSCODE_ARCH: $(VSCODE_ARCH)
+ displayName: Check GLIBC and GLIBCXX dependencies in server archive
+
- ${{ else }}:
- - script: yarn gulp "transpile-client-swc" "transpile-extensions"
+ - script: npm run gulp "transpile-client-swc" "transpile-extensions"
env:
GITHUB_TOKEN: "$(github-distro-mixin-password)"
displayName: Transpile client and extensions
@@ -251,31 +293,43 @@ steps:
- ${{ if and(ne(parameters.VSCODE_CIBUILD, true), ne(parameters.VSCODE_QUALITY, 'oss')) }}:
- script: |
set -e
- yarn gulp "vscode-linux-$(VSCODE_ARCH)-prepare-deb"
+ npm run gulp "vscode-linux-$(VSCODE_ARCH)-prepare-deb"
env:
GITHUB_TOKEN: "$(github-distro-mixin-password)"
displayName: Prepare deb package
- script: |
set -e
- yarn gulp "vscode-linux-$(VSCODE_ARCH)-build-deb"
+ npm run gulp "vscode-linux-$(VSCODE_ARCH)-build-deb"
echo "##vso[task.setvariable variable=DEB_PATH]$(ls .build/linux/deb/*/deb/*.deb)"
displayName: Build deb package
- script: |
set -e
- yarn gulp "vscode-linux-$(VSCODE_ARCH)-prepare-rpm"
+ TRIPLE=""
+ if [ "$VSCODE_ARCH" == "x64" ]; then
+ TRIPLE="x86_64-linux-gnu"
+ elif [ "$VSCODE_ARCH" == "arm64" ]; then
+ TRIPLE="aarch64-linux-gnu"
+ elif [ "$VSCODE_ARCH" == "armhf" ]; then
+ TRIPLE="arm-rpi-linux-gnueabihf"
+ fi
+ export VSCODE_SYSROOT_DIR=$(Build.SourcesDirectory)/.build/sysroots
+ export STRIP="$VSCODE_SYSROOT_DIR/$TRIPLE/$TRIPLE/bin/strip"
+ npm run gulp "vscode-linux-$(VSCODE_ARCH)-prepare-rpm"
+ env:
+ VSCODE_ARCH: $(VSCODE_ARCH)
displayName: Prepare rpm package
- script: |
set -e
- yarn gulp "vscode-linux-$(VSCODE_ARCH)-build-rpm"
+ npm run gulp "vscode-linux-$(VSCODE_ARCH)-build-rpm"
echo "##vso[task.setvariable variable=RPM_PATH]$(ls .build/linux/rpm/*/*.rpm)"
displayName: Build rpm package
- script: |
set -e
- yarn gulp "vscode-linux-$(VSCODE_ARCH)-prepare-snap"
+ npm run gulp "vscode-linux-$(VSCODE_ARCH)-prepare-snap"
ARCHIVE_PATH=".build/linux/snap-tarball/snap-$(VSCODE_ARCH).tar.gz"
mkdir -p $(dirname $ARCHIVE_PATH)
tar -czf $ARCHIVE_PATH -C .build/linux snap
diff --git a/build/azure-pipelines/linux/setup-env.sh b/build/azure-pipelines/linux/setup-env.sh
index 9bfbf9ab41a..1ce3ba742c1 100755
--- a/build/azure-pipelines/linux/setup-env.sh
+++ b/build/azure-pipelines/linux/setup-env.sh
@@ -8,12 +8,17 @@ if [ "$SYSROOT_ARCH" == "x64" ]; then
fi
export VSCODE_SYSROOT_DIR=$PWD/.build/sysroots
-SYSROOT_ARCH="$SYSROOT_ARCH" node -e '(async () => { const { getVSCodeSysroot } = require("./build/linux/debian/install-sysroot.js"); await getVSCodeSysroot(process.env["SYSROOT_ARCH"]); })()'
+if [ -d "$VSCODE_SYSROOT_DIR" ]; then
+ echo "Using cached sysroot"
+else
+ echo "Downloading sysroot"
+ SYSROOT_ARCH="$SYSROOT_ARCH" node -e '(async () => { const { getVSCodeSysroot } = require("./build/linux/debian/install-sysroot.js"); await getVSCodeSysroot(process.env["SYSROOT_ARCH"]); })()'
+fi
if [ "$npm_config_arch" == "x64" ]; then
if [ "$(echo "$@" | grep -c -- "--only-remote")" -eq 0 ]; then
# Download clang based on chromium revision used by vscode
- curl -s https://raw.githubusercontent.com/chromium/chromium/122.0.6261.156/tools/clang/scripts/update.py | python - --output-dir=$PWD/.build/CR_Clang --host-os=linux
+ curl -s https://raw.githubusercontent.com/chromium/chromium/124.0.6367.243/tools/clang/scripts/update.py | python - --output-dir=$PWD/.build/CR_Clang --host-os=linux
# Download libcxx headers and objects from upstream electron releases
DEBUG=libcxx-fetcher \
@@ -25,9 +30,9 @@ if [ "$npm_config_arch" == "x64" ]; then
# Set compiler toolchain
# Flags for the client build are based on
- # https://source.chromium.org/chromium/chromium/src/+/refs/tags/122.0.6261.156:build/config/arm.gni
- # https://source.chromium.org/chromium/chromium/src/+/refs/tags/122.0.6261.156:build/config/compiler/BUILD.gn
- # https://source.chromium.org/chromium/chromium/src/+/refs/tags/122.0.6261.156:build/config/c++/BUILD.gn
+ # https://source.chromium.org/chromium/chromium/src/+/refs/tags/124.0.6367.243:build/config/arm.gni
+ # https://source.chromium.org/chromium/chromium/src/+/refs/tags/124.0.6367.243:build/config/compiler/BUILD.gn
+ # https://source.chromium.org/chromium/chromium/src/+/refs/tags/124.0.6367.243:build/config/c++/BUILD.gn
export CC="$PWD/.build/CR_Clang/bin/clang --gcc-toolchain=$VSCODE_SYSROOT_DIR/x86_64-linux-gnu"
export CXX="$PWD/.build/CR_Clang/bin/clang++ --gcc-toolchain=$VSCODE_SYSROOT_DIR/x86_64-linux-gnu"
export CXXFLAGS="-nostdinc++ -D__NO_INLINE__ -I$PWD/.build/libcxx_headers -isystem$PWD/.build/libcxx_headers/include -isystem$PWD/.build/libcxxabi_headers/include -fPIC -flto=thin -fsplit-lto-unit -D_LIBCPP_ABI_NAMESPACE=Cr -D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_EXTENSIVE --sysroot=$VSCODE_SYSROOT_DIR/x86_64-linux-gnu/x86_64-linux-gnu/sysroot"
@@ -54,17 +59,15 @@ elif [ "$npm_config_arch" == "arm64" ]; then
export VSCODE_REMOTE_LDFLAGS="--sysroot=$VSCODE_SYSROOT_DIR/aarch64-linux-gnu/aarch64-linux-gnu/sysroot -L$VSCODE_SYSROOT_DIR/aarch64-linux-gnu/aarch64-linux-gnu/sysroot/usr/lib/aarch64-linux-gnu -L$VSCODE_SYSROOT_DIR/aarch64-linux-gnu/aarch64-linux-gnu/sysroot/lib/aarch64-linux-gnu"
fi
elif [ "$npm_config_arch" == "arm" ]; then
- if [ "$(echo "$@" | grep -c -- "--only-remote")" -eq 0 ]; then
- # Set compiler toolchain for client native modules
- export CC=$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/bin/arm-rpi-linux-gnueabihf-gcc
- export CXX=$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/bin/arm-rpi-linux-gnueabihf-g++
- export CXXFLAGS="--sysroot=$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot"
- export LDFLAGS="--sysroot=$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot -L$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot/usr/lib/arm-linux-gnueabihf -L$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot/lib/arm-linux-gnueabihf"
+ # Set compiler toolchain for client native modules
+ export CC=$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/bin/arm-rpi-linux-gnueabihf-gcc
+ export CXX=$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/bin/arm-rpi-linux-gnueabihf-g++
+ export CXXFLAGS="--sysroot=$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot"
+ export LDFLAGS="--sysroot=$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot -L$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot/usr/lib/arm-linux-gnueabihf -L$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot/lib/arm-linux-gnueabihf"
- # Set compiler toolchain for remote server
- export VSCODE_REMOTE_CC=$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/bin/arm-rpi-linux-gnueabihf-gcc
- export VSCODE_REMOTE_CXX=$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/bin/arm-rpi-linux-gnueabihf-g++
- export VSCODE_REMOTE_CXXFLAGS="--sysroot=$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot"
- export VSCODE_REMOTE_LDFLAGS="--sysroot=$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot -L$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot/usr/lib/arm-linux-gnueabihf -L$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot/lib/arm-linux-gnueabihf"
- fi
+ # Set compiler toolchain for remote server
+ export VSCODE_REMOTE_CC=$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/bin/arm-rpi-linux-gnueabihf-gcc
+ export VSCODE_REMOTE_CXX=$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/bin/arm-rpi-linux-gnueabihf-g++
+ export VSCODE_REMOTE_CXXFLAGS="--sysroot=$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot"
+ export VSCODE_REMOTE_LDFLAGS="--sysroot=$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot -L$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot/usr/lib/arm-linux-gnueabihf -L$VSCODE_SYSROOT_DIR/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot/lib/arm-linux-gnueabihf"
fi
diff --git a/build/azure-pipelines/linux/snap-build-linux.yml b/build/azure-pipelines/linux/snap-build-linux.yml
index 033058163f9..3582be07cca 100644
--- a/build/azure-pipelines/linux/snap-build-linux.yml
+++ b/build/azure-pipelines/linux/snap-build-linux.yml
@@ -5,11 +5,11 @@ steps:
versionFilePath: .nvmrc
nodejsMirror: https://github.com/joaomoreno/node-mirror/releases/download
- - task: DownloadPipelineArtifact@0
+ - task: DownloadPipelineArtifact@2
displayName: "Download Pipeline Artifact"
inputs:
- artifactName: snap-$(VSCODE_ARCH)
- targetPath: .build/linux/snap-tarball
+ artifact: snap-$(VSCODE_ARCH)
+ path: .build/linux/snap-tarball
- script: |
set -e
@@ -22,17 +22,11 @@ steps:
sudo apt-get upgrade -y
sudo apt-get install -y curl apt-transport-https ca-certificates
- # Yarn
- curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
- echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
- sudo apt-get update
- sudo apt-get install -y yarn
-
# Define variables
SNAP_ROOT="$(pwd)/.build/linux/snap/$(VSCODE_ARCH)"
# Install build dependencies
- (cd build && yarn)
+ (cd build && npm ci)
# Unpack snap tarball artifact, in order to preserve file perms
(cd .build/linux && tar -xzf snap-tarball/snap-$(VSCODE_ARCH).tar.gz)
diff --git a/build/azure-pipelines/linux/verify-glibc-requirements.sh b/build/azure-pipelines/linux/verify-glibc-requirements.sh
index f07c0ba71b0..c655ce74c7e 100755
--- a/build/azure-pipelines/linux/verify-glibc-requirements.sh
+++ b/build/azure-pipelines/linux/verify-glibc-requirements.sh
@@ -9,8 +9,8 @@ elif [ "$VSCODE_ARCH" == "armhf" ]; then
TRIPLE="arm-rpi-linux-gnueabihf"
fi
-# Get all files with .node extension from remote/node_modules folder
-files=$(find remote/node_modules -name "*.node" -not -path "*prebuilds*")
+# Get all files with .node extension from server folder
+files=$(find $SEARCH_PATH -name "*.node" -not -path "*prebuilds*" -not -path "*extensions/node_modules/@parcel/watcher*" -o -type f -executable -name "node")
echo "Verifying requirements for files: $files"
@@ -19,13 +19,13 @@ for file in $files; do
glibcxx_version="$EXPECTED_GLIBCXX_VERSION"
while IFS= read -r line; do
if [[ $line == *"GLIBC_"* ]]; then
- version=$(echo "$line" | awk '{print $5}' | tr -d '()')
+ version=$(echo "$line" | awk '{if ($5 ~ /^[0-9a-fA-F]+$/) print $6; else print $5}' | tr -d '()')
version=${version#*_}
if [[ $(printf "%s\n%s" "$version" "$glibc_version" | sort -V | tail -n1) == "$version" ]]; then
glibc_version=$version
fi
elif [[ $line == *"GLIBCXX_"* ]]; then
- version=$(echo "$line" | awk '{print $5}' | tr -d '()')
+ version=$(echo "$line" | awk '{if ($5 ~ /^[0-9a-fA-F]+$/) print $6; else print $5}' | tr -d '()')
version=${version#*_}
if [[ $(printf "%s\n%s" "$version" "$glibcxx_version" | sort -V | tail -n1) == "$version" ]]; then
glibcxx_version=$version
@@ -34,11 +34,11 @@ for file in $files; do
done < <("$PWD/.build/sysroots/$TRIPLE/$TRIPLE/bin/objdump" -T "$file")
if [[ "$glibc_version" != "$EXPECTED_GLIBC_VERSION" ]]; then
- echo "Error: File $file has dependency on GLIBC > $EXPECTED_GLIBC_VERSION"
+ echo "Error: File $file has dependency on GLIBC > $EXPECTED_GLIBC_VERSION, found $glibc_version"
exit 1
fi
if [[ "$glibcxx_version" != "$EXPECTED_GLIBCXX_VERSION" ]]; then
- echo "Error: File $file has dependency on GLIBCXX > $EXPECTED_GLIBCXX_VERSION"
+ echo "Error: File $file has dependency on GLIBCXX > $EXPECTED_GLIBCXX_VERSION, found $glibcxx_version"
exit 1
fi
done
diff --git a/build/azure-pipelines/oss/product-build-pr-cache-linux.yml b/build/azure-pipelines/oss/product-build-pr-cache-linux.yml
index 9f207f75220..3186c09b455 100644
--- a/build/azure-pipelines/oss/product-build-pr-cache-linux.yml
+++ b/build/azure-pipelines/oss/product-build-pr-cache-linux.yml
@@ -13,12 +13,12 @@ steps:
condition: and(succeeded(), ne(variables['NPM_REGISTRY'], 'none'))
displayName: Setup NPM Registry
- - script: mkdir -p .build && node build/azure-pipelines/common/computeNodeModulesCacheKey.js linux $VSCODE_ARCH > .build/yarnlockhash
+ - script: mkdir -p .build && node build/azure-pipelines/common/computeNodeModulesCacheKey.js linux $VSCODE_ARCH > .build/packagelockhash
displayName: Prepare node_modules cache key
- task: Cache@2
inputs:
- key: '"node_modules" | .build/yarnlockhash'
+ key: '"node_modules" | .build/packagelockhash'
path: .build/node_modules_cache
cacheHitVar: NODE_MODULES_RESTORED
displayName: Restore node_modules cache
@@ -29,34 +29,36 @@ steps:
- script: |
set -e
- npm config set registry "$NPM_REGISTRY" --location=project
- # npm >v7 deprecated the `always-auth` config option, refs npm/cli@72a7eeb
- # following is a workaround for yarn to send authorization header
- # for GET requests to the registry.
- echo "always-auth=true" >> .npmrc
- yarn config set registry "$NPM_REGISTRY"
+ # Set the private NPM registry to the global npmrc file
+ # so that authentication works for subfolders like build/, remote/, extensions/ etc
+ # which does not have their own .npmrc file
+ npm config set registry "$NPM_REGISTRY"
+ echo "##vso[task.setvariable variable=NPMRC_PATH]$(npm config get userconfig)"
condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none'))
- displayName: Setup NPM & Yarn
+ displayName: Setup NPM
- task: npmAuthenticate@0
inputs:
- workingFile: .npmrc
+ workingFile: $(NPMRC_PATH)
condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none'))
displayName: Setup NPM Authentication
- - script: sudo apt-get update && sudo apt-get install -y libkrb5-dev
- displayName: Install build dependencies
+ - script: |
+ set -e
+ ../linux/apt-retry.sh sudo apt-get update
+ ../linux/apt-retry.sh sudo apt-get install -y libkrb5-dev
+ displayName: Setup system services
condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'))
- script: |
set -e
for i in {1..5}; do # try 5 times
- yarn --frozen-lockfile --check-files && break
- if [ $i -eq 3 ]; then
- echo "Yarn failed too many times" >&2
+ npm ci && break
+ if [ $i -eq 5 ]; then
+ echo "Npm install failed too many times" >&2
exit 1
fi
- echo "Yarn failed $i, trying again..."
+ echo "Npm install failed $i, trying again..."
done
env:
ELECTRON_SKIP_BINARY_DOWNLOAD: 1
diff --git a/build/azure-pipelines/oss/product-build-pr-cache-win32.yml b/build/azure-pipelines/oss/product-build-pr-cache-win32.yml
index b084c5e97c5..e1c8305bbb2 100644
--- a/build/azure-pipelines/oss/product-build-pr-cache-win32.yml
+++ b/build/azure-pipelines/oss/product-build-pr-cache-win32.yml
@@ -15,12 +15,12 @@ steps:
- pwsh: |
mkdir .build -ea 0
- node build/azure-pipelines/common/computeNodeModulesCacheKey.js win32 $(VSCODE_ARCH) > .build/yarnlockhash
+ node build/azure-pipelines/common/computeNodeModulesCacheKey.js win32 $(VSCODE_ARCH) > .build/packagelockhash
displayName: Prepare node_modules cache key
- task: Cache@2
inputs:
- key: '"node_modules" | .build/yarnlockhash'
+ key: '"node_modules" | .build/packagelockhash'
path: .build/node_modules_cache
cacheHitVar: NODE_MODULES_RESTORED
displayName: Restore node_modules cache
@@ -32,18 +32,18 @@ steps:
- powershell: |
. build/azure-pipelines/win32/exec.ps1
$ErrorActionPreference = "Stop"
- exec { npm config set registry "$env:NPM_REGISTRY" --location=project }
- # npm >v7 deprecated the `always-auth` config option, refs npm/cli@72a7eeb
- # following is a workaround for yarn to send authorization header
- # for GET requests to the registry.
- exec { Add-Content -Path .npmrc -Value "always-auth=true" }
- exec { yarn config set registry "$env:NPM_REGISTRY" }
+ # Set the private NPM registry to the global npmrc file
+ # so that authentication works for subfolders like build/, remote/, extensions/ etc
+ # which does not have their own .npmrc file
+ exec { npm config set registry "$env:NPM_REGISTRY" }
+ $NpmrcPath = (npm config get userconfig)
+ echo "##vso[task.setvariable variable=NPMRC_PATH]$NpmrcPath"
condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none'))
- displayName: Setup NPM & Yarn
+ displayName: Setup NPM
- task: npmAuthenticate@0
inputs:
- workingFile: .npmrc
+ workingFile: $(NPMRC_PATH)
condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none'))
displayName: Setup NPM Authentication
@@ -53,7 +53,7 @@ steps:
$ErrorActionPreference = "Stop"
$env:npm_config_arch="$(VSCODE_ARCH)"
$env:CHILD_CONCURRENCY="1"
- retry { exec { yarn --frozen-lockfile --check-files } }
+ retry { exec { npm ci } }
env:
ELECTRON_SKIP_BINARY_DOWNLOAD: 1
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
diff --git a/build/azure-pipelines/product-build-pr.yml b/build/azure-pipelines/product-build-pr.yml
index 7dce4d20265..2d66ff3945d 100644
--- a/build/azure-pipelines/product-build-pr.yml
+++ b/build/azure-pipelines/product-build-pr.yml
@@ -26,7 +26,7 @@ jobs:
- ${{ if ne(variables['VSCODE_CIBUILD'], true) }}:
- job: Compile
displayName: Compile & Hygiene
- pool: 1es-oss-ubuntu-20.04-x64
+ pool: 1es-oss-ubuntu-22.04-x64
timeoutInMinutes: 30
variables:
VSCODE_ARCH: x64
@@ -37,7 +37,7 @@ jobs:
- job: Linuxx64UnitTest
displayName: Linux (Unit Tests)
- pool: 1es-oss-ubuntu-20.04-x64
+ pool: 1es-oss-ubuntu-22.04-x64
timeoutInMinutes: 30
variables:
VSCODE_ARCH: x64
@@ -55,7 +55,7 @@ jobs:
- job: Linuxx64IntegrationTest
displayName: Linux (Integration Tests)
- pool: 1es-oss-ubuntu-20.04-x64
+ pool: 1es-oss-ubuntu-22.04-x64
timeoutInMinutes: 30
variables:
VSCODE_ARCH: x64
@@ -73,7 +73,7 @@ jobs:
- job: Linuxx64SmokeTest
displayName: Linux (Smoke Tests)
- pool: 1es-oss-ubuntu-20.04-x64
+ pool: 1es-oss-ubuntu-22.04-x64
timeoutInMinutes: 30
variables:
VSCODE_ARCH: x64
@@ -91,14 +91,14 @@ jobs:
- job: LinuxCLI
displayName: Linux (CLI)
- pool: 1es-oss-ubuntu-20.04-x64
+ pool: 1es-oss-ubuntu-22.04-x64
timeoutInMinutes: 30
steps:
- template: cli/test.yml@self
- job: Windowsx64UnitTests
displayName: Windows (Unit Tests)
- pool: 1es-oss-windows-2019-x64
+ pool: 1es-oss-windows-2022-x64
timeoutInMinutes: 30
variables:
VSCODE_ARCH: x64
@@ -115,8 +115,8 @@ jobs:
- job: Windowsx64IntegrationTests
displayName: Windows (Integration Tests)
- pool: 1es-oss-windows-2019-x64
- timeoutInMinutes: 30
+ pool: 1es-oss-windows-2022-x64
+ timeoutInMinutes: 60
variables:
VSCODE_ARCH: x64
NPM_ARCH: x64
@@ -132,7 +132,7 @@ jobs:
# - job: Windowsx64SmokeTests
# displayName: Windows (Smoke Tests)
- # pool: 1es-oss-windows-2019-x64
+ # pool: 1es-oss-windows-2022-x64
# timeoutInMinutes: 30
# variables:
# VSCODE_ARCH: x64
@@ -149,7 +149,7 @@ jobs:
- ${{ if eq(variables['VSCODE_CIBUILD'], true) }}:
- job: Linuxx64MaintainNodeModulesCache
displayName: Linux (Maintain node_modules cache)
- pool: 1es-oss-ubuntu-20.04-x64
+ pool: 1es-oss-ubuntu-22.04-x64
timeoutInMinutes: 30
variables:
VSCODE_ARCH: x64
@@ -158,7 +158,7 @@ jobs:
- job: Windowsx64MaintainNodeModulesCache
displayName: Windows (Maintain node_modules cache)
- pool: 1es-oss-windows-2019-x64
+ pool: 1es-oss-windows-2022-x64
timeoutInMinutes: 30
variables:
VSCODE_ARCH: x64
diff --git a/build/azure-pipelines/product-build.yml b/build/azure-pipelines/product-build.yml
index 0508059fcd7..a061c23e8dc 100644
--- a/build/azure-pipelines/product-build.yml
+++ b/build/azure-pipelines/product-build.yml
@@ -148,6 +148,8 @@ variables:
value: microsoft/vscode-distro
- name: skipComponentGovernanceDetection
value: true
+ - name: ComponentDetection.Timeout
+ value: 600
- name: Codeql.SkipTaskAutoInjection
value: true
- name: ARTIFACT_PREFIX
@@ -182,9 +184,10 @@ extends:
validateToolOutput: None
allTools: true
codeql:
- compiled:
- enabled: true
runSourceLanguagesInSourceAnalysis: true
+ compiled:
+ enabled: false
+ justificationForDisabling: "CodeQL breaks ESRP CodeSign on macOS (ICM #520035761, githubcustomers/microsoft-codeql-support#198)"
credscan:
suppressionsFile: $(Build.SourcesDirectory)/build/azure-pipelines/config/CredScanSuppressions.json
eslint:
@@ -192,6 +195,7 @@ extends:
enableExclusions: true
exclusionsFilePath: $(Build.SourcesDirectory)/.eslintignore
sourceAnalysisPool: 1es-windows-2022-x64
+ createAdoIssuesForJustificationsForDisablement: false
containers:
snapcraft:
image: vscodehub.azurecr.io/vscode-linux-build-agent:snapcraft-x64
@@ -207,7 +211,7 @@ extends:
- job: Compile
timeoutInMinutes: 90
pool:
- name: 1es-ubuntu-20.04-x64
+ name: 1es-ubuntu-22.04-x64
os: linux
variables:
VSCODE_ARCH: x64
@@ -216,110 +220,128 @@ extends:
parameters:
VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }}
- - stage: CompileCLI
- dependsOn: []
- jobs:
- - ${{ if eq(parameters.VSCODE_BUILD_LINUX, true) }}:
- - job: CLILinuxX64
- pool:
- name: 1es-ubuntu-20.04-x64
- os: linux
- steps:
- - template: build/azure-pipelines/linux/cli-build-linux.yml@self
- parameters:
- VSCODE_CHECK_ONLY: ${{ variables.VSCODE_CIBUILD }}
- VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }}
- VSCODE_BUILD_LINUX: ${{ parameters.VSCODE_BUILD_LINUX }}
+ - ${{ if or(eq(parameters.VSCODE_BUILD_LINUX, true),eq(parameters.VSCODE_BUILD_LINUX_ARMHF, true),eq(parameters.VSCODE_BUILD_LINUX_ARM64, true),eq(parameters.VSCODE_BUILD_ALPINE, true),eq(parameters.VSCODE_BUILD_ALPINE_ARM64, true),eq(parameters.VSCODE_BUILD_MACOS, true),eq(parameters.VSCODE_BUILD_MACOS_ARM64, true),eq(parameters.VSCODE_BUILD_WIN32, true),eq(parameters.VSCODE_BUILD_WIN32_ARM64, true)) }}:
+ - stage: CompileCLI
+ dependsOn: []
+ jobs:
+ - ${{ if eq(parameters.VSCODE_BUILD_LINUX, true) }}:
+ - job: CLILinuxX64
+ pool:
+ name: 1es-ubuntu-22.04-x64
+ os: linux
+ steps:
+ - template: build/azure-pipelines/linux/cli-build-linux.yml@self
+ parameters:
+ VSCODE_CHECK_ONLY: ${{ variables.VSCODE_CIBUILD }}
+ VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }}
+ VSCODE_BUILD_LINUX: ${{ parameters.VSCODE_BUILD_LINUX }}
- - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), or(eq(parameters.VSCODE_BUILD_LINUX_ARMHF, true), eq(parameters.VSCODE_BUILD_LINUX_ARM64, true))) }}:
- - job: CLILinuxGnuARM
- pool:
- name: 1es-ubuntu-20.04-x64
- os: linux
- steps:
- - template: build/azure-pipelines/linux/cli-build-linux.yml@self
- parameters:
- VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }}
- VSCODE_BUILD_LINUX_ARMHF: ${{ parameters.VSCODE_BUILD_LINUX_ARMHF }}
- VSCODE_BUILD_LINUX_ARM64: ${{ parameters.VSCODE_BUILD_LINUX_ARM64 }}
+ - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), or(eq(parameters.VSCODE_BUILD_LINUX_ARMHF, true), eq(parameters.VSCODE_BUILD_LINUX_ARM64, true))) }}:
+ - job: CLILinuxGnuARM
+ pool:
+ name: 1es-ubuntu-22.04-x64
+ os: linux
+ steps:
+ - template: build/azure-pipelines/linux/cli-build-linux.yml@self
+ parameters:
+ VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }}
+ VSCODE_BUILD_LINUX_ARMHF: ${{ parameters.VSCODE_BUILD_LINUX_ARMHF }}
+ VSCODE_BUILD_LINUX_ARM64: ${{ parameters.VSCODE_BUILD_LINUX_ARM64 }}
- - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_ALPINE, true)) }}:
- - job: CLIAlpineX64
- pool:
- name: 1es-ubuntu-20.04-x64
- os: linux
- steps:
- - template: build/azure-pipelines/alpine/cli-build-alpine.yml@self
- parameters:
- VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }}
- VSCODE_BUILD_ALPINE: ${{ parameters.VSCODE_BUILD_ALPINE }}
+ - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_ALPINE, true)) }}:
+ - job: CLIAlpineX64
+ pool:
+ name: 1es-ubuntu-22.04-x64
+ os: linux
+ steps:
+ - template: build/azure-pipelines/alpine/cli-build-alpine.yml@self
+ parameters:
+ VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }}
+ VSCODE_BUILD_ALPINE: ${{ parameters.VSCODE_BUILD_ALPINE }}
- - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_ALPINE_ARM64, true)) }}:
- - job: CLIAlpineARM64
- pool:
- name: 1es-mariner-2.0-arm64
- os: linux
- hostArchitecture: arm64
- container: ubuntu-2004-arm64
- steps:
- - template: build/azure-pipelines/alpine/cli-build-alpine.yml@self
- parameters:
- VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }}
- VSCODE_BUILD_ALPINE_ARM64: ${{ parameters.VSCODE_BUILD_ALPINE_ARM64 }}
+ - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_ALPINE_ARM64, true)) }}:
+ - job: CLIAlpineARM64
+ pool:
+ name: 1es-mariner-2.0-arm64
+ os: linux
+ hostArchitecture: arm64
+ container: ubuntu-2004-arm64
+ steps:
+ - template: build/azure-pipelines/alpine/cli-build-alpine.yml@self
+ parameters:
+ VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }}
+ VSCODE_BUILD_ALPINE_ARM64: ${{ parameters.VSCODE_BUILD_ALPINE_ARM64 }}
- - ${{ if eq(parameters.VSCODE_BUILD_MACOS, true) }}:
- - job: CLIMacOSX64
- pool:
- name: Azure Pipelines
- image: macOS-11
- os: macOS
- steps:
- - template: build/azure-pipelines/darwin/cli-build-darwin.yml@self
- parameters:
- VSCODE_CHECK_ONLY: ${{ variables.VSCODE_CIBUILD }}
- VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }}
- VSCODE_BUILD_MACOS: ${{ parameters.VSCODE_BUILD_MACOS }}
+ - ${{ if eq(parameters.VSCODE_BUILD_MACOS, true) }}:
+ - job: CLIMacOSX64
+ pool:
+ name: Azure Pipelines
+ image: macOS-13
+ os: macOS
+ steps:
+ - template: build/azure-pipelines/darwin/cli-build-darwin.yml@self
+ parameters:
+ VSCODE_CHECK_ONLY: ${{ variables.VSCODE_CIBUILD }}
+ VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }}
+ VSCODE_BUILD_MACOS: ${{ parameters.VSCODE_BUILD_MACOS }}
- - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_MACOS_ARM64, true)) }}:
- - job: CLIMacOSARM64
- pool:
- name: Azure Pipelines
- image: macOS-11
- os: macOS
- steps:
- - template: build/azure-pipelines/darwin/cli-build-darwin.yml@self
- parameters:
- VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }}
- VSCODE_BUILD_MACOS_ARM64: ${{ parameters.VSCODE_BUILD_MACOS_ARM64 }}
+ - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_MACOS_ARM64, true)) }}:
+ - job: CLIMacOSARM64
+ pool:
+ name: Azure Pipelines
+ image: macOS-13
+ os: macOS
+ steps:
+ - template: build/azure-pipelines/darwin/cli-build-darwin.yml@self
+ parameters:
+ VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }}
+ VSCODE_BUILD_MACOS_ARM64: ${{ parameters.VSCODE_BUILD_MACOS_ARM64 }}
- - ${{ if eq(parameters.VSCODE_BUILD_WIN32, true) }}:
- - job: CLIWindowsX64
- pool:
- name: 1es-windows-2019-x64
- os: windows
- steps:
- - template: build/azure-pipelines/win32/cli-build-win32.yml@self
- parameters:
- VSCODE_CHECK_ONLY: ${{ variables.VSCODE_CIBUILD }}
- VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }}
- VSCODE_BUILD_WIN32: ${{ parameters.VSCODE_BUILD_WIN32 }}
+ - ${{ if eq(parameters.VSCODE_BUILD_WIN32, true) }}:
+ - job: CLIWindowsX64
+ pool:
+ name: 1es-windows-2019-x64
+ os: windows
+ steps:
+ - template: build/azure-pipelines/win32/cli-build-win32.yml@self
+ parameters:
+ VSCODE_CHECK_ONLY: ${{ variables.VSCODE_CIBUILD }}
+ VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }}
+ VSCODE_BUILD_WIN32: ${{ parameters.VSCODE_BUILD_WIN32 }}
- - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_WIN32_ARM64, true)) }}:
- - job: CLIWindowsARM64
- pool:
- name: 1es-windows-2019-x64
- os: windows
+ - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_WIN32_ARM64, true)) }}:
+ - job: CLIWindowsARM64
+ pool:
+ name: 1es-windows-2019-x64
+ os: windows
+ steps:
+ - template: build/azure-pipelines/win32/cli-build-win32.yml@self
+ parameters:
+ VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }}
+ VSCODE_BUILD_WIN32_ARM64: ${{ parameters.VSCODE_BUILD_WIN32_ARM64 }}
+
+ - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_COMPILE_ONLY, false)) }}:
+ - stage: CustomSDL
+ dependsOn: []
+ pool:
+ name: 1es-windows-2019-x64
+ os: windows
+ jobs:
+ - job: WindowsSDL
+ variables:
+ - group: 'API Scan'
steps:
- - template: build/azure-pipelines/win32/cli-build-win32.yml@self
+ - template: build/azure-pipelines/win32/sdl-scan-win32.yml@self
parameters:
+ VSCODE_ARCH: x64
VSCODE_QUALITY: ${{ variables.VSCODE_QUALITY }}
- VSCODE_BUILD_WIN32_ARM64: ${{ parameters.VSCODE_BUILD_WIN32_ARM64 }}
- ${{ if and(eq(parameters.VSCODE_COMPILE_ONLY, false), eq(variables['VSCODE_BUILD_STAGE_WINDOWS'], true)) }}:
- stage: Windows
dependsOn:
- Compile
- - CompileCLI
+ - ${{ if or(eq(parameters.VSCODE_BUILD_LINUX, true),eq(parameters.VSCODE_BUILD_LINUX_ARMHF, true),eq(parameters.VSCODE_BUILD_LINUX_ARM64, true),eq(parameters.VSCODE_BUILD_ALPINE, true),eq(parameters.VSCODE_BUILD_ALPINE_ARM64, true),eq(parameters.VSCODE_BUILD_MACOS, true),eq(parameters.VSCODE_BUILD_MACOS_ARM64, true),eq(parameters.VSCODE_BUILD_WIN32, true),eq(parameters.VSCODE_BUILD_WIN32_ARM64, true)) }}:
+ - CompileCLI
pool:
name: 1es-windows-2019-x64
os: windows
@@ -410,9 +432,10 @@ extends:
- stage: Linux
dependsOn:
- Compile
- - CompileCLI
+ - ${{ if or(eq(parameters.VSCODE_BUILD_LINUX, true),eq(parameters.VSCODE_BUILD_LINUX_ARMHF, true),eq(parameters.VSCODE_BUILD_LINUX_ARM64, true),eq(parameters.VSCODE_BUILD_ALPINE, true),eq(parameters.VSCODE_BUILD_ALPINE_ARM64, true),eq(parameters.VSCODE_BUILD_MACOS, true),eq(parameters.VSCODE_BUILD_MACOS_ARM64, true),eq(parameters.VSCODE_BUILD_WIN32, true),eq(parameters.VSCODE_BUILD_WIN32_ARM64, true)) }}:
+ - CompileCLI
pool:
- name: 1es-ubuntu-20.04-x64
+ name: 1es-ubuntu-22.04-x64
os: linux
jobs:
- ${{ if eq(variables['VSCODE_CIBUILD'], true) }}:
@@ -568,9 +591,10 @@ extends:
- stage: Alpine
dependsOn:
- Compile
- - CompileCLI
+ - ${{ if or(eq(parameters.VSCODE_BUILD_LINUX, true),eq(parameters.VSCODE_BUILD_LINUX_ARMHF, true),eq(parameters.VSCODE_BUILD_LINUX_ARM64, true),eq(parameters.VSCODE_BUILD_ALPINE, true),eq(parameters.VSCODE_BUILD_ALPINE_ARM64, true),eq(parameters.VSCODE_BUILD_MACOS, true),eq(parameters.VSCODE_BUILD_MACOS_ARM64, true),eq(parameters.VSCODE_BUILD_WIN32, true),eq(parameters.VSCODE_BUILD_WIN32_ARM64, true)) }}:
+ - CompileCLI
pool:
- name: 1es-ubuntu-20.04-x64
+ name: 1es-ubuntu-22.04-x64
os: linux
jobs:
- ${{ if eq(parameters.VSCODE_BUILD_ALPINE, true) }}:
@@ -594,10 +618,11 @@ extends:
- stage: macOS
dependsOn:
- Compile
- - CompileCLI
+ - ${{ if or(eq(parameters.VSCODE_BUILD_LINUX, true),eq(parameters.VSCODE_BUILD_LINUX_ARMHF, true),eq(parameters.VSCODE_BUILD_LINUX_ARM64, true),eq(parameters.VSCODE_BUILD_ALPINE, true),eq(parameters.VSCODE_BUILD_ALPINE_ARM64, true),eq(parameters.VSCODE_BUILD_MACOS, true),eq(parameters.VSCODE_BUILD_MACOS_ARM64, true),eq(parameters.VSCODE_BUILD_WIN32, true),eq(parameters.VSCODE_BUILD_WIN32_ARM64, true)) }}:
+ - CompileCLI
pool:
name: Azure Pipelines
- image: macOS-11
+ image: macOS-13
os: macOS
variables:
BUILDSECMON_OPT_IN: true
@@ -736,7 +761,7 @@ extends:
dependsOn:
- Compile
pool:
- name: 1es-ubuntu-20.04-x64
+ name: 1es-ubuntu-22.04-x64
os: linux
jobs:
- ${{ if eq(parameters.VSCODE_BUILD_WEB, true) }}:
@@ -766,7 +791,7 @@ extends:
- stage: ApproveRelease
dependsOn: [] # run in parallel to compile stage
pool:
- name: 1es-ubuntu-20.04-x64
+ name: 1es-ubuntu-22.04-x64
os: linux
jobs:
- deployment: ApproveRelease
@@ -787,7 +812,7 @@ extends:
- ${{ if and(parameters.VSCODE_RELEASE, eq(variables['VSCODE_PRIVATE_BUILD'], false)) }}:
- ApproveRelease
pool:
- name: 1es-ubuntu-20.04-x64
+ name: 1es-ubuntu-22.04-x64
os: linux
jobs:
- job: ReleaseBuild
diff --git a/build/azure-pipelines/product-compile.yml b/build/azure-pipelines/product-compile.yml
index 9a3748ed6fc..facc7af4bc2 100644
--- a/build/azure-pipelines/product-compile.yml
+++ b/build/azure-pipelines/product-compile.yml
@@ -12,7 +12,7 @@ steps:
- ${{ if ne(parameters.VSCODE_QUALITY, 'oss') }}:
- template: ./distro/download-distro.yml@self
- - task: AzureKeyVault@1
+ - task: AzureKeyVault@2
displayName: "Azure Key Vault: Get Secrets"
inputs:
azureSubscription: "vscode-builds-subscription"
@@ -23,12 +23,12 @@ steps:
condition: and(succeeded(), ne(variables['NPM_REGISTRY'], 'none'))
displayName: Setup NPM Registry
- - script: mkdir -p .build && node build/azure-pipelines/common/computeNodeModulesCacheKey.js compile > .build/yarnlockhash
+ - script: mkdir -p .build && node build/azure-pipelines/common/computeNodeModulesCacheKey.js compile > .build/packagelockhash
displayName: Prepare node_modules cache key
- task: Cache@2
inputs:
- key: '"node_modules" | .build/yarnlockhash'
+ key: '"node_modules" | .build/packagelockhash'
path: .build/node_modules_cache
cacheHitVar: NODE_MODULES_RESTORED
displayName: Restore node_modules cache
@@ -39,18 +39,17 @@ steps:
- script: |
set -e
- npm config set registry "$NPM_REGISTRY" --location=project
- # npm >v7 deprecated the `always-auth` config option, refs npm/cli@72a7eeb
- # following is a workaround for yarn to send authorization header
- # for GET requests to the registry.
- echo "always-auth=true" >> .npmrc
- yarn config set registry "$NPM_REGISTRY"
+ # Set the private NPM registry to the global npmrc file
+ # so that authentication works for subfolders like build/, remote/, extensions/ etc
+ # which does not have their own .npmrc file
+ npm config set registry "$NPM_REGISTRY"
+ echo "##vso[task.setvariable variable=NPMRC_PATH]$(npm config get userconfig)"
condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none'))
- displayName: Setup NPM & Yarn
+ displayName: Setup NPM
- task: npmAuthenticate@0
inputs:
- workingFile: .npmrc
+ workingFile: $(NPMRC_PATH)
condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none'))
displayName: Setup NPM Authentication
@@ -60,15 +59,14 @@ steps:
- script: |
set -e
- npm i -g node-gyp@9.4.0
for i in {1..5}; do # try 5 times
- yarn --frozen-lockfile --check-files && break
- if [ $i -eq 3 ]; then
- echo "Yarn failed too many times" >&2
+ npm ci && break
+ if [ $i -eq 5 ]; then
+ echo "Npm install failed too many times" >&2
exit 1
fi
- echo "Yarn failed $i, trying again..."
+ echo "Npm install failed $i, trying again..."
done
env:
ELECTRON_SKIP_BINARY_DOWNLOAD: 1
@@ -91,7 +89,11 @@ steps:
displayName: Create node_modules archive
- ${{ if eq(parameters.VSCODE_QUALITY, 'oss') }}:
- - script: yarn --cwd build compile && ./.github/workflows/check-clean-git-state.sh
+ - script: npm run compile
+ workingDirectory: build
+ displayName: Compile /build/ folder
+
+ - script: .github/workflows/check-clean-git-state.sh
displayName: Check /build/ folder
- ${{ if ne(parameters.VSCODE_QUALITY, 'oss') }}:
@@ -101,24 +103,29 @@ steps:
- template: common/install-builtin-extensions.yml@self
- ${{ if eq(parameters.VSCODE_QUALITY, 'oss') }}:
- - script: yarn npm-run-all -lp core-ci-pr extensions-ci-pr hygiene eslint valid-layers-check vscode-dts-compile-check tsec-compile-check
+ - script: npm exec -- npm-run-all -lp core-ci-pr extensions-ci-pr hygiene eslint valid-layers-check vscode-dts-compile-check tsec-compile-check
env:
GITHUB_TOKEN: "$(github-distro-mixin-password)"
- DISABLE_V8_COMPILE_CACHE: 1 # Disable v8 cache used by yarn v1.x, refs https://github.com/nodejs/node/issues/51555
displayName: Compile & Hygiene (OSS)
- ${{ else }}:
- - script: yarn npm-run-all -lp core-ci extensions-ci hygiene eslint valid-layers-check vscode-dts-compile-check tsec-compile-check
+ - script: npm exec -- npm-run-all -lp core-ci extensions-ci hygiene eslint valid-layers-check vscode-dts-compile-check tsec-compile-check
env:
GITHUB_TOKEN: "$(github-distro-mixin-password)"
- DISABLE_V8_COMPILE_CACHE: 1 # Disable v8 cache used by yarn v1.x, refs https://github.com/nodejs/node/issues/51555
displayName: Compile & Hygiene (non-OSS)
- ${{ if ne(parameters.VSCODE_QUALITY, 'oss') }}:
- script: |
set -e
- yarn --cwd test/smoke compile
- yarn --cwd test/integration/browser compile
- displayName: Compile test suites (non-OSS)
+ npm run compile
+ displayName: Compile smoke test suites (non-OSS)
+ workingDirectory: test/smoke
+ condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
+
+ - script: |
+ set -e
+ npm run compile
+ displayName: Compile integration test suites (non-OSS)
+ workingDirectory: test/integration/browser
condition: and(succeeded(), eq(variables['VSCODE_STEP_ON_IT'], 'false'))
- task: AzureCLI@2
@@ -164,7 +171,7 @@ steps:
sbomEnabled: false
displayName: Publish compilation artifact
- - script: yarn download-builtin-extensions-cg
+ - script: npm run download-builtin-extensions-cg
env:
GITHUB_TOKEN: "$(github-distro-mixin-password)"
displayName: Download component details of built-in extensions
diff --git a/build/azure-pipelines/product-publish.yml b/build/azure-pipelines/product-publish.yml
index 2c57e131c1a..59012a938ac 100644
--- a/build/azure-pipelines/product-publish.yml
+++ b/build/azure-pipelines/product-publish.yml
@@ -8,14 +8,14 @@ steps:
- task: SFP.build-tasks.esrpclient-tools-task.EsrpClientTool@2
displayName: "Use EsrpClient"
- - task: AzureKeyVault@1
+ - task: AzureKeyVault@2
displayName: "Azure Key Vault: Get Secrets"
inputs:
azureSubscription: "vscode-builds-subscription"
KeyVaultName: vscode-build-secrets
SecretsFilter: "github-distro-mixin-password,esrp-aad-username,esrp-aad-password"
- - task: AzureKeyVault@1
+ - task: AzureKeyVault@2
displayName: "Azure Key Vault: Get Secrets"
inputs:
azureSubscription: "vscode-builds-subscription"
@@ -26,10 +26,8 @@ steps:
- pwsh: Write-Host "##vso[build.addbuildtag]🚀"
displayName: Add build tag
- - pwsh: node build/npm/setupBuildYarnrc
- displayName: Prepare build dependencies
-
- - pwsh: yarn
+ - pwsh: |
+ npm ci
workingDirectory: build
displayName: Install build dependencies
diff --git a/build/azure-pipelines/product-release.yml b/build/azure-pipelines/product-release.yml
index dc084f5a04c..8afdcf10053 100644
--- a/build/azure-pipelines/product-release.yml
+++ b/build/azure-pipelines/product-release.yml
@@ -23,7 +23,12 @@ steps:
- script: |
set -e
- (cd build ; yarn)
+ npm ci
+ workingDirectory: build
+ displayName: Install /build dependencies
+
+ - script: |
+ set -e
AZURE_TENANT_ID="$(AZURE_TENANT_ID)" \
AZURE_CLIENT_ID="$(AZURE_CLIENT_ID)" \
AZURE_CLIENT_SECRET="$(AZURE_CLIENT_SECRET)" \
diff --git a/build/azure-pipelines/publish-types/publish-types.yml b/build/azure-pipelines/publish-types/publish-types.yml
index 4fc31fb6b37..5f60ae5a262 100644
--- a/build/azure-pipelines/publish-types/publish-types.yml
+++ b/build/azure-pipelines/publish-types/publish-types.yml
@@ -34,7 +34,7 @@ steps:
- bash: |
# Install build dependencies
- (cd build && yarn)
+ (cd build && npm ci)
node build/azure-pipelines/publish-types/check-version.js
displayName: Check version
diff --git a/build/azure-pipelines/sdl-scan.yml b/build/azure-pipelines/sdl-scan.yml
deleted file mode 100644
index 927cd5e04ae..00000000000
--- a/build/azure-pipelines/sdl-scan.yml
+++ /dev/null
@@ -1,296 +0,0 @@
-trigger: none
-pr: none
-
-parameters:
- - name: NPM_REGISTRY
- displayName: "Custom NPM Registry"
- type: string
- default: "https://pkgs.dev.azure.com/monacotools/Monaco/_packaging/vscode/npm/registry/"
- - name: SCAN_WINDOWS
- displayName: "Scan Windows"
- type: boolean
- default: true
- - name: SCAN_LINUX
- displayName: "Scan Linux"
- type: boolean
- default: false
-
-variables:
- - name: NPM_REGISTRY
- value: ${{ parameters.NPM_REGISTRY }}
- - name: SCAN_WINDOWS
- value: ${{ eq(parameters.SCAN_WINDOWS, true) }}
- - name: SCAN_LINUX
- value: ${{ eq(parameters.SCAN_LINUX, true) }}
- - name: VSCODE_MIXIN_REPO
- value: microsoft/vscode-distro
- - name: skipComponentGovernanceDetection
- value: true
- - name: NPM_ARCH
- value: x64
- - name: VSCODE_ARCH
- value: x64
- - name: Codeql.enabled
- value: true
- - name: Codeql.TSAEnabled
- value: true
- - name: Codeql.TSAOptionsPath
- value: '$(Build.SourcesDirectory)\build\azure-pipelines\config\tsaoptions.json'
-
-stages:
- - stage: Windows
- condition: eq(variables.SCAN_WINDOWS, 'true')
- pool: 1es-windows-2019-x64
- jobs:
- - job: WindowsJob
- timeoutInMinutes: 0
- steps:
- - task: CredScan@3
- continueOnError: true
- inputs:
- scanFolder: "$(Build.SourcesDirectory)"
- outputFormat: "pre"
-
- - task: NodeTool@0
- inputs:
- versionSource: fromFile
- versionFilePath: .nvmrc
- nodejsMirror: https://github.com/joaomoreno/node-mirror/releases/download
-
- - template: ./distro/download-distro.yml
-
- - task: AzureKeyVault@1
- displayName: "Azure Key Vault: Get Secrets"
- inputs:
- azureSubscription: "vscode-builds-subscription"
- KeyVaultName: vscode-build-secrets
- SecretsFilter: "github-distro-mixin-password"
-
- - powershell: |
- . build/azure-pipelines/win32/exec.ps1
- $ErrorActionPreference = "Stop"
- exec { npm config set registry "$env:NPM_REGISTRY" --location=project }
- # npm >v7 deprecated the `always-auth` config option, refs npm/cli@72a7eeb
- # following is a workaround for yarn to send authorization header
- # for GET requests to the registry.
- exec { Add-Content -Path .npmrc -Value "always-auth=true" }
- exec { yarn config set registry "$env:NPM_REGISTRY" }
- condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none'))
- displayName: Setup NPM & Yarn
-
- - task: npmAuthenticate@0
- inputs:
- workingFile: .npmrc
- condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none'))
- displayName: Setup NPM Authentication
-
- - powershell: |
- . build/azure-pipelines/win32/exec.ps1
- $ErrorActionPreference = "Stop"
- exec { node build/setup-npm-registry.js $env:NPM_REGISTRY }
- condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none'))
- displayName: Setup NPM Registry
-
- - task: CodeQL3000Init@0
- displayName: CodeQL Initialize
- condition: eq(variables['Codeql.enabled'], 'True')
-
- - powershell: |
- . build/azure-pipelines/win32/exec.ps1
- . build/azure-pipelines/win32/retry.ps1
- $ErrorActionPreference = "Stop"
- # TODO: remove custom node-gyp when updating to Node v20,
- # refs https://github.com/npm/cli/releases/tag/v10.2.3 which is available with Node >= 20.10.0
- $nodeGypDir = "$(Agent.TempDirectory)/custom-packages"
- mkdir "$nodeGypDir"
- npm install node-gyp@10.0.1 -g --prefix "$nodeGypDir"
- $env:npm_config_node_gyp = "${nodeGypDir}/node_modules/node-gyp/bin/node-gyp.js"
- $env:npm_config_arch = "$(NPM_ARCH)"
- retry { exec { yarn --frozen-lockfile --check-files } }
- env:
- PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
- GITHUB_TOKEN: "$(github-distro-mixin-password)"
- CHILD_CONCURRENCY: 1
- displayName: Install dependencies
-
- - script: node build/azure-pipelines/distro/mixin-npm
- displayName: Mixin distro node modules
-
- - script: node build/azure-pipelines/distro/mixin-quality
- displayName: Mixin distro quality
- env:
- VSCODE_QUALITY: stable
-
- - powershell: yarn compile
- displayName: Compile
-
- - task: CodeQL3000Finalize@0
- displayName: CodeQL Finalize
- condition: eq(variables['Codeql.enabled'], 'True')
-
- - powershell: yarn gulp "vscode-symbols-win32-$(VSCODE_ARCH)"
- env:
- GITHUB_TOKEN: "$(github-distro-mixin-password)"
- displayName: Download Symbols
-
- - task: PSScriptAnalyzer@1
- inputs:
- Path: '$(Build.SourcesDirectory)'
- Settings: required
- Recurse: true
-
- - task: BinSkim@4
- inputs:
- InputType: "Basic"
- Function: "analyze"
- TargetPattern: "guardianGlob"
- AnalyzeIgnorePdbLoadError: true
- AnalyzeTargetGlob: '$(agent.builddirectory)\scanbin\**.dll;$(agent.builddirectory)\scanbin\**.exe;$(agent.builddirectory)\scanbin\**.node'
- AnalyzeLocalSymbolDirectories: '$(agent.builddirectory)\scanbin\VSCode-win32-$(VSCODE_ARCH)\pdb'
-
- - task: AntiMalware@4
- inputs:
- InputType: Basic
- ScanType: CustomScan
- FileDirPath: '$(Build.SourcesDirectory)'
- EnableServices: true
- SupportLogOnError: false
- TreatSignatureUpdateFailureAs: 'Warning'
- SignatureFreshness: 'OneDay'
- TreatStaleSignatureAs: 'Error'
-
- - task: PublishSecurityAnalysisLogs@3
- inputs:
- ArtifactName: CodeAnalysisLogs
- ArtifactType: Container
- PublishProcessedResults: false
- AllTools: true
-
- - task: TSAUpload@2
- inputs:
- GdnPublishTsaOnboard: true
- GdnPublishTsaConfigFile: '$(Build.SourcesDirectory)\build\azure-pipelines\config\tsaoptions.json'
-
- - stage: Linux
- dependsOn: []
- condition: eq(variables.SCAN_LINUX, 'true')
- pool:
- vmImage: "Ubuntu-18.04"
- jobs:
- - job: LinuxJob
- steps:
- - task: CredScan@2
- inputs:
- toolMajorVersion: "V2"
- - task: NodeTool@0
- inputs:
- versionSource: fromFile
- versionFilePath: .nvmrc
- nodejsMirror: https://github.com/joaomoreno/node-mirror/releases/download
-
- - template: ./distro/download-distro.yml
-
- - task: AzureKeyVault@1
- displayName: "Azure Key Vault: Get Secrets"
- inputs:
- azureSubscription: "vscode-builds-subscription"
- KeyVaultName: vscode-build-secrets
- SecretsFilter: "github-distro-mixin-password"
-
- - script: |
- set -e
- npm config set registry "$NPM_REGISTRY" --location=project
- # npm >v7 deprecated the `always-auth` config option, refs npm/cli@72a7eeb
- # following is a workaround for yarn to send authorization header
- # for GET requests to the registry.
- echo "always-auth=true" >> .npmrc
- yarn config set registry "$NPM_REGISTRY"
- condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none'))
- displayName: Setup NPM & Yarn
-
- - task: npmAuthenticate@0
- inputs:
- workingFile: .npmrc
- condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none'))
- displayName: Setup NPM Authentication
-
- - script: node build/setup-npm-registry.js $NPM_REGISTRY
- condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none'))
- displayName: Setup NPM Registry
-
- - script: |
- set -e
- for i in {1..5}; do # try 5 times
- yarn --cwd build --frozen-lockfile --check-files && break
- if [ $i -eq 3 ]; then
- echo "Yarn failed too many times" >&2
- exit 1
- fi
- echo "Yarn failed $i, trying again..."
- done
- displayName: Install build dependencies
-
- - script: |
- set -e
- export npm_config_arch=$(NPM_ARCH)
-
- if [ -z "$CC" ] || [ -z "$CXX" ]; then
- # Download clang based on chromium revision used by vscode
- curl -s https://raw.githubusercontent.com/chromium/chromium/96.0.4664.110/tools/clang/scripts/update.py | python - --output-dir=$PWD/.build/CR_Clang --host-os=linux
- # Download libcxx headers and objects from upstream electron releases
- DEBUG=libcxx-fetcher \
- VSCODE_LIBCXX_OBJECTS_DIR=$PWD/.build/libcxx-objects \
- VSCODE_LIBCXX_HEADERS_DIR=$PWD/.build/libcxx_headers \
- VSCODE_LIBCXXABI_HEADERS_DIR=$PWD/.build/libcxxabi_headers \
- VSCODE_ARCH="$(NPM_ARCH)" \
- node build/linux/libcxx-fetcher.js
- # Set compiler toolchain
- export CC=$PWD/.build/CR_Clang/bin/clang
- export CXX=$PWD/.build/CR_Clang/bin/clang++
- export CXXFLAGS="-std=c++17 -nostdinc++ -D__NO_INLINE__ -I$PWD/.build/libcxx_headers -isystem$PWD/.build/libcxx_headers/include -isystem$PWD/.build/libcxxabi_headers/include -fPIC -flto=thin -fsplit-lto-unit -D_LIBCPP_ABI_NAMESPACE=Cr"
- export LDFLAGS="-stdlib=libc++ -fuse-ld=lld -flto=thin -fsplit-lto-unit -L$PWD/.build/libcxx-objects -lc++abi"
- export VSCODE_REMOTE_CC=$(which gcc)
- export VSCODE_REMOTE_CXX=$(which g++)
- fi
-
- for i in {1..5}; do # try 5 times
- yarn --frozen-lockfile --check-files && break
- if [ $i -eq 3 ]; then
- echo "Yarn failed too many times" >&2
- exit 1
- fi
- echo "Yarn failed $i, trying again..."
- done
- env:
- PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
- GITHUB_TOKEN: "$(github-distro-mixin-password)"
- displayName: Install dependencies
-
- - script: yarn --frozen-lockfile --check-files
- workingDirectory: .build/distro/npm
- env:
- npm_config_arch: $(NPM_ARCH)
- displayName: Install distro node modules
-
- - script: node build/azure-pipelines/distro/mixin-npm
- displayName: Mixin distro node modules
-
- - script: node build/azure-pipelines/distro/mixin-quality
- displayName: Mixin distro quality
- env:
- VSCODE_QUALITY: stable
-
- - script: yarn gulp vscode-symbols-linux-$(VSCODE_ARCH)
- env:
- GITHUB_TOKEN: "$(github-distro-mixin-password)"
- displayName: Build
-
- - task: BinSkim@3
- inputs:
- toolVersion: Latest
- InputType: CommandLine
- arguments: analyze $(agent.builddirectory)\scanbin\exe\*.* --recurse --local-symbol-directories $(agent.builddirectory)\scanbin\VSCode-linux-$(VSCODE_ARCH)\pdb
-
- - task: TSAUpload@2
- inputs:
- GdnPublishTsaConfigFile: '$(Build.SourceDirectory)\build\azure-pipelines\config\tsaoptions.json'
diff --git a/build/azure-pipelines/upload-configuration.js b/build/azure-pipelines/upload-configuration.js
deleted file mode 100644
index 39a44dc5c41..00000000000
--- a/build/azure-pipelines/upload-configuration.js
+++ /dev/null
@@ -1,112 +0,0 @@
-"use strict";
-/*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.getSettingsSearchBuildId = exports.shouldSetupSettingsSearch = void 0;
-const path = require("path");
-const os = require("os");
-const cp = require("child_process");
-const vfs = require("vinyl-fs");
-const util = require("../lib/util");
-const identity_1 = require("@azure/identity");
-const azure = require('gulp-azure-storage');
-const packageJson = require("../../package.json");
-const commit = process.env['BUILD_SOURCEVERSION'];
-function generateVSCodeConfigurationTask() {
- return new Promise((resolve, reject) => {
- const buildDir = process.env['AGENT_BUILDDIRECTORY'];
- if (!buildDir) {
- return reject(new Error('$AGENT_BUILDDIRECTORY not set'));
- }
- if (!shouldSetupSettingsSearch()) {
- console.log(`Only runs on main and release branches, not ${process.env.BUILD_SOURCEBRANCH}`);
- return resolve(undefined);
- }
- if (process.env.VSCODE_QUALITY !== 'insider' && process.env.VSCODE_QUALITY !== 'stable') {
- console.log(`Only runs on insider and stable qualities, not ${process.env.VSCODE_QUALITY}`);
- return resolve(undefined);
- }
- const result = path.join(os.tmpdir(), 'configuration.json');
- const userDataDir = path.join(os.tmpdir(), 'tmpuserdata');
- const extensionsDir = path.join(os.tmpdir(), 'tmpextdir');
- const arch = process.env['VSCODE_ARCH'];
- const appRoot = path.join(buildDir, `VSCode-darwin-${arch}`);
- const appName = process.env.VSCODE_QUALITY === 'insider' ? 'Visual\\ Studio\\ Code\\ -\\ Insiders.app' : 'Visual\\ Studio\\ Code.app';
- const appPath = path.join(appRoot, appName, 'Contents', 'Resources', 'app', 'bin', 'code');
- const codeProc = cp.exec(`${appPath} --export-default-configuration='${result}' --wait --user-data-dir='${userDataDir}' --extensions-dir='${extensionsDir}'`, (err, stdout, stderr) => {
- clearTimeout(timer);
- if (err) {
- console.log(`err: ${err} ${err.message} ${err.toString()}`);
- reject(err);
- }
- if (stdout) {
- console.log(`stdout: ${stdout}`);
- }
- if (stderr) {
- console.log(`stderr: ${stderr}`);
- }
- resolve(result);
- });
- const timer = setTimeout(() => {
- codeProc.kill();
- reject(new Error('export-default-configuration process timed out'));
- }, 60 * 1000);
- codeProc.on('error', err => {
- clearTimeout(timer);
- reject(err);
- });
- });
-}
-function shouldSetupSettingsSearch() {
- const branch = process.env.BUILD_SOURCEBRANCH;
- return !!(branch && (/\/main$/.test(branch) || branch.indexOf('/release/') >= 0));
-}
-exports.shouldSetupSettingsSearch = shouldSetupSettingsSearch;
-function getSettingsSearchBuildId(packageJson) {
- try {
- const branch = process.env.BUILD_SOURCEBRANCH;
- const branchId = branch.indexOf('/release/') >= 0 ? 0 :
- /\/main$/.test(branch) ? 1 :
- 2; // Some unexpected branch
- const out = cp.execSync(`git rev-list HEAD --count`);
- const count = parseInt(out.toString());
- //
- // 1.25.1, 1,234,567 commits, main = 1250112345671
- return util.versionStringToNumber(packageJson.version) * 1e8 + count * 10 + branchId;
- }
- catch (e) {
- throw new Error('Could not determine build number: ' + e.toString());
- }
-}
-exports.getSettingsSearchBuildId = getSettingsSearchBuildId;
-async function main() {
- const configPath = await generateVSCodeConfigurationTask();
- if (!configPath) {
- return;
- }
- const settingsSearchBuildId = getSettingsSearchBuildId(packageJson);
- if (!settingsSearchBuildId) {
- throw new Error('Failed to compute build number');
- }
- const credential = new identity_1.ClientSecretCredential(process.env['AZURE_TENANT_ID'], process.env['AZURE_CLIENT_ID'], process.env['AZURE_CLIENT_SECRET']);
- return new Promise((c, e) => {
- vfs.src(configPath)
- .pipe(azure.upload({
- account: process.env.AZURE_STORAGE_ACCOUNT,
- credential,
- container: 'configuration',
- prefix: `${settingsSearchBuildId}/${commit}/`
- }))
- .on('end', () => c())
- .on('error', (err) => e(err));
- });
-}
-if (require.main === module) {
- main().catch(err => {
- console.error(err);
- process.exit(1);
- });
-}
-//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWNvbmZpZ3VyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1cGxvYWQtY29uZmlndXJhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztnR0FHZ0c7OztBQUVoRyw2QkFBNkI7QUFDN0IseUJBQXlCO0FBQ3pCLG9DQUFvQztBQUNwQyxnQ0FBZ0M7QUFDaEMsb0NBQW9DO0FBQ3BDLDhDQUF5RDtBQUN6RCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUM1QyxrREFBa0Q7QUFFbEQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0FBRWxELFNBQVMsK0JBQStCO0lBQ3ZDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDdEMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZCxPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLENBQUM7U0FDMUQ7UUFFRCxJQUFJLENBQUMseUJBQXlCLEVBQUUsRUFBRTtZQUNqQyxPQUFPLENBQUMsR0FBRyxDQUFDLCtDQUErQyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztZQUM3RixPQUFPLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUMxQjtRQUVELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEtBQUssU0FBUyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxLQUFLLFFBQVEsRUFBRTtZQUN4RixPQUFPLENBQUMsR0FBRyxDQUFDLGtEQUFrRCxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7WUFDNUYsT0FBTyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDMUI7UUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQzVELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzFELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzFELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDeEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLElBQUksRUFBRSxDQUFDLENBQUM7UUFDN0QsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDLENBQUMsNEJBQTRCLENBQUM7UUFDdEksTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMzRixNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUN2QixHQUFHLE9BQU8sb0NBQW9DLE1BQU0sNkJBQTZCLFdBQVcsdUJBQXVCLGFBQWEsR0FBRyxFQUNuSSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDdkIsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BCLElBQUksR0FBRyxFQUFFO2dCQUNSLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUM1RCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDWjtZQUVELElBQUksTUFBTSxFQUFFO2dCQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2FBQ2pDO1lBRUQsSUFBSSxNQUFNLEVBQUU7Z0JBQ1gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLE1BQU0sRUFBRSxDQUFDLENBQUM7YUFDakM7WUFFRCxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUNELENBQUM7UUFDRixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQzdCLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNoQixNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQyxDQUFDO1FBQ3JFLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFFZCxRQUFRLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBRTtZQUMxQixZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFnQix5QkFBeUI7SUFDeEMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQztJQUM5QyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25GLENBQUM7QUFIRCw4REFHQztBQUVELFNBQWdCLHdCQUF3QixDQUFDLFdBQWdDO0lBQ3hFLElBQUk7UUFDSCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFtQixDQUFDO1FBQy9DLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0RCxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDM0IsQ0FBQyxDQUFDLENBQUMseUJBQXlCO1FBRTlCLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUNyRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFFdkMsc0VBQXNFO1FBQ3RFLGtEQUFrRDtRQUNsRCxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxFQUFFLEdBQUcsUUFBUSxDQUFDO0tBQ3JGO0lBQUMsT0FBTyxDQUFDLEVBQUU7UUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0tBQ3JFO0FBQ0YsQ0FBQztBQWhCRCw0REFnQkM7QUFFRCxLQUFLLFVBQVUsSUFBSTtJQUNsQixNQUFNLFVBQVUsR0FBRyxNQUFNLCtCQUErQixFQUFFLENBQUM7SUFFM0QsSUFBSSxDQUFDLFVBQVUsRUFBRTtRQUNoQixPQUFPO0tBQ1A7SUFFRCxNQUFNLHFCQUFxQixHQUFHLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRXBFLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtRQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7S0FDbEQ7SUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLGlDQUFzQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFFLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBRSxDQUFDLENBQUM7SUFFckosT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMzQixHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQzthQUNqQixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUNsQixPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUI7WUFDMUMsVUFBVTtZQUNWLFNBQVMsRUFBRSxlQUFlO1lBQzFCLE1BQU0sRUFBRSxHQUFHLHFCQUFxQixJQUFJLE1BQU0sR0FBRztTQUM3QyxDQUFDLENBQUM7YUFDRixFQUFFLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ3BCLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLENBQUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVELElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUU7SUFDNUIsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ2xCLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQixDQUFDLENBQUMsQ0FBQztDQUNIIn0=
\ No newline at end of file
diff --git a/build/azure-pipelines/upload-nlsmetadata.js b/build/azure-pipelines/upload-nlsmetadata.js
index 34c2005a30f..5b6cd3ed1fd 100644
--- a/build/azure-pipelines/upload-nlsmetadata.js
+++ b/build/azure-pipelines/upload-nlsmetadata.js
@@ -16,13 +16,33 @@ const commit = process.env['BUILD_SOURCEVERSION'];
const credential = new identity_1.ClientSecretCredential(process.env['AZURE_TENANT_ID'], process.env['AZURE_CLIENT_ID'], process.env['AZURE_CLIENT_SECRET']);
function main() {
return new Promise((c, e) => {
- es.merge(vfs.src('out-vscode-web-min/nls.metadata.json', { base: 'out-vscode-web-min' }), vfs.src('.build/extensions/**/nls.metadata.json', { base: '.build/extensions' }), vfs.src('.build/extensions/**/nls.metadata.header.json', { base: '.build/extensions' }), vfs.src('.build/extensions/**/package.nls.json', { base: '.build/extensions' }))
+ const combinedMetadataJson = es.merge(
+ // vscode: we are not using `out-build/nls.metadata.json` here because
+ // it includes metadata for translators for `keys`. but for our purpose
+ // we want only the `keys` and `messages` as `string`.
+ es.merge(vfs.src('out-build/nls.keys.json', { base: 'out-build' }), vfs.src('out-build/nls.messages.json', { base: 'out-build' }))
.pipe(merge({
+ fileName: 'vscode.json',
+ jsonSpace: '',
+ concatArrays: true,
+ edit: (parsedJson, file) => {
+ if (file.base === 'out-build') {
+ if (file.basename === 'nls.keys.json') {
+ return { keys: parsedJson };
+ }
+ else {
+ return { messages: parsedJson };
+ }
+ }
+ }
+ })),
+ // extensions
+ vfs.src('.build/extensions/**/nls.metadata.json', { base: '.build/extensions' }), vfs.src('.build/extensions/**/nls.metadata.header.json', { base: '.build/extensions' }), vfs.src('.build/extensions/**/package.nls.json', { base: '.build/extensions' })).pipe(merge({
fileName: 'combined.nls.metadata.json',
jsonSpace: '',
concatArrays: true,
edit: (parsedJson, file) => {
- if (file.base === 'out-vscode-web-min') {
+ if (file.basename === 'vscode.json') {
return { vscode: parsedJson };
}
// Handle extensions and follow the same structure as the Core nls file.
@@ -72,13 +92,15 @@ function main() {
const key = manifestJson.publisher + '.' + manifestJson.name;
return { [key]: parsedJson };
},
- }))
+ }));
+ const nlsMessagesJs = vfs.src('out-build/nls.messages.js', { base: 'out-build' });
+ es.merge(combinedMetadataJson, nlsMessagesJs)
.pipe(gzip({ append: false }))
.pipe(vfs.dest('./nlsMetadata'))
.pipe(es.through(function (data) {
console.log(`Uploading ${data.path}`);
// trigger artifact upload
- console.log(`##vso[artifact.upload containerfolder=nlsmetadata;artifactname=combined.nls.metadata.json]${data.path}`);
+ console.log(`##vso[artifact.upload containerfolder=nlsmetadata;artifactname=${data.basename}]${data.path}`);
this.emit('data', data);
}))
.pipe(azure.upload({
diff --git a/build/azure-pipelines/upload-nlsmetadata.ts b/build/azure-pipelines/upload-nlsmetadata.ts
index 416d0eec408..030cc8f0e5a 100644
--- a/build/azure-pipelines/upload-nlsmetadata.ts
+++ b/build/azure-pipelines/upload-nlsmetadata.ts
@@ -24,79 +24,103 @@ interface NlsMetadata {
function main(): Promise {
return new Promise((c, e) => {
-
- es.merge(
- vfs.src('out-vscode-web-min/nls.metadata.json', { base: 'out-vscode-web-min' }),
- vfs.src('.build/extensions/**/nls.metadata.json', { base: '.build/extensions' }),
- vfs.src('.build/extensions/**/nls.metadata.header.json', { base: '.build/extensions' }),
- vfs.src('.build/extensions/**/package.nls.json', { base: '.build/extensions' }))
- .pipe(merge({
- fileName: 'combined.nls.metadata.json',
- jsonSpace: '',
- concatArrays: true,
- edit: (parsedJson, file) => {
- if (file.base === 'out-vscode-web-min') {
- return { vscode: parsedJson };
- }
-
- // Handle extensions and follow the same structure as the Core nls file.
- switch (file.basename) {
- case 'package.nls.json':
- // put package.nls.json content in Core NlsMetadata format
- // language packs use the key "package" to specify that
- // translations are for the package.json file
- parsedJson = {
- messages: {
- package: Object.values(parsedJson)
- },
- keys: {
- package: Object.keys(parsedJson)
- },
- bundles: {
- main: ['package']
- }
- };
- break;
-
- case 'nls.metadata.header.json':
- parsedJson = { header: parsedJson };
- break;
-
- case 'nls.metadata.json': {
- // put nls.metadata.json content in Core NlsMetadata format
- const modules = Object.keys(parsedJson);
-
- const json: NlsMetadata = {
- keys: {},
- messages: {},
- bundles: {
- main: []
- }
- };
- for (const module of modules) {
- json.messages[module] = parsedJson[module].messages;
- json.keys[module] = parsedJson[module].keys;
- json.bundles.main.push(module);
+ const combinedMetadataJson = es.merge(
+ // vscode: we are not using `out-build/nls.metadata.json` here because
+ // it includes metadata for translators for `keys`. but for our purpose
+ // we want only the `keys` and `messages` as `string`.
+ es.merge(
+ vfs.src('out-build/nls.keys.json', { base: 'out-build' }),
+ vfs.src('out-build/nls.messages.json', { base: 'out-build' }))
+ .pipe(merge({
+ fileName: 'vscode.json',
+ jsonSpace: '',
+ concatArrays: true,
+ edit: (parsedJson, file) => {
+ if (file.base === 'out-build') {
+ if (file.basename === 'nls.keys.json') {
+ return { keys: parsedJson };
+ } else {
+ return { messages: parsedJson };
}
- parsedJson = json;
- break;
}
}
+ })),
- // Get extension id and use that as the key
- const folderPath = path.join(file.base, file.relative.split('/')[0]);
- const manifest = readFileSync(path.join(folderPath, 'package.json'), 'utf-8');
- const manifestJson = JSON.parse(manifest);
- const key = manifestJson.publisher + '.' + manifestJson.name;
- return { [key]: parsedJson };
- },
- }))
+ // extensions
+ vfs.src('.build/extensions/**/nls.metadata.json', { base: '.build/extensions' }),
+ vfs.src('.build/extensions/**/nls.metadata.header.json', { base: '.build/extensions' }),
+ vfs.src('.build/extensions/**/package.nls.json', { base: '.build/extensions' })
+ ).pipe(merge({
+ fileName: 'combined.nls.metadata.json',
+ jsonSpace: '',
+ concatArrays: true,
+ edit: (parsedJson, file) => {
+ if (file.basename === 'vscode.json') {
+ return { vscode: parsedJson };
+ }
+
+ // Handle extensions and follow the same structure as the Core nls file.
+ switch (file.basename) {
+ case 'package.nls.json':
+ // put package.nls.json content in Core NlsMetadata format
+ // language packs use the key "package" to specify that
+ // translations are for the package.json file
+ parsedJson = {
+ messages: {
+ package: Object.values(parsedJson)
+ },
+ keys: {
+ package: Object.keys(parsedJson)
+ },
+ bundles: {
+ main: ['package']
+ }
+ };
+ break;
+
+ case 'nls.metadata.header.json':
+ parsedJson = { header: parsedJson };
+ break;
+
+ case 'nls.metadata.json': {
+ // put nls.metadata.json content in Core NlsMetadata format
+ const modules = Object.keys(parsedJson);
+
+ const json: NlsMetadata = {
+ keys: {},
+ messages: {},
+ bundles: {
+ main: []
+ }
+ };
+ for (const module of modules) {
+ json.messages[module] = parsedJson[module].messages;
+ json.keys[module] = parsedJson[module].keys;
+ json.bundles.main.push(module);
+ }
+ parsedJson = json;
+ break;
+ }
+ }
+
+ // Get extension id and use that as the key
+ const folderPath = path.join(file.base, file.relative.split('/')[0]);
+ const manifest = readFileSync(path.join(folderPath, 'package.json'), 'utf-8');
+ const manifestJson = JSON.parse(manifest);
+ const key = manifestJson.publisher + '.' + manifestJson.name;
+ return { [key]: parsedJson };
+ },
+ }));
+
+ const nlsMessagesJs = vfs.src('out-build/nls.messages.js', { base: 'out-build' });
+
+ es.merge(combinedMetadataJson, nlsMessagesJs)
.pipe(gzip({ append: false }))
.pipe(vfs.dest('./nlsMetadata'))
.pipe(es.through(function (data: Vinyl) {
console.log(`Uploading ${data.path}`);
// trigger artifact upload
- console.log(`##vso[artifact.upload containerfolder=nlsmetadata;artifactname=combined.nls.metadata.json]${data.path}`);
+ console.log(`##vso[artifact.upload containerfolder=nlsmetadata;artifactname=${data.basename}]${data.path}`);
this.emit('data', data);
}))
.pipe(azure.upload({
diff --git a/build/azure-pipelines/upload-sourcemaps.js b/build/azure-pipelines/upload-sourcemaps.js
index 7cd68398734..83c1cae596d 100644
--- a/build/azure-pipelines/upload-sourcemaps.js
+++ b/build/azure-pipelines/upload-sourcemaps.js
@@ -31,7 +31,7 @@ function main() {
const vs = src('out-vscode-min'); // client source-maps only
sources.push(vs);
const productionDependencies = deps.getProductionDependencies(root);
- const productionDependenciesSrc = productionDependencies.map(d => path.relative(root, d.path)).map(d => `./${d}/**/*.map`);
+ const productionDependenciesSrc = productionDependencies.map(d => path.relative(root, d)).map(d => `./${d}/**/*.map`);
const nodeModules = vfs.src(productionDependenciesSrc, { base: '.' })
.pipe(util.cleanNodeModules(path.join(root, 'build', '.moduleignore')))
.pipe(util.cleanNodeModules(path.join(root, 'build', `.moduleignore.${process.platform}`)));
diff --git a/build/azure-pipelines/upload-sourcemaps.ts b/build/azure-pipelines/upload-sourcemaps.ts
index 366ad945499..8e148c6095f 100644
--- a/build/azure-pipelines/upload-sourcemaps.ts
+++ b/build/azure-pipelines/upload-sourcemaps.ts
@@ -36,8 +36,8 @@ function main(): Promise {
const vs = src('out-vscode-min'); // client source-maps only
sources.push(vs);
- const productionDependencies: { name: string; path: string; version: string }[] = deps.getProductionDependencies(root);
- const productionDependenciesSrc = productionDependencies.map(d => path.relative(root, d.path)).map(d => `./${d}/**/*.map`);
+ const productionDependencies = deps.getProductionDependencies(root);
+ const productionDependenciesSrc = productionDependencies.map(d => path.relative(root, d)).map(d => `./${d}/**/*.map`);
const nodeModules = vfs.src(productionDependenciesSrc, { base: '.' })
.pipe(util.cleanNodeModules(path.join(root, 'build', '.moduleignore')))
.pipe(util.cleanNodeModules(path.join(root, 'build', `.moduleignore.${process.platform}`)));
diff --git a/build/azure-pipelines/web/product-build-web.yml b/build/azure-pipelines/web/product-build-web.yml
index 5e423d077c7..2c5753ec89c 100644
--- a/build/azure-pipelines/web/product-build-web.yml
+++ b/build/azure-pipelines/web/product-build-web.yml
@@ -7,7 +7,7 @@ steps:
- template: ../distro/download-distro.yml@self
- - task: AzureKeyVault@1
+ - task: AzureKeyVault@2
displayName: "Azure Key Vault: Get Secrets"
inputs:
azureSubscription: "vscode-builds-subscription"
@@ -27,12 +27,12 @@ steps:
condition: and(succeeded(), ne(variables['NPM_REGISTRY'], 'none'))
displayName: Setup NPM Registry
- - script: mkdir -p .build && node build/azure-pipelines/common/computeNodeModulesCacheKey.js web > .build/yarnlockhash
+ - script: mkdir -p .build && node build/azure-pipelines/common/computeNodeModulesCacheKey.js web > .build/packagelockhash
displayName: Prepare node_modules cache key
- task: Cache@2
inputs:
- key: '"node_modules" | .build/yarnlockhash'
+ key: '"node_modules" | .build/packagelockhash'
path: .build/node_modules_cache
cacheHitVar: NODE_MODULES_RESTORED
displayName: Restore node_modules cache
@@ -43,34 +43,36 @@ steps:
- script: |
set -e
- npm config set registry "$NPM_REGISTRY" --location=project
- # npm >v7 deprecated the `always-auth` config option, refs npm/cli@72a7eeb
- # following is a workaround for yarn to send authorization header
- # for GET requests to the registry.
- echo "always-auth=true" >> .npmrc
- yarn config set registry "$NPM_REGISTRY"
+ # Set the private NPM registry to the global npmrc file
+ # so that authentication works for subfolders like build/, remote/, extensions/ etc
+ # which does not have their own .npmrc file
+ npm config set registry "$NPM_REGISTRY"
+ echo "##vso[task.setvariable variable=NPMRC_PATH]$(npm config get userconfig)"
condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none'))
- displayName: Setup NPM & Yarn
+ displayName: Setup NPM
- task: npmAuthenticate@0
inputs:
- workingFile: .npmrc
+ workingFile: $(NPMRC_PATH)
condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none'))
displayName: Setup NPM Authentication
- - script: sudo apt-get update && sudo apt-get install -y libkrb5-dev
- displayName: Install build dependencies
+ - script: |
+ set -e
+ ../linux/apt-retry.sh sudo apt-get update
+ ../linux/apt-retry.sh sudo apt-get install -y libkrb5-dev
+ displayName: Setup system services
condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'))
- script: |
set -e
for i in {1..5}; do # try 5 times
- yarn --frozen-lockfile --check-files && break
- if [ $i -eq 3 ]; then
- echo "Yarn failed too many times" >&2
+ npm ci && break
+ if [ $i -eq 5 ]; then
+ echo "Npm install failed too many times" >&2
exit 1
fi
- echo "Yarn failed $i, trying again..."
+ echo "Npm install failed $i, trying again..."
done
env:
ELECTRON_SKIP_BINARY_DOWNLOAD: 1
@@ -98,13 +100,12 @@ steps:
- script: |
set -e
- yarn gulp vscode-web-min-ci
+ npm run gulp vscode-web-min-ci
ARCHIVE_PATH=".build/web/vscode-web.tar.gz"
mkdir -p $(dirname $ARCHIVE_PATH)
tar --owner=0 --group=0 -czf $ARCHIVE_PATH -C .. vscode-web
echo "##vso[task.setvariable variable=WEB_PATH]$ARCHIVE_PATH"
env:
- DISABLE_V8_COMPILE_CACHE: 1 # Disable v8 cache used by yarn v1.x, refs https://github.com/nodejs/node/issues/51555
GITHUB_TOKEN: "$(github-distro-mixin-password)"
displayName: Build
@@ -152,7 +153,7 @@ steps:
- script: |
set -e
- AZURE_STORAGE_ACCOUNT="ticino" \
+ AZURE_STORAGE_ACCOUNT="vscodeweb" \
AZURE_TENANT_ID="$(AZURE_TENANT_ID)" \
AZURE_CLIENT_ID="$(AZURE_CLIENT_ID)" \
AZURE_CLIENT_SECRET="$(AZURE_CLIENT_SECRET)" \
diff --git a/build/azure-pipelines/win32/product-build-win32-cli-sign.yml b/build/azure-pipelines/win32/product-build-win32-cli-sign.yml
index 3b5668d0082..62b1b715af2 100644
--- a/build/azure-pipelines/win32/product-build-win32-cli-sign.yml
+++ b/build/azure-pipelines/win32/product-build-win32-cli-sign.yml
@@ -17,21 +17,20 @@ steps:
displayName: Setup NPM Registry
- powershell: |
- . azure-pipelines/win32/exec.ps1
+ . build/azure-pipelines/win32/exec.ps1
$ErrorActionPreference = "Stop"
- exec { npm config set registry "$env:NPM_REGISTRY" --location=project }
- # npm >v7 deprecated the `always-auth` config option, refs npm/cli@72a7eeb
- # following is a workaround for yarn to send authorization header
- # for GET requests to the registry.
- exec { Add-Content -Path .npmrc -Value "always-auth=true" }
- exec { yarn config set registry "$env:NPM_REGISTRY" }
- workingDirectory: build
+ # Set the private NPM registry to the global npmrc file
+ # so that authentication works for subfolders like build/, remote/, extensions/ etc
+ # which does not have their own .npmrc file
+ exec { npm config set registry "$env:NPM_REGISTRY" }
+ $NpmrcPath = (npm config get userconfig)
+ echo "##vso[task.setvariable variable=NPMRC_PATH]$NpmrcPath"
condition: and(succeeded(), ne(variables['NPM_REGISTRY'], 'none'))
- displayName: Setup NPM & Yarn
+ displayName: Setup NPM
- task: npmAuthenticate@0
inputs:
- workingFile: build/.npmrc
+ workingFile: $(NPMRC_PATH)
condition: and(succeeded(), ne(variables['NPM_REGISTRY'], 'none'))
displayName: Setup NPM Authentication
@@ -40,7 +39,7 @@ steps:
. azure-pipelines/win32/retry.ps1
$ErrorActionPreference = "Stop"
$env:CHILD_CONCURRENCY="1"
- retry { exec { yarn --frozen-lockfile --check-files } }
+ retry { exec { npm ci } }
workingDirectory: build
displayName: Install build dependencies
diff --git a/build/azure-pipelines/win32/product-build-win32-test.yml b/build/azure-pipelines/win32/product-build-win32-test.yml
index a3b251b71ac..cdcccd7684b 100644
--- a/build/azure-pipelines/win32/product-build-win32-test.yml
+++ b/build/azure-pipelines/win32/product-build-win32-test.yml
@@ -14,7 +14,7 @@ parameters:
default: PublishPipelineArtifact@0
steps:
- - powershell: yarn npm-run-all -lp "electron $(VSCODE_ARCH)" "playwright-install"
+ - powershell: npm exec -- npm-run-all -lp "electron $(VSCODE_ARCH)" "playwright-install"
env:
GITHUB_TOKEN: "$(github-distro-mixin-password)"
displayName: Download Electron and Playwright
@@ -25,11 +25,9 @@ steps:
- powershell: .\scripts\test.bat --tfs "Unit Tests"
displayName: Run unit tests (Electron)
timeoutInMinutes: 15
-
- - powershell: yarn test-node
+ - powershell: npm run test-node
displayName: Run unit tests (node.js)
timeoutInMinutes: 15
-
- powershell: node test/unit/browser/index.js --sequential --browser chromium --tfs "Browser Unit Tests"
displayName: Run unit tests (Browser, Chromium)
timeoutInMinutes: 20
@@ -38,12 +36,10 @@ steps:
- powershell: .\scripts\test.bat --build --tfs "Unit Tests"
displayName: Run unit tests (Electron)
timeoutInMinutes: 15
-
- - powershell: yarn test-node --build
+ - powershell: npm run test-node -- --build
displayName: Run unit tests (node.js)
timeoutInMinutes: 15
-
- - powershell: yarn test-browser-no-install --sequential --build --browser chromium --tfs "Browser Unit Tests"
+ - powershell: npm run test-browser-no-install -- --sequential --build --browser chromium --tfs "Browser Unit Tests"
displayName: Run unit tests (Browser, Chromium)
timeoutInMinutes: 20
@@ -51,7 +47,7 @@ steps:
- powershell: |
. build/azure-pipelines/win32/exec.ps1
$ErrorActionPreference = "Stop"
- exec { yarn gulp `
+ exec { npm run gulp `
compile-extension:configuration-editing `
compile-extension:css-language-features-server `
compile-extension:emmet `
@@ -61,7 +57,6 @@ steps:
compile-extension:ipynb `
compile-extension:notebook-renderers `
compile-extension:json-language-features-server `
- compile-extension:markdown-language-features-server `
compile-extension:markdown-language-features `
compile-extension-media `
compile-extension:microsoft-authentication `
@@ -72,13 +67,18 @@ steps:
}
displayName: Build integration tests
+ - powershell: .\build\azure-pipelines\win32\listprocesses.bat
+ displayName: Diagnostics before integration test runs
+ continueOnError: true
+ condition: succeededOrFailed()
+
- ${{ if eq(parameters.VSCODE_QUALITY, 'oss') }}:
- powershell: .\scripts\test-integration.bat --tfs "Integration Tests"
displayName: Run integration tests (Electron)
timeoutInMinutes: 20
- - powershell: .\scripts\test-web-integration.bat --browser firefox
- displayName: Run integration tests (Browser, Firefox)
+ - powershell: .\scripts\test-web-integration.bat --browser chromium
+ displayName: Run integration tests (Browser, Chromium)
timeoutInMinutes: 20
- powershell: .\scripts\test-remote-integration.bat
@@ -121,6 +121,11 @@ steps:
displayName: Run integration tests (Remote)
timeoutInMinutes: 20
+ - powershell: .\build\azure-pipelines\win32\listprocesses.bat
+ displayName: Diagnostics after integration test runs
+ continueOnError: true
+ condition: succeededOrFailed()
+
- ${{ if eq(parameters.VSCODE_RUN_SMOKE_TESTS, true) }}:
- powershell: .\build\azure-pipelines\win32\listprocesses.bat
displayName: Diagnostics before smoke test run
@@ -128,32 +133,33 @@ steps:
condition: succeededOrFailed()
- ${{ if eq(parameters.VSCODE_QUALITY, 'oss') }}:
- - powershell: yarn --cwd test/smoke compile
+ - powershell: npm run compile
+ workingDirectory: test/smoke
displayName: Compile smoke tests
- - powershell: yarn gulp compile-extension-media
+ - powershell: npm run gulp compile-extension-media
displayName: Build extensions for smoke tests
- - powershell: yarn smoketest-no-compile --tracing
+ - powershell: npm run smoketest-no-compile -- --tracing
displayName: Run smoke tests (Electron)
timeoutInMinutes: 20
- ${{ if ne(parameters.VSCODE_QUALITY, 'oss') }}:
- - powershell: yarn smoketest-no-compile --tracing --build "$(agent.builddirectory)\VSCode-win32-$(VSCODE_ARCH)"
+ - powershell: npm run smoketest-no-compile -- --tracing --build "$(agent.builddirectory)\VSCode-win32-$(VSCODE_ARCH)"
displayName: Run smoke tests (Electron)
timeoutInMinutes: 20
- - powershell: yarn smoketest-no-compile --web --tracing --headless
+ - powershell: npm run smoketest-no-compile -- --web --tracing --headless
env:
VSCODE_REMOTE_SERVER_PATH: $(agent.builddirectory)\vscode-server-win32-$(VSCODE_ARCH)-web
displayName: Run smoke tests (Browser, Chromium)
timeoutInMinutes: 20
- - powershell: yarn gulp compile-extension:vscode-test-resolver
+ - powershell: npm run gulp compile-extension:vscode-test-resolver
displayName: Compile test resolver extension
timeoutInMinutes: 20
- - powershell: yarn smoketest-no-compile --tracing --remote --build "$(agent.builddirectory)\VSCode-win32-$(VSCODE_ARCH)"
+ - powershell: npm run smoketest-no-compile -- --tracing --remote --build "$(agent.builddirectory)\VSCode-win32-$(VSCODE_ARCH)"
env:
VSCODE_REMOTE_SERVER_PATH: $(agent.builddirectory)\vscode-server-win32-$(VSCODE_ARCH)
displayName: Run smoke tests (Remote)
diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml
index d3827b930f8..a30d4ca8029 100644
--- a/build/azure-pipelines/win32/product-build-win32.yml
+++ b/build/azure-pipelines/win32/product-build-win32.yml
@@ -32,7 +32,7 @@ steps:
- ${{ if ne(parameters.VSCODE_QUALITY, 'oss') }}:
- template: ../distro/download-distro.yml@self
- - task: AzureKeyVault@1
+ - task: AzureKeyVault@2
displayName: "Azure Key Vault: Get Secrets"
inputs:
azureSubscription: "vscode-builds-subscription"
@@ -57,12 +57,12 @@ steps:
- pwsh: |
mkdir .build -ea 0
- node build/azure-pipelines/common/computeNodeModulesCacheKey.js win32 $(VSCODE_ARCH) > .build/yarnlockhash
+ node build/azure-pipelines/common/computeNodeModulesCacheKey.js win32 $(VSCODE_ARCH) > .build/packagelockhash
displayName: Prepare node_modules cache key
- task: Cache@2
inputs:
- key: '"node_modules" | .build/yarnlockhash'
+ key: '"node_modules" | .build/packagelockhash'
path: .build/node_modules_cache
cacheHitVar: NODE_MODULES_RESTORED
displayName: Restore node_modules cache
@@ -74,18 +74,18 @@ steps:
- powershell: |
. build/azure-pipelines/win32/exec.ps1
$ErrorActionPreference = "Stop"
- exec { npm config set registry "$env:NPM_REGISTRY" --location=project }
- # npm >v7 deprecated the `always-auth` config option, refs npm/cli@72a7eeb
- # following is a workaround for yarn to send authorization header
- # for GET requests to the registry.
- exec { Add-Content -Path .npmrc -Value "always-auth=true" }
- exec { yarn config set registry "$env:NPM_REGISTRY" }
+ # Set the private NPM registry to the global npmrc file
+ # so that authentication works for subfolders like build/, remote/, extensions/ etc
+ # which does not have their own .npmrc file
+ exec { npm config set registry "$env:NPM_REGISTRY" }
+ $NpmrcPath = (npm config get userconfig)
+ echo "##vso[task.setvariable variable=NPMRC_PATH]$NpmrcPath"
condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none'))
- displayName: Setup NPM & Yarn
+ displayName: Setup NPM
- task: npmAuthenticate@0
inputs:
- workingFile: .npmrc
+ workingFile: $(NPMRC_PATH)
condition: and(succeeded(), ne(variables.NODE_MODULES_RESTORED, 'true'), ne(variables['NPM_REGISTRY'], 'none'))
displayName: Setup NPM Authentication
@@ -93,7 +93,7 @@ steps:
. build/azure-pipelines/win32/exec.ps1
. build/azure-pipelines/win32/retry.ps1
$ErrorActionPreference = "Stop"
- retry { exec { yarn --frozen-lockfile --check-files } }
+ retry { exec { npm ci } }
env:
npm_config_arch: $(VSCODE_ARCH)
CHILD_CONCURRENCY: 1
@@ -129,7 +129,7 @@ steps:
retryCountOnTaskFailure: 3
- ${{ if eq(parameters.VSCODE_QUALITY, 'oss') }}:
- - powershell: yarn gulp "transpile-client-swc" "transpile-extensions"
+ - powershell: npm run gulp "transpile-client-swc" "transpile-extensions"
env:
GITHUB_TOKEN: "$(github-distro-mixin-password)"
displayName: Transpile client and extensions
@@ -142,8 +142,8 @@ steps:
- powershell: |
. build/azure-pipelines/win32/exec.ps1
$ErrorActionPreference = "Stop"
- exec { yarn gulp "vscode-win32-$(VSCODE_ARCH)-min-ci" }
- exec { yarn gulp "vscode-win32-$(VSCODE_ARCH)-inno-updater" }
+ exec { npm run gulp "vscode-win32-$(VSCODE_ARCH)-min-ci" }
+ exec { npm run gulp "vscode-win32-$(VSCODE_ARCH)-inno-updater" }
echo "##vso[task.setvariable variable=BUILT_CLIENT]true"
echo "##vso[task.setvariable variable=CodeSigningFolderPath]$(agent.builddirectory)/VSCode-win32-$(VSCODE_ARCH)"
env:
@@ -153,25 +153,23 @@ steps:
- powershell: |
. build/azure-pipelines/win32/exec.ps1
$ErrorActionPreference = "Stop"
- exec { yarn gulp "vscode-reh-win32-$(VSCODE_ARCH)-min-ci" }
+ exec { npm run gulp "vscode-reh-win32-$(VSCODE_ARCH)-min-ci" }
mv ..\vscode-reh-win32-$(VSCODE_ARCH) ..\vscode-server-win32-$(VSCODE_ARCH) # TODO@joaomoreno
echo "##vso[task.setvariable variable=BUILT_SERVER]true"
echo "##vso[task.setvariable variable=CodeSigningFolderPath]$(CodeSigningFolderPath),$(agent.builddirectory)/vscode-server-win32-$(VSCODE_ARCH)"
env:
GITHUB_TOKEN: "$(github-distro-mixin-password)"
displayName: Build server
- condition: and(succeeded(), ne(variables['VSCODE_ARCH'], 'arm64'))
- powershell: |
. build/azure-pipelines/win32/exec.ps1
$ErrorActionPreference = "Stop"
- exec { yarn gulp "vscode-reh-web-win32-$(VSCODE_ARCH)-min-ci" }
+ exec { npm run gulp "vscode-reh-web-win32-$(VSCODE_ARCH)-min-ci" }
mv ..\vscode-reh-web-win32-$(VSCODE_ARCH) ..\vscode-server-win32-$(VSCODE_ARCH)-web # TODO@joaomoreno
echo "##vso[task.setvariable variable=BUILT_WEB]true"
env:
GITHUB_TOKEN: "$(github-distro-mixin-password)"
displayName: Build server (web)
- condition: and(succeeded(), ne(variables['VSCODE_ARCH'], 'arm64'))
- ${{ if or(eq(parameters.VSCODE_RUN_UNIT_TESTS, true), eq(parameters.VSCODE_RUN_INTEGRATION_TESTS, true), eq(parameters.VSCODE_RUN_SMOKE_TESTS, true)) }}:
- template: product-build-win32-test.yml@self
@@ -273,7 +271,7 @@ steps:
$env:ESRPPKI = "$(ESRP-PKI)"
$env:ESRPAADUsername = "$(esrp-aad-username)"
$env:ESRPAADPassword = "$(esrp-aad-password)"
- exec { yarn gulp "vscode-win32-$(VSCODE_ARCH)-system-setup" --sign }
+ exec { npm run -- gulp "vscode-win32-$(VSCODE_ARCH)-system-setup" --sign }
$SetupPath = ".build\win32-$(VSCODE_ARCH)\system-setup\VSCodeSetup-$(VSCODE_ARCH)-$(VSCODE_VERSION).exe"
mv .build\win32-$(VSCODE_ARCH)\system-setup\VSCodeSetup.exe $SetupPath
echo "##vso[task.setvariable variable=SYSTEM_SETUP_PATH]$SetupPath"
@@ -285,7 +283,7 @@ steps:
$env:ESRPPKI = "$(ESRP-PKI)"
$env:ESRPAADUsername = "$(esrp-aad-username)"
$env:ESRPAADPassword = "$(esrp-aad-password)"
- exec { yarn gulp "vscode-win32-$(VSCODE_ARCH)-user-setup" --sign }
+ exec { npm run -- gulp "vscode-win32-$(VSCODE_ARCH)-user-setup" --sign }
$SetupPath = ".build\win32-$(VSCODE_ARCH)\user-setup\VSCodeUserSetup-$(VSCODE_ARCH)-$(VSCODE_VERSION).exe"
mv .build\win32-$(VSCODE_ARCH)\user-setup\VSCodeSetup.exe $SetupPath
echo "##vso[task.setvariable variable=USER_SETUP_PATH]$SetupPath"
@@ -312,7 +310,7 @@ steps:
sbomBuildDropPath: $(Agent.BuildDirectory)/vscode-server-win32-$(VSCODE_ARCH)
sbomPackageName: "VS Code Windows $(VSCODE_ARCH) Server"
sbomPackageVersion: $(Build.SourceVersion)
- condition: and(succeededOrFailed(), ne(variables['SERVER_PATH'], ''), ne(variables['VSCODE_ARCH'], 'arm64'))
+ condition: and(succeededOrFailed(), ne(variables['SERVER_PATH'], ''))
displayName: Publish server archive
- task: 1ES.PublishPipelineArtifact@1
@@ -322,7 +320,7 @@ steps:
sbomBuildDropPath: $(Agent.BuildDirectory)/vscode-server-win32-$(VSCODE_ARCH)-web
sbomPackageName: "VS Code Windows $(VSCODE_ARCH) Web"
sbomPackageVersion: $(Build.SourceVersion)
- condition: and(succeededOrFailed(), ne(variables['WEB_PATH'], ''), ne(variables['VSCODE_ARCH'], 'arm64'))
+ condition: and(succeededOrFailed(), ne(variables['WEB_PATH'], ''))
displayName: Publish web server archive
- task: 1ES.PublishPipelineArtifact@1
diff --git a/build/azure-pipelines/win32/sdl-scan-win32.yml b/build/azure-pipelines/win32/sdl-scan-win32.yml
new file mode 100644
index 00000000000..fc40b9a0e60
--- /dev/null
+++ b/build/azure-pipelines/win32/sdl-scan-win32.yml
@@ -0,0 +1,162 @@
+parameters:
+ - name: VSCODE_ARCH
+ type: string
+ - name: VSCODE_QUALITY
+ type: string
+
+steps:
+ - task: NodeTool@0
+ inputs:
+ versionSource: fromFile
+ versionFilePath: .nvmrc
+ nodejsMirror: https://github.com/joaomoreno/node-mirror/releases/download
+
+ - task: UsePythonVersion@0
+ inputs:
+ versionSpec: "3.x"
+ addToPath: true
+
+ - template: ../distro/download-distro.yml@self
+
+ - task: AzureKeyVault@2
+ displayName: "Azure Key Vault: Get Secrets"
+ inputs:
+ azureSubscription: "vscode-builds-subscription"
+ KeyVaultName: vscode-build-secrets
+ SecretsFilter: "github-distro-mixin-password"
+
+ - powershell: node build/setup-npm-registry.js $env:NPM_REGISTRY
+ condition: and(succeeded(), ne(variables['NPM_REGISTRY'], 'none'))
+ displayName: Setup NPM Registry
+
+ - powershell: |
+ . build/azure-pipelines/win32/exec.ps1
+ $ErrorActionPreference = "Stop"
+ # Set the private NPM registry to the global npmrc file
+ # so that authentication works for subfolders like build/, remote/, extensions/ etc
+ # which does not have their own .npmrc file
+ exec { npm config set registry "$env:NPM_REGISTRY" }
+ $NpmrcPath = (npm config get userconfig)
+ echo "##vso[task.setvariable variable=NPMRC_PATH]$NpmrcPath"
+ condition: and(succeeded(), ne(variables['NPM_REGISTRY'], 'none'))
+ displayName: Setup NPM
+
+ - task: npmAuthenticate@0
+ inputs:
+ workingFile: $(NPMRC_PATH)
+ condition: and(succeeded(), ne(variables['NPM_REGISTRY'], 'none'))
+ displayName: Setup NPM Authentication
+
+ - pwsh: |
+ $includes = @'
+ {
+ 'target_defaults': {
+ 'conditions': [
+ ['OS=="win"', {
+ 'msvs_settings': {
+ 'VCCLCompilerTool': {
+ 'AdditionalOptions': [
+ '/Zi',
+ '/FS'
+ ],
+ },
+ 'VCLinkerTool': {
+ 'AdditionalOptions': [
+ '/profile'
+ ]
+ }
+ }
+ }]
+ ]
+ }
+ }
+ '@
+
+ if (!(Test-Path "~/.gyp")) {
+ mkdir "~/.gyp"
+ }
+ echo $includes > "~/.gyp/include.gypi"
+ displayName: Create include.gypi
+
+ - powershell: |
+ . build/azure-pipelines/win32/exec.ps1
+ . build/azure-pipelines/win32/retry.ps1
+ $ErrorActionPreference = "Stop"
+ retry { exec { npm ci } }
+ env:
+ npm_config_arch: ${{ parameters.VSCODE_ARCH }}
+ CHILD_CONCURRENCY: 1
+ ELECTRON_SKIP_BINARY_DOWNLOAD: 1
+ PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
+ GITHUB_TOKEN: "$(github-distro-mixin-password)"
+ displayName: Install dependencies
+
+ - script: node build/azure-pipelines/distro/mixin-npm
+ displayName: Mixin distro node modules
+
+ - script: node build/azure-pipelines/distro/mixin-quality
+ displayName: Mixin distro quality
+ env:
+ VSCODE_QUALITY: ${{ parameters.VSCODE_QUALITY }}
+
+ - powershell: npm run compile
+ displayName: Compile
+
+ - powershell: |
+ Get-ChildItem '$(Build.SourcesDirectory)' -Recurse -Filter "*.exe"
+ Get-ChildItem '$(Build.SourcesDirectory)' -Recurse -Filter "*.dll"
+ Get-ChildItem '$(Build.SourcesDirectory)' -Recurse -Filter "*.node"
+ Get-ChildItem '$(Build.SourcesDirectory)' -Recurse -Filter "*.pdb"
+ displayName: List files
+
+ - powershell: npm run gulp "vscode-symbols-win32-${{ parameters.VSCODE_ARCH }}"
+ env:
+ GITHUB_TOKEN: "$(github-distro-mixin-password)"
+ displayName: Download Symbols
+
+ - powershell: |
+ Get-ChildItem '$(Agent.BuildDirectory)\scanbin' -Recurse -Filter "*.exe"
+ Get-ChildItem '$(Agent.BuildDirectory)\scanbin' -Recurse -Filter "*.dll"
+ Get-ChildItem '$(Agent.BuildDirectory)\scanbin' -Recurse -Filter "*.node"
+ Get-ChildItem '$(Agent.BuildDirectory)\scanbin' -Recurse -Filter "*.pdb"
+ displayName: List files again
+
+ - task: BinSkim@4
+ inputs:
+ InputType: "Basic"
+ Function: "analyze"
+ TargetPattern: "guardianGlob"
+ AnalyzeIgnorePdbLoadError: true
+ AnalyzeTargetGlob: '$(Agent.BuildDirectory)\scanbin\**.dll;$(Agent.BuildDirectory)\scanbin\**.exe;$(Agent.BuildDirectory)\scanbin\**.node'
+ AnalyzeLocalSymbolDirectories: '$(Agent.BuildDirectory)\scanbin\VSCode-win32-${{ parameters.VSCODE_ARCH }}\pdb'
+
+ - task: CopyFiles@2
+ displayName: 'Collect Symbols for API Scan'
+ inputs:
+ SourceFolder: $(Agent.BuildDirectory)
+ Contents: 'scanbin\**\*.pdb'
+ TargetFolder: '$(Agent.BuildDirectory)\symbols'
+ flattenFolders: true
+ condition: succeeded()
+
+ - task: APIScan@2
+ inputs:
+ softwareFolder: $(Agent.BuildDirectory)\scanbin
+ softwareName: 'vscode-client'
+ softwareVersionNum: '1'
+ symbolsFolder: 'srv*https://symweb.azurefd.net;$(Agent.BuildDirectory)\symbols'
+ isLargeApp: false
+ toolVersion: 'Latest'
+ azureSubscription: 'vscode-apiscan'
+ displayName: Run ApiScan
+ condition: succeeded()
+ env:
+ AzureServicesAuthConnectionString: $(apiscan-connectionstring)
+ SYSTEM_ACCESSTOKEN: $(System.AccessToken)
+
+ - task: PublishSecurityAnalysisLogs@3
+ inputs:
+ ArtifactName: CodeAnalysisLogs
+ ArtifactType: Container
+ PublishProcessedResults: false
+ AllTools: true
diff --git a/build/buildfile.js b/build/buildfile.js
new file mode 100644
index 00000000000..d49a5394cad
--- /dev/null
+++ b/build/buildfile.js
@@ -0,0 +1,68 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+/**
+ * @param {string} name
+ * @param {string[]=} exclude
+ * @returns {import('./lib/bundle').IEntryPoint}
+ */
+function createModuleDescription(name, exclude) {
+
+ let excludes = ['vs/css'];
+ if (Array.isArray(exclude) && exclude.length > 0) {
+ excludes = excludes.concat(exclude);
+ }
+
+ return {
+ name,
+ include: [],
+ exclude: excludes
+ };
+}
+
+/**
+ * @param {string} name
+ */
+function createEditorWorkerModuleDescription(name) {
+ return createModuleDescription(name, ['vs/base/common/worker/simpleWorker', 'vs/editor/common/services/editorSimpleWorker']);
+}
+
+exports.workerEditor = createEditorWorkerModuleDescription('vs/editor/common/services/editorSimpleWorkerMain');
+exports.workerExtensionHost = createEditorWorkerModuleDescription('vs/workbench/api/worker/extensionHostWorkerMain');
+exports.workerNotebook = createEditorWorkerModuleDescription('vs/workbench/contrib/notebook/common/services/notebookSimpleWorkerMain');
+exports.workerLanguageDetection = createEditorWorkerModuleDescription('vs/workbench/services/languageDetection/browser/languageDetectionSimpleWorkerMain');
+exports.workerLocalFileSearch = createEditorWorkerModuleDescription('vs/workbench/services/search/worker/localFileSearchMain');
+exports.workerProfileAnalysis = createEditorWorkerModuleDescription('vs/platform/profiling/electron-sandbox/profileAnalysisWorkerMain');
+exports.workerOutputLinks = createEditorWorkerModuleDescription('vs/workbench/contrib/output/common/outputLinkComputerMain');
+exports.workerBackgroundTokenization = createEditorWorkerModuleDescription('vs/workbench/services/textMate/browser/backgroundTokenization/worker/textMateTokenizationWorker.workerMain');
+
+exports.workbenchDesktop = [
+ createModuleDescription('vs/workbench/contrib/debug/node/telemetryApp'),
+ createModuleDescription('vs/platform/files/node/watcher/watcherMain'),
+ createModuleDescription('vs/platform/terminal/node/ptyHostMain'),
+ createModuleDescription('vs/workbench/api/node/extensionHostProcess'),
+ createModuleDescription('vs/workbench/contrib/issue/electron-sandbox/issueReporterMain'),
+ createModuleDescription('vs/workbench/workbench.desktop.main')
+];
+
+exports.workbenchWeb = createModuleDescription('vs/workbench/workbench.web.main');
+
+exports.keyboardMaps = [
+ createModuleDescription('vs/workbench/services/keybinding/browser/keyboardLayouts/layout.contribution.linux'),
+ createModuleDescription('vs/workbench/services/keybinding/browser/keyboardLayouts/layout.contribution.darwin'),
+ createModuleDescription('vs/workbench/services/keybinding/browser/keyboardLayouts/layout.contribution.win')
+];
+
+exports.code = [
+ // 'vs/code/electron-main/main' is not included here because it comes in via ./src/main.js
+ // 'vs/code/node/cli' is not included here because it comes in via ./src/cli.js
+ createModuleDescription('vs/code/node/cliProcessMain'),
+ createModuleDescription('vs/code/electron-utility/sharedProcess/sharedProcessMain'),
+ createModuleDescription('vs/code/electron-sandbox/processExplorer/processExplorerMain')
+];
+
+exports.codeWeb = createModuleDescription('vs/code/browser/workbench/workbench');
+
+exports.entrypoint = createModuleDescription;
diff --git a/build/checksums/electron.txt b/build/checksums/electron.txt
index a80aa1531f1..53654213809 100644
--- a/build/checksums/electron.txt
+++ b/build/checksums/electron.txt
@@ -1,75 +1,75 @@
-3d3d8bb185d7b63b0db910661fdd69d6381afb8c97742bbd2526a9c932e1f8ca *chromedriver-v29.4.0-darwin-arm64.zip
-c3d075943d87604ffa50382cc8d5798485349544ca391cab88c892f889d3b14c *chromedriver-v29.4.0-darwin-x64.zip
-6d62d2dba55e4419fa003d45f93dad1324ec29a4d3eb84fd9fd5fd7a64339389 *chromedriver-v29.4.0-linux-arm64.zip
-81bb3d362331c7296f700b1b0e8f07c4c7739b1151f698cd56af927bedda59e7 *chromedriver-v29.4.0-linux-armv7l.zip
-ab593cc39aefac8c5abd259e31f6add4b2b70c52231724a6c08ac1872b4a0edf *chromedriver-v29.4.0-linux-x64.zip
-705d42ccc05b2c48b0673b9dcf63eb78772bb79dba078a523d384ed2481bc9c0 *chromedriver-v29.4.0-mas-arm64.zip
-956a7caa28eeeb0c02eb7638a53215ffd89b4f12880f0893ff10f497ca1a8117 *chromedriver-v29.4.0-mas-x64.zip
-1f070176aa33e0139d61a3d758fd2f015f09bb275577293fe93564749b6310ba *chromedriver-v29.4.0-win32-arm64.zip
-38a71526d243bcb73c28cb648bd4816d70b5e643df52f9f86a83416014589744 *chromedriver-v29.4.0-win32-ia32.zip
-f90750d3589cb3c9f6f0ebc70d5e025cf81c382e8c23fa47a54570696a478ef0 *chromedriver-v29.4.0-win32-x64.zip
-05dffc90dd1341cc7a6b50127985e4e217fef7f50a173c7d0ff34039dd2d81b6 *electron-api.json
-7f63f7cf675ba6dec3a5e4173d729bd53c75f81e612f809641d9d0c4d9791649 *electron-v29.4.0-darwin-arm64-dsym-snapshot.zip
-aa29530fcafa4db364978d4f414a6ec2005ea695f7fee70ffbe5e114e9e453f0 *electron-v29.4.0-darwin-arm64-dsym.zip
-8d12fb6d9bcdf5bbfc93dbcd1cac348735dc6f98aa450ee03ec7837a01a8a938 *electron-v29.4.0-darwin-arm64-symbols.zip
-c16d05f1231bb3c77da05ab236b454b3a2b6a642403be51e7c9b16cd2c421a19 *electron-v29.4.0-darwin-arm64.zip
-2dfc1017831ab2f6e9ddb575d3b9cff5a0d56f16a335a3c0df508e964e2db963 *electron-v29.4.0-darwin-x64-dsym-snapshot.zip
-025de6aa39d98762928e1b700f46177e74be20101b27457659b938e2c69db326 *electron-v29.4.0-darwin-x64-dsym.zip
-ec4eb0a618207233985ceaab297be34b3d4f0813d88801d5637295b238dd661a *electron-v29.4.0-darwin-x64-symbols.zip
-8ed7924f77a5c43c137a57097c5c47c2e8e9a78197e18af11a767c98035c123e *electron-v29.4.0-darwin-x64.zip
-bde1772fa8ac4850e108012a9edd3bd93472bad8f68ddd55fca355dad81dde4f *electron-v29.4.0-linux-arm64-debug.zip
-dfe7852a7423196efb2205c788d942db3ffc9de6ce52577e173bcf7ca6973d48 *electron-v29.4.0-linux-arm64-symbols.zip
-c3764d6c3799950e3418e8e5a5a5b2c41abe421dd8bcdebf054c7c85798d9860 *electron-v29.4.0-linux-arm64.zip
-bde1772fa8ac4850e108012a9edd3bd93472bad8f68ddd55fca355dad81dde4f *electron-v29.4.0-linux-armv7l-debug.zip
-360668ba669cb2c01c2f960cdee76c29670e6ce907ccc0718e971a04af594ce9 *electron-v29.4.0-linux-armv7l-symbols.zip
-c5e92943ad78b4e41a32ae53c679e148ea2ae09f95f914b1834dbdbae578ba91 *electron-v29.4.0-linux-armv7l.zip
-375be885426bcbd272bd068bfcef41a83296c2f8e61e633233d2a9e9a69242fc *electron-v29.4.0-linux-x64-debug.zip
-847e0f75624616c2918b33de2eefeec63419bd250685610d3f52fa115527d2b9 *electron-v29.4.0-linux-x64-symbols.zip
-91e5eb374c2c85a07c2d4e99a89eb18515ff0169a49c3fa75289800e1225729e *electron-v29.4.0-linux-x64.zip
-098f973537c3d9679a69409d0b84bcc1a6113bb2002ee60068e2c22f335a3855 *electron-v29.4.0-mas-arm64-dsym-snapshot.zip
-2724aa32eb441eea21680d95fc1efdd75ac473fa19623c7acf3d546419e96154 *electron-v29.4.0-mas-arm64-dsym.zip
-98dd81914752a57da4cbaad1f0aa94b16335f9b8f997be9aa049be90b96b2886 *electron-v29.4.0-mas-arm64-symbols.zip
-fd2663f65c1f995304e3eb65870b7146adfefef07cf82bf44de75855fd4f36e8 *electron-v29.4.0-mas-arm64.zip
-237983b2169e69bb73aa0987e871e3e486755904b71ebe36c3e902377f92754a *electron-v29.4.0-mas-x64-dsym-snapshot.zip
-a5d59599827d32ef322b99eee8416e39235f4c7a0ada78342a885665e0b732dd *electron-v29.4.0-mas-x64-dsym.zip
-5182e7697ac0591e0b95c33f70316af24093c9100f442be2cee0039660e959ac *electron-v29.4.0-mas-x64-symbols.zip
-e0ee7057aff0240a70b9ed75ff44d55aeae9af67fbc8915f741711a8bb6fe744 *electron-v29.4.0-mas-x64.zip
-2802872dfc6de0f0e2e8cef9d2f4f384e3d82b20ad36fc981c4e725dd2f2abcd *electron-v29.4.0-win32-arm64-pdb.zip
-d49c954dc25ae9e4c75e61af80b9718014c52f016f43a29071913f0e7100c7bd *electron-v29.4.0-win32-arm64-symbols.zip
-c9f31ae6408aa6936b5d683eda601773789185890375cd097e61e924d4fed77a *electron-v29.4.0-win32-arm64-toolchain-profile.zip
-483d692efbe4fb1231ff63afb8a236b2e22b486fbe5ac6abbc8b208abf94a4d3 *electron-v29.4.0-win32-arm64.zip
-98458f49ba67a08e473d475a68a2818d9df076a5246fbc9b45403e8796f9d35b *electron-v29.4.0-win32-ia32-pdb.zip
-69d505d4ae59d9dddf83c4e530e45dd7c5bc64d6da90cf4f851e523be9e51014 *electron-v29.4.0-win32-ia32-symbols.zip
-c9f31ae6408aa6936b5d683eda601773789185890375cd097e61e924d4fed77a *electron-v29.4.0-win32-ia32-toolchain-profile.zip
-d5a21a17a64e9638f49f057356af23b51f56bd6a7fea3c2e0a28ff3186a7bc41 *electron-v29.4.0-win32-ia32.zip
-521ee7b3398c4dc395b43dac86cd099e86a6123de2b43636ee805b7da014ed3f *electron-v29.4.0-win32-x64-pdb.zip
-e33848ebd6c6e4ce431aa367bef887050947a136e883677cfc524ca5cabc1e98 *electron-v29.4.0-win32-x64-symbols.zip
-c9f31ae6408aa6936b5d683eda601773789185890375cd097e61e924d4fed77a *electron-v29.4.0-win32-x64-toolchain-profile.zip
-e4ef85aa3608221f8a3e011c1b1c2d2d36093ad19bda12d16b3816929fb6c99b *electron-v29.4.0-win32-x64.zip
-707ee08593289ee83514b4fc55123611309f995788f38a5ec03e285741aac1c8 *electron.d.ts
-281b5f4a49de55fdb86b1662530f07f2ced1252c878eb7a941c88ede545339e0 *ffmpeg-v29.4.0-darwin-arm64.zip
-0b735912df9b2ff3d03eb23942e03bc0116d82f1291d0a45cbde14177c2f3066 *ffmpeg-v29.4.0-darwin-x64.zip
-4e2ba537d7c131abbd34168bce2c28cc9ef6262b217d5f4085afccfdf9635da6 *ffmpeg-v29.4.0-linux-arm64.zip
-4aa56ad5d849f4e61af22678a179346b68aec9100282e1b8a43df25d95721677 *ffmpeg-v29.4.0-linux-armv7l.zip
-0558e6e1f78229d303e16d4d8c290794baa9adc619fdd2ddccadb3ea241a1df4 *ffmpeg-v29.4.0-linux-x64.zip
-224f15d8f96c75348cd7f1b85c4eab63468fae1e50ff4b1381e08011cf76e4f7 *ffmpeg-v29.4.0-mas-arm64.zip
-175ec79f0dc4c5966d9a0ca6ec1674106340ecc64503585c12c2f854249af06f *ffmpeg-v29.4.0-mas-x64.zip
-5fa13744b87fef1bfd24a37513677f446143e085504541f8ce97466803bd1893 *ffmpeg-v29.4.0-win32-arm64.zip
-d7ba316bb7e13025c9db29e0acafebb540b7716c9f111e469733615d8521186a *ffmpeg-v29.4.0-win32-ia32.zip
-35c70a28bcfd4f0b1f8c985d3d1348936bd60767d231ce28ba38f3daeeef64bb *ffmpeg-v29.4.0-win32-x64.zip
-8c7228ea0ecab25a1f7fcd1ba9680684d19f9671a497113d71a851a53867b048 *hunspell_dictionaries.zip
-7552547c8d585b9bc43518d239d7ce3ad7c5cad0346b07cdcfc1eab638b2b794 *libcxx-objects-v29.4.0-linux-arm64.zip
-76054a779d4845ad752b625213ce8990f08dcc5b89aa20660dd4f2e817ba30a8 *libcxx-objects-v29.4.0-linux-armv7l.zip
-761c317a9c874bd3d1118d0ecad33c4be23727f538cfbb42a08dd87c68da6039 *libcxx-objects-v29.4.0-linux-x64.zip
-f98f9972cc30200b8e05815f5a9cd5cec04bdeee0e48ae2143cdaeff5db9d71d *libcxx_headers.zip
-f0b0dd2be579baaf97901322ef489d03fae69a0b8524ea77b24fb3c896f73dd9 *libcxxabi_headers.zip
-5da864ea23d70538298a40e0d037a5a461a6b74984e72fd4f0cd20904bccaed1 *mksnapshot-v29.4.0-darwin-arm64.zip
-bde97bd7c69209ed6bf4cf1cdf7de622e3a9f50fe6b4dc4b5618eee868f47c62 *mksnapshot-v29.4.0-darwin-x64.zip
-a3df9b9e6ef14efe5827d0256d8ecaebe6d8be130cfc3faac0dea76eb53b9b11 *mksnapshot-v29.4.0-linux-arm64-x64.zip
-648b9dbca21194d663ddb706e6086a166e691263c764c80f836ae02c27e3657a *mksnapshot-v29.4.0-linux-armv7l-x64.zip
-e7a4201cda3956380facc2b5b9d0b1020cc5e654fba44129fc7429a982411cc1 *mksnapshot-v29.4.0-linux-x64.zip
-ffb44c45733675e0378f45fce25dafa95697d0c86179f8e46742ada16bc11aa1 *mksnapshot-v29.4.0-mas-arm64.zip
-0242da3ca193206e56b88eb108502244bae35dcc587210bd0a32d9fa4cb71041 *mksnapshot-v29.4.0-mas-x64.zip
-1445806dca6effbc60072bbde7997cefb62bdb7a9e295a090d26f27c3882685f *mksnapshot-v29.4.0-win32-arm64-x64.zip
-09599adc3afb0a13ae87fc4b8ab97c729fe3689faa6a4f5f7a4a3cf0d9cc49d3 *mksnapshot-v29.4.0-win32-ia32.zip
-84f80683d95665d29284386509bb104e840ff0b797bfbbd19da86b84d370aa49 *mksnapshot-v29.4.0-win32-x64.zip
+3de7da4462c7690f75680aecac8fddedc4b998d0da769136d8eff2932b36004e *chromedriver-v30.5.1-darwin-arm64.zip
+d89b89f7c2ba45cb10df7fc23722bacf6f77e13002c42648762cd18ae3fa9182 *chromedriver-v30.5.1-darwin-x64.zip
+3722d46929fd2c7b33c17d37464a08150e60d9269053eb67195795254fb5e947 *chromedriver-v30.5.1-linux-arm64.zip
+a786d51f834c24b768bd415bf9a2fc5c1d9abdf9dc0b1a091bf9a8ff101becfe *chromedriver-v30.5.1-linux-armv7l.zip
+688e4da8dbcb7dbfacab6f29341d96736e6d06e4c8029835b83ef30b69885b01 *chromedriver-v30.5.1-linux-x64.zip
+786a7c2659ad97d5a09866b9aafd55edc015cb17a87bd8d72aa5925f2bfcf55a *chromedriver-v30.5.1-mas-arm64.zip
+398759d1dc02fc4928d48ff0f8fbade8811347e1a51d1cedcb2ba9350fbed04d *chromedriver-v30.5.1-mas-x64.zip
+65766f1270d1876e2a81acfb4b1130dc4a41eb7165842afa8f41ea438bf2fecb *chromedriver-v30.5.1-win32-arm64.zip
+ca9fe0abd1032ebd51497049cb1bb2ae1dd9592697b278f6b1ee2a1a25148891 *chromedriver-v30.5.1-win32-ia32.zip
+b6b6ea2202e0139ea436288add736d19078bfb190fc0b22937283927f3024bb9 *chromedriver-v30.5.1-win32-x64.zip
+50e8b2d59916bc180873324fdbeb8227dbb8b2375cc936e58b7c9885fb23376d *electron-api.json
+595db4fa3f755432bf59cbbaf591ee44b576e15952d014d83d3748646b2e338c *electron-v30.5.1-darwin-arm64-dsym-snapshot.zip
+c1beb80553f3c9575e638625ce0ffbfdb87b6f8b23799eb132954b2bb74a9a2f *electron-v30.5.1-darwin-arm64-dsym.zip
+cba315d6d6f607a2ee6cfc437b46f92da88daded86f0130d85129adb4742bc48 *electron-v30.5.1-darwin-arm64-symbols.zip
+d312544ea29844cf328b44b9dbde12f4fdced90cb442dfca6df36c098dbb6e7a *electron-v30.5.1-darwin-arm64.zip
+fd24d585d28909c082d703db3fcc5ffa0b55e1077ff320e25ed510f36e6a3761 *electron-v30.5.1-darwin-x64-dsym-snapshot.zip
+4d1a2adea4b98c4d0b03c6561fca146aab102d636d359e48ce418c465df891ae *electron-v30.5.1-darwin-x64-dsym.zip
+d9065eaf659f4c3e8a75f5453ceb65269763b2e57110bdcc01904b9a1e33a62c *electron-v30.5.1-darwin-x64-symbols.zip
+faf9dcc20d525607ea205f2f6a1dfe3270f6268aa439bb0ba5646c7e4fbbd842 *electron-v30.5.1-darwin-x64.zip
+b85dba1cdb49591542dcecff3e710f29b81285569c8c5db8c1181c3ed818ba44 *electron-v30.5.1-linux-arm64-debug.zip
+5e97cc105282783d1c20d8e8dd4ca1134342839235288840cb50f314ca7a6ede *electron-v30.5.1-linux-arm64-symbols.zip
+eb31470c0d7cd6e23e7ce0d89cc93a2356c9dac8bcc997e335353b8aa995afa0 *electron-v30.5.1-linux-arm64.zip
+b85dba1cdb49591542dcecff3e710f29b81285569c8c5db8c1181c3ed818ba44 *electron-v30.5.1-linux-armv7l-debug.zip
+137548cd73cd648107f6e01c777e411838173309848a492b42825857cec7d110 *electron-v30.5.1-linux-armv7l-symbols.zip
+224bd46983e503101c756c72d10b195f14712a7a56438718acb126017dd04edf *electron-v30.5.1-linux-armv7l.zip
+1f87fadebc444c9c0de43f52972a3f61af83ca0594c3de368f7579ce613fcb60 *electron-v30.5.1-linux-x64-debug.zip
+aae78654f599a68310bdbdc0e3de8db644320ef44e58a5c6e5c693dff5cd1970 *electron-v30.5.1-linux-x64-symbols.zip
+ec4707783d39e86005f42899e30ae59e50dd5d9c7f28531ed494eb43f2361403 *electron-v30.5.1-linux-x64.zip
+c61f3121e52fd29987814b7805b597ef3fc78b2ce891eba5e3fc6bbe14128f23 *electron-v30.5.1-mas-arm64-dsym-snapshot.zip
+f934e55ef6c986d3ec56626b2605fed16030efc45efcd8b05afa9322d625ec56 *electron-v30.5.1-mas-arm64-dsym.zip
+3cc36e99f2cd59d7cb2f47b52d19609c2a2358f6ddde35fd832872abe241cc8d *electron-v30.5.1-mas-arm64-symbols.zip
+c5085ab1fb74dfa4a4e463dcb688989bc63baf44007419fd96db4e7c974fb6db *electron-v30.5.1-mas-arm64.zip
+47102b6dcd5892de734be2b48e40bbbdbc5e0a228bf5fec33071661d2724d946 *electron-v30.5.1-mas-x64-dsym-snapshot.zip
+607091ddfd313ed27bb5a0acb6fa58b0d65cb87e6c6ce9b373949b4b152476d8 *electron-v30.5.1-mas-x64-dsym.zip
+ac49568635d41e1075bca39c97aca1f2fcede702f721ddce5d80f18cc2dd1067 *electron-v30.5.1-mas-x64-symbols.zip
+3746bc4ba32ab9c11398a393d54ba81733088729ae7cef4e5dccf1e64dc82b0a *electron-v30.5.1-mas-x64.zip
+930ad941c8bc0aa5e4e3457b235f104846939974d71bde5b42a8980de2d4a35d *electron-v30.5.1-win32-arm64-pdb.zip
+11c1252547b381ab6e40cc032ee60c5209dee9ea1102d1b47ad3fcd4da03049f *electron-v30.5.1-win32-arm64-symbols.zip
+7351fa5cb892853a7d4b67d8858d0f9cc6506c554a2e42c9ad7e8d5e29ae2743 *electron-v30.5.1-win32-arm64-toolchain-profile.zip
+f18baa98ba9c04b346fda9f40fc3150a57b539d0cd510971a073983f78e0a20c *electron-v30.5.1-win32-arm64.zip
+b03c7297dc61aa234ab2273c419d9ae064e52c2c0c3dd56f09135f81964630b5 *electron-v30.5.1-win32-ia32-pdb.zip
+8fc570c7f4d97eb6b745fb4af5932311d1da57058da8f39a3d97d6e099cd6982 *electron-v30.5.1-win32-ia32-symbols.zip
+7351fa5cb892853a7d4b67d8858d0f9cc6506c554a2e42c9ad7e8d5e29ae2743 *electron-v30.5.1-win32-ia32-toolchain-profile.zip
+20845163bf9d5a4ead03c5f0280c9bae71f0ab1fc03362f3406ed12620e4d9cd *electron-v30.5.1-win32-ia32.zip
+019f3ae97a69dc837d89c44d25e0e5dadc88564b74202c5a3524fc6ab59490bc *electron-v30.5.1-win32-x64-pdb.zip
+2eb4889fe275e5ea42cf6f51821bcceb833d5714aa1b45ad7915495afb447e94 *electron-v30.5.1-win32-x64-symbols.zip
+7351fa5cb892853a7d4b67d8858d0f9cc6506c554a2e42c9ad7e8d5e29ae2743 *electron-v30.5.1-win32-x64-toolchain-profile.zip
+443119bb559fc2ca297a57cf79f2bce532e853ada070c1e71460c9657c13b4b3 *electron-v30.5.1-win32-x64.zip
+deecdc1f3f5ea9548ef73774f412c7af489afeb7dca1c394b5add10e929aff42 *electron.d.ts
+14319b51118a5c94e108731f6b5c4e701c700212e790198ba22242eb9674a334 *ffmpeg-v30.5.1-darwin-arm64.zip
+bfd5110457438fa8b113a8806db45f30b8975304d95e5efb1b71b0f5e46757fe *ffmpeg-v30.5.1-darwin-x64.zip
+44ebf3185fc24404647da0c1f9e496effefd32ff3dbc2499c022164b919d06ed *ffmpeg-v30.5.1-linux-arm64.zip
+4f7583513d48b48c44a2cbc4430cbc9a33d8f9728622166db688e3de61190821 *ffmpeg-v30.5.1-linux-armv7l.zip
+154900e5db5810f63e38fd4551cfff3d88d6eac39226e06e12e1e43558d360a4 *ffmpeg-v30.5.1-linux-x64.zip
+14319b51118a5c94e108731f6b5c4e701c700212e790198ba22242eb9674a334 *ffmpeg-v30.5.1-mas-arm64.zip
+bfd5110457438fa8b113a8806db45f30b8975304d95e5efb1b71b0f5e46757fe *ffmpeg-v30.5.1-mas-x64.zip
+f2169c4b6b9f073c20652953599f2453947936e851ff25c9f2719e7d889faea3 *ffmpeg-v30.5.1-win32-arm64.zip
+90745f1422ae0431b295cb5d27ff03e69c890f3572ef6c4655774b892419e94f *ffmpeg-v30.5.1-win32-ia32.zip
+567fe8952f17b224d4492980af741b470e86b31d58e7c6a9262258eeae490122 *ffmpeg-v30.5.1-win32-x64.zip
+8bbbadb52a19f074d9f8bd533891e2bacbe4813101ae6c344cfc88e28b1429a3 *hunspell_dictionaries.zip
+61137508aee6837c70a2ead2e31dd106d753ec5fac01b49e7e8701be0e09e7aa *libcxx-objects-v30.5.1-linux-arm64.zip
+3c285f012f256f767e777550a1f18054cfcffc4e13ad6fa4e4e90dd58ec22069 *libcxx-objects-v30.5.1-linux-armv7l.zip
+9b96b53c8dfbc70a0f617f78dde89a1e8510ae2261bcddfbf7c12c61eb5a3d73 *libcxx-objects-v30.5.1-linux-x64.zip
+1b5cbe24d6356a388e166bff60d7452583019ea7dec85f593c552eb287346f43 *libcxx_headers.zip
+eae200a0d1fd0d4b881358bdef600111891c75ecc4db679b680b0cbaf87ecfc3 *libcxxabi_headers.zip
+ed1f7463b5869acf57dd388208918652182b049b2846f572d52ed47e7c091d54 *mksnapshot-v30.5.1-darwin-arm64.zip
+bc80de1f29b869cdb2676d2dc08cbb4bd6228a6825b1b0bfc13acee0b070ac3e *mksnapshot-v30.5.1-darwin-x64.zip
+5e526ca4f4250a9b9b040d6eb60f1d2b8db974ab68c27e46198f4bf8dc1ef347 *mksnapshot-v30.5.1-linux-arm64-x64.zip
+c40ca2a45cc9ab4e1668f063860ba243baef8c192a253638e4c93aaccb0ef8da *mksnapshot-v30.5.1-linux-armv7l-x64.zip
+a3134e0b0980547167dd3ca2f17dd2f40a7db697ab563ba6257534f9ad0d256d *mksnapshot-v30.5.1-linux-x64.zip
+82776eafcb3e4d053e275ad50d84151f41a651986baacda20c6ed722854cb8fb *mksnapshot-v30.5.1-mas-arm64.zip
+9d6d95d4cb121a29fd68d64557edd8c9859345ac37d0645de8aff518391755ed *mksnapshot-v30.5.1-mas-x64.zip
+94b9ce6cb40ae001962b77525d12483c3458776066a69a4e714b327bab1decfc *mksnapshot-v30.5.1-win32-arm64-x64.zip
+4d89d06c2e85b25d52bb64f48258ad5d05b98ac21697ae9c49ccd19bad9d7d94 *mksnapshot-v30.5.1-win32-ia32.zip
+ccfd322bafde0485a0ac6b0acc3669c7b08f30003a1c2e044eebc1bf02289de3 *mksnapshot-v30.5.1-win32-x64.zip
diff --git a/build/checksums/nodejs.txt b/build/checksums/nodejs.txt
index bcc9340406d..3436ff37cc5 100644
--- a/build/checksums/nodejs.txt
+++ b/build/checksums/nodejs.txt
@@ -1,7 +1,7 @@
-e0065c61f340e85106a99c4b54746c5cee09d59b08c5712f67f99e92aa44995d node-v20.11.1-darwin-arm64.tar.gz
-c52e7fb0709dbe63a4cbe08ac8af3479188692937a7bd8e776e0eedfa33bb848 node-v20.11.1-darwin-x64.tar.gz
-e34ab2fc2726b4abd896bcbff0250e9b2da737cbd9d24267518a802ed0606f3b node-v20.11.1-linux-arm64.tar.gz
-e42791f76ece283c7a4b97fbf716da72c5128c54a9779f10f03ae74a4bcfb8f6 node-v20.11.1-linux-armv7l.tar.gz
-bf3a779bef19452da90fb88358ec2c57e0d2f882839b20dc6afc297b6aafc0d7 node-v20.11.1-linux-x64.tar.gz
-a5a9d30a8f7d56e00ccb27c1a7d24c8d0bc96a2689ebba8eb7527698793496f1 win-arm64/node.exe
-bc585910690318aaebe3c57669cb83ca9d1e5791efd63195e238f54686e6c2ec win-x64/node.exe
+fc7355e778b181575153b7dea4879e8021776eeb376c43c50f65893d2ea70aa3 node-v20.16.0-darwin-arm64.tar.gz
+e18942cd706e4d69a4845ddacee2f1c17a72e853a229e3d2623d2edeb7efde72 node-v20.16.0-darwin-x64.tar.gz
+551588f8f5ca05c04efb53f1b2bb7d9834603327bdc82d60a944d385569866e1 node-v20.16.0-linux-arm64.tar.gz
+1c77c52ab507ddee479012f0b4bf523dd8400df4504447d623632353076e2e27 node-v20.16.0-linux-armv7l.tar.gz
+b3f874ea84e440d69ed02ca92429d0eccd17737fde86db69c1c153d16ec654f2 node-v20.16.0-linux-x64.tar.gz
+7e773fba3a19eac5ccbe85c1f87a05d7b112ecf41440076e6b6de1c7bffa0fdf win-arm64/node.exe
+ba221658a3b68bd583e3068903eb675b5206d86a883c084ed95502e8f634b82a win-x64/node.exe
diff --git a/build/darwin/create-universal-app.js b/build/darwin/create-universal-app.js
index 7da8e55c908..a3daf1878b0 100644
--- a/build/darwin/create-universal-app.js
+++ b/build/darwin/create-universal-app.js
@@ -6,6 +6,7 @@
Object.defineProperty(exports, "__esModule", { value: true });
const path = require("path");
const fs = require("fs");
+const minimatch = require("minimatch");
const vscode_universal_bundler_1 = require("vscode-universal-bundler");
const cross_spawn_promise_1 = require("@malept/cross-spawn-promise");
const root = path.dirname(path.dirname(__dirname));
@@ -18,26 +19,29 @@ async function main(buildDir) {
const appName = product.nameLong + '.app';
const x64AppPath = path.join(buildDir, 'VSCode-darwin-x64', appName);
const arm64AppPath = path.join(buildDir, 'VSCode-darwin-arm64', appName);
- const x64AsarPath = path.join(x64AppPath, 'Contents', 'Resources', 'app', 'node_modules.asar');
- const arm64AsarPath = path.join(arm64AppPath, 'Contents', 'Resources', 'app', 'node_modules.asar');
+ const asarRelativePath = path.join('Contents', 'Resources', 'app', 'node_modules.asar');
const outAppPath = path.join(buildDir, `VSCode-darwin-${arch}`, appName);
const productJsonPath = path.resolve(outAppPath, 'Contents', 'Resources', 'app', 'product.json');
+ const filesToSkip = [
+ '**/CodeResources',
+ '**/Credits.rtf',
+ ];
await (0, vscode_universal_bundler_1.makeUniversalApp)({
x64AppPath,
arm64AppPath,
- x64AsarPath,
- arm64AsarPath,
- filesToSkip: [
- 'product.json',
- 'Credits.rtf',
- 'CodeResources',
- 'fsevents.node',
- 'Info.plist', // TODO@deepak1556: regressed with 11.4.2 internal builds
- 'MainMenu.nib', // Generated sequence is not deterministic with Xcode 13
- '.npmrc'
- ],
+ asarPath: asarRelativePath,
outAppPath,
- force: true
+ force: true,
+ mergeASARs: true,
+ x64ArchFiles: '*/kerberos.node',
+ filesToSkipComparison: (file) => {
+ for (const expected of filesToSkip) {
+ if (minimatch(file, expected)) {
+ return true;
+ }
+ }
+ return false;
+ }
});
const productJson = JSON.parse(fs.readFileSync(productJsonPath, 'utf8'));
Object.assign(productJson, {
diff --git a/build/darwin/create-universal-app.ts b/build/darwin/create-universal-app.ts
index ffba8952cd8..94b8a23b9e5 100644
--- a/build/darwin/create-universal-app.ts
+++ b/build/darwin/create-universal-app.ts
@@ -5,6 +5,7 @@
import * as path from 'path';
import * as fs from 'fs';
+import * as minimatch from 'minimatch';
import { makeUniversalApp } from 'vscode-universal-bundler';
import { spawn } from '@malept/cross-spawn-promise';
@@ -21,27 +22,31 @@ async function main(buildDir?: string) {
const appName = product.nameLong + '.app';
const x64AppPath = path.join(buildDir, 'VSCode-darwin-x64', appName);
const arm64AppPath = path.join(buildDir, 'VSCode-darwin-arm64', appName);
- const x64AsarPath = path.join(x64AppPath, 'Contents', 'Resources', 'app', 'node_modules.asar');
- const arm64AsarPath = path.join(arm64AppPath, 'Contents', 'Resources', 'app', 'node_modules.asar');
+ const asarRelativePath = path.join('Contents', 'Resources', 'app', 'node_modules.asar');
const outAppPath = path.join(buildDir, `VSCode-darwin-${arch}`, appName);
const productJsonPath = path.resolve(outAppPath, 'Contents', 'Resources', 'app', 'product.json');
+ const filesToSkip = [
+ '**/CodeResources',
+ '**/Credits.rtf',
+ ];
+
await makeUniversalApp({
x64AppPath,
arm64AppPath,
- x64AsarPath,
- arm64AsarPath,
- filesToSkip: [
- 'product.json',
- 'Credits.rtf',
- 'CodeResources',
- 'fsevents.node',
- 'Info.plist', // TODO@deepak1556: regressed with 11.4.2 internal builds
- 'MainMenu.nib', // Generated sequence is not deterministic with Xcode 13
- '.npmrc'
- ],
+ asarPath: asarRelativePath,
outAppPath,
- force: true
+ force: true,
+ mergeASARs: true,
+ x64ArchFiles: '*/kerberos.node',
+ filesToSkipComparison: (file: string) => {
+ for (const expected of filesToSkip) {
+ if (minimatch(file, expected)) {
+ return true;
+ }
+ }
+ return false;
+ }
});
const productJson = JSON.parse(fs.readFileSync(productJsonPath, 'utf8'));
diff --git a/build/darwin/sign.js b/build/darwin/sign.js
index f5913b73ab8..feb5834ff85 100644
--- a/build/darwin/sign.js
+++ b/build/darwin/sign.js
@@ -10,8 +10,8 @@ const codesign = require("electron-osx-sign");
const cross_spawn_promise_1 = require("@malept/cross-spawn-promise");
const root = path.dirname(path.dirname(__dirname));
function getElectronVersion() {
- const yarnrc = fs.readFileSync(path.join(root, '.yarnrc'), 'utf8');
- const target = /^target "(.*)"$/m.exec(yarnrc)[1];
+ const npmrc = fs.readFileSync(path.join(root, '.npmrc'), 'utf8');
+ const target = /^target="(.*)"$/m.exec(npmrc)[1];
return target;
}
async function main(buildDir) {
diff --git a/build/darwin/sign.ts b/build/darwin/sign.ts
index 01e9ebf2d4b..5b3413b79e1 100644
--- a/build/darwin/sign.ts
+++ b/build/darwin/sign.ts
@@ -11,8 +11,8 @@ import { spawn } from '@malept/cross-spawn-promise';
const root = path.dirname(path.dirname(__dirname));
function getElectronVersion(): string {
- const yarnrc = fs.readFileSync(path.join(root, '.yarnrc'), 'utf8');
- const target = /^target "(.*)"$/m.exec(yarnrc)![1];
+ const npmrc = fs.readFileSync(path.join(root, '.npmrc'), 'utf8');
+ const target = /^target="(.*)"$/m.exec(npmrc)![1];
return target;
}
diff --git a/build/eslint.js b/build/eslint.js
index 288917b35bf..55e11b277d9 100644
--- a/build/eslint.js
+++ b/build/eslint.js
@@ -8,17 +8,11 @@ const vfs = require('vinyl-fs');
const { eslintFilter } = require('./filters');
function eslint() {
- const gulpeslint = require('gulp-eslint');
+ const eslint = require('./gulp-eslint');
return vfs
.src(eslintFilter, { base: '.', follow: true, allowEmpty: true })
.pipe(
- gulpeslint({
- configFile: '.eslintrc.json'
- })
- )
- .pipe(gulpeslint.formatEach('compact'))
- .pipe(
- gulpeslint.results((results) => {
+ eslint((results) => {
if (results.warningCount > 0 || results.errorCount > 0) {
throw new Error('eslint failed with warnings and/or errors');
}
diff --git a/build/filters.js b/build/filters.js
index c7be2d818d9..4e5049f23f0 100644
--- a/build/filters.js
+++ b/build/filters.js
@@ -77,7 +77,9 @@ module.exports.indentationFilter = [
'!src/vs/base/common/semver/semver.js',
'!src/vs/base/node/terminateProcess.sh',
'!src/vs/base/node/cpuUsage.sh',
+ '!src/vs/editor/common/languages/highlights/*.scm',
'!test/unit/assert.js',
+ '!test/unit/assert-esm.js',
'!resources/linux/snap/electron-launch',
'!build/ext.js',
'!build/npm/gyp/patches/gyp_spectre_mitigation_support.patch',
@@ -99,8 +101,7 @@ module.exports.indentationFilter = [
// except multiple specific files
'!**/package.json',
- '!**/yarn.lock',
- '!**/yarn-error.log',
+ '!**/package-lock.json',
// except multiple specific folders
'!**/codicon/**',
@@ -117,7 +118,7 @@ module.exports.indentationFilter = [
'!src/vs/*/**/*.d.ts',
'!src/typings/**/*.d.ts',
'!extensions/**/*.d.ts',
- '!**/*.{svg,exe,png,bmp,jpg,scpt,bat,cmd,cur,ttf,woff,eot,md,ps1,template,yaml,yml,d.ts.recipe,ico,icns,plist,opus,admx,adml,wasm}',
+ '!**/*.{svg,exe,png,bmp,jpg,scpt,bat,cmd,cur,ttf,woff,eot,md,ps1,psm1,template,yaml,yml,d.ts.recipe,ico,icns,plist,opus,admx,adml,wasm}',
'!build/{lib,download,linux,darwin}/**/*.js',
'!build/**/*.sh',
'!build/azure-pipelines/**/*.js',
@@ -199,7 +200,7 @@ module.exports.eslintFilter = [
.toString().split(/\r\n|\n/)
.filter(line => !line.startsWith('#'))
.filter(line => !!line)
- .map(line => `!${line}`)
+ .map(line => line.startsWith('!') ? line.slice(1) : `!${line}`)
];
module.exports.stylelintFilter = [
diff --git a/build/gulp-eslint.js b/build/gulp-eslint.js
new file mode 100644
index 00000000000..3373171671b
--- /dev/null
+++ b/build/gulp-eslint.js
@@ -0,0 +1,78 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+'use strict';
+
+const { ESLint } = require('eslint');
+const { Transform } = require('stream');
+const { relative } = require('path');
+const fancyLog = require('fancy-log');
+
+/**
+ * @param {Function} action - A function to handle all ESLint results
+ * @returns {stream} gulp file stream
+ */
+function eslint(action) {
+ const linter = new ESLint();
+ const formatter = linter.loadFormatter('compact');
+
+ const results = [];
+ results.errorCount = 0;
+ results.warningCount = 0;
+
+ return transform(
+ async (file, enc, cb) => {
+ const filePath = relative(process.cwd(), file.path);
+
+ if (file.isNull()) {
+ cb(null, file);
+ return;
+ }
+
+ if (file.isStream()) {
+ cb(new Error('vinyl files with Stream contents are not supported'));
+ return;
+ }
+
+ try {
+ // TODO: Should this be checked?
+ if (await linter.isPathIgnored(filePath)) {
+ cb(null, file);
+ return;
+ }
+
+ const result = (await linter.lintText(file.contents.toString(), { filePath }))[0];
+ results.push(result);
+ results.errorCount += result.errorCount;
+ results.warningCount += result.warningCount;
+
+ const message = (await formatter).format([result]);
+ if (message) {
+ fancyLog(message);
+ }
+ cb(null, file);
+ } catch (error) {
+ cb(error);
+ }
+ },
+ (done) => {
+ try {
+ action(results);
+ done();
+ } catch (error) {
+ done(error);
+ }
+ });
+}
+
+function transform(transform, flush) {
+ return new Transform({
+ objectMode: true,
+ transform,
+ flush
+ });
+}
+
+module.exports = eslint;
diff --git a/build/gulpfile.cli.js b/build/gulpfile.cli.js
index 86646fdb274..592fc74516c 100644
--- a/build/gulpfile.cli.js
+++ b/build/gulpfile.cli.js
@@ -5,8 +5,6 @@
'use strict';
-//@ts-check
-
const es = require('event-stream');
const gulp = require('gulp');
const path = require('path');
@@ -24,7 +22,6 @@ const createReporter = require('./lib/reporter').createReporter;
const root = 'cli';
const rootAbs = path.resolve(__dirname, '..', root);
const src = `${root}/src`;
-const targetCliPath = path.join(root, 'target', 'debug', process.platform === 'win32' ? 'code.exe' : 'code');
const platformOpensslDirName =
process.platform === 'win32' ? (
diff --git a/build/gulpfile.compile.js b/build/gulpfile.compile.js
index c4947e76cbf..e40b05f8d39 100644
--- a/build/gulpfile.compile.js
+++ b/build/gulpfile.compile.js
@@ -3,21 +3,24 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
+//@ts-check
'use strict';
const gulp = require('gulp');
const util = require('./lib/util');
+const date = require('./lib/date');
const task = require('./lib/task');
const compilation = require('./lib/compilation');
-const optimize = require('./lib/optimize');
+/**
+ * @param {boolean} disableMangle
+ */
function makeCompileBuildTask(disableMangle) {
return task.series(
util.rimraf('out-build'),
- util.buildWebNodePaths('out-build'),
+ date.writeISODate('out-build'),
compilation.compileApiProposalNamesTask,
- compilation.compileTask('src', 'out-build', true, { disableMangle }),
- optimize.optimizeLoaderTask('out-build', 'out-build', true)
+ compilation.compileTask('src', 'out-build', true, { disableMangle })
);
}
diff --git a/build/gulpfile.editor.js b/build/gulpfile.editor.js
index 22b70a953df..0a6231dbfb0 100644
--- a/build/gulpfile.editor.js
+++ b/build/gulpfile.editor.js
@@ -29,19 +29,17 @@ const editorEntryPoints = [
{
name: 'vs/editor/editor.main',
include: [],
- exclude: ['vs/css', 'vs/nls'],
+ exclude: ['vs/css'],
prepend: [
- { path: 'out-editor-build/vs/css.js', amdModuleId: 'vs/css' },
- { path: 'out-editor-build/vs/nls.js', amdModuleId: 'vs/nls' }
+ { path: 'out-editor-build/vs/css.js', amdModuleId: 'vs/css' }
],
},
{
name: 'vs/base/common/worker/simpleWorker',
include: ['vs/editor/common/services/editorSimpleWorker'],
- exclude: ['vs/nls'],
+ exclude: [],
prepend: [
{ path: 'vs/loader.js' },
- { path: 'vs/nls.js', amdModuleId: 'vs/nls' },
{ path: 'vs/base/worker/workerMain.js' }
],
dest: 'vs/base/worker/workerMain.js'
@@ -79,33 +77,25 @@ const extractEditorSrcTask = task.define('extract-editor-src', () => {
extrausages
],
shakeLevel: 2, // 0-Files, 1-InnerFile, 2-ClassMembers
- importIgnorePattern: /(^vs\/css!)/,
+ importIgnorePattern: /\.css$/,
destRoot: path.join(root, 'out-editor-src'),
- redirects: []
+ redirects: {
+ '@vscode/tree-sitter-wasm': '../node_modules/@vscode/tree-sitter-wasm/wasm/tree-sitter-web',
+ }
});
});
// Disable mangling for the editor, as it complicates debugging & quite a few users rely on private/protected fields.
-const compileEditorAMDTask = task.define('compile-editor-amd', compilation.compileTask('out-editor-src', 'out-editor-build', true, { disableMangle: true }));
+// Disable NLS task to remove english strings to preserve backwards compatibility when we removed the `vs/nls!` AMD plugin.
+const compileEditorAMDTask = task.define('compile-editor-amd', compilation.compileTask('out-editor-src', 'out-editor-build', true, { disableMangle: true, preserveEnglish: true }));
const optimizeEditorAMDTask = task.define('optimize-editor-amd', optimize.optimizeTask(
{
out: 'out-editor',
- amd: {
+ esm: {
src: 'out-editor-build',
entryPoints: editorEntryPoints,
- resources: editorResources,
- loaderConfig: {
- paths: {
- 'vs': 'out-editor-build/vs',
- 'vs/css': 'out-editor-build/vs/css.build',
- 'vs/nls': 'out-editor-build/vs/nls.build',
- 'vscode': 'empty:'
- }
- },
- header: BUNDLED_FILE_HEADER,
- bundleInfo: true,
- languages
+ resources: editorResources
}
}
));
@@ -124,7 +114,6 @@ const createESMSourcesAndResourcesTask = task.define('extract-editor-esm', () =>
'vs/base/worker/workerMain.ts',
],
renames: {
- 'vs/nls.mock.ts': 'vs/nls.ts'
}
});
});
@@ -136,7 +125,8 @@ const compileEditorESMTask = task.define('compile-editor-esm', () => {
let result;
if (process.platform === 'win32') {
result = cp.spawnSync(`..\\node_modules\\.bin\\tsc.cmd`, {
- cwd: path.join(__dirname, '../out-editor-esm')
+ cwd: path.join(__dirname, '../out-editor-esm'),
+ shell: true
});
} else {
result = cp.spawnSync(`node`, [`../node_modules/.bin/tsc`], {
@@ -198,49 +188,11 @@ const compileEditorESMTask = task.define('compile-editor-esm', () => {
}
console.log(`Open in VS Code the folder at '${destPath}' and you can analyze the compilation error`);
- throw new Error('Standalone Editor compilation failed. If this is the build machine, simply launch `yarn run gulp editor-distro` on your machine to further analyze the compilation problem.');
+ throw new Error('Standalone Editor compilation failed. If this is the build machine, simply launch `npm run gulp editor-distro` on your machine to further analyze the compilation problem.');
});
}
});
-/**
- * Go over all .js files in `/out-monaco-editor-core/esm/` and make sure that all imports
- * use `.js` at the end in order to be ESM compliant.
- */
-const appendJSToESMImportsTask = task.define('append-js-to-esm-imports', () => {
- const SRC_DIR = path.join(__dirname, '../out-monaco-editor-core/esm');
- const files = util.rreddir(SRC_DIR);
- for (const file of files) {
- const filePath = path.join(SRC_DIR, file);
- if (!/\.js$/.test(filePath)) {
- continue;
- }
-
- const contents = fs.readFileSync(filePath).toString();
- const lines = contents.split(/\r\n|\r|\n/g);
- const /** @type {string[]} */result = [];
- for (const line of lines) {
- if (!/^import/.test(line) && !/^export \* from/.test(line)) {
- // not an import
- result.push(line);
- continue;
- }
- if (/^import '[^']+\.css';/.test(line)) {
- // CSS import
- result.push(line);
- continue;
- }
- const modifiedLine = (
- line
- .replace(/^import(.*)\'([^']+)\'/, `import$1'$2.js'`)
- .replace(/^export \* from \'([^']+)\'/, `export * from '$1.js'`)
- );
- result.push(modifiedLine);
- }
- fs.writeFileSync(filePath, result.join('\n'));
- }
-});
-
/**
* @param {string} contents
*/
@@ -413,7 +365,6 @@ gulp.task('editor-distro',
task.series(
createESMSourcesAndResourcesTask,
compileEditorESMTask,
- appendJSToESMImportsTask
)
),
finalEditorResourcesTask
@@ -430,7 +381,6 @@ gulp.task('editor-esm',
extractEditorSrcTask,
createESMSourcesAndResourcesTask,
compileEditorESMTask,
- appendJSToESMImportsTask,
)
);
diff --git a/build/gulpfile.extensions.js b/build/gulpfile.extensions.js
index b85425bccfc..4f745aebdc7 100644
--- a/build/gulpfile.extensions.js
+++ b/build/gulpfile.extensions.js
@@ -48,7 +48,6 @@ const compilations = [
'extensions/json-language-features/client/tsconfig.json',
'extensions/json-language-features/server/tsconfig.json',
'extensions/markdown-language-features/preview-src/tsconfig.json',
- 'extensions/markdown-language-features/server/tsconfig.json',
'extensions/markdown-language-features/tsconfig.json',
'extensions/markdown-math/tsconfig.json',
'extensions/media-preview/tsconfig.json',
@@ -69,6 +68,7 @@ const compilations = [
'extensions/vscode-test-resolver/tsconfig.json',
'.vscode/extensions/vscode-selfhost-test-provider/tsconfig.json',
+ '.vscode/extensions/vscode-selfhost-import-aid/tsconfig.json',
];
const getBaseUrl = out => `https://main.vscode-cdn.net/sourcemaps/${commit}/${out}`;
@@ -101,7 +101,6 @@ const tasks = compilations.map(function (tsconfigFile) {
}
function createPipeline(build, emitError, transpileOnly) {
- const nlsDev = require('vscode-nls-dev');
const tsb = require('./lib/tsb');
const sourcemaps = require('gulp-sourcemaps');
@@ -126,7 +125,6 @@ const tasks = compilations.map(function (tsconfigFile) {
.pipe(tsFilter)
.pipe(util.loadSourcemaps())
.pipe(compilation())
- .pipe(build ? nlsDev.rewriteLocalizeCalls() : es.through())
.pipe(build ? util.stripSourceMappingURL() : es.through())
.pipe(sourcemaps.write('.', {
sourceMappingURL: !build ? null : f => `${baseUrl}/${f.relative}.map`,
@@ -136,9 +134,6 @@ const tasks = compilations.map(function (tsconfigFile) {
sourceRoot: '../src/',
}))
.pipe(tsFilter.restore)
- .pipe(build ? nlsDev.bundleMetaDataFiles(headerId, headerOut) : es.through())
- // Filter out *.nls.json file. We needed them only to bundle meta data file.
- .pipe(filter(['**', '!**/*.nls.json'], { dot: true }))
.pipe(reporter.end(emitError));
return es.duplex(input, output);
diff --git a/build/gulpfile.js b/build/gulpfile.js
index e945c06eed4..73f7f23cc0b 100644
--- a/build/gulpfile.js
+++ b/build/gulpfile.js
@@ -20,18 +20,18 @@ gulp.task(compileApiProposalNamesTask);
gulp.task(watchApiProposalNamesTask);
// SWC Client Transpile
-const transpileClientSWCTask = task.define('transpile-client-swc', task.series(util.rimraf('out'), util.buildWebNodePaths('out'), transpileTask('src', 'out', true)));
+const transpileClientSWCTask = task.define('transpile-client-swc', task.series(util.rimraf('out'), transpileTask('src', 'out', true)));
gulp.task(transpileClientSWCTask);
// Transpile only
-const transpileClientTask = task.define('transpile-client', task.series(util.rimraf('out'), util.buildWebNodePaths('out'), transpileTask('src', 'out')));
+const transpileClientTask = task.define('transpile-client', task.series(util.rimraf('out'), transpileTask('src', 'out')));
gulp.task(transpileClientTask);
// Fast compile for development time
-const compileClientTask = task.define('compile-client', task.series(util.rimraf('out'), util.buildWebNodePaths('out'), compileApiProposalNamesTask, compileTask('src', 'out', false)));
+const compileClientTask = task.define('compile-client', task.series(util.rimraf('out'), compileApiProposalNamesTask, compileTask('src', 'out', false)));
gulp.task(compileClientTask);
-const watchClientTask = task.define('watch-client', task.series(util.rimraf('out'), util.buildWebNodePaths('out'), task.parallel(watchTask('out', false), watchApiProposalNamesTask)));
+const watchClientTask = task.define('watch-client', task.series(util.rimraf('out'), task.parallel(watchTask('out', false), watchApiProposalNamesTask)));
gulp.task(watchClientTask);
// All
diff --git a/build/gulpfile.reh.js b/build/gulpfile.reh.js
index 4ab7dcbc4b6..94f7004fd14 100644
--- a/build/gulpfile.reh.js
+++ b/build/gulpfile.reh.js
@@ -12,11 +12,13 @@ const util = require('./lib/util');
const { getVersion } = require('./lib/getVersion');
const task = require('./lib/task');
const optimize = require('./lib/optimize');
+const { inlineMeta } = require('./lib/inlineMeta');
const product = require('../product.json');
const rename = require('gulp-rename');
const replace = require('gulp-replace');
const filter = require('gulp-filter');
const { getProductionDependencies } = require('./lib/dependencies');
+const { readISODate } = require('./lib/date');
const vfs = require('vinyl-fs');
const packageJson = require('../package.json');
const flatmap = require('gulp-flatmap');
@@ -26,9 +28,10 @@ const fs = require('fs');
const glob = require('glob');
const { compileBuildTask } = require('./gulpfile.compile');
const { compileExtensionsBuildTask, compileExtensionMediaBuildTask } = require('./gulpfile.extensions');
-const { vscodeWebEntryPoints, vscodeWebResourceIncludes, createVSCodeWebFileContentMapper } = require('./gulpfile.vscode.web');
+const { vscodeWebResourceIncludes, createVSCodeWebFileContentMapper } = require('./gulpfile.vscode.web');
const cp = require('child_process');
const log = require('fancy-log');
+const buildfile = require('./buildfile');
const REPO_ROOT = path.dirname(__dirname);
const commit = getVersion(REPO_ROOT);
@@ -39,6 +42,7 @@ const REMOTE_FOLDER = path.join(REPO_ROOT, 'remote');
const BUILD_TARGETS = [
{ platform: 'win32', arch: 'x64' },
+ { platform: 'win32', arch: 'arm64' },
{ platform: 'darwin', arch: 'x64' },
{ platform: 'darwin', arch: 'arm64' },
{ platform: 'linux', arch: 'x64' },
@@ -50,95 +54,108 @@ const BUILD_TARGETS = [
{ platform: 'linux', arch: 'alpine' },
];
-const serverResources = [
+const serverResourceIncludes = [
- // Bootstrap
- 'out-build/bootstrap.js',
- 'out-build/bootstrap-fork.js',
- 'out-build/bootstrap-amd.js',
- 'out-build/bootstrap-node.js',
-
- // Performance
- 'out-build/vs/base/common/performance.js',
+ // NLS
+ 'out-build/nls.messages.json',
// Process monitor
'out-build/vs/base/node/cpuUsage.sh',
'out-build/vs/base/node/ps.sh',
// Terminal shell integration
- 'out-build/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1',
- 'out-build/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh',
- 'out-build/vs/workbench/contrib/terminal/browser/media/shellIntegration-env.zsh',
- 'out-build/vs/workbench/contrib/terminal/browser/media/shellIntegration-profile.zsh',
- 'out-build/vs/workbench/contrib/terminal/browser/media/shellIntegration-rc.zsh',
- 'out-build/vs/workbench/contrib/terminal/browser/media/shellIntegration-login.zsh',
- 'out-build/vs/workbench/contrib/terminal/browser/media/fish_xdg_data/fish/vendor_conf.d/shellIntegration.fish',
+ 'out-build/vs/workbench/contrib/terminal/common/scripts/shellIntegration.ps1',
+ 'out-build/vs/workbench/contrib/terminal/common/scripts/CodeTabExpansion.psm1',
+ 'out-build/vs/workbench/contrib/terminal/common/scripts/GitTabExpansion.psm1',
+ 'out-build/vs/workbench/contrib/terminal/common/scripts/shellIntegration-bash.sh',
+ 'out-build/vs/workbench/contrib/terminal/common/scripts/shellIntegration-env.zsh',
+ 'out-build/vs/workbench/contrib/terminal/common/scripts/shellIntegration-profile.zsh',
+ 'out-build/vs/workbench/contrib/terminal/common/scripts/shellIntegration-rc.zsh',
+ 'out-build/vs/workbench/contrib/terminal/common/scripts/shellIntegration-login.zsh',
+ 'out-build/vs/workbench/contrib/terminal/common/scripts/fish_xdg_data/fish/vendor_conf.d/shellIntegration.fish',
+];
+
+const serverResourceExcludes = [
+ '!out-build/vs/**/{electron-sandbox,electron-main,electron-utility}/**',
+ '!out-build/vs/editor/standalone/**',
+ '!out-build/vs/workbench/**/*-tb.png',
'!**/test/**'
];
-const serverWithWebResources = [
+const serverResources = [
+ ...serverResourceIncludes,
+ ...serverResourceExcludes
+];
- // Include all of server...
- ...serverResources,
-
- // ...and all of web
+const serverWithWebResourceIncludes = [
+ ...serverResourceIncludes,
+ 'out-build/vs/code/browser/workbench/*.html',
...vscodeWebResourceIncludes
];
+const serverWithWebResourceExcludes = [
+ ...serverResourceExcludes,
+ '!out-build/vs/code/**/*-dev.html'
+];
+
+const serverWithWebResources = [
+ ...serverWithWebResourceIncludes,
+ ...serverWithWebResourceExcludes
+];
+
const serverEntryPoints = [
- {
- name: 'vs/server/node/server.main',
- exclude: ['vs/css', 'vs/nls']
- },
- {
- name: 'vs/server/node/server.cli',
- exclude: ['vs/css', 'vs/nls']
- },
+ // 'vs/server/node/server.main' is not included here because it gets inlined via ./src/server-main.js
+ // 'vs/server/node/server.cli' is not included here because it gets inlined via ./src/server-cli.js
{
name: 'vs/workbench/api/node/extensionHostProcess',
- exclude: ['vs/css', 'vs/nls']
+ exclude: ['vs/css']
},
{
name: 'vs/platform/files/node/watcher/watcherMain',
- exclude: ['vs/css', 'vs/nls']
+ exclude: ['vs/css']
},
{
name: 'vs/platform/terminal/node/ptyHostMain',
- exclude: ['vs/css', 'vs/nls']
+ exclude: ['vs/css']
}
];
+const webEntryPoints = [
+ buildfile.workerEditor,
+ buildfile.workerExtensionHost,
+ buildfile.workerNotebook,
+ buildfile.workerLanguageDetection,
+ buildfile.workerLocalFileSearch,
+ buildfile.workerOutputLinks,
+ buildfile.workerBackgroundTokenization,
+ buildfile.keyboardMaps,
+ buildfile.codeWeb
+].flat();
+
const serverWithWebEntryPoints = [
// Include all of server
...serverEntryPoints,
- // Include workbench web
- ...vscodeWebEntryPoints
+ // Include all of web
+ ...webEntryPoints,
+].flat();
+
+const bootstrapEntryPoints = [
+ 'out-build/server-main.js',
+ 'out-build/server-cli.js',
+ 'out-build/bootstrap-fork.js'
];
function getNodeVersion() {
- const yarnrc = fs.readFileSync(path.join(REPO_ROOT, 'remote', '.yarnrc'), 'utf8');
- const nodeVersion = /^target "(.*)"$/m.exec(yarnrc)[1];
- const internalNodeVersion = /^ms_build_id "(.*)"$/m.exec(yarnrc)[1];
+ const npmrc = fs.readFileSync(path.join(REPO_ROOT, 'remote', '.npmrc'), 'utf8');
+ const nodeVersion = /^target="(.*)"$/m.exec(npmrc)[1];
+ const internalNodeVersion = /^ms_build_id="(.*)"$/m.exec(npmrc)[1];
return { nodeVersion, internalNodeVersion };
}
-function getNodeChecksum(nodeVersion, platform, arch, glibcPrefix) {
- let expectedName;
- switch (platform) {
- case 'win32':
- expectedName = `win-${arch}/node.exe`;
- break;
-
- case 'darwin':
- case 'alpine':
- case 'linux':
- expectedName = `node-v${nodeVersion}${glibcPrefix}-${platform}-${arch}.tar.gz`;
- break;
- }
-
+function getNodeChecksum(expectedName) {
const nodeJsChecksums = fs.readFileSync(path.join(REPO_ROOT, 'build', 'checksums', 'nodejs.txt'), 'utf8');
for (const line of nodeJsChecksums.split('\n')) {
const [checksum, name] = line.split(/\s+/);
@@ -182,7 +199,6 @@ if (defaultNodeTask) {
function nodejs(platform, arch) {
const { fetchUrls, fetchGithub } = require('./lib/fetch');
const untar = require('gulp-untar');
- const crypto = require('crypto');
if (arch === 'armhf') {
arch = 'armv7l';
@@ -194,7 +210,24 @@ function nodejs(platform, arch) {
log(`Downloading node.js ${nodeVersion} ${platform} ${arch} from ${product.nodejsRepository}...`);
const glibcPrefix = process.env['VSCODE_NODE_GLIBC'] ?? '';
- const checksumSha256 = getNodeChecksum(nodeVersion, platform, arch, glibcPrefix);
+ let expectedName;
+ switch (platform) {
+ case 'win32':
+ expectedName = product.nodejsRepository !== 'https://nodejs.org' ?
+ `win-${arch}-node.exe` : `win-${arch}/node.exe`;
+ break;
+
+ case 'darwin':
+ expectedName = `node-v${nodeVersion}-${platform}-${arch}.tar.gz`;
+ break;
+ case 'linux':
+ expectedName = `node-v${nodeVersion}${glibcPrefix}-${platform}-${arch}.tar.gz`;
+ break;
+ case 'alpine':
+ expectedName = `node-v${nodeVersion}-linux-${arch}-musl.tar.gz`;
+ break;
+ }
+ const checksumSha256 = getNodeChecksum(expectedName);
if (checksumSha256) {
log(`Using SHA256 checksum for checking integrity: ${checksumSha256}`);
@@ -205,13 +238,13 @@ function nodejs(platform, arch) {
switch (platform) {
case 'win32':
return (product.nodejsRepository !== 'https://nodejs.org' ?
- fetchGithub(product.nodejsRepository, { version: `${nodeVersion}-${internalNodeVersion}`, name: `win-${arch}-node.exe`, checksumSha256 }) :
+ fetchGithub(product.nodejsRepository, { version: `${nodeVersion}-${internalNodeVersion}`, name: expectedName, checksumSha256 }) :
fetchUrls(`/dist/v${nodeVersion}/win-${arch}/node.exe`, { base: 'https://nodejs.org', checksumSha256 }))
.pipe(rename('node.exe'));
case 'darwin':
case 'linux':
return (product.nodejsRepository !== 'https://nodejs.org' ?
- fetchGithub(product.nodejsRepository, { version: `${nodeVersion}-${internalNodeVersion}`, name: `node-v${nodeVersion}${glibcPrefix}-${platform}-${arch}.tar.gz`, checksumSha256 }) :
+ fetchGithub(product.nodejsRepository, { version: `${nodeVersion}-${internalNodeVersion}`, name: expectedName, checksumSha256 }) :
fetchUrls(`/dist/v${nodeVersion}/node-v${nodeVersion}-${platform}-${arch}.tar.gz`, { base: 'https://nodejs.org', checksumSha256 })
).pipe(flatmap(stream => stream.pipe(gunzip()).pipe(untar())))
.pipe(filter('**/node'))
@@ -219,7 +252,7 @@ function nodejs(platform, arch) {
.pipe(rename('node'));
case 'alpine':
return product.nodejsRepository !== 'https://nodejs.org' ?
- fetchGithub(product.nodejsRepository, { version: `${nodeVersion}-${internalNodeVersion}`, name: `node-v${nodeVersion}-${platform}-${arch}.tar.gz`, checksumSha256 })
+ fetchGithub(product.nodejsRepository, { version: `${nodeVersion}-${internalNodeVersion}`, name: expectedName, checksumSha256 })
.pipe(flatmap(stream => stream.pipe(gunzip()).pipe(untar())))
.pipe(filter('**/node'))
.pipe(util.setExecutableBit('**'))
@@ -288,23 +321,32 @@ function packageTask(type, platform, arch, sourceFolderName, destinationFolderNa
}
const name = product.nameShort;
+
+ let packageJsonContents;
const packageJsonStream = gulp.src(['remote/package.json'], { base: 'remote' })
- .pipe(json({ name, version, dependencies: undefined, optionalDependencies: undefined }));
-
- const date = new Date().toISOString();
+ .pipe(json({ name, version, dependencies: undefined, optionalDependencies: undefined, ...{ type: 'module' } })) // TODO@esm this should be configured in the top level package.json
+ .pipe(es.through(function (file) {
+ packageJsonContents = file.contents.toString();
+ this.emit('data', file);
+ }));
+ let productJsonContents;
const productJsonStream = gulp.src(['product.json'], { base: '.' })
- .pipe(json({ commit, date, version }));
+ .pipe(json({ commit, date: readISODate('out-build'), version }))
+ .pipe(es.through(function (file) {
+ productJsonContents = file.contents.toString();
+ this.emit('data', file);
+ }));
const license = gulp.src(['remote/LICENSE'], { base: 'remote', allowEmpty: true });
const jsFilter = util.filter(data => !data.isDirectory() && /\.js$/.test(data.path));
const productionDependencies = getProductionDependencies(REMOTE_FOLDER);
- const dependenciesSrc = productionDependencies.map(d => path.relative(REPO_ROOT, d.path)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`, `!${d}/.bin/**`]).flat();
+ const dependenciesSrc = productionDependencies.map(d => path.relative(REPO_ROOT, d)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`, `!${d}/.bin/**`]).flat();
const deps = gulp.src(dependenciesSrc, { base: 'remote', dot: true })
// filter out unnecessary files, no source maps in server build
- .pipe(filter(['**', '!**/package-lock.json', '!**/yarn.lock', '!**/*.js.map']))
+ .pipe(filter(['**', '!**/package-lock.json', '!**/*.js.map']))
.pipe(util.cleanNodeModules(path.join(__dirname, '.moduleignore')))
.pipe(util.cleanNodeModules(path.join(__dirname, `.moduleignore.${process.platform}`)))
.pipe(jsFilter)
@@ -387,6 +429,12 @@ function packageTask(type, platform, arch, sourceFolderName, destinationFolderNa
);
}
+ result = inlineMeta(result, {
+ targetPaths: bootstrapEntryPoints,
+ packageJsonFn: () => packageJsonContents,
+ productJsonFn: () => productJsonContents
+ });
+
return result.pipe(vfs.dest(destination));
};
}
@@ -406,31 +454,14 @@ function tweakProductForServerWeb(product) {
optimize.optimizeTask(
{
out: `out-vscode-${type}`,
- amd: {
- src: 'out-build',
- entryPoints: (type === 'reh' ? serverEntryPoints : serverWithWebEntryPoints).flat(),
- otherSources: [],
- resources: type === 'reh' ? serverResources : serverWithWebResources,
- loaderConfig: optimize.loaderConfig(),
- inlineAmdImages: true,
- bundleInfo: undefined,
- fileContentMapper: createVSCodeWebFileContentMapper('.build/extensions', type === 'reh-web' ? tweakProductForServerWeb(product) : product)
- },
- commonJS: {
+ esm: {
src: 'out-build',
entryPoints: [
- 'out-build/server-main.js',
- 'out-build/server-cli.js'
+ ...(type === 'reh' ? serverEntryPoints : serverWithWebEntryPoints),
+ ...bootstrapEntryPoints
],
- platform: 'node',
- external: [
- 'minimist',
- // TODO: we cannot inline `product.json` because
- // it is being changed during build time at a later
- // point in time (such as `checksums`)
- '../product.json',
- '../package.json'
- ]
+ resources: type === 'reh' ? serverResources : serverWithWebResources,
+ fileContentMapper: createVSCodeWebFileContentMapper('.build/extensions', type === 'reh-web' ? tweakProductForServerWeb(product) : product)
}
}
)
diff --git a/build/gulpfile.scan.js b/build/gulpfile.scan.js
index 6f8144b0954..582481bf1eb 100644
--- a/build/gulpfile.scan.js
+++ b/build/gulpfile.scan.js
@@ -26,6 +26,9 @@ const BUILD_TARGETS = [
{ platform: 'linux', arch: 'arm64' },
];
+// The following files do not have PDBs downloaded for them during the download symbols process.
+const excludedCheckList = ['d3dcompiler_47.dll'];
+
BUILD_TARGETS.forEach(buildTarget => {
const dashed = (/** @type {string | null} */ str) => (str ? `-${str}` : ``);
const platform = buildTarget.platform;
@@ -46,7 +49,6 @@ BUILD_TARGETS.forEach(buildTarget => {
if (platform === 'win32') {
tasks.push(
() => electron.dest(destinationPdb, { ...config, platform, arch: arch === 'armhf' ? 'arm' : arch, pdbs: true }),
- util.rimraf(path.join(destinationExe, 'd3dcompiler_47.dll')),
() => confirmPdbsExist(destinationExe, destinationPdb)
);
}
@@ -71,7 +73,7 @@ BUILD_TARGETS.forEach(buildTarget => {
function nodeModules(destinationExe, destinationPdb, platform) {
const productionDependencies = deps.getProductionDependencies(root);
- const dependenciesSrc = productionDependencies.map(d => path.relative(root, d.path)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`]).flat();
+ const dependenciesSrc = productionDependencies.map(d => path.relative(root, d)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`]).flat();
const exe = () => {
return gulp.src(dependenciesSrc, { base: '.', dot: true })
@@ -110,6 +112,10 @@ function nodeModules(destinationExe, destinationPdb, platform) {
function confirmPdbsExist(destinationExe, destinationPdb) {
readdirSync(destinationExe).forEach(file => {
+ if (excludedCheckList.includes(file)) {
+ return;
+ }
+
if (file.endsWith('.dll') || file.endsWith('.exe')) {
const pdb = `${file}.pdb`;
if (!existsSync(path.join(destinationPdb, pdb))) {
diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js
index c6202c70883..03f446fdc2b 100644
--- a/build/gulpfile.vscode.js
+++ b/build/gulpfile.vscode.js
@@ -6,10 +6,7 @@
'use strict';
const gulp = require('gulp');
-const merge = require('gulp-merge-json');
const fs = require('fs');
-const os = require('os');
-const cp = require('child_process');
const path = require('path');
const es = require('event-stream');
const vfs = require('vinyl-fs');
@@ -18,9 +15,11 @@ const replace = require('gulp-replace');
const filter = require('gulp-filter');
const util = require('./lib/util');
const { getVersion } = require('./lib/getVersion');
+const { readISODate } = require('./lib/date');
const task = require('./lib/task');
-const buildfile = require('../src/buildfile');
+const buildfile = require('./buildfile');
const optimize = require('./lib/optimize');
+const { inlineMeta } = require('./lib/inlineMeta');
const root = path.dirname(__dirname);
const commit = getVersion(root);
const packageJson = require('../package.json');
@@ -39,44 +38,84 @@ const rcedit = promisify(require('rcedit'));
// Build
const vscodeEntryPoints = [
- buildfile.entrypoint('vs/workbench/workbench.desktop.main'),
- buildfile.base,
+ buildfile.workerEditor,
buildfile.workerExtensionHost,
buildfile.workerNotebook,
buildfile.workerLanguageDetection,
buildfile.workerLocalFileSearch,
buildfile.workerProfileAnalysis,
+ buildfile.workerOutputLinks,
+ buildfile.workerBackgroundTokenization,
buildfile.workbenchDesktop,
buildfile.code
].flat();
-const vscodeResources = [
- 'out-build/bootstrap.js',
- 'out-build/bootstrap-fork.js',
- 'out-build/bootstrap-amd.js',
- 'out-build/bootstrap-node.js',
- 'out-build/bootstrap-window.js',
- 'out-build/vs/**/*.{svg,png,html,jpg,mp3}',
- '!out-build/vs/code/browser/**/*.html',
- '!out-build/vs/code/**/*-dev.html',
- '!out-build/vs/editor/standalone/**/*.svg',
- 'out-build/vs/base/common/performance.js',
- 'out-build/vs/base/node/{stdForkStart.js,terminateProcess.sh,cpuUsage.sh,ps.sh}',
- 'out-build/vs/base/browser/ui/codicons/codicon/**',
+const vscodeResourceIncludes = [
+
+ // NLS
+ 'out-build/nls.messages.json',
+ 'out-build/nls.keys.json',
+
+ // Workbench
+ 'out-build/vs/code/electron-sandbox/workbench/workbench.html',
+
+ // Electron Preload
'out-build/vs/base/parts/sandbox/electron-sandbox/preload.js',
'out-build/vs/base/parts/sandbox/electron-sandbox/preload-aux.js',
- 'out-build/vs/workbench/browser/media/*-theme.css',
- 'out-build/vs/workbench/contrib/debug/**/*.json',
+
+ // Node Scripts
+ 'out-build/vs/base/node/{terminateProcess.sh,cpuUsage.sh,ps.sh}',
+
+ // Touchbar
+ 'out-build/vs/workbench/browser/parts/editor/media/*.png',
+ 'out-build/vs/workbench/contrib/debug/browser/media/*.png',
+
+ // External Terminal
'out-build/vs/workbench/contrib/externalTerminal/**/*.scpt',
- 'out-build/vs/workbench/contrib/terminal/browser/media/fish_xdg_data/fish/vendor_conf.d/*.fish',
- 'out-build/vs/workbench/contrib/terminal/browser/media/*.ps1',
- 'out-build/vs/workbench/contrib/terminal/browser/media/*.sh',
- 'out-build/vs/workbench/contrib/terminal/browser/media/*.zsh',
- 'out-build/vs/workbench/contrib/webview/browser/pre/*.js',
- '!out-build/vs/workbench/contrib/issue/browser/*.html',
+
+ // Terminal shell integration
+ 'out-build/vs/workbench/contrib/terminal/common/scripts/fish_xdg_data/fish/vendor_conf.d/*.fish',
+ 'out-build/vs/workbench/contrib/terminal/common/scripts/*.ps1',
+ 'out-build/vs/workbench/contrib/terminal/common/scripts/*.psm1',
+ 'out-build/vs/workbench/contrib/terminal/common/scripts/*.sh',
+ 'out-build/vs/workbench/contrib/terminal/common/scripts/*.zsh',
+
+ // Accessibility Signals
+ 'out-build/vs/platform/accessibilitySignal/browser/media/*.mp3',
+
+ // Welcome
+ 'out-build/vs/workbench/contrib/welcomeGettingStarted/common/media/**/*.{svg,png}',
+
+ // Extensions
+ 'out-build/vs/workbench/contrib/extensions/browser/media/{theme-icon.png,language-icon.svg}',
+ 'out-build/vs/workbench/services/extensionManagement/common/media/*.{svg,png}',
+
+ // Webview
+ 'out-build/vs/workbench/contrib/webview/browser/pre/*.{js,html}',
+
+ // Extension Host Worker
+ 'out-build/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html',
+
+ // Process Explorer
+ 'out-build/vs/code/electron-sandbox/processExplorer/processExplorer.html',
+
+ // Tree Sitter highlights
+ 'out-build/vs/editor/common/languages/highlights/*.scm',
+
+ // Issue Reporter
+ 'out-build/vs/workbench/contrib/issue/electron-sandbox/issueReporter.html'
+];
+
+const vscodeResources = [
+
+ // Includes
+ ...vscodeResourceIncludes,
+
+ // Excludes
+ '!out-build/vs/code/browser/**',
+ '!out-build/vs/editor/standalone/**',
+ '!out-build/vs/code/**/*-dev.html',
'!out-build/vs/workbench/contrib/issue/**/*-dev.html',
- 'out-build/vs/**/markdown.css',
- 'out-build/vs/workbench/contrib/tasks/**/*.json',
'!**/test/**'
];
@@ -84,43 +123,31 @@ const vscodeResources = [
// be inlined into the target window file in this order
// and they depend on each other in this way.
const windowBootstrapFiles = [
- 'out-build/bootstrap.js',
- 'out-build/vs/loader.js',
'out-build/bootstrap-window.js'
];
+const bootstrapEntryPoints = [
+ 'out-build/main.js',
+ 'out-build/cli.js',
+ 'out-build/bootstrap-fork.js'
+];
+
const optimizeVSCodeTask = task.define('optimize-vscode', task.series(
util.rimraf('out-vscode'),
// Optimize: bundles source files automatically based on
- // AMD and CommonJS import statements based on the passed
- // in entry points. In addition, concat window related
- // bootstrap files into a single file.
+ // import statements based on the passed in entry points.
+ // In addition, concat window related bootstrap files into
+ // a single file.
optimize.optimizeTask(
{
out: 'out-vscode',
- amd: {
- src: 'out-build',
- entryPoints: vscodeEntryPoints,
- resources: vscodeResources,
- loaderConfig: optimize.loaderConfig(),
- bundleInfo: undefined
- },
- commonJS: {
+ esm: {
src: 'out-build',
entryPoints: [
- 'out-build/main.js',
- 'out-build/cli.js'
+ ...vscodeEntryPoints,
+ ...bootstrapEntryPoints
],
- platform: 'node',
- external: [
- 'electron',
- 'minimist',
- // TODO: we cannot inline `product.json` because
- // it is being changed during build time at a later
- // point in time (such as `checksums`)
- '../product.json',
- '../package.json',
- ]
+ resources: vscodeResources
},
manual: [
{ src: [...windowBootstrapFiles, 'out-build/vs/code/electron-sandbox/workbench/workbench.js'], out: 'vs/code/electron-sandbox/workbench/workbench.js' },
@@ -242,21 +269,28 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op
}
const name = product.nameShort;
- const packageJsonUpdates = { name, version };
+ const packageJsonUpdates = { name, version, ...{ type: 'module', main: 'out/main.js' } }; // TODO@esm this should be configured in the top level package.json
// for linux url handling
if (platform === 'linux') {
packageJsonUpdates.desktopName = `${product.applicationName}-url-handler.desktop`;
}
+ let packageJsonContents;
const packageJsonStream = gulp.src(['package.json'], { base: '.' })
- .pipe(json(packageJsonUpdates));
-
- const date = new Date().toISOString();
- const productJsonUpdate = { commit, date, checksums, version };
+ .pipe(json(packageJsonUpdates))
+ .pipe(es.through(function (file) {
+ packageJsonContents = file.contents.toString();
+ this.emit('data', file);
+ }));
+ let productJsonContents;
const productJsonStream = gulp.src(['product.json'], { base: '.' })
- .pipe(json(productJsonUpdate));
+ .pipe(json({ commit, date: readISODate('out-build'), checksums, version }))
+ .pipe(es.through(function (file) {
+ productJsonContents = file.contents.toString();
+ this.emit('data', file);
+ }));
const license = gulp.src([product.licenseFileName, 'ThirdPartyNotices.txt', 'licenses/**'], { base: '.', allowEmpty: true });
@@ -268,7 +302,7 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op
const jsFilter = util.filter(data => !data.isDirectory() && /\.js$/.test(data.path));
const root = path.resolve(path.join(__dirname, '..'));
const productionDependencies = getProductionDependencies(root);
- const dependenciesSrc = productionDependencies.map(d => path.relative(root, d.path)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`]).flat();
+ const dependenciesSrc = productionDependencies.map(d => path.relative(root, d)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`, `!**/*.mk`]).flat();
const deps = gulp.src(dependenciesSrc, { base: '.', dot: true })
.pipe(filter(['**', `!**/${config.version}/**`, '!**/bin/darwin-arm64-87/**', '!**/package-lock.json', '!**/yarn.lock', '!**/*.js.map']))
@@ -281,10 +315,16 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op
'**/*.node',
'**/@vscode/ripgrep/bin/*',
'**/node-pty/build/Release/*',
+ '**/node-pty/build/Release/conpty/*',
'**/node-pty/lib/worker/conoutSocketWorker.js',
'**/node-pty/lib/shared/conout.js',
'**/*.wasm',
'**/@vscode/vsce-sign/bin/*',
+ ], [
+ '**/*.mk',
+ '!node_modules/vsda/**' // stay compatible with extensions that depend on us shipping `vsda` into ASAR
+ ], [
+ 'node_modules/vsda/**' // retain copy of `vsda` in node_modules for internal use
], 'node_modules.asar'));
let all = es.merge(
@@ -389,6 +429,12 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op
.pipe(rename('bin/' + product.applicationName)));
}
+ result = inlineMeta(result, {
+ targetPaths: bootstrapEntryPoints,
+ packageJsonFn: () => packageJsonContents,
+ productJsonFn: () => productJsonContents
+ });
+
return result.pipe(vfs.dest(destination));
};
}
@@ -397,7 +443,7 @@ function patchWin32DependenciesTask(destinationFolderName) {
const cwd = path.join(path.dirname(root), destinationFolderName);
return async () => {
- const deps = await glob('**/*.node', { cwd });
+ const deps = await glob('**/*.node', { cwd, ignore: 'extensions/node_modules/@parcel/watcher/**' });
const packageJson = JSON.parse(await fs.promises.readFile(path.join(cwd, 'resources', 'app', 'package.json'), 'utf8'));
const product = JSON.parse(await fs.promises.readFile(path.join(cwd, 'resources', 'app', 'product.json'), 'utf8'));
const baseVersion = packageJson.version.replace(/-.*$/, '');
@@ -496,17 +542,12 @@ gulp.task(task.define(
core,
compileExtensionsBuildTask,
function () {
- const pathToMetadata = './out-vscode/nls.metadata.json';
- const pathToRehWebMetadata = './out-vscode-reh-web/nls.metadata.json';
+ const pathToMetadata = './out-build/nls.metadata.json';
const pathToExtensions = '.build/extensions/*';
const pathToSetup = 'build/win32/i18n/messages.en.isl';
return es.merge(
- gulp.src([pathToMetadata, pathToRehWebMetadata]).pipe(merge({
- fileName: 'nls.metadata.json',
- jsonSpace: '',
- concatArrays: true
- })).pipe(i18n.createXlfFilesForCoreBundle()),
+ gulp.src(pathToMetadata).pipe(i18n.createXlfFilesForCoreBundle()),
gulp.src(pathToSetup).pipe(i18n.createXlfFilesForIsl()),
gulp.src(pathToExtensions).pipe(i18n.createXlfFilesForExtensions())
).pipe(vfs.dest('../vscode-translations-export'));
diff --git a/build/gulpfile.vscode.linux.js b/build/gulpfile.vscode.linux.js
index 28ddfb04c3d..5fa5a5d136e 100644
--- a/build/gulpfile.vscode.linux.js
+++ b/build/gulpfile.vscode.linux.js
@@ -108,7 +108,11 @@ function prepareDebPackage(arch) {
.pipe(replace('@@NAME@@', product.applicationName))
.pipe(rename('DEBIAN/postinst'));
- const all = es.merge(control, postinst, postrm, prerm, desktops, appdata, workspaceMime, icon, bash_completion, zsh_completion, code);
+ const templates = gulp.src('resources/linux/debian/templates.template', { base: '.' })
+ .pipe(replace('@@NAME@@', product.applicationName))
+ .pipe(rename('DEBIAN/templates'));
+
+ const all = es.merge(control, templates, postinst, postrm, prerm, desktops, appdata, workspaceMime, icon, bash_completion, zsh_completion, code);
return all.pipe(vfs.dest(destination));
};
@@ -148,6 +152,7 @@ function getRpmPackageArch(arch) {
function prepareRpmPackage(arch) {
const binaryDir = '../VSCode-linux-' + arch;
const rpmArch = getRpmPackageArch(arch);
+ const stripBinary = process.env['STRIP'] ?? '/usr/bin/strip';
return function () {
const desktop = gulp.src('resources/linux/code.desktop', { base: '.' })
@@ -204,6 +209,7 @@ function prepareRpmPackage(arch) {
.pipe(replace('@@QUALITY@@', product.quality || '@@QUALITY@@'))
.pipe(replace('@@UPDATEURL@@', product.updateUrl || '@@UPDATEURL@@'))
.pipe(replace('@@DEPENDENCIES@@', dependencies.join(', ')))
+ .pipe(replace('@@STRIP@@', stripBinary))
.pipe(rename('SPECS/' + product.applicationName + '.spec'))
.pipe(es.through(function (f) { that.emit('data', f); }, function () { that.emit('end'); }));
}));
diff --git a/build/gulpfile.vscode.web.js b/build/gulpfile.vscode.web.js
index 50c7e6fb631..ce65c7e028b 100644
--- a/build/gulpfile.vscode.web.js
+++ b/build/gulpfile.vscode.web.js
@@ -12,15 +12,16 @@ const util = require('./lib/util');
const { getVersion } = require('./lib/getVersion');
const task = require('./lib/task');
const optimize = require('./lib/optimize');
+const { readISODate } = require('./lib/date');
const product = require('../product.json');
const rename = require('gulp-rename');
const filter = require('gulp-filter');
const { getProductionDependencies } = require('./lib/dependencies');
const vfs = require('vinyl-fs');
-const replace = require('gulp-replace');
const packageJson = require('../package.json');
const { compileBuildTask } = require('./gulpfile.compile');
const extensions = require('./lib/extensions');
+const VinylFile = require('vinyl');
const REPO_ROOT = path.dirname(__dirname);
const BUILD_ROOT = path.dirname(REPO_ROOT);
@@ -31,21 +32,28 @@ const quality = product.quality;
const version = (quality && quality !== 'stable') ? `${packageJson.version}-${quality}` : packageJson.version;
const vscodeWebResourceIncludes = [
- // Workbench
- 'out-build/vs/{base,platform,editor,workbench}/**/*.{svg,png,jpg,mp3}',
- 'out-build/vs/code/browser/workbench/*.html',
- 'out-build/vs/base/browser/ui/codicons/codicon/**/*.ttf',
- 'out-build/vs/**/markdown.css',
+
+ // NLS
+ 'out-build/nls.messages.js',
+
+ // Accessibility Signals
+ 'out-build/vs/platform/accessibilitySignal/browser/media/*.mp3',
+
+ // Welcome
+ 'out-build/vs/workbench/contrib/welcomeGettingStarted/common/media/**/*.{svg,png}',
+
+ // Extensions
+ 'out-build/vs/workbench/contrib/extensions/browser/media/{theme-icon.png,language-icon.svg}',
+ 'out-build/vs/workbench/services/extensionManagement/common/media/*.{svg,png}',
// Webview
- 'out-build/vs/workbench/contrib/webview/browser/pre/*.js',
- 'out-build/vs/workbench/contrib/webview/browser/pre/*.html',
+ 'out-build/vs/workbench/contrib/webview/browser/pre/*.{js,html}',
- // Extension Worker
+ // Tree Sitter highlights
+ 'out-build/vs/editor/common/languages/highlights/*.scm',
+
+ // Extension Host Worker
'out-build/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html',
-
- // Web node paths (needed for integration tests)
- 'out-build/vs/webPackagePaths.js',
];
exports.vscodeWebResourceIncludes = vscodeWebResourceIncludes;
@@ -55,28 +63,27 @@ const vscodeWebResources = [
...vscodeWebResourceIncludes,
// Excludes
- '!out-build/vs/**/{node,electron-sandbox,electron-main}/**',
+ '!out-build/vs/**/{node,electron-sandbox,electron-main,electron-utility}/**',
'!out-build/vs/editor/standalone/**',
'!out-build/vs/workbench/**/*-tb.png',
+ '!out-build/vs/code/**/*-dev.html',
'!**/test/**'
];
-const buildfile = require('../src/buildfile');
+const buildfile = require('./buildfile');
const vscodeWebEntryPoints = [
- buildfile.entrypoint('vs/workbench/workbench.web.main'),
- buildfile.base,
+ buildfile.workerEditor,
buildfile.workerExtensionHost,
buildfile.workerNotebook,
buildfile.workerLanguageDetection,
buildfile.workerLocalFileSearch,
- buildfile.workerProfileAnalysis,
+ buildfile.workerOutputLinks,
+ buildfile.workerBackgroundTokenization,
buildfile.keyboardMaps,
- buildfile.workbenchWeb
+ buildfile.workbenchWeb,
+ buildfile.entrypoint('vs/workbench/workbench.web.main.internal') // TODO@esm remove line when we stop supporting web-amd-esm-bridge
].flat();
-exports.vscodeWebEntryPoints = vscodeWebEntryPoints;
-
-const buildDate = new Date().toISOString();
/**
* @param {object} product The parsed product.json file contents
@@ -93,7 +100,7 @@ const createVSCodeWebProductConfigurationPatcher = (product) => {
...product,
version,
commit,
- date: buildDate
+ date: readISODate('out-build')
});
return content.replace('/*BUILD->INSERT_PRODUCT_CONFIGURATION*/', () => productConfiguration.substr(1, productConfiguration.length - 2) /* without { and }*/);
}
@@ -157,15 +164,10 @@ const optimizeVSCodeWebTask = task.define('optimize-vscode-web', task.series(
optimize.optimizeTask(
{
out: 'out-vscode-web',
- amd: {
+ esm: {
src: 'out-build',
- entryPoints: vscodeWebEntryPoints.flat(),
- otherSources: [],
+ entryPoints: vscodeWebEntryPoints,
resources: vscodeWebResources,
- loaderConfig: optimize.loaderConfig(),
- externalLoaderInfo: util.createExternalLoaderConfig(product.webEndpointUrl, commit, quality),
- inlineAmdImages: true,
- bundleInfo: undefined,
fileContentMapper: createVSCodeWebFileContentMapper('.build/web/extensions', product)
}
}
@@ -190,8 +192,21 @@ function packageTask(sourceFolderName, destinationFolderName) {
const extensions = gulp.src('.build/web/extensions/**', { base: '.build/web', dot: true });
- const sources = es.merge(src, extensions)
- .pipe(filter(['**', '!**/*.js.map'], { dot: true }));
+ const loader = gulp.src('build/loader.min', { base: 'build', dot: true }).pipe(rename('out/vs/loader.js')); // TODO@esm remove line when we stop supporting web-amd-esm-bridge
+
+ const sources = es.merge(src, extensions, loader)
+ .pipe(filter(['**', '!**/*.js.map'], { dot: true }))
+ // TODO@esm remove me once we stop supporting our web-esm-bridge
+ .pipe(es.through(function (file) {
+ if (file.relative === 'out/vs/workbench/workbench.web.main.internal.css') {
+ this.emit('data', new VinylFile({
+ contents: file.contents,
+ path: file.path.replace('workbench.web.main.internal.css', 'workbench.web.main.css'),
+ base: file.base
+ }));
+ }
+ this.emit('data', file);
+ }));
const name = product.nameShort;
const packageJsonStream = gulp.src(['remote/web/package.json'], { base: 'remote/web' })
@@ -200,7 +215,7 @@ function packageTask(sourceFolderName, destinationFolderName) {
const license = gulp.src(['remote/LICENSE'], { base: 'remote', allowEmpty: true });
const productionDependencies = getProductionDependencies(WEB_FOLDER);
- const dependenciesSrc = productionDependencies.map(d => path.relative(REPO_ROOT, d.path)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`, `!${d}/.bin/**`]).flat();
+ const dependenciesSrc = productionDependencies.map(d => path.relative(REPO_ROOT, d)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`, `!${d}/.bin/**`]).flat();
const deps = gulp.src(dependenciesSrc, { base: 'remote/web', dot: true })
.pipe(filter(['**', '!**/package-lock.json']))
diff --git a/build/gulpfile.vscode.win32.js b/build/gulpfile.vscode.win32.js
index 5adfdfbfe18..98175f530dd 100644
--- a/build/gulpfile.vscode.win32.js
+++ b/build/gulpfile.vscode.win32.js
@@ -16,7 +16,6 @@ const pkg = require('../package.json');
const product = require('../product.json');
const vfs = require('vinyl-fs');
const rcedit = require('rcedit');
-const mkdirp = require('mkdirp');
const repoPath = path.dirname(__dirname);
const buildPath = (/** @type {string} */ arch) => path.join(path.dirname(repoPath), `VSCode-win32-${arch}`);
@@ -75,7 +74,7 @@ function buildWin32Setup(arch, target) {
const sourcePath = buildPath(arch);
const outputPath = setupDir(arch, target);
- mkdirp.sync(outputPath);
+ fs.mkdirSync(outputPath, { recursive: true });
const originalProductJsonPath = path.join(sourcePath, 'resources/app/product.json');
const productJsonPath = path.join(outputPath, 'product.json');
diff --git a/build/hygiene.js b/build/hygiene.js
index bc64a11f8e9..2edd9470c0b 100644
--- a/build/hygiene.js
+++ b/build/hygiene.js
@@ -21,7 +21,7 @@ const copyrightHeaderLines = [
];
function hygiene(some, linting = true) {
- const gulpeslint = require('gulp-eslint');
+ const eslint = require('./gulp-eslint');
const gulpstylelint = require('./stylelint');
const formatter = require('./lib/formatter');
@@ -145,11 +145,13 @@ function hygiene(some, linting = true) {
const productJsonFilter = filter('product.json', { restore: true });
const snapshotFilter = filter(['**', '!**/*.snap', '!**/*.snap.actual']);
+ const yarnLockFilter = filter(['**', '!**/yarn.lock']);
const unicodeFilterStream = filter(unicodeFilter, { restore: true });
const result = input
.pipe(filter((f) => !f.stat.isDirectory()))
.pipe(snapshotFilter)
+ .pipe(yarnLockFilter)
.pipe(productJsonFilter)
.pipe(process.env['BUILD_SOURCEVERSION'] ? es.through() : productJson)
.pipe(productJsonFilter.restore)
@@ -170,13 +172,7 @@ function hygiene(some, linting = true) {
result
.pipe(filter(eslintFilter))
.pipe(
- gulpeslint({
- configFile: '.eslintrc.json'
- })
- )
- .pipe(gulpeslint.formatEach('compact'))
- .pipe(
- gulpeslint.results((results) => {
+ eslint((results) => {
errorCount += results.warningCount;
errorCount += results.errorCount;
})
diff --git a/build/lib/asar.js b/build/lib/asar.js
index 31845f2f2dd..19285ef7100 100644
--- a/build/lib/asar.js
+++ b/build/lib/asar.js
@@ -11,7 +11,7 @@ const pickle = require('chromium-pickle-js');
const Filesystem = require('asar/lib/filesystem');
const VinylFile = require("vinyl");
const minimatch = require("minimatch");
-function createAsar(folderPath, unpackGlobs, destFilename) {
+function createAsar(folderPath, unpackGlobs, skipGlobs, duplicateGlobs, destFilename) {
const shouldUnpackFile = (file) => {
for (let i = 0; i < unpackGlobs.length; i++) {
if (minimatch(file.relative, unpackGlobs[i])) {
@@ -20,6 +20,24 @@ function createAsar(folderPath, unpackGlobs, destFilename) {
}
return false;
};
+ const shouldSkipFile = (file) => {
+ for (const skipGlob of skipGlobs) {
+ if (minimatch(file.relative, skipGlob)) {
+ return true;
+ }
+ }
+ return false;
+ };
+ // Files that should be duplicated between
+ // node_modules.asar and node_modules
+ const shouldDuplicateFile = (file) => {
+ for (const duplicateGlob of duplicateGlobs) {
+ if (minimatch(file.relative, duplicateGlob)) {
+ return true;
+ }
+ }
+ return false;
+ };
const filesystem = new Filesystem(folderPath);
const out = [];
// Keep track of pending inserts
@@ -64,6 +82,23 @@ function createAsar(folderPath, unpackGlobs, destFilename) {
if (!file.stat.isFile()) {
throw new Error(`unknown item in stream!`);
}
+ if (shouldSkipFile(file)) {
+ this.queue(new VinylFile({
+ base: '.',
+ path: file.path,
+ stat: file.stat,
+ contents: file.contents
+ }));
+ return;
+ }
+ if (shouldDuplicateFile(file)) {
+ this.queue(new VinylFile({
+ base: '.',
+ path: file.path,
+ stat: file.stat,
+ contents: file.contents
+ }));
+ }
const shouldUnpack = shouldUnpackFile(file);
insertFile(file.relative, { size: file.contents.length, mode: file.stat.mode }, shouldUnpack);
if (shouldUnpack) {
diff --git a/build/lib/asar.ts b/build/lib/asar.ts
index 44a6416bdfb..0b225ab1624 100644
--- a/build/lib/asar.ts
+++ b/build/lib/asar.ts
@@ -17,7 +17,7 @@ declare class AsarFilesystem {
insertFile(path: string, shouldUnpack: boolean, file: { stat: { size: number; mode: number } }, options: {}): Promise;
}
-export function createAsar(folderPath: string, unpackGlobs: string[], destFilename: string): NodeJS.ReadWriteStream {
+export function createAsar(folderPath: string, unpackGlobs: string[], skipGlobs: string[], duplicateGlobs: string[], destFilename: string): NodeJS.ReadWriteStream {
const shouldUnpackFile = (file: VinylFile): boolean => {
for (let i = 0; i < unpackGlobs.length; i++) {
@@ -28,6 +28,26 @@ export function createAsar(folderPath: string, unpackGlobs: string[], destFilena
return false;
};
+ const shouldSkipFile = (file: VinylFile): boolean => {
+ for (const skipGlob of skipGlobs) {
+ if (minimatch(file.relative, skipGlob)) {
+ return true;
+ }
+ }
+ return false;
+ };
+
+ // Files that should be duplicated between
+ // node_modules.asar and node_modules
+ const shouldDuplicateFile = (file: VinylFile): boolean => {
+ for (const duplicateGlob of duplicateGlobs) {
+ if (minimatch(file.relative, duplicateGlob)) {
+ return true;
+ }
+ }
+ return false;
+ };
+
const filesystem = new Filesystem(folderPath);
const out: Buffer[] = [];
@@ -78,6 +98,23 @@ export function createAsar(folderPath: string, unpackGlobs: string[], destFilena
if (!file.stat.isFile()) {
throw new Error(`unknown item in stream!`);
}
+ if (shouldSkipFile(file)) {
+ this.queue(new VinylFile({
+ base: '.',
+ path: file.path,
+ stat: file.stat,
+ contents: file.contents
+ }));
+ return;
+ }
+ if (shouldDuplicateFile(file)) {
+ this.queue(new VinylFile({
+ base: '.',
+ path: file.path,
+ stat: file.stat,
+ contents: file.contents
+ }));
+ }
const shouldUnpack = shouldUnpackFile(file);
insertFile(file.relative, { size: file.contents.length, mode: file.stat.mode }, shouldUnpack);
diff --git a/build/lib/builtInExtensions.js b/build/lib/builtInExtensions.js
index 463ce16e18d..ac784c03506 100644
--- a/build/lib/builtInExtensions.js
+++ b/build/lib/builtInExtensions.js
@@ -16,7 +16,6 @@ const vfs = require("vinyl-fs");
const ext = require("./extensions");
const fancyLog = require("fancy-log");
const ansiColors = require("ansi-colors");
-const mkdirp = require('mkdirp');
const root = path.dirname(path.dirname(__dirname));
const productjson = JSON.parse(fs.readFileSync(path.join(__dirname, '../../product.json'), 'utf8'));
const builtInExtensions = productjson.builtInExtensions || [];
@@ -107,7 +106,7 @@ function readControlFile() {
}
}
function writeControlFile(control) {
- mkdirp.sync(path.dirname(controlFilePath));
+ fs.mkdirSync(path.dirname(controlFilePath), { recursive: true });
fs.writeFileSync(controlFilePath, JSON.stringify(control, null, 2));
}
function getBuiltInExtensions() {
diff --git a/build/lib/builtInExtensions.ts b/build/lib/builtInExtensions.ts
index fefed436bb9..8b831d42d44 100644
--- a/build/lib/builtInExtensions.ts
+++ b/build/lib/builtInExtensions.ts
@@ -15,8 +15,6 @@ import * as fancyLog from 'fancy-log';
import * as ansiColors from 'ansi-colors';
import { Stream } from 'stream';
-const mkdirp = require('mkdirp');
-
export interface IExtensionDefinition {
name: string;
version: string;
@@ -147,7 +145,7 @@ function readControlFile(): IControlFile {
}
function writeControlFile(control: IControlFile): void {
- mkdirp.sync(path.dirname(controlFilePath));
+ fs.mkdirSync(path.dirname(controlFilePath), { recursive: true });
fs.writeFileSync(controlFilePath, JSON.stringify(control, null, 2));
}
diff --git a/build/lib/builtInExtensionsCG.js b/build/lib/builtInExtensionsCG.js
index 30b6791b3a0..6a1e5ea539e 100644
--- a/build/lib/builtInExtensionsCG.js
+++ b/build/lib/builtInExtensionsCG.js
@@ -15,7 +15,7 @@ const builtInExtensions = productjson.builtInExtensions || [];
const webBuiltInExtensions = productjson.webBuiltInExtensions || [];
const token = process.env['GITHUB_TOKEN'];
const contentBasePath = 'raw.githubusercontent.com';
-const contentFileNames = ['package.json', 'package-lock.json', 'yarn.lock'];
+const contentFileNames = ['package.json', 'package-lock.json'];
async function downloadExtensionDetails(extension) {
const extensionLabel = `${extension.name}@${extension.version}`;
const repository = url.parse(extension.repo).path.substr(1);
@@ -58,9 +58,8 @@ async function downloadExtensionDetails(extension) {
if (!results.find(r => r.fileName === 'package.json')?.body) {
// throw new Error(`The "package.json" file could not be found for the built-in extension - ${extensionLabel}`);
}
- if (!results.find(r => r.fileName === 'package-lock.json')?.body &&
- !results.find(r => r.fileName === 'yarn.lock')?.body) {
- // throw new Error(`The "package-lock.json"/"yarn.lock" could not be found for the built-in extension - ${extensionLabel}`);
+ if (!results.find(r => r.fileName === 'package-lock.json')?.body) {
+ // throw new Error(`The "package-lock.json" could not be found for the built-in extension - ${extensionLabel}`);
}
}
async function main() {
diff --git a/build/lib/builtInExtensionsCG.ts b/build/lib/builtInExtensionsCG.ts
index 62d09498221..9d11dea3dca 100644
--- a/build/lib/builtInExtensionsCG.ts
+++ b/build/lib/builtInExtensionsCG.ts
@@ -17,7 +17,7 @@ const webBuiltInExtensions = productjson.webBuiltInExten
const token = process.env['GITHUB_TOKEN'];
const contentBasePath = 'raw.githubusercontent.com';
-const contentFileNames = ['package.json', 'package-lock.json', 'yarn.lock'];
+const contentFileNames = ['package.json', 'package-lock.json'];
async function downloadExtensionDetails(extension: IExtensionDefinition): Promise {
const extensionLabel = `${extension.name}@${extension.version}`;
@@ -61,9 +61,8 @@ async function downloadExtensionDetails(extension: IExtensionDefinition): Promis
if (!results.find(r => r.fileName === 'package.json')?.body) {
// throw new Error(`The "package.json" file could not be found for the built-in extension - ${extensionLabel}`);
}
- if (!results.find(r => r.fileName === 'package-lock.json')?.body &&
- !results.find(r => r.fileName === 'yarn.lock')?.body) {
- // throw new Error(`The "package-lock.json"/"yarn.lock" could not be found for the built-in extension - ${extensionLabel}`);
+ if (!results.find(r => r.fileName === 'package-lock.json')?.body) {
+ // throw new Error(`The "package-lock.json" could not be found for the built-in extension - ${extensionLabel}`);
}
}
diff --git a/build/lib/bundle.js b/build/lib/bundle.js
index 1a2f870991f..627b9966700 100644
--- a/build/lib/bundle.js
+++ b/build/lib/bundle.js
@@ -5,6 +5,7 @@
*--------------------------------------------------------------------------------------------*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.bundle = bundle;
+exports.removeAllTSBoilerplate = removeAllTSBoilerplate;
const fs = require("fs");
const path = require("path");
const vm = require("vm");
@@ -36,14 +37,10 @@ function bundle(entryPoints, config, callback) {
const loader = loaderModule.exports;
config.isBuild = true;
config.paths = config.paths || {};
- if (!config.paths['vs/nls']) {
- config.paths['vs/nls'] = 'out-build/vs/nls.build';
- }
if (!config.paths['vs/css']) {
config.paths['vs/css'] = 'out-build/vs/css.build';
}
config.buildForceInvokeFactory = config.buildForceInvokeFactory || {};
- config.buildForceInvokeFactory['vs/nls'] = true;
config.buildForceInvokeFactory['vs/css'] = true;
loader.config(config);
loader(['require'], (localRequire) => {
@@ -53,15 +50,11 @@ function bundle(entryPoints, config, callback) {
r += '.js';
}
// avoid packaging the build version of plugins:
- r = r.replace('vs/nls.build.js', 'vs/nls.js');
r = r.replace('vs/css.build.js', 'vs/css.js');
return { path: r, amdModuleId: entry.amdModuleId };
};
for (const moduleId in entryPointsMap) {
const entryPoint = entryPointsMap[moduleId];
- if (entryPoint.append) {
- entryPoint.append = entryPoint.append.map(resolvePath);
- }
if (entryPoint.prepend) {
entryPoint.prepend = entryPoint.prepend.map(resolvePath);
}
@@ -109,7 +102,7 @@ function emitEntryPoints(modules, entryPoints) {
return allDependencies[module];
});
bundleData.bundles[moduleToBundle] = includedModules;
- const res = emitEntryPoint(modulesMap, modulesGraph, moduleToBundle, includedModules, info.prepend || [], info.append || [], info.dest);
+ const res = emitEntryPoint(modulesMap, modulesGraph, moduleToBundle, includedModules, info.prepend || [], info.dest);
result = result.concat(res.files);
for (const pluginName in res.usedPlugins) {
usedPlugins[pluginName] = usedPlugins[pluginName] || res.usedPlugins[pluginName];
@@ -132,7 +125,7 @@ function emitEntryPoints(modules, entryPoints) {
});
return {
// TODO@TS 2.1.2
- files: extractStrings(removeDuplicateTSBoilerplate(result)),
+ files: extractStrings(removeAllDuplicateTSBoilerplate(result)),
bundleData: bundleData
};
}
@@ -221,61 +214,68 @@ function extractStrings(destFiles) {
});
return destFiles;
}
-function removeDuplicateTSBoilerplate(destFiles) {
- // Taken from typescript compiler => emitFiles
- const BOILERPLATE = [
- { start: /^var __extends/, end: /^}\)\(\);$/ },
- { start: /^var __assign/, end: /^};$/ },
- { start: /^var __decorate/, end: /^};$/ },
- { start: /^var __metadata/, end: /^};$/ },
- { start: /^var __param/, end: /^};$/ },
- { start: /^var __awaiter/, end: /^};$/ },
- { start: /^var __generator/, end: /^};$/ },
- { start: /^var __createBinding/, end: /^}\)\);$/ },
- { start: /^var __setModuleDefault/, end: /^}\);$/ },
- { start: /^var __importStar/, end: /^};$/ },
- ];
+function removeAllDuplicateTSBoilerplate(destFiles) {
destFiles.forEach((destFile) => {
const SEEN_BOILERPLATE = [];
destFile.sources.forEach((source) => {
- const lines = source.contents.split(/\r\n|\n|\r/);
- const newLines = [];
- let IS_REMOVING_BOILERPLATE = false, END_BOILERPLATE;
- for (let i = 0; i < lines.length; i++) {
- const line = lines[i];
- if (IS_REMOVING_BOILERPLATE) {
- newLines.push('');
- if (END_BOILERPLATE.test(line)) {
- IS_REMOVING_BOILERPLATE = false;
- }
- }
- else {
- for (let j = 0; j < BOILERPLATE.length; j++) {
- const boilerplate = BOILERPLATE[j];
- if (boilerplate.start.test(line)) {
- if (SEEN_BOILERPLATE[j]) {
- IS_REMOVING_BOILERPLATE = true;
- END_BOILERPLATE = boilerplate.end;
- }
- else {
- SEEN_BOILERPLATE[j] = true;
- }
- }
- }
- if (IS_REMOVING_BOILERPLATE) {
- newLines.push('');
- }
- else {
- newLines.push(line);
- }
- }
- }
- source.contents = newLines.join('\n');
+ source.contents = removeDuplicateTSBoilerplate(source.contents, SEEN_BOILERPLATE);
});
});
return destFiles;
}
-function emitEntryPoint(modulesMap, deps, entryPoint, includedModules, prepend, append, dest) {
+function removeAllTSBoilerplate(source) {
+ const seen = new Array(BOILERPLATE.length).fill(true, 0, 10);
+ return removeDuplicateTSBoilerplate(source, seen);
+}
+// Taken from typescript compiler => emitFiles
+const BOILERPLATE = [
+ { start: /^var __extends/, end: /^}\)\(\);$/ },
+ { start: /^var __assign/, end: /^};$/ },
+ { start: /^var __decorate/, end: /^};$/ },
+ { start: /^var __metadata/, end: /^};$/ },
+ { start: /^var __param/, end: /^};$/ },
+ { start: /^var __awaiter/, end: /^};$/ },
+ { start: /^var __generator/, end: /^};$/ },
+ { start: /^var __createBinding/, end: /^}\)\);$/ },
+ { start: /^var __setModuleDefault/, end: /^}\);$/ },
+ { start: /^var __importStar/, end: /^};$/ },
+];
+function removeDuplicateTSBoilerplate(source, SEEN_BOILERPLATE = []) {
+ const lines = source.split(/\r\n|\n|\r/);
+ const newLines = [];
+ let IS_REMOVING_BOILERPLATE = false, END_BOILERPLATE;
+ for (let i = 0; i < lines.length; i++) {
+ const line = lines[i];
+ if (IS_REMOVING_BOILERPLATE) {
+ newLines.push('');
+ if (END_BOILERPLATE.test(line)) {
+ IS_REMOVING_BOILERPLATE = false;
+ }
+ }
+ else {
+ for (let j = 0; j < BOILERPLATE.length; j++) {
+ const boilerplate = BOILERPLATE[j];
+ if (boilerplate.start.test(line)) {
+ if (SEEN_BOILERPLATE[j]) {
+ IS_REMOVING_BOILERPLATE = true;
+ END_BOILERPLATE = boilerplate.end;
+ }
+ else {
+ SEEN_BOILERPLATE[j] = true;
+ }
+ }
+ }
+ if (IS_REMOVING_BOILERPLATE) {
+ newLines.push('');
+ }
+ else {
+ newLines.push(line);
+ }
+ }
+ }
+ return newLines.join('\n');
+}
+function emitEntryPoint(modulesMap, deps, entryPoint, includedModules, prepend, dest) {
if (!dest) {
dest = entryPoint + '.js';
}
@@ -349,8 +349,7 @@ function emitEntryPoint(modulesMap, deps, entryPoint, includedModules, prepend,
};
};
const toPrepend = (prepend || []).map(toIFile);
- const toAppend = (append || []).map(toIFile);
- mainResult.sources = toPrepend.concat(mainResult.sources).concat(toAppend);
+ mainResult.sources = toPrepend.concat(mainResult.sources);
return {
files: results,
usedPlugins: usedPlugins
diff --git a/build/lib/bundle.ts b/build/lib/bundle.ts
index 2efa081b471..58995b7d5d1 100644
--- a/build/lib/bundle.ts
+++ b/build/lib/bundle.ts
@@ -51,8 +51,8 @@ export interface IEntryPoint {
name: string;
include?: string[];
exclude?: string[];
+ /** @deprecated unsupported by ESM */
prepend?: IExtraFile[];
- append?: IExtraFile[];
dest?: string;
}
@@ -138,14 +138,10 @@ export function bundle(entryPoints: IEntryPoint[], config: ILoaderConfig, callba
const loader: any = loaderModule.exports;
config.isBuild = true;
config.paths = config.paths || {};
- if (!config.paths['vs/nls']) {
- config.paths['vs/nls'] = 'out-build/vs/nls.build';
- }
if (!config.paths['vs/css']) {
config.paths['vs/css'] = 'out-build/vs/css.build';
}
config.buildForceInvokeFactory = config.buildForceInvokeFactory || {};
- config.buildForceInvokeFactory['vs/nls'] = true;
config.buildForceInvokeFactory['vs/css'] = true;
loader.config(config);
@@ -156,15 +152,11 @@ export function bundle(entryPoints: IEntryPoint[], config: ILoaderConfig, callba
r += '.js';
}
// avoid packaging the build version of plugins:
- r = r.replace('vs/nls.build.js', 'vs/nls.js');
r = r.replace('vs/css.build.js', 'vs/css.js');
return { path: r, amdModuleId: entry.amdModuleId };
};
for (const moduleId in entryPointsMap) {
const entryPoint = entryPointsMap[moduleId];
- if (entryPoint.append) {
- entryPoint.append = entryPoint.append.map(resolvePath);
- }
if (entryPoint.prepend) {
entryPoint.prepend = entryPoint.prepend.map(resolvePath);
}
@@ -228,7 +220,6 @@ function emitEntryPoints(modules: IBuildModuleInfo[], entryPoints: IEntryPointMa
moduleToBundle,
includedModules,
info.prepend || [],
- info.append || [],
info.dest
);
@@ -256,7 +247,7 @@ function emitEntryPoints(modules: IBuildModuleInfo[], entryPoints: IEntryPointMa
return {
// TODO@TS 2.1.2
- files: extractStrings(removeDuplicateTSBoilerplate(result)),
+ files: extractStrings(removeAllDuplicateTSBoilerplate(result)),
bundleData: bundleData
};
}
@@ -355,61 +346,70 @@ function extractStrings(destFiles: IConcatFile[]): IConcatFile[] {
return destFiles;
}
-function removeDuplicateTSBoilerplate(destFiles: IConcatFile[]): IConcatFile[] {
- // Taken from typescript compiler => emitFiles
- const BOILERPLATE = [
- { start: /^var __extends/, end: /^}\)\(\);$/ },
- { start: /^var __assign/, end: /^};$/ },
- { start: /^var __decorate/, end: /^};$/ },
- { start: /^var __metadata/, end: /^};$/ },
- { start: /^var __param/, end: /^};$/ },
- { start: /^var __awaiter/, end: /^};$/ },
- { start: /^var __generator/, end: /^};$/ },
- { start: /^var __createBinding/, end: /^}\)\);$/ },
- { start: /^var __setModuleDefault/, end: /^}\);$/ },
- { start: /^var __importStar/, end: /^};$/ },
- ];
-
+function removeAllDuplicateTSBoilerplate(destFiles: IConcatFile[]): IConcatFile[] {
destFiles.forEach((destFile) => {
const SEEN_BOILERPLATE: boolean[] = [];
destFile.sources.forEach((source) => {
- const lines = source.contents.split(/\r\n|\n|\r/);
- const newLines: string[] = [];
- let IS_REMOVING_BOILERPLATE = false, END_BOILERPLATE: RegExp;
-
- for (let i = 0; i < lines.length; i++) {
- const line = lines[i];
- if (IS_REMOVING_BOILERPLATE) {
- newLines.push('');
- if (END_BOILERPLATE!.test(line)) {
- IS_REMOVING_BOILERPLATE = false;
- }
- } else {
- for (let j = 0; j < BOILERPLATE.length; j++) {
- const boilerplate = BOILERPLATE[j];
- if (boilerplate.start.test(line)) {
- if (SEEN_BOILERPLATE[j]) {
- IS_REMOVING_BOILERPLATE = true;
- END_BOILERPLATE = boilerplate.end;
- } else {
- SEEN_BOILERPLATE[j] = true;
- }
- }
- }
- if (IS_REMOVING_BOILERPLATE) {
- newLines.push('');
- } else {
- newLines.push(line);
- }
- }
- }
- source.contents = newLines.join('\n');
+ source.contents = removeDuplicateTSBoilerplate(source.contents, SEEN_BOILERPLATE);
});
});
return destFiles;
}
+export function removeAllTSBoilerplate(source: string) {
+ const seen = new Array(BOILERPLATE.length).fill(true, 0, 10);
+ return removeDuplicateTSBoilerplate(source, seen);
+}
+
+// Taken from typescript compiler => emitFiles
+const BOILERPLATE = [
+ { start: /^var __extends/, end: /^}\)\(\);$/ },
+ { start: /^var __assign/, end: /^};$/ },
+ { start: /^var __decorate/, end: /^};$/ },
+ { start: /^var __metadata/, end: /^};$/ },
+ { start: /^var __param/, end: /^};$/ },
+ { start: /^var __awaiter/, end: /^};$/ },
+ { start: /^var __generator/, end: /^};$/ },
+ { start: /^var __createBinding/, end: /^}\)\);$/ },
+ { start: /^var __setModuleDefault/, end: /^}\);$/ },
+ { start: /^var __importStar/, end: /^};$/ },
+];
+
+function removeDuplicateTSBoilerplate(source: string, SEEN_BOILERPLATE: boolean[] = []): string {
+ const lines = source.split(/\r\n|\n|\r/);
+ const newLines: string[] = [];
+ let IS_REMOVING_BOILERPLATE = false, END_BOILERPLATE: RegExp;
+
+ for (let i = 0; i < lines.length; i++) {
+ const line = lines[i];
+ if (IS_REMOVING_BOILERPLATE) {
+ newLines.push('');
+ if (END_BOILERPLATE!.test(line)) {
+ IS_REMOVING_BOILERPLATE = false;
+ }
+ } else {
+ for (let j = 0; j < BOILERPLATE.length; j++) {
+ const boilerplate = BOILERPLATE[j];
+ if (boilerplate.start.test(line)) {
+ if (SEEN_BOILERPLATE[j]) {
+ IS_REMOVING_BOILERPLATE = true;
+ END_BOILERPLATE = boilerplate.end;
+ } else {
+ SEEN_BOILERPLATE[j] = true;
+ }
+ }
+ }
+ if (IS_REMOVING_BOILERPLATE) {
+ newLines.push('');
+ } else {
+ newLines.push(line);
+ }
+ }
+ }
+ return newLines.join('\n');
+}
+
interface IPluginMap {
[moduleId: string]: ILoaderPlugin;
}
@@ -425,7 +425,6 @@ function emitEntryPoint(
entryPoint: string,
includedModules: string[],
prepend: IExtraFile[],
- append: IExtraFile[],
dest: string | undefined
): IEmitEntryPointResult {
if (!dest) {
@@ -511,9 +510,8 @@ function emitEntryPoint(
};
const toPrepend = (prepend || []).map(toIFile);
- const toAppend = (append || []).map(toIFile);
- mainResult.sources = toPrepend.concat(mainResult.sources).concat(toAppend);
+ mainResult.sources = toPrepend.concat(mainResult.sources);
return {
files: results,
diff --git a/build/lib/compilation.js b/build/lib/compilation.js
index b44cbefe78a..e6fe4b592a6 100644
--- a/build/lib/compilation.js
+++ b/build/lib/compilation.js
@@ -41,7 +41,7 @@ function getTypeScriptCompilerOptions(src) {
options.newLine = /\r\n/.test(fs.readFileSync(__filename, 'utf8')) ? 0 : 1;
return options;
}
-function createCompile(src, build, emitError, transpileOnly) {
+function createCompile(src, { build, emitError, transpileOnly, preserveEnglish }) {
const tsb = require('./tsb');
const sourcemaps = require('gulp-sourcemaps');
const projectPath = path.join(__dirname, '../../', src, 'tsconfig.json');
@@ -71,7 +71,7 @@ function createCompile(src, build, emitError, transpileOnly) {
.pipe(util.loadSourcemaps())
.pipe(compilation(token))
.pipe(noDeclarationsFilter)
- .pipe(util.$if(build, nls.nls()))
+ .pipe(util.$if(build, nls.nls({ preserveEnglish })))
.pipe(noDeclarationsFilter.restore)
.pipe(util.$if(!transpileOnly, sourcemaps.write('.', {
addComment: false,
@@ -90,7 +90,7 @@ function createCompile(src, build, emitError, transpileOnly) {
}
function transpileTask(src, out, swc) {
const task = () => {
- const transpile = createCompile(src, false, true, { swc });
+ const transpile = createCompile(src, { build: false, emitError: true, transpileOnly: { swc }, preserveEnglish: false });
const srcPipe = gulp.src(`${src}/**`, { base: `${src}` });
return srcPipe
.pipe(transpile())
@@ -104,7 +104,7 @@ function compileTask(src, out, build, options = {}) {
if (os.totalmem() < 4_000_000_000) {
throw new Error('compilation requires 4GB of RAM');
}
- const compile = createCompile(src, build, true, false);
+ const compile = createCompile(src, { build, emitError: true, transpileOnly: false, preserveEnglish: !!options.preserveEnglish });
const srcPipe = gulp.src(`${src}/**`, { base: `${src}` });
const generator = new MonacoGenerator(false);
if (src === 'src') {
@@ -139,11 +139,11 @@ function compileTask(src, out, build, options = {}) {
task.taskName = `compile-${path.basename(src)}`;
return task;
}
-function watchTask(out, build) {
+function watchTask(out, build, srcPath = 'src') {
const task = () => {
- const compile = createCompile('src', build, false, false);
- const src = gulp.src('src/**', { base: 'src' });
- const watchSrc = watch('src/**', { base: 'src', readDelay: 200 });
+ const compile = createCompile(srcPath, { build, emitError: false, transpileOnly: false, preserveEnglish: false });
+ const src = gulp.src(`${srcPath}/**`, { base: srcPath });
+ const watchSrc = watch(`${srcPath}/**`, { base: srcPath, readDelay: 200 });
const generator = new MonacoGenerator(true);
generator.execute();
return watchSrc
@@ -234,7 +234,7 @@ class MonacoGenerator {
function generateApiProposalNames() {
let eol;
try {
- const src = fs.readFileSync('src/vs/workbench/services/extensions/common/extensionsApiProposals.ts', 'utf-8');
+ const src = fs.readFileSync('src/vs/platform/extensions/common/extensionsApiProposals.ts', 'utf-8');
const match = /\r?\n/m.exec(src);
eol = match ? match[0] : os.EOL;
}
@@ -242,18 +242,27 @@ function generateApiProposalNames() {
eol = os.EOL;
}
const pattern = /vscode\.proposed\.([a-zA-Z\d]+)\.d\.ts$/;
- const proposalNames = new Set();
+ const versionPattern = /^\s*\/\/\s*version\s*:\s*(\d+)\s*$/mi;
+ const proposals = new Map();
const input = es.through();
const output = input
.pipe(util.filter((f) => pattern.test(f.path)))
.pipe(es.through((f) => {
const name = path.basename(f.path);
const match = pattern.exec(name);
- if (match) {
- proposalNames.add(match[1]);
+ if (!match) {
+ return;
}
+ const proposalName = match[1];
+ const contents = f.contents.toString('utf8');
+ const versionMatch = versionPattern.exec(contents);
+ const version = versionMatch ? versionMatch[1] : undefined;
+ proposals.set(proposalName, {
+ proposal: `https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.${proposalName}.d.ts`,
+ version: version ? parseInt(version) : undefined
+ });
}, function () {
- const names = [...proposalNames.values()].sort();
+ const names = [...proposals.keys()].sort();
const contents = [
'/*---------------------------------------------------------------------------------------------',
' * Copyright (c) Microsoft Corporation. All rights reserved.',
@@ -262,14 +271,18 @@ function generateApiProposalNames() {
'',
'// THIS IS A GENERATED FILE. DO NOT EDIT DIRECTLY.',
'',
- 'export const allApiProposals = Object.freeze({',
- `${names.map(name => `\t${name}: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.${name}.d.ts'`).join(`,${eol}`)}`,
- '});',
- 'export type ApiProposalName = keyof typeof allApiProposals;',
+ 'const _allApiProposals = {',
+ `${names.map(proposalName => {
+ const proposal = proposals.get(proposalName);
+ return `\t${proposalName}: {${eol}\t\tproposal: '${proposal.proposal}',${eol}${proposal.version ? `\t\tversion: ${proposal.version}${eol}` : ''}\t}`;
+ }).join(`,${eol}`)}`,
+ '};',
+ 'export const allApiProposals = Object.freeze<{ [proposalName: string]: Readonly<{ proposal: string; version?: number }> }>(_allApiProposals);',
+ 'export type ApiProposalName = keyof typeof _allApiProposals;',
'',
].join(eol);
this.emit('data', new File({
- path: 'vs/workbench/services/extensions/common/extensionsApiProposals.ts',
+ path: 'vs/platform/extensions/common/extensionsApiProposals.ts',
contents: Buffer.from(contents)
}));
this.emit('end');
diff --git a/build/lib/compilation.ts b/build/lib/compilation.ts
index b88d0d29003..978fb15df9e 100644
--- a/build/lib/compilation.ts
+++ b/build/lib/compilation.ts
@@ -42,7 +42,14 @@ function getTypeScriptCompilerOptions(src: string): ts.CompilerOptions {
return options;
}
-function createCompile(src: string, build: boolean, emitError: boolean, transpileOnly: boolean | { swc: boolean }) {
+interface ICompileTaskOptions {
+ readonly build: boolean;
+ readonly emitError: boolean;
+ readonly transpileOnly: boolean | { swc: boolean };
+ readonly preserveEnglish: boolean;
+}
+
+function createCompile(src: string, { build, emitError, transpileOnly, preserveEnglish }: ICompileTaskOptions) {
const tsb = require('./tsb') as typeof import('./tsb');
const sourcemaps = require('gulp-sourcemaps') as typeof import('gulp-sourcemaps');
@@ -79,7 +86,7 @@ function createCompile(src: string, build: boolean, emitError: boolean, transpil
.pipe(util.loadSourcemaps())
.pipe(compilation(token))
.pipe(noDeclarationsFilter)
- .pipe(util.$if(build, nls.nls()))
+ .pipe(util.$if(build, nls.nls({ preserveEnglish })))
.pipe(noDeclarationsFilter.restore)
.pipe(util.$if(!transpileOnly, sourcemaps.write('.', {
addComment: false,
@@ -102,7 +109,7 @@ export function transpileTask(src: string, out: string, swc: boolean): task.Stre
const task = () => {
- const transpile = createCompile(src, false, true, { swc });
+ const transpile = createCompile(src, { build: false, emitError: true, transpileOnly: { swc }, preserveEnglish: false });
const srcPipe = gulp.src(`${src}/**`, { base: `${src}` });
return srcPipe
@@ -114,7 +121,7 @@ export function transpileTask(src: string, out: string, swc: boolean): task.Stre
return task;
}
-export function compileTask(src: string, out: string, build: boolean, options: { disableMangle?: boolean } = {}): task.StreamTask {
+export function compileTask(src: string, out: string, build: boolean, options: { disableMangle?: boolean; preserveEnglish?: boolean } = {}): task.StreamTask {
const task = () => {
@@ -122,7 +129,7 @@ export function compileTask(src: string, out: string, build: boolean, options: {
throw new Error('compilation requires 4GB of RAM');
}
- const compile = createCompile(src, build, true, false);
+ const compile = createCompile(src, { build, emitError: true, transpileOnly: false, preserveEnglish: !!options.preserveEnglish });
const srcPipe = gulp.src(`${src}/**`, { base: `${src}` });
const generator = new MonacoGenerator(false);
if (src === 'src') {
@@ -163,13 +170,13 @@ export function compileTask(src: string, out: string, build: boolean, options: {
return task;
}
-export function watchTask(out: string, build: boolean): task.StreamTask {
+export function watchTask(out: string, build: boolean, srcPath: string = 'src'): task.StreamTask {
const task = () => {
- const compile = createCompile('src', build, false, false);
+ const compile = createCompile(srcPath, { build, emitError: false, transpileOnly: false, preserveEnglish: false });
- const src = gulp.src('src/**', { base: 'src' });
- const watchSrc = watch('src/**', { base: 'src', readDelay: 200 });
+ const src = gulp.src(`${srcPath}/**`, { base: srcPath });
+ const watchSrc = watch(`${srcPath}/**`, { base: srcPath, readDelay: 200 });
const generator = new MonacoGenerator(true);
generator.execute();
@@ -275,7 +282,7 @@ function generateApiProposalNames() {
let eol: string;
try {
- const src = fs.readFileSync('src/vs/workbench/services/extensions/common/extensionsApiProposals.ts', 'utf-8');
+ const src = fs.readFileSync('src/vs/platform/extensions/common/extensionsApiProposals.ts', 'utf-8');
const match = /\r?\n/m.exec(src);
eol = match ? match[0] : os.EOL;
} catch {
@@ -283,7 +290,8 @@ function generateApiProposalNames() {
}
const pattern = /vscode\.proposed\.([a-zA-Z\d]+)\.d\.ts$/;
- const proposalNames = new Set();
+ const versionPattern = /^\s*\/\/\s*version\s*:\s*(\d+)\s*$/mi;
+ const proposals = new Map();
const input = es.through();
const output = input
@@ -292,11 +300,22 @@ function generateApiProposalNames() {
const name = path.basename(f.path);
const match = pattern.exec(name);
- if (match) {
- proposalNames.add(match[1]);
+ if (!match) {
+ return;
}
+
+ const proposalName = match[1];
+
+ const contents = f.contents.toString('utf8');
+ const versionMatch = versionPattern.exec(contents);
+ const version = versionMatch ? versionMatch[1] : undefined;
+
+ proposals.set(proposalName, {
+ proposal: `https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.${proposalName}.d.ts`,
+ version: version ? parseInt(version) : undefined
+ });
}, function () {
- const names = [...proposalNames.values()].sort();
+ const names = [...proposals.keys()].sort();
const contents = [
'/*---------------------------------------------------------------------------------------------',
' * Copyright (c) Microsoft Corporation. All rights reserved.',
@@ -305,15 +324,19 @@ function generateApiProposalNames() {
'',
'// THIS IS A GENERATED FILE. DO NOT EDIT DIRECTLY.',
'',
- 'export const allApiProposals = Object.freeze({',
- `${names.map(name => `\t${name}: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.${name}.d.ts'`).join(`,${eol}`)}`,
- '});',
- 'export type ApiProposalName = keyof typeof allApiProposals;',
+ 'const _allApiProposals = {',
+ `${names.map(proposalName => {
+ const proposal = proposals.get(proposalName)!;
+ return `\t${proposalName}: {${eol}\t\tproposal: '${proposal.proposal}',${eol}${proposal.version ? `\t\tversion: ${proposal.version}${eol}` : ''}\t}`;
+ }).join(`,${eol}`)}`,
+ '};',
+ 'export const allApiProposals = Object.freeze<{ [proposalName: string]: Readonly<{ proposal: string; version?: number }> }>(_allApiProposals);',
+ 'export type ApiProposalName = keyof typeof _allApiProposals;',
'',
].join(eol);
this.emit('data', new File({
- path: 'vs/workbench/services/extensions/common/extensionsApiProposals.ts',
+ path: 'vs/platform/extensions/common/extensionsApiProposals.ts',
contents: Buffer.from(contents)
}));
this.emit('end');
diff --git a/build/lib/date.js b/build/lib/date.js
new file mode 100644
index 00000000000..77fff0e5073
--- /dev/null
+++ b/build/lib/date.js
@@ -0,0 +1,32 @@
+"use strict";
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.writeISODate = writeISODate;
+exports.readISODate = readISODate;
+const path = require("path");
+const fs = require("fs");
+const root = path.join(__dirname, '..', '..');
+/**
+ * Writes a `outDir/date` file with the contents of the build
+ * so that other tasks during the build process can use it and
+ * all use the same date.
+ */
+function writeISODate(outDir) {
+ const result = () => new Promise((resolve, _) => {
+ const outDirectory = path.join(root, outDir);
+ fs.mkdirSync(outDirectory, { recursive: true });
+ const date = new Date().toISOString();
+ fs.writeFileSync(path.join(outDirectory, 'date'), date, 'utf8');
+ resolve();
+ });
+ result.taskName = 'build-date-file';
+ return result;
+}
+function readISODate(outDir) {
+ const outDirectory = path.join(root, outDir);
+ return fs.readFileSync(path.join(outDirectory, 'date'), 'utf8');
+}
+//# sourceMappingURL=date.js.map
\ No newline at end of file
diff --git a/build/lib/date.ts b/build/lib/date.ts
new file mode 100644
index 00000000000..998e89f8e6a
--- /dev/null
+++ b/build/lib/date.ts
@@ -0,0 +1,33 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+import * as path from 'path';
+import * as fs from 'fs';
+
+const root = path.join(__dirname, '..', '..');
+
+/**
+ * Writes a `outDir/date` file with the contents of the build
+ * so that other tasks during the build process can use it and
+ * all use the same date.
+ */
+export function writeISODate(outDir: string) {
+ const result = () => new Promise((resolve, _) => {
+ const outDirectory = path.join(root, outDir);
+ fs.mkdirSync(outDirectory, { recursive: true });
+
+ const date = new Date().toISOString();
+ fs.writeFileSync(path.join(outDirectory, 'date'), date, 'utf8');
+
+ resolve();
+ });
+ result.taskName = 'build-date-file';
+ return result;
+}
+
+export function readISODate(outDir: string): string {
+ const outDirectory = path.join(root, outDir);
+ return fs.readFileSync(path.join(outDirectory, 'date'), 'utf8');
+}
diff --git a/build/lib/dependencies.js b/build/lib/dependencies.js
index 1f2dd75d68c..9bcd1204eab 100644
--- a/build/lib/dependencies.js
+++ b/build/lib/dependencies.js
@@ -8,64 +8,43 @@ exports.getProductionDependencies = getProductionDependencies;
const fs = require("fs");
const path = require("path");
const cp = require("child_process");
-const parseSemver = require('parse-semver');
const root = fs.realpathSync(path.dirname(path.dirname(__dirname)));
-function asYarnDependency(prefix, tree) {
- let parseResult;
+function getNpmProductionDependencies(folder) {
+ let raw;
try {
- parseResult = parseSemver(tree.name);
+ raw = cp.execSync('npm ls --all --omit=dev --parseable', { cwd: folder, encoding: 'utf8', env: { ...process.env, NODE_ENV: 'production' }, stdio: [null, null, null] });
}
catch (err) {
- err.message += `: ${tree.name}`;
- console.warn(`Could not parse semver: ${tree.name}`);
- return null;
- }
- // not an actual dependency in disk
- if (parseResult.version !== parseResult.range) {
- return null;
- }
- const name = parseResult.name;
- const version = parseResult.version;
- const dependencyPath = path.join(prefix, name);
- const children = [];
- for (const child of (tree.children || [])) {
- const dep = asYarnDependency(path.join(prefix, name, 'node_modules'), child);
- if (dep) {
- children.push(dep);
+ const regex = /^npm ERR! .*$/gm;
+ let match;
+ while (match = regex.exec(err.message)) {
+ if (/ELSPROBLEMS/.test(match[0])) {
+ continue;
+ }
+ else if (/invalid: xterm/.test(match[0])) {
+ continue;
+ }
+ else if (/A complete log of this run/.test(match[0])) {
+ continue;
+ }
+ else {
+ throw err;
+ }
}
+ raw = err.stdout;
}
- return { name, version, path: dependencyPath, children };
-}
-function getYarnProductionDependencies(folderPath) {
- const raw = cp.execSync('yarn list --json', { cwd: folderPath, encoding: 'utf8', env: { ...process.env, NODE_ENV: 'production' }, stdio: [null, null, 'inherit'] });
- const match = /^{"type":"tree".*$/m.exec(raw);
- if (!match || match.length !== 1) {
- throw new Error('Could not parse result of `yarn list --json`');
- }
- const trees = JSON.parse(match[0]).data.trees;
- return trees
- .map(tree => asYarnDependency(path.join(folderPath, 'node_modules'), tree))
- .filter((dep) => !!dep);
+ return raw.split(/\r?\n/).filter(line => {
+ return !!line.trim() && path.relative(root, line) !== path.relative(root, folder);
+ });
}
function getProductionDependencies(folderPath) {
- const result = [];
- const deps = getYarnProductionDependencies(folderPath);
- const flatten = (dep) => { result.push({ name: dep.name, version: dep.version, path: dep.path }); dep.children.forEach(flatten); };
- deps.forEach(flatten);
+ const result = getNpmProductionDependencies(folderPath);
// Account for distro npm dependencies
const realFolderPath = fs.realpathSync(folderPath);
const relativeFolderPath = path.relative(root, realFolderPath);
- const distroPackageJsonPath = `${root}/.build/distro/npm/${relativeFolderPath}/package.json`;
- if (fs.existsSync(distroPackageJsonPath)) {
- const distroPackageJson = JSON.parse(fs.readFileSync(distroPackageJsonPath, 'utf8'));
- const distroDependencyNames = Object.keys(distroPackageJson.dependencies ?? {});
- for (const name of distroDependencyNames) {
- result.push({
- name,
- version: distroPackageJson.dependencies[name],
- path: path.join(realFolderPath, 'node_modules', name)
- });
- }
+ const distroFolderPath = `${root}/.build/distro/npm/${relativeFolderPath}`;
+ if (fs.existsSync(distroFolderPath)) {
+ result.push(...getNpmProductionDependencies(distroFolderPath));
}
return [...new Set(result)];
}
diff --git a/build/lib/dependencies.ts b/build/lib/dependencies.ts
index 3b314e7d0c5..45368ffd26d 100644
--- a/build/lib/dependencies.ts
+++ b/build/lib/dependencies.ts
@@ -6,93 +6,46 @@
import * as fs from 'fs';
import * as path from 'path';
import * as cp from 'child_process';
-const parseSemver = require('parse-semver');
const root = fs.realpathSync(path.dirname(path.dirname(__dirname)));
-interface Tree {
- readonly name: string;
- readonly children?: Tree[];
-}
-
-interface FlatDependency {
- readonly name: string;
- readonly version: string;
- readonly path: string;
-}
-
-interface Dependency extends FlatDependency {
- readonly children: Dependency[];
-}
-
-function asYarnDependency(prefix: string, tree: Tree): Dependency | null {
- let parseResult;
+function getNpmProductionDependencies(folder: string): string[] {
+ let raw: string;
try {
- parseResult = parseSemver(tree.name);
+ raw = cp.execSync('npm ls --all --omit=dev --parseable', { cwd: folder, encoding: 'utf8', env: { ...process.env, NODE_ENV: 'production' }, stdio: [null, null, null] });
} catch (err) {
- err.message += `: ${tree.name}`;
- console.warn(`Could not parse semver: ${tree.name}`);
- return null;
- }
+ const regex = /^npm ERR! .*$/gm;
+ let match: RegExpExecArray | null;
- // not an actual dependency in disk
- if (parseResult.version !== parseResult.range) {
- return null;
- }
-
- const name = parseResult.name;
- const version = parseResult.version;
- const dependencyPath = path.join(prefix, name);
- const children = [];
-
- for (const child of (tree.children || [])) {
- const dep = asYarnDependency(path.join(prefix, name, 'node_modules'), child);
-
- if (dep) {
- children.push(dep);
+ while (match = regex.exec(err.message)) {
+ if (/ELSPROBLEMS/.test(match[0])) {
+ continue;
+ } else if (/invalid: xterm/.test(match[0])) {
+ continue;
+ } else if (/A complete log of this run/.test(match[0])) {
+ continue;
+ } else {
+ throw err;
+ }
}
+
+ raw = err.stdout;
}
- return { name, version, path: dependencyPath, children };
+ return raw.split(/\r?\n/).filter(line => {
+ return !!line.trim() && path.relative(root, line) !== path.relative(root, folder);
+ });
}
-function getYarnProductionDependencies(folderPath: string): Dependency[] {
- const raw = cp.execSync('yarn list --json', { cwd: folderPath, encoding: 'utf8', env: { ...process.env, NODE_ENV: 'production' }, stdio: [null, null, 'inherit'] });
- const match = /^{"type":"tree".*$/m.exec(raw);
-
- if (!match || match.length !== 1) {
- throw new Error('Could not parse result of `yarn list --json`');
- }
-
- const trees = JSON.parse(match[0]).data.trees as Tree[];
-
- return trees
- .map(tree => asYarnDependency(path.join(folderPath, 'node_modules'), tree))
- .filter((dep): dep is Dependency => !!dep);
-}
-
-export function getProductionDependencies(folderPath: string): FlatDependency[] {
- const result: FlatDependency[] = [];
- const deps = getYarnProductionDependencies(folderPath);
- const flatten = (dep: Dependency) => { result.push({ name: dep.name, version: dep.version, path: dep.path }); dep.children.forEach(flatten); };
- deps.forEach(flatten);
-
+export function getProductionDependencies(folderPath: string): string[] {
+ const result = getNpmProductionDependencies(folderPath);
// Account for distro npm dependencies
const realFolderPath = fs.realpathSync(folderPath);
const relativeFolderPath = path.relative(root, realFolderPath);
- const distroPackageJsonPath = `${root}/.build/distro/npm/${relativeFolderPath}/package.json`;
+ const distroFolderPath = `${root}/.build/distro/npm/${relativeFolderPath}`;
- if (fs.existsSync(distroPackageJsonPath)) {
- const distroPackageJson = JSON.parse(fs.readFileSync(distroPackageJsonPath, 'utf8'));
- const distroDependencyNames = Object.keys(distroPackageJson.dependencies ?? {});
-
- for (const name of distroDependencyNames) {
- result.push({
- name,
- version: distroPackageJson.dependencies[name],
- path: path.join(realFolderPath, 'node_modules', name)
- });
- }
+ if (fs.existsSync(distroFolderPath)) {
+ result.push(...getNpmProductionDependencies(distroFolderPath));
}
return [...new Set(result)];
diff --git a/build/lib/electron.js b/build/lib/electron.js
index 8524b18850c..99252e4e64a 100644
--- a/build/lib/electron.js
+++ b/build/lib/electron.js
@@ -54,7 +54,7 @@ function darwinBundleDocumentType(extensions, icon, nameOrSuffix, utis) {
role: 'Editor',
ostypes: ['TEXT', 'utxt', 'TUTX', '****'],
extensions,
- iconFile: 'resources/darwin/' + icon + '.icns',
+ iconFile: 'resources/darwin/' + icon.toLowerCase() + '.icns',
utis
};
}
diff --git a/build/lib/electron.ts b/build/lib/electron.ts
index ba93c3a2af3..da2387f68f6 100644
--- a/build/lib/electron.ts
+++ b/build/lib/electron.ts
@@ -68,7 +68,7 @@ function darwinBundleDocumentType(extensions: string[], icon: string, nameOrSuff
role: 'Editor',
ostypes: ['TEXT', 'utxt', 'TUTX', '****'],
extensions,
- iconFile: 'resources/darwin/' + icon + '.icns',
+ iconFile: 'resources/darwin/' + icon.toLowerCase() + '.icns',
utis
};
}
@@ -93,7 +93,7 @@ function darwinBundleDocumentTypes(types: { [name: string]: string | string[] },
ostypes: ['TEXT', 'utxt', 'TUTX', '****'],
extensions: Array.isArray(extensions) ? extensions : [extensions],
iconFile: 'resources/darwin/' + icon + '.icns'
- } as DarwinDocumentType;
+ };
});
}
diff --git a/build/lib/extensions.js b/build/lib/extensions.js
index 58d4d3e9a7f..fbf11ee1ee4 100644
--- a/build/lib/extensions.js
+++ b/build/lib/extensions.js
@@ -97,7 +97,12 @@ function fromLocalWebpack(extensionPath, webpackConfigFileName, disableMangle) {
}
}
}
- vsce.listFiles({ cwd: extensionPath, packageManager: vsce.PackageManager.Yarn, packagedDependencies }).then(fileNames => {
+ // TODO: add prune support based on packagedDependencies to vsce.PackageManager.Npm similar
+ // to vsce.PackageManager.Yarn.
+ // A static analysis showed there are no webpack externals that are dependencies of the current
+ // local extensions so we can use the vsce.PackageManager.None config to ignore dependencies list
+ // as a temporary workaround.
+ vsce.listFiles({ cwd: extensionPath, packageManager: vsce.PackageManager.None, packagedDependencies }).then(fileNames => {
const files = fileNames
.map(fileName => path.join(extensionPath, fileName))
.map(filePath => new File({
@@ -178,7 +183,7 @@ function fromLocalWebpack(extensionPath, webpackConfigFileName, disableMangle) {
function fromLocalNormal(extensionPath) {
const vsce = require('@vscode/vsce');
const result = es.through();
- vsce.listFiles({ cwd: extensionPath, packageManager: vsce.PackageManager.Yarn })
+ vsce.listFiles({ cwd: extensionPath, packageManager: vsce.PackageManager.Npm })
.then(fileNames => {
const files = fileNames
.map(fileName => path.join(extensionPath, fileName))
@@ -303,7 +308,7 @@ function packageLocalExtensionsStream(forWeb, disableMangle) {
else {
// also include shared production node modules
const productionDependencies = (0, dependencies_1.getProductionDependencies)('extensions/');
- const dependenciesSrc = productionDependencies.map(d => path.relative(root, d.path)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`]).flat();
+ const dependenciesSrc = productionDependencies.map(d => path.relative(root, d)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`]).flat();
result = es.merge(localExtensionsStream, gulp.src(dependenciesSrc, { base: '.' })
.pipe(util2.cleanNodeModules(path.join(root, 'build', '.moduleignore')))
.pipe(util2.cleanNodeModules(path.join(root, 'build', `.moduleignore.${process.platform}`))));
@@ -482,9 +487,6 @@ async function esbuildExtensions(taskName, isWatch, scripts) {
return reject(error);
}
reporter(stderr, script);
- if (stderr) {
- return reject();
- }
return resolve();
});
proc.stdout.on('data', (data) => {
diff --git a/build/lib/extensions.ts b/build/lib/extensions.ts
index 0582e0cb11e..628cf90c4c9 100644
--- a/build/lib/extensions.ts
+++ b/build/lib/extensions.ts
@@ -101,7 +101,12 @@ function fromLocalWebpack(extensionPath: string, webpackConfigFileName: string,
}
}
- vsce.listFiles({ cwd: extensionPath, packageManager: vsce.PackageManager.Yarn, packagedDependencies }).then(fileNames => {
+ // TODO: add prune support based on packagedDependencies to vsce.PackageManager.Npm similar
+ // to vsce.PackageManager.Yarn.
+ // A static analysis showed there are no webpack externals that are dependencies of the current
+ // local extensions so we can use the vsce.PackageManager.None config to ignore dependencies list
+ // as a temporary workaround.
+ vsce.listFiles({ cwd: extensionPath, packageManager: vsce.PackageManager.None, packagedDependencies }).then(fileNames => {
const files = fileNames
.map(fileName => path.join(extensionPath, fileName))
.map(filePath => new File({
@@ -196,7 +201,7 @@ function fromLocalNormal(extensionPath: string): Stream {
const vsce = require('@vscode/vsce') as typeof import('@vscode/vsce');
const result = es.through();
- vsce.listFiles({ cwd: extensionPath, packageManager: vsce.PackageManager.Yarn })
+ vsce.listFiles({ cwd: extensionPath, packageManager: vsce.PackageManager.Npm })
.then(fileNames => {
const files = fileNames
.map(fileName => path.join(extensionPath, fileName))
@@ -354,7 +359,7 @@ export function packageLocalExtensionsStream(forWeb: boolean, disableMangle: boo
} else {
// also include shared production node modules
const productionDependencies = getProductionDependencies('extensions/');
- const dependenciesSrc = productionDependencies.map(d => path.relative(root, d.path)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`]).flat();
+ const dependenciesSrc = productionDependencies.map(d => path.relative(root, d)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`]).flat();
result = es.merge(
localExtensionsStream,
@@ -563,9 +568,6 @@ async function esbuildExtensions(taskName: string, isWatch: boolean, scripts: {
return reject(error);
}
reporter(stderr, script);
- if (stderr) {
- return reject();
- }
return resolve();
});
diff --git a/build/lib/fetch.js b/build/lib/fetch.js
index 2fed63bca0e..b7da65f4af2 100644
--- a/build/lib/fetch.js
+++ b/build/lib/fetch.js
@@ -33,7 +33,7 @@ function fetchUrls(urls, options) {
}));
}
async function fetchUrl(url, options, retries = 10, retryDelay = 1000) {
- const verbose = !!options.verbose ?? (!!process.env['CI'] || !!process.env['BUILD_ARTIFACTSTAGINGDIRECTORY']);
+ const verbose = !!options.verbose || !!process.env['CI'] || !!process.env['BUILD_ARTIFACTSTAGINGDIRECTORY'];
try {
let startTime = 0;
if (verbose) {
diff --git a/build/lib/fetch.ts b/build/lib/fetch.ts
index dc1de777e04..0c44b8e567f 100644
--- a/build/lib/fetch.ts
+++ b/build/lib/fetch.ts
@@ -42,7 +42,7 @@ export function fetchUrls(urls: string[] | string, options: IFetchOptions): es.T
}
export async function fetchUrl(url: string, options: IFetchOptions, retries = 10, retryDelay = 1000): Promise {
- const verbose = !!options.verbose ?? (!!process.env['CI'] || !!process.env['BUILD_ARTIFACTSTAGINGDIRECTORY']);
+ const verbose = !!options.verbose || !!process.env['CI'] || !!process.env['BUILD_ARTIFACTSTAGINGDIRECTORY'];
try {
let startTime = 0;
if (verbose) {
diff --git a/build/lib/i18n.js b/build/lib/i18n.js
index c33994987f0..6964616291b 100644
--- a/build/lib/i18n.js
+++ b/build/lib/i18n.js
@@ -23,6 +23,7 @@ const fancyLog = require("fancy-log");
const ansiColors = require("ansi-colors");
const iconv = require("@vscode/iconv-lite-umd");
const l10n_dev_1 = require("@vscode/l10n-dev");
+const REPO_ROOT_PATH = path.join(__dirname, '../..');
function log(message, ...rest) {
fancyLog(ansiColors.green('[i18n]'), message, ...rest);
}
@@ -63,6 +64,17 @@ var BundledFormat;
}
BundledFormat.is = is;
})(BundledFormat || (BundledFormat = {}));
+var NLSKeysFormat;
+(function (NLSKeysFormat) {
+ function is(value) {
+ if (value === undefined) {
+ return false;
+ }
+ const candidate = value;
+ return Array.isArray(candidate) && Array.isArray(candidate[1]);
+ }
+ NLSKeysFormat.is = is;
+})(NLSKeysFormat || (NLSKeysFormat = {}));
class Line {
buffer = [];
constructor(indent = 0) {
@@ -265,67 +277,8 @@ function stripComments(content) {
});
return result;
}
-function escapeCharacters(value) {
- const result = [];
- for (let i = 0; i < value.length; i++) {
- const ch = value.charAt(i);
- switch (ch) {
- case '\'':
- result.push('\\\'');
- break;
- case '"':
- result.push('\\"');
- break;
- case '\\':
- result.push('\\\\');
- break;
- case '\n':
- result.push('\\n');
- break;
- case '\r':
- result.push('\\r');
- break;
- case '\t':
- result.push('\\t');
- break;
- case '\b':
- result.push('\\b');
- break;
- case '\f':
- result.push('\\f');
- break;
- default:
- result.push(ch);
- }
- }
- return result.join('');
-}
-function processCoreBundleFormat(fileHeader, languages, json, emitter) {
- const keysSection = json.keys;
- const messageSection = json.messages;
- const bundleSection = json.bundles;
- const statistics = Object.create(null);
- const defaultMessages = Object.create(null);
- const modules = Object.keys(keysSection);
- modules.forEach((module) => {
- const keys = keysSection[module];
- const messages = messageSection[module];
- if (!messages || keys.length !== messages.length) {
- emitter.emit('error', `Message for module ${module} corrupted. Mismatch in number of keys and messages.`);
- return;
- }
- const messageMap = Object.create(null);
- defaultMessages[module] = messageMap;
- keys.map((key, i) => {
- if (typeof key === 'string') {
- messageMap[key] = messages[i];
- }
- else {
- messageMap[key.key] = messages[i];
- }
- });
- });
- const languageDirectory = path.join(__dirname, '..', '..', '..', 'vscode-loc', 'i18n');
+function processCoreBundleFormat(base, fileHeader, languages, json, emitter) {
+ const languageDirectory = path.join(REPO_ROOT_PATH, '..', 'vscode-loc', 'i18n');
if (!fs.existsSync(languageDirectory)) {
log(`No VS Code localization repository found. Looking at ${languageDirectory}`);
log(`To bundle translations please check out the vscode-loc repository as a sibling of the vscode repository.`);
@@ -335,8 +288,6 @@ function processCoreBundleFormat(fileHeader, languages, json, emitter) {
if (process.env['VSCODE_BUILD_VERBOSE']) {
log(`Generating nls bundles for: ${language.id}`);
}
- statistics[language.id] = 0;
- const localizedModules = Object.create(null);
const languageFolderName = language.translationId || language.id;
const i18nFile = path.join(languageDirectory, `vscode-language-pack-${languageFolderName}`, 'translations', 'main.i18n.json');
let allMessages;
@@ -344,87 +295,36 @@ function processCoreBundleFormat(fileHeader, languages, json, emitter) {
const content = stripComments(fs.readFileSync(i18nFile, 'utf8'));
allMessages = JSON.parse(content);
}
- modules.forEach((module) => {
- const order = keysSection[module];
- let moduleMessage;
- if (allMessages) {
- moduleMessage = allMessages.contents[module];
+ let nlsIndex = 0;
+ const nlsResult = [];
+ for (const [moduleId, nlsKeys] of json) {
+ const moduleTranslations = allMessages?.contents[moduleId];
+ for (const nlsKey of nlsKeys) {
+ nlsResult.push(moduleTranslations?.[nlsKey]); // pushing `undefined` is fine, as we keep english strings as fallback for monaco editor in the build
+ nlsIndex++;
}
- if (!moduleMessage) {
- if (process.env['VSCODE_BUILD_VERBOSE']) {
- log(`No localized messages found for module ${module}. Using default messages.`);
- }
- moduleMessage = defaultMessages[module];
- statistics[language.id] = statistics[language.id] + Object.keys(moduleMessage).length;
- }
- const localizedMessages = [];
- order.forEach((keyInfo) => {
- let key = null;
- if (typeof keyInfo === 'string') {
- key = keyInfo;
- }
- else {
- key = keyInfo.key;
- }
- let message = moduleMessage[key];
- if (!message) {
- if (process.env['VSCODE_BUILD_VERBOSE']) {
- log(`No localized message found for key ${key} in module ${module}. Using default message.`);
- }
- message = defaultMessages[module][key];
- statistics[language.id] = statistics[language.id] + 1;
- }
- localizedMessages.push(message);
- });
- localizedModules[module] = localizedMessages;
- });
- Object.keys(bundleSection).forEach((bundle) => {
- const modules = bundleSection[bundle];
- const contents = [
- fileHeader,
- `define("${bundle}.nls.${language.id}", {`
- ];
- modules.forEach((module, index) => {
- contents.push(`\t"${module}": [`);
- const messages = localizedModules[module];
- if (!messages) {
- emitter.emit('error', `Didn't find messages for module ${module}.`);
- return;
- }
- messages.forEach((message, index) => {
- contents.push(`\t\t"${escapeCharacters(message)}${index < messages.length ? '",' : '"'}`);
- });
- contents.push(index < modules.length - 1 ? '\t],' : '\t]');
- });
- contents.push('});');
- emitter.queue(new File({ path: bundle + '.nls.' + language.id + '.js', contents: Buffer.from(contents.join('\n'), 'utf-8') }));
- });
- });
- Object.keys(statistics).forEach(key => {
- const value = statistics[key];
- log(`${key} has ${value} untranslated strings.`);
- });
- sortedLanguages.forEach(language => {
- const stats = statistics[language.id];
- if (!stats) {
- log(`\tNo translations found for language ${language.id}. Using default language instead.`);
}
+ emitter.queue(new File({
+ contents: Buffer.from(`${fileHeader}
+globalThis._VSCODE_NLS_MESSAGES=${JSON.stringify(nlsResult)};
+globalThis._VSCODE_NLS_LANGUAGE=${JSON.stringify(language.id)};`),
+ base,
+ path: `${base}/nls.messages.${language.id}.js`
+ }));
});
}
function processNlsFiles(opts) {
return (0, event_stream_1.through)(function (file) {
const fileName = path.basename(file.path);
- if (fileName === 'nls.metadata.json') {
- let json = null;
- if (file.isBuffer()) {
- json = JSON.parse(file.contents.toString('utf8'));
+ if (fileName === 'bundleInfo.json') { // pick a root level file to put the core bundles (TODO@esm this file is not created anymore, pick another)
+ try {
+ const json = JSON.parse(fs.readFileSync(path.join(REPO_ROOT_PATH, opts.out, 'nls.keys.json')).toString());
+ if (NLSKeysFormat.is(json)) {
+ processCoreBundleFormat(file.base, opts.fileHeader, opts.languages, json, this);
+ }
}
- else {
- this.emit('error', `Failed to read component file: ${file.relative}`);
- return;
- }
- if (BundledFormat.is(json)) {
- processCoreBundleFormat(opts.fileHeader, opts.languages, json, this);
+ catch (error) {
+ this.emit('error', `Failed to read component file: ${error}`);
}
}
this.queue(file);
diff --git a/build/lib/i18n.resources.json b/build/lib/i18n.resources.json
index b080b05f102..fb732ae1eaf 100644
--- a/build/lib/i18n.resources.json
+++ b/build/lib/i18n.resources.json
@@ -561,6 +561,14 @@
{
"name": "vs/workbench/contrib/authentication",
"project": "vscode-workbench"
+ },
+ {
+ "name": "vs/workbench/contrib/replNotebook",
+ "project": "vscode-workbench"
+ },
+ {
+ "name": "vs/workbench/contrib/list",
+ "project": "vscode-workbench"
}
]
}
diff --git a/build/lib/i18n.ts b/build/lib/i18n.ts
index 444e3abe59c..cd7e522ad36 100644
--- a/build/lib/i18n.ts
+++ b/build/lib/i18n.ts
@@ -16,6 +16,8 @@ import * as ansiColors from 'ansi-colors';
import * as iconv from '@vscode/iconv-lite-umd';
import { l10nJsonFormat, getL10nXlf, l10nJsonDetails, getL10nFilesFromXlf, getL10nJson } from '@vscode/l10n-dev';
+const REPO_ROOT_PATH = path.join(__dirname, '../..');
+
function log(message: any, ...rest: any[]): void {
fancyLog(ansiColors.green('[i18n]'), message, ...rest);
}
@@ -91,6 +93,19 @@ module BundledFormat {
}
}
+type NLSKeysFormat = [string /* module ID */, string[] /* keys */];
+
+module NLSKeysFormat {
+ export function is(value: any): value is NLSKeysFormat {
+ if (value === undefined) {
+ return false;
+ }
+
+ const candidate = value as NLSKeysFormat;
+ return Array.isArray(candidate) && Array.isArray(candidate[1]);
+ }
+}
+
interface BundledExtensionFormat {
[key: string]: {
messages: string[];
@@ -329,70 +344,8 @@ function stripComments(content: string): string {
return result;
}
-function escapeCharacters(value: string): string {
- const result: string[] = [];
- for (let i = 0; i < value.length; i++) {
- const ch = value.charAt(i);
- switch (ch) {
- case '\'':
- result.push('\\\'');
- break;
- case '"':
- result.push('\\"');
- break;
- case '\\':
- result.push('\\\\');
- break;
- case '\n':
- result.push('\\n');
- break;
- case '\r':
- result.push('\\r');
- break;
- case '\t':
- result.push('\\t');
- break;
- case '\b':
- result.push('\\b');
- break;
- case '\f':
- result.push('\\f');
- break;
- default:
- result.push(ch);
- }
- }
- return result.join('');
-}
-
-function processCoreBundleFormat(fileHeader: string, languages: Language[], json: BundledFormat, emitter: ThroughStream) {
- const keysSection = json.keys;
- const messageSection = json.messages;
- const bundleSection = json.bundles;
-
- const statistics: Record = Object.create(null);
-
- const defaultMessages: Record> = Object.create(null);
- const modules = Object.keys(keysSection);
- modules.forEach((module) => {
- const keys = keysSection[module];
- const messages = messageSection[module];
- if (!messages || keys.length !== messages.length) {
- emitter.emit('error', `Message for module ${module} corrupted. Mismatch in number of keys and messages.`);
- return;
- }
- const messageMap: Record = Object.create(null);
- defaultMessages[module] = messageMap;
- keys.map((key, i) => {
- if (typeof key === 'string') {
- messageMap[key] = messages[i];
- } else {
- messageMap[key.key] = messages[i];
- }
- });
- });
-
- const languageDirectory = path.join(__dirname, '..', '..', '..', 'vscode-loc', 'i18n');
+function processCoreBundleFormat(base: string, fileHeader: string, languages: Language[], json: NLSKeysFormat, emitter: ThroughStream) {
+ const languageDirectory = path.join(REPO_ROOT_PATH, '..', 'vscode-loc', 'i18n');
if (!fs.existsSync(languageDirectory)) {
log(`No VS Code localization repository found. Looking at ${languageDirectory}`);
log(`To bundle translations please check out the vscode-loc repository as a sibling of the vscode repository.`);
@@ -403,8 +356,6 @@ function processCoreBundleFormat(fileHeader: string, languages: Language[], json
log(`Generating nls bundles for: ${language.id}`);
}
- statistics[language.id] = 0;
- const localizedModules: Record = Object.create(null);
const languageFolderName = language.translationId || language.id;
const i18nFile = path.join(languageDirectory, `vscode-language-pack-${languageFolderName}`, 'translations', 'main.i18n.json');
let allMessages: I18nFormat | undefined;
@@ -412,86 +363,38 @@ function processCoreBundleFormat(fileHeader: string, languages: Language[], json
const content = stripComments(fs.readFileSync(i18nFile, 'utf8'));
allMessages = JSON.parse(content);
}
- modules.forEach((module) => {
- const order = keysSection[module];
- let moduleMessage: { [messageKey: string]: string } | undefined;
- if (allMessages) {
- moduleMessage = allMessages.contents[module];
+
+ let nlsIndex = 0;
+ const nlsResult: Array = [];
+ for (const [moduleId, nlsKeys] of json) {
+ const moduleTranslations = allMessages?.contents[moduleId];
+ for (const nlsKey of nlsKeys) {
+ nlsResult.push(moduleTranslations?.[nlsKey]); // pushing `undefined` is fine, as we keep english strings as fallback for monaco editor in the build
+ nlsIndex++;
}
- if (!moduleMessage) {
- if (process.env['VSCODE_BUILD_VERBOSE']) {
- log(`No localized messages found for module ${module}. Using default messages.`);
- }
- moduleMessage = defaultMessages[module];
- statistics[language.id] = statistics[language.id] + Object.keys(moduleMessage).length;
- }
- const localizedMessages: string[] = [];
- order.forEach((keyInfo) => {
- let key: string | null = null;
- if (typeof keyInfo === 'string') {
- key = keyInfo;
- } else {
- key = keyInfo.key;
- }
- let message: string = moduleMessage![key];
- if (!message) {
- if (process.env['VSCODE_BUILD_VERBOSE']) {
- log(`No localized message found for key ${key} in module ${module}. Using default message.`);
- }
- message = defaultMessages[module][key];
- statistics[language.id] = statistics[language.id] + 1;
- }
- localizedMessages.push(message);
- });
- localizedModules[module] = localizedMessages;
- });
- Object.keys(bundleSection).forEach((bundle) => {
- const modules = bundleSection[bundle];
- const contents: string[] = [
- fileHeader,
- `define("${bundle}.nls.${language.id}", {`
- ];
- modules.forEach((module, index) => {
- contents.push(`\t"${module}": [`);
- const messages = localizedModules[module];
- if (!messages) {
- emitter.emit('error', `Didn't find messages for module ${module}.`);
- return;
- }
- messages.forEach((message, index) => {
- contents.push(`\t\t"${escapeCharacters(message)}${index < messages.length ? '",' : '"'}`);
- });
- contents.push(index < modules.length - 1 ? '\t],' : '\t]');
- });
- contents.push('});');
- emitter.queue(new File({ path: bundle + '.nls.' + language.id + '.js', contents: Buffer.from(contents.join('\n'), 'utf-8') }));
- });
- });
- Object.keys(statistics).forEach(key => {
- const value = statistics[key];
- log(`${key} has ${value} untranslated strings.`);
- });
- sortedLanguages.forEach(language => {
- const stats = statistics[language.id];
- if (!stats) {
- log(`\tNo translations found for language ${language.id}. Using default language instead.`);
}
+
+ emitter.queue(new File({
+ contents: Buffer.from(`${fileHeader}
+globalThis._VSCODE_NLS_MESSAGES=${JSON.stringify(nlsResult)};
+globalThis._VSCODE_NLS_LANGUAGE=${JSON.stringify(language.id)};`),
+ base,
+ path: `${base}/nls.messages.${language.id}.js`
+ }));
});
}
-export function processNlsFiles(opts: { fileHeader: string; languages: Language[] }): ThroughStream {
+export function processNlsFiles(opts: { out: string; fileHeader: string; languages: Language[] }): ThroughStream {
return through(function (this: ThroughStream, file: File) {
const fileName = path.basename(file.path);
- if (fileName === 'nls.metadata.json') {
- let json = null;
- if (file.isBuffer()) {
- json = JSON.parse((file.contents).toString('utf8'));
- } else {
- this.emit('error', `Failed to read component file: ${file.relative}`);
- return;
- }
- if (BundledFormat.is(json)) {
- processCoreBundleFormat(opts.fileHeader, opts.languages, json, this);
+ if (fileName === 'bundleInfo.json') { // pick a root level file to put the core bundles (TODO@esm this file is not created anymore, pick another)
+ try {
+ const json = JSON.parse(fs.readFileSync(path.join(REPO_ROOT_PATH, opts.out, 'nls.keys.json')).toString());
+ if (NLSKeysFormat.is(json)) {
+ processCoreBundleFormat(file.base, opts.fileHeader, opts.languages, json, this);
+ }
+ } catch (error) {
+ this.emit('error', `Failed to read component file: ${error}`);
}
}
this.queue(file);
diff --git a/build/lib/inlineMeta.js b/build/lib/inlineMeta.js
new file mode 100644
index 00000000000..f1dbfa83a7e
--- /dev/null
+++ b/build/lib/inlineMeta.js
@@ -0,0 +1,48 @@
+"use strict";
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.inlineMeta = inlineMeta;
+const es = require("event-stream");
+const path_1 = require("path");
+const packageJsonMarkerId = 'BUILD_INSERT_PACKAGE_CONFIGURATION';
+// TODO@bpasero in order to inline `product.json`, more work is
+// needed to ensure that we cover all cases where modifications
+// are done to the product configuration during build. There are
+// at least 2 more changes that kick in very late:
+// - a `darwinUniversalAssetId` is added in`create-universal-app.ts`
+// - a `target` is added in `gulpfile.vscode.win32.js`
+// const productJsonMarkerId = 'BUILD_INSERT_PRODUCT_CONFIGURATION';
+function inlineMeta(result, ctx) {
+ return result.pipe(es.through(function (file) {
+ if (matchesFile(file, ctx)) {
+ let content = file.contents.toString();
+ let markerFound = false;
+ const packageMarker = `${packageJsonMarkerId}:"${packageJsonMarkerId}"`; // this needs to be the format after esbuild has processed the file (e.g. double quotes)
+ if (content.includes(packageMarker)) {
+ content = content.replace(packageMarker, JSON.stringify(JSON.parse(ctx.packageJsonFn())).slice(1, -1) /* trim braces */);
+ markerFound = true;
+ }
+ // const productMarker = `${productJsonMarkerId}:"${productJsonMarkerId}"`; // this needs to be the format after esbuild has processed the file (e.g. double quotes)
+ // if (content.includes(productMarker)) {
+ // content = content.replace(productMarker, JSON.stringify(JSON.parse(ctx.productJsonFn())).slice(1, -1) /* trim braces */);
+ // markerFound = true;
+ // }
+ if (markerFound) {
+ file.contents = Buffer.from(content);
+ }
+ }
+ this.emit('data', file);
+ }));
+}
+function matchesFile(file, ctx) {
+ for (const targetPath of ctx.targetPaths) {
+ if (file.basename === (0, path_1.basename)(targetPath)) { // TODO would be nicer to figure out root relative path to not match on false positives
+ return true;
+ }
+ }
+ return false;
+}
+//# sourceMappingURL=inlineMeta.js.map
\ No newline at end of file
diff --git a/build/lib/inlineMeta.ts b/build/lib/inlineMeta.ts
new file mode 100644
index 00000000000..ef3987fc32e
--- /dev/null
+++ b/build/lib/inlineMeta.ts
@@ -0,0 +1,60 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+import * as es from 'event-stream';
+import { basename } from 'path';
+import * as File from 'vinyl';
+
+export interface IInlineMetaContext {
+ readonly targetPaths: string[];
+ readonly packageJsonFn: () => string;
+ readonly productJsonFn: () => string;
+}
+
+const packageJsonMarkerId = 'BUILD_INSERT_PACKAGE_CONFIGURATION';
+
+// TODO@bpasero in order to inline `product.json`, more work is
+// needed to ensure that we cover all cases where modifications
+// are done to the product configuration during build. There are
+// at least 2 more changes that kick in very late:
+// - a `darwinUniversalAssetId` is added in`create-universal-app.ts`
+// - a `target` is added in `gulpfile.vscode.win32.js`
+// const productJsonMarkerId = 'BUILD_INSERT_PRODUCT_CONFIGURATION';
+
+export function inlineMeta(result: NodeJS.ReadWriteStream, ctx: IInlineMetaContext): NodeJS.ReadWriteStream {
+ return result.pipe(es.through(function (file: File) {
+ if (matchesFile(file, ctx)) {
+ let content = file.contents.toString();
+ let markerFound = false;
+
+ const packageMarker = `${packageJsonMarkerId}:"${packageJsonMarkerId}"`; // this needs to be the format after esbuild has processed the file (e.g. double quotes)
+ if (content.includes(packageMarker)) {
+ content = content.replace(packageMarker, JSON.stringify(JSON.parse(ctx.packageJsonFn())).slice(1, -1) /* trim braces */);
+ markerFound = true;
+ }
+
+ // const productMarker = `${productJsonMarkerId}:"${productJsonMarkerId}"`; // this needs to be the format after esbuild has processed the file (e.g. double quotes)
+ // if (content.includes(productMarker)) {
+ // content = content.replace(productMarker, JSON.stringify(JSON.parse(ctx.productJsonFn())).slice(1, -1) /* trim braces */);
+ // markerFound = true;
+ // }
+
+ if (markerFound) {
+ file.contents = Buffer.from(content);
+ }
+ }
+
+ this.emit('data', file);
+ }));
+}
+
+function matchesFile(file: File, ctx: IInlineMetaContext): boolean {
+ for (const targetPath of ctx.targetPaths) {
+ if (file.basename === basename(targetPath)) { // TODO would be nicer to figure out root relative path to not match on false positives
+ return true;
+ }
+ }
+ return false;
+}
diff --git a/build/lib/layersChecker.js b/build/lib/layersChecker.js
index dce2b85d658..9b69794628c 100644
--- a/build/lib/layersChecker.js
+++ b/build/lib/layersChecker.js
@@ -68,7 +68,14 @@ const CORE_TYPES = [
'fetch',
'RequestInit',
'Headers',
- 'Response'
+ 'Response',
+ '__global',
+ 'PerformanceMark',
+ 'PerformanceObserver',
+ 'ImportMeta',
+ // webcrypto has been available since Node.js 19, but still live in dom.d.ts
+ 'Crypto',
+ 'SubtleCrypto'
];
// Types that are defined in a common layer but are known to be only
// available in native environments should not be allowed in browser
@@ -116,6 +123,22 @@ const RULES = [
'@types/node' // no node.js
]
},
+ // Common: vs/base/common/performance.ts
+ {
+ target: '**/vs/base/common/performance.ts',
+ allowedTypes: [
+ ...CORE_TYPES,
+ // Safe access to Performance
+ 'Performance',
+ 'PerformanceEntry',
+ 'PerformanceTiming'
+ ],
+ disallowedTypes: NATIVE_TYPES,
+ disallowedDefinitions: [
+ 'lib.dom.d.ts', // no DOM
+ '@types/node' // no node.js
+ ]
+ },
// Common: vs/platform/environment/common/*
{
target: '**/vs/platform/environment/common/*.ts',
@@ -170,59 +193,17 @@ const RULES = [
'@types/node' // no node.js
]
},
- // Common: vs/workbench/api/common/extHostTypes.ts
+ // Common: vs/base/parts/sandbox/electron-sandbox/preload.ts
{
- target: '**/vs/workbench/api/common/extHostTypes.ts',
+ target: '**/vs/base/parts/sandbox/electron-sandbox/preload.ts',
allowedTypes: [
...CORE_TYPES,
- // Safe access to global
- '__global'
+ // Safe access to a very small subset of node.js
+ 'process',
+ 'NodeJS'
],
disallowedTypes: NATIVE_TYPES,
disallowedDefinitions: [
- 'lib.dom.d.ts', // no DOM
- '@types/node' // no node.js
- ]
- },
- // Common: vs/workbench/api/common/extHostChatAgents2.ts
- {
- target: '**/vs/workbench/api/common/extHostChatAgents2.ts',
- allowedTypes: [
- ...CORE_TYPES,
- // Safe access to global
- '__global'
- ],
- disallowedTypes: NATIVE_TYPES,
- disallowedDefinitions: [
- 'lib.dom.d.ts', // no DOM
- '@types/node' // no node.js
- ]
- },
- // Common: vs/workbench/api/common/extHostChatVariables.ts
- {
- target: '**/vs/workbench/api/common/extHostChatVariables.ts',
- allowedTypes: [
- ...CORE_TYPES,
- // Safe access to global
- '__global'
- ],
- disallowedTypes: NATIVE_TYPES,
- disallowedDefinitions: [
- 'lib.dom.d.ts', // no DOM
- '@types/node' // no node.js
- ]
- },
- // Common: vs/workbench/api/common/extensionHostMain.ts
- {
- target: '**/vs/workbench/api/common/extensionHostMain.ts',
- allowedTypes: [
- ...CORE_TYPES,
- // Safe access to global
- '__global'
- ],
- disallowedTypes: NATIVE_TYPES,
- disallowedDefinitions: [
- 'lib.dom.d.ts', // no DOM
'@types/node' // no node.js
]
},
@@ -273,6 +254,22 @@ const RULES = [
'@types/node' // no node.js
]
},
+ // Electron (utility)
+ {
+ target: '**/vs/**/electron-utility/**',
+ allowedTypes: [
+ ...CORE_TYPES,
+ // --> types from electron.d.ts that duplicate from lib.dom.d.ts
+ 'Event',
+ 'Request'
+ ],
+ disallowedTypes: [
+ 'ipcMain' // not allowed, use validatedIpcMain instead
+ ],
+ disallowedDefinitions: [
+ 'lib.dom.d.ts' // no DOM
+ ]
+ },
// Electron (main)
{
target: '**/vs/**/electron-main/**',
diff --git a/build/lib/layersChecker.ts b/build/lib/layersChecker.ts
index 039f222135d..16b1e9f5101 100644
--- a/build/lib/layersChecker.ts
+++ b/build/lib/layersChecker.ts
@@ -69,7 +69,15 @@ const CORE_TYPES = [
'fetch',
'RequestInit',
'Headers',
- 'Response'
+ 'Response',
+ '__global',
+ 'PerformanceMark',
+ 'PerformanceObserver',
+ 'ImportMeta',
+
+ // webcrypto has been available since Node.js 19, but still live in dom.d.ts
+ 'Crypto',
+ 'SubtleCrypto'
];
// Types that are defined in a common layer but are known to be only
@@ -125,6 +133,24 @@ const RULES: IRule[] = [
]
},
+ // Common: vs/base/common/performance.ts
+ {
+ target: '**/vs/base/common/performance.ts',
+ allowedTypes: [
+ ...CORE_TYPES,
+
+ // Safe access to Performance
+ 'Performance',
+ 'PerformanceEntry',
+ 'PerformanceTiming'
+ ],
+ disallowedTypes: NATIVE_TYPES,
+ disallowedDefinitions: [
+ 'lib.dom.d.ts', // no DOM
+ '@types/node' // no node.js
+ ]
+ },
+
// Common: vs/platform/environment/common/*
{
target: '**/vs/platform/environment/common/*.ts',
@@ -185,66 +211,18 @@ const RULES: IRule[] = [
]
},
- // Common: vs/workbench/api/common/extHostTypes.ts
+ // Common: vs/base/parts/sandbox/electron-sandbox/preload.ts
{
- target: '**/vs/workbench/api/common/extHostTypes.ts',
+ target: '**/vs/base/parts/sandbox/electron-sandbox/preload.ts',
allowedTypes: [
...CORE_TYPES,
- // Safe access to global
- '__global'
+ // Safe access to a very small subset of node.js
+ 'process',
+ 'NodeJS'
],
disallowedTypes: NATIVE_TYPES,
disallowedDefinitions: [
- 'lib.dom.d.ts', // no DOM
- '@types/node' // no node.js
- ]
- },
-
- // Common: vs/workbench/api/common/extHostChatAgents2.ts
- {
- target: '**/vs/workbench/api/common/extHostChatAgents2.ts',
- allowedTypes: [
- ...CORE_TYPES,
-
- // Safe access to global
- '__global'
- ],
- disallowedTypes: NATIVE_TYPES,
- disallowedDefinitions: [
- 'lib.dom.d.ts', // no DOM
- '@types/node' // no node.js
- ]
- },
-
- // Common: vs/workbench/api/common/extHostChatVariables.ts
- {
- target: '**/vs/workbench/api/common/extHostChatVariables.ts',
- allowedTypes: [
- ...CORE_TYPES,
-
- // Safe access to global
- '__global'
- ],
- disallowedTypes: NATIVE_TYPES,
- disallowedDefinitions: [
- 'lib.dom.d.ts', // no DOM
- '@types/node' // no node.js
- ]
- },
-
- // Common: vs/workbench/api/common/extensionHostMain.ts
- {
- target: '**/vs/workbench/api/common/extensionHostMain.ts',
- allowedTypes: [
- ...CORE_TYPES,
-
- // Safe access to global
- '__global'
- ],
- disallowedTypes: NATIVE_TYPES,
- disallowedDefinitions: [
- 'lib.dom.d.ts', // no DOM
'@types/node' // no node.js
]
},
@@ -301,6 +279,24 @@ const RULES: IRule[] = [
]
},
+ // Electron (utility)
+ {
+ target: '**/vs/**/electron-utility/**',
+ allowedTypes: [
+ ...CORE_TYPES,
+
+ // --> types from electron.d.ts that duplicate from lib.dom.d.ts
+ 'Event',
+ 'Request'
+ ],
+ disallowedTypes: [
+ 'ipcMain' // not allowed, use validatedIpcMain instead
+ ],
+ disallowedDefinitions: [
+ 'lib.dom.d.ts' // no DOM
+ ]
+ },
+
// Electron (main)
{
target: '**/vs/**/electron-main/**',
diff --git a/build/lib/mangle/index.js b/build/lib/mangle/index.js
index bb6b414e845..1c2c8cc3dd3 100644
--- a/build/lib/mangle/index.js
+++ b/build/lib/mangle/index.js
@@ -14,7 +14,7 @@ const ts = require("typescript");
const url_1 = require("url");
const workerpool = require("workerpool");
const staticLanguageServiceHost_1 = require("./staticLanguageServiceHost");
-const buildfile = require('../../../src/buildfile');
+const buildfile = require('../../buildfile');
class ShortIdent {
prefix;
static _keywords = new Set(['await', 'break', 'case', 'catch', 'class', 'const', 'continue', 'debugger',
@@ -250,7 +250,6 @@ function isNameTakenInFile(node, name) {
const skippedExportMangledFiles = [
// Build
'css.build',
- 'nls.build',
// Monaco
'editorCommon',
'editorOptions',
@@ -264,17 +263,18 @@ const skippedExportMangledFiles = [
'pfs',
// entry points
...[
- buildfile.entrypoint('vs/server/node/server.main', []),
- buildfile.entrypoint('vs/workbench/workbench.desktop.main', []),
- buildfile.base,
+ buildfile.workerEditor,
buildfile.workerExtensionHost,
buildfile.workerNotebook,
buildfile.workerLanguageDetection,
buildfile.workerLocalFileSearch,
buildfile.workerProfileAnalysis,
+ buildfile.workerOutputLinks,
+ buildfile.workerBackgroundTokenization,
buildfile.workbenchDesktop,
buildfile.workbenchWeb,
- buildfile.code
+ buildfile.code,
+ buildfile.codeWeb
].flat().map(x => x.name),
];
const skippedExportMangledProjects = [
diff --git a/build/lib/mangle/index.ts b/build/lib/mangle/index.ts
index 4a7544f162b..f291bd63f6b 100644
--- a/build/lib/mangle/index.ts
+++ b/build/lib/mangle/index.ts
@@ -12,7 +12,7 @@ import * as ts from 'typescript';
import { pathToFileURL } from 'url';
import * as workerpool from 'workerpool';
import { StaticLanguageServiceHost } from './staticLanguageServiceHost';
-const buildfile = require('../../../src/buildfile');
+const buildfile = require('../../buildfile');
class ShortIdent {
@@ -279,11 +279,9 @@ function isNameTakenInFile(node: ts.Node, name: string): boolean {
return false;
}
-
const skippedExportMangledFiles = [
// Build
'css.build',
- 'nls.build',
// Monaco
'editorCommon',
@@ -301,17 +299,18 @@ const skippedExportMangledFiles = [
// entry points
...[
- buildfile.entrypoint('vs/server/node/server.main', []),
- buildfile.entrypoint('vs/workbench/workbench.desktop.main', []),
- buildfile.base,
+ buildfile.workerEditor,
buildfile.workerExtensionHost,
buildfile.workerNotebook,
buildfile.workerLanguageDetection,
buildfile.workerLocalFileSearch,
buildfile.workerProfileAnalysis,
+ buildfile.workerOutputLinks,
+ buildfile.workerBackgroundTokenization,
buildfile.workbenchDesktop,
buildfile.workbenchWeb,
- buildfile.code
+ buildfile.code,
+ buildfile.codeWeb
].flat().map(x => x.name),
];
diff --git a/build/lib/nls.js b/build/lib/nls.js
index 48ca84f2433..6ddcd46167a 100644
--- a/build/lib/nls.js
+++ b/build/lib/nls.js
@@ -10,6 +10,7 @@ const event_stream_1 = require("event-stream");
const File = require("vinyl");
const sm = require("source-map");
const path = require("path");
+const sort = require("gulp-sort");
var CollectStepResult;
(function (CollectStepResult) {
CollectStepResult[CollectStepResult["Yes"] = 0] = "Yes";
@@ -38,23 +39,15 @@ function clone(object) {
}
return result;
}
-function template(lines) {
- let indent = '', wrap = '';
- if (lines.length > 1) {
- indent = '\t';
- wrap = '\n';
- }
- return `/*---------------------------------------------------------
- * Copyright (C) Microsoft Corporation. All rights reserved.
- *--------------------------------------------------------*/
-define([], [${wrap + lines.map(l => indent + l).join(',\n') + wrap}]);`;
-}
/**
* Returns a stream containing the patched JavaScript and source maps.
*/
-function nls() {
+function nls(options) {
+ let base;
const input = (0, event_stream_1.through)();
- const output = input.pipe((0, event_stream_1.through)(function (f) {
+ const output = input
+ .pipe(sort()) // IMPORTANT: to ensure stable NLS metadata generation, we must sort the files because NLS messages are globally extracted and indexed across all files
+ .pipe((0, event_stream_1.through)(function (f) {
if (!f.sourceMap) {
return this.emit('error', new Error(`File ${f.relative} does not have sourcemaps.`));
}
@@ -70,7 +63,40 @@ function nls() {
if (!typescript) {
return this.emit('error', new Error(`File ${f.relative} does not have the original content in the source map.`));
}
- _nls.patchFiles(f, typescript).forEach(f => this.emit('data', f));
+ base = f.base;
+ this.emit('data', _nls.patchFile(f, typescript, options));
+ }, function () {
+ for (const file of [
+ new File({
+ contents: Buffer.from(JSON.stringify({
+ keys: _nls.moduleToNLSKeys,
+ messages: _nls.moduleToNLSMessages,
+ }, null, '\t')),
+ base,
+ path: `${base}/nls.metadata.json`
+ }),
+ new File({
+ contents: Buffer.from(JSON.stringify(_nls.allNLSMessages)),
+ base,
+ path: `${base}/nls.messages.json`
+ }),
+ new File({
+ contents: Buffer.from(JSON.stringify(_nls.allNLSModulesAndKeys)),
+ base,
+ path: `${base}/nls.keys.json`
+ }),
+ new File({
+ contents: Buffer.from(`/*---------------------------------------------------------
+ * Copyright (C) Microsoft Corporation. All rights reserved.
+ *--------------------------------------------------------*/
+globalThis._VSCODE_NLS_MESSAGES=${JSON.stringify(_nls.allNLSMessages)};`),
+ base,
+ path: `${base}/nls.messages.js`
+ })
+ ]) {
+ this.emit('data', file);
+ }
+ this.emit('end');
}));
return (0, event_stream_1.duplex)(input, output);
}
@@ -79,6 +105,11 @@ function isImportNode(ts, node) {
}
var _nls;
(function (_nls) {
+ _nls.moduleToNLSKeys = {};
+ _nls.moduleToNLSMessages = {};
+ _nls.allNLSMessages = [];
+ _nls.allNLSModulesAndKeys = [];
+ let allNLSMessagesIndex = 0;
function fileFrom(file, contents, path = file.path) {
return new File({
contents: Buffer.from(contents),
@@ -138,21 +169,14 @@ var _nls;
.filter(n => n.kind === ts.SyntaxKind.ImportEqualsDeclaration)
.map(n => n)
.filter(d => d.moduleReference.kind === ts.SyntaxKind.ExternalModuleReference)
- .filter(d => d.moduleReference.expression.getText() === '\'vs/nls\'');
+ .filter(d => d.moduleReference.expression.getText().endsWith(`/nls.js'`));
// import ... from 'vs/nls';
const importDeclarations = imports
.filter(n => n.kind === ts.SyntaxKind.ImportDeclaration)
.map(n => n)
.filter(d => d.moduleSpecifier.kind === ts.SyntaxKind.StringLiteral)
- .filter(d => d.moduleSpecifier.getText() === '\'vs/nls\'')
+ .filter(d => d.moduleSpecifier.getText().endsWith(`/nls.js'`))
.filter(d => !!d.importClause && !!d.importClause.namedBindings);
- const nlsExpressions = importEqualsDeclarations
- .map(d => d.moduleReference.expression)
- .concat(importDeclarations.map(d => d.moduleSpecifier))
- .map(d => ({
- start: ts.getLineAndCharacterOfPosition(sourceFile, d.getStart()),
- end: ts.getLineAndCharacterOfPosition(sourceFile, d.getEnd())
- }));
// `nls.localize(...)` calls
const nlsLocalizeCallExpressions = importDeclarations
.filter(d => !!(d.importClause && d.importClause.namedBindings && d.importClause.namedBindings.kind === ts.SyntaxKind.NamespaceImport))
@@ -206,8 +230,7 @@ var _nls;
value: a[1].getText()
}));
return {
- localizeCalls: localizeCalls.toArray(),
- nlsExpressions: nlsExpressions.toArray()
+ localizeCalls: localizeCalls.toArray()
};
}
class TextModel {
@@ -262,14 +285,10 @@ var _nls;
.flatten().toArray().join('');
}
}
- function patchJavascript(patches, contents, moduleId) {
+ function patchJavascript(patches, contents) {
const model = new TextModel(contents);
// patch the localize calls
lazy(patches).reverse().each(p => model.apply(p));
- // patch the 'vs/nls' imports
- const firstLine = model.get(0);
- const patchedFirstLine = firstLine.replace(/(['"])vs\/nls\1/g, `$1vs/nls!${moduleId}$1`);
- model.set(0, patchedFirstLine);
return model.toString();
}
function patchSourcemap(patches, rsm, smc) {
@@ -307,14 +326,21 @@ var _nls;
}
return JSON.parse(smg.toString());
}
- function patch(ts, moduleId, typescript, javascript, sourcemap) {
- const { localizeCalls, nlsExpressions } = analyze(ts, typescript, 'localize');
- const { localizeCalls: localize2Calls, nlsExpressions: nls2Expressions } = analyze(ts, typescript, 'localize2');
+ function parseLocalizeKeyOrValue(sourceExpression) {
+ // sourceValue can be "foo", 'foo', `foo` or { .... }
+ // in its evalulated form
+ // we want to return either the string or the object
+ // eslint-disable-next-line no-eval
+ return eval(`(${sourceExpression})`);
+ }
+ function patch(ts, typescript, javascript, sourcemap, options) {
+ const { localizeCalls } = analyze(ts, typescript, 'localize');
+ const { localizeCalls: localize2Calls } = analyze(ts, typescript, 'localize2');
if (localizeCalls.length === 0 && localize2Calls.length === 0) {
return { javascript, sourcemap };
}
- const nlsKeys = template(localizeCalls.map(lc => lc.key).concat(localize2Calls.map(lc => lc.key)));
- const nls = template(localizeCalls.map(lc => lc.value).concat(localize2Calls.map(lc => lc.value)));
+ const nlsKeys = localizeCalls.map(lc => parseLocalizeKeyOrValue(lc.key)).concat(localize2Calls.map(lc => parseLocalizeKeyOrValue(lc.key)));
+ const nlsMessages = localizeCalls.map(lc => parseLocalizeKeyOrValue(lc.value)).concat(localize2Calls.map(lc => parseLocalizeKeyOrValue(lc.value)));
const smc = new sm.SourceMapConsumer(sourcemap);
const positionFrom = mappedPositionFrom.bind(null, sourcemap.sources[0]);
// build patches
@@ -323,16 +349,18 @@ var _nls;
const end = lcFrom(smc.generatedPositionFor(positionFrom(c.range.end)));
return { span: { start, end }, content: c.content };
};
- let i = 0;
const localizePatches = lazy(localizeCalls)
- .map(lc => ([
- { range: lc.keySpan, content: '' + (i++) },
+ .map(lc => (options.preserveEnglish ? [
+ { range: lc.keySpan, content: `${allNLSMessagesIndex++}` } // localize('key', "message") => localize(, "message")
+ ] : [
+ { range: lc.keySpan, content: `${allNLSMessagesIndex++}` }, // localize('key', "message") => localize(, null)
{ range: lc.valueSpan, content: 'null' }
]))
.flatten()
.map(toPatch);
const localize2Patches = lazy(localize2Calls)
- .map(lc => ({ range: lc.keySpan, content: '' + (i++) }))
+ .map(lc => ({ range: lc.keySpan, content: `${allNLSMessagesIndex++}` } // localize2('key', "message") => localize(, "message")
+ ))
.map(toPatch);
// Sort patches by their start position
const patches = localizePatches.concat(localize2Patches).toArray().sort((a, b) => {
@@ -352,34 +380,29 @@ var _nls;
return 0;
}
});
- javascript = patchJavascript(patches, javascript, moduleId);
- // since imports are not within the sourcemap information,
- // we must do this MacGyver style
- if (nlsExpressions.length || nls2Expressions.length) {
- javascript = javascript.replace(/^define\(.*$/m, line => {
- return line.replace(/(['"])vs\/nls\1/g, `$1vs/nls!${moduleId}$1`);
- });
- }
+ javascript = patchJavascript(patches, javascript);
sourcemap = patchSourcemap(patches, sourcemap, smc);
- return { javascript, sourcemap, nlsKeys, nls };
+ return { javascript, sourcemap, nlsKeys, nlsMessages };
}
- function patchFiles(javascriptFile, typescript) {
+ function patchFile(javascriptFile, typescript, options) {
const ts = require('typescript');
// hack?
const moduleId = javascriptFile.relative
.replace(/\.js$/, '')
.replace(/\\/g, '/');
- const { javascript, sourcemap, nlsKeys, nls } = patch(ts, moduleId, typescript, javascriptFile.contents.toString(), javascriptFile.sourceMap);
- const result = [fileFrom(javascriptFile, javascript)];
- result[0].sourceMap = sourcemap;
+ const { javascript, sourcemap, nlsKeys, nlsMessages } = patch(ts, typescript, javascriptFile.contents.toString(), javascriptFile.sourceMap, options);
+ const result = fileFrom(javascriptFile, javascript);
+ result.sourceMap = sourcemap;
if (nlsKeys) {
- result.push(fileFrom(javascriptFile, nlsKeys, javascriptFile.path.replace(/\.js$/, '.nls.keys.js')));
+ _nls.moduleToNLSKeys[moduleId] = nlsKeys;
+ _nls.allNLSModulesAndKeys.push([moduleId, nlsKeys.map(nlsKey => typeof nlsKey === 'string' ? nlsKey : nlsKey.key)]);
}
- if (nls) {
- result.push(fileFrom(javascriptFile, nls, javascriptFile.path.replace(/\.js$/, '.nls.js')));
+ if (nlsMessages) {
+ _nls.moduleToNLSMessages[moduleId] = nlsMessages;
+ _nls.allNLSMessages.push(...nlsMessages);
}
return result;
}
- _nls.patchFiles = patchFiles;
+ _nls.patchFile = patchFile;
})(_nls || (_nls = {}));
//# sourceMappingURL=nls.js.map
\ No newline at end of file
diff --git a/build/lib/nls.ts b/build/lib/nls.ts
index c4ee031b2eb..cac832903a3 100644
--- a/build/lib/nls.ts
+++ b/build/lib/nls.ts
@@ -8,7 +8,8 @@ import * as lazy from 'lazy.js';
import { duplex, through } from 'event-stream';
import * as File from 'vinyl';
import * as sm from 'source-map';
-import * as path from 'path';
+import * as path from 'path';
+import * as sort from 'gulp-sort';
declare class FileSourceMap extends File {
public sourceMap: sm.RawSourceMap;
@@ -41,54 +42,77 @@ function collect(ts: typeof import('typescript'), node: ts.Node, fn: (node: ts.N
}
function clone(object: T): T {
- const result = {};
+ const result = {} as any as T;
for (const id in object) {
result[id] = object[id];
}
return result;
}
-function template(lines: string[]): string {
- let indent = '', wrap = '';
-
- if (lines.length > 1) {
- indent = '\t';
- wrap = '\n';
- }
-
- return `/*---------------------------------------------------------
- * Copyright (C) Microsoft Corporation. All rights reserved.
- *--------------------------------------------------------*/
-define([], [${wrap + lines.map(l => indent + l).join(',\n') + wrap}]);`;
-}
-
/**
* Returns a stream containing the patched JavaScript and source maps.
*/
-export function nls(): NodeJS.ReadWriteStream {
+export function nls(options: { preserveEnglish: boolean }): NodeJS.ReadWriteStream {
+ let base: string;
const input = through();
- const output = input.pipe(through(function (f: FileSourceMap) {
- if (!f.sourceMap) {
- return this.emit('error', new Error(`File ${f.relative} does not have sourcemaps.`));
- }
+ const output = input
+ .pipe(sort()) // IMPORTANT: to ensure stable NLS metadata generation, we must sort the files because NLS messages are globally extracted and indexed across all files
+ .pipe(through(function (f: FileSourceMap) {
+ if (!f.sourceMap) {
+ return this.emit('error', new Error(`File ${f.relative} does not have sourcemaps.`));
+ }
- let source = f.sourceMap.sources[0];
- if (!source) {
- return this.emit('error', new Error(`File ${f.relative} does not have a source in the source map.`));
- }
+ let source = f.sourceMap.sources[0];
+ if (!source) {
+ return this.emit('error', new Error(`File ${f.relative} does not have a source in the source map.`));
+ }
- const root = f.sourceMap.sourceRoot;
- if (root) {
- source = path.join(root, source);
- }
+ const root = f.sourceMap.sourceRoot;
+ if (root) {
+ source = path.join(root, source);
+ }
- const typescript = f.sourceMap.sourcesContent![0];
- if (!typescript) {
- return this.emit('error', new Error(`File ${f.relative} does not have the original content in the source map.`));
- }
+ const typescript = f.sourceMap.sourcesContent![0];
+ if (!typescript) {
+ return this.emit('error', new Error(`File ${f.relative} does not have the original content in the source map.`));
+ }
- _nls.patchFiles(f, typescript).forEach(f => this.emit('data', f));
- }));
+ base = f.base;
+ this.emit('data', _nls.patchFile(f, typescript, options));
+ }, function () {
+ for (const file of [
+ new File({
+ contents: Buffer.from(JSON.stringify({
+ keys: _nls.moduleToNLSKeys,
+ messages: _nls.moduleToNLSMessages,
+ }, null, '\t')),
+ base,
+ path: `${base}/nls.metadata.json`
+ }),
+ new File({
+ contents: Buffer.from(JSON.stringify(_nls.allNLSMessages)),
+ base,
+ path: `${base}/nls.messages.json`
+ }),
+ new File({
+ contents: Buffer.from(JSON.stringify(_nls.allNLSModulesAndKeys)),
+ base,
+ path: `${base}/nls.keys.json`
+ }),
+ new File({
+ contents: Buffer.from(`/*---------------------------------------------------------
+ * Copyright (C) Microsoft Corporation. All rights reserved.
+ *--------------------------------------------------------*/
+globalThis._VSCODE_NLS_MESSAGES=${JSON.stringify(_nls.allNLSMessages)};`),
+ base,
+ path: `${base}/nls.messages.js`
+ })
+ ]) {
+ this.emit('data', file);
+ }
+
+ this.emit('end');
+ }));
return duplex(input, output);
}
@@ -99,11 +123,19 @@ function isImportNode(ts: typeof import('typescript'), node: ts.Node): boolean {
module _nls {
- interface INlsStringResult {
+ export const moduleToNLSKeys: { [name: string /* module ID */]: ILocalizeKey[] /* keys */ } = {};
+ export const moduleToNLSMessages: { [name: string /* module ID */]: string[] /* messages */ } = {};
+ export const allNLSMessages: string[] = [];
+ export const allNLSModulesAndKeys: Array<[string /* module ID */, string[] /* keys */]> = [];
+ let allNLSMessagesIndex = 0;
+
+ type ILocalizeKey = string | { key: string }; // key might contain metadata for translators and then is not just a string
+
+ interface INlsPatchResult {
javascript: string;
sourcemap: sm.RawSourceMap;
- nls?: string;
- nlsKeys?: string;
+ nlsMessages?: string[];
+ nlsKeys?: ILocalizeKey[];
}
interface ISpan {
@@ -120,7 +152,6 @@ module _nls {
interface ILocalizeAnalysisResult {
localizeCalls: ILocalizeCall[];
- nlsExpressions: ISpan[];
}
interface IPatch {
@@ -200,24 +231,16 @@ module _nls {
.filter(n => n.kind === ts.SyntaxKind.ImportEqualsDeclaration)
.map(n => n)
.filter(d => d.moduleReference.kind === ts.SyntaxKind.ExternalModuleReference)
- .filter(d => (d.moduleReference).expression.getText() === '\'vs/nls\'');
+ .filter(d => (d.moduleReference).expression.getText().endsWith(`/nls.js'`));
// import ... from 'vs/nls';
const importDeclarations = imports
.filter(n => n.kind === ts.SyntaxKind.ImportDeclaration)
.map(n => n)
.filter(d => d.moduleSpecifier.kind === ts.SyntaxKind.StringLiteral)
- .filter(d => d.moduleSpecifier.getText() === '\'vs/nls\'')
+ .filter(d => d.moduleSpecifier.getText().endsWith(`/nls.js'`))
.filter(d => !!d.importClause && !!d.importClause.namedBindings);
- const nlsExpressions = importEqualsDeclarations
- .map(d => (d.moduleReference).expression)
- .concat(importDeclarations.map(d => d.moduleSpecifier))
- .map(d => ({
- start: ts.getLineAndCharacterOfPosition(sourceFile, d.getStart()),
- end: ts.getLineAndCharacterOfPosition(sourceFile, d.getEnd())
- }));
-
// `nls.localize(...)` calls
const nlsLocalizeCallExpressions = importDeclarations
.filter(d => !!(d.importClause && d.importClause.namedBindings && d.importClause.namedBindings.kind === ts.SyntaxKind.NamespaceImport))
@@ -280,8 +303,7 @@ module _nls {
}));
return {
- localizeCalls: localizeCalls.toArray(),
- nlsExpressions: nlsExpressions.toArray()
+ localizeCalls: localizeCalls.toArray()
};
}
@@ -351,17 +373,12 @@ module _nls {
}
}
- function patchJavascript(patches: IPatch[], contents: string, moduleId: string): string {
+ function patchJavascript(patches: IPatch[], contents: string): string {
const model = new TextModel(contents);
// patch the localize calls
lazy(patches).reverse().each(p => model.apply(p));
- // patch the 'vs/nls' imports
- const firstLine = model.get(0);
- const patchedFirstLine = firstLine.replace(/(['"])vs\/nls\1/g, `$1vs/nls!${moduleId}$1`);
- model.set(0, patchedFirstLine);
-
return model.toString();
}
@@ -410,16 +427,24 @@ module _nls {
return JSON.parse(smg.toString());
}
- function patch(ts: typeof import('typescript'), moduleId: string, typescript: string, javascript: string, sourcemap: sm.RawSourceMap): INlsStringResult {
- const { localizeCalls, nlsExpressions } = analyze(ts, typescript, 'localize');
- const { localizeCalls: localize2Calls, nlsExpressions: nls2Expressions } = analyze(ts, typescript, 'localize2');
+ function parseLocalizeKeyOrValue(sourceExpression: string) {
+ // sourceValue can be "foo", 'foo', `foo` or { .... }
+ // in its evalulated form
+ // we want to return either the string or the object
+ // eslint-disable-next-line no-eval
+ return eval(`(${sourceExpression})`);
+ }
+
+ function patch(ts: typeof import('typescript'), typescript: string, javascript: string, sourcemap: sm.RawSourceMap, options: { preserveEnglish: boolean }): INlsPatchResult {
+ const { localizeCalls } = analyze(ts, typescript, 'localize');
+ const { localizeCalls: localize2Calls } = analyze(ts, typescript, 'localize2');
if (localizeCalls.length === 0 && localize2Calls.length === 0) {
return { javascript, sourcemap };
}
- const nlsKeys = template(localizeCalls.map(lc => lc.key).concat(localize2Calls.map(lc => lc.key)));
- const nls = template(localizeCalls.map(lc => lc.value).concat(localize2Calls.map(lc => lc.value)));
+ const nlsKeys = localizeCalls.map(lc => parseLocalizeKeyOrValue(lc.key)).concat(localize2Calls.map(lc => parseLocalizeKeyOrValue(lc.key)));
+ const nlsMessages = localizeCalls.map(lc => parseLocalizeKeyOrValue(lc.value)).concat(localize2Calls.map(lc => parseLocalizeKeyOrValue(lc.value)));
const smc = new sm.SourceMapConsumer(sourcemap);
const positionFrom = mappedPositionFrom.bind(null, sourcemap.sources[0]);
@@ -430,18 +455,20 @@ module _nls {
return { span: { start, end }, content: c.content };
};
- let i = 0;
const localizePatches = lazy(localizeCalls)
- .map(lc => ([
- { range: lc.keySpan, content: '' + (i++) },
- { range: lc.valueSpan, content: 'null' }
- ]))
+ .map(lc => (
+ options.preserveEnglish ? [
+ { range: lc.keySpan, content: `${allNLSMessagesIndex++}` } // localize('key', "message") => localize(, "message")
+ ] : [
+ { range: lc.keySpan, content: `${allNLSMessagesIndex++}` }, // localize('key', "message") => localize(, null)
+ { range: lc.valueSpan, content: 'null' }
+ ]))
.flatten()
.map(toPatch);
const localize2Patches = lazy(localize2Calls)
.map(lc => (
- { range: lc.keySpan, content: '' + (i++) }
+ { range: lc.keySpan, content: `${allNLSMessagesIndex++}` } // localize2('key', "message") => localize(, "message")
))
.map(toPatch);
@@ -460,45 +487,39 @@ module _nls {
}
});
- javascript = patchJavascript(patches, javascript, moduleId);
-
- // since imports are not within the sourcemap information,
- // we must do this MacGyver style
- if (nlsExpressions.length || nls2Expressions.length) {
- javascript = javascript.replace(/^define\(.*$/m, line => {
- return line.replace(/(['"])vs\/nls\1/g, `$1vs/nls!${moduleId}$1`);
- });
- }
+ javascript = patchJavascript(patches, javascript);
sourcemap = patchSourcemap(patches, sourcemap, smc);
- return { javascript, sourcemap, nlsKeys, nls };
+ return { javascript, sourcemap, nlsKeys, nlsMessages };
}
- export function patchFiles(javascriptFile: File, typescript: string): File[] {
+ export function patchFile(javascriptFile: File, typescript: string, options: { preserveEnglish: boolean }): File {
const ts = require('typescript') as typeof import('typescript');
// hack?
const moduleId = javascriptFile.relative
.replace(/\.js$/, '')
.replace(/\\/g, '/');
- const { javascript, sourcemap, nlsKeys, nls } = patch(
+ const { javascript, sourcemap, nlsKeys, nlsMessages } = patch(
ts,
- moduleId,
typescript,
javascriptFile.contents.toString(),
- (javascriptFile).sourceMap
+ (javascriptFile).sourceMap,
+ options
);
- const result: File[] = [fileFrom(javascriptFile, javascript)];
- (result[0]).sourceMap = sourcemap;
+ const result = fileFrom(javascriptFile, javascript);
+ (result).sourceMap = sourcemap;
if (nlsKeys) {
- result.push(fileFrom(javascriptFile, nlsKeys, javascriptFile.path.replace(/\.js$/, '.nls.keys.js')));
+ moduleToNLSKeys[moduleId] = nlsKeys;
+ allNLSModulesAndKeys.push([moduleId, nlsKeys.map(nlsKey => typeof nlsKey === 'string' ? nlsKey : nlsKey.key)]);
}
- if (nls) {
- result.push(fileFrom(javascriptFile, nls, javascriptFile.path.replace(/\.js$/, '.nls.js')));
+ if (nlsMessages) {
+ moduleToNLSMessages[moduleId] = nlsMessages;
+ allNLSMessages.push(...nlsMessages);
}
return result;
diff --git a/build/lib/node.js b/build/lib/node.js
index 7209dffc134..74a54a3c170 100644
--- a/build/lib/node.js
+++ b/build/lib/node.js
@@ -7,9 +7,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
const path = require("path");
const fs = require("fs");
const root = path.dirname(path.dirname(__dirname));
-const yarnrcPath = path.join(root, 'remote', '.yarnrc');
-const yarnrc = fs.readFileSync(yarnrcPath, 'utf8');
-const version = /^target\s+"([^"]+)"$/m.exec(yarnrc)[1];
+const npmrcPath = path.join(root, 'remote', '.npmrc');
+const npmrc = fs.readFileSync(npmrcPath, 'utf8');
+const version = /^target="(.*)"$/m.exec(npmrc)[1];
const platform = process.platform;
const arch = process.arch;
const node = platform === 'win32' ? 'node.exe' : 'node';
diff --git a/build/lib/node.ts b/build/lib/node.ts
index d1b0039b022..4beb13ae91b 100644
--- a/build/lib/node.ts
+++ b/build/lib/node.ts
@@ -7,9 +7,9 @@ import * as path from 'path';
import * as fs from 'fs';
const root = path.dirname(path.dirname(__dirname));
-const yarnrcPath = path.join(root, 'remote', '.yarnrc');
-const yarnrc = fs.readFileSync(yarnrcPath, 'utf8');
-const version = /^target\s+"([^"]+)"$/m.exec(yarnrc)![1];
+const npmrcPath = path.join(root, 'remote', '.npmrc');
+const npmrc = fs.readFileSync(npmrcPath, 'utf8');
+const version = /^target="(.*)"$/m.exec(npmrc)![1];
const platform = process.platform;
const arch = process.arch;
diff --git a/build/lib/optimize.js b/build/lib/optimize.js
index d48235ebf15..2bc923ba636 100644
--- a/build/lib/optimize.js
+++ b/build/lib/optimize.js
@@ -4,215 +4,145 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
Object.defineProperty(exports, "__esModule", { value: true });
-exports.loaderConfig = loaderConfig;
-exports.optimizeLoaderTask = optimizeLoaderTask;
exports.optimizeTask = optimizeTask;
exports.minifyTask = minifyTask;
const es = require("event-stream");
const gulp = require("gulp");
const concat = require("gulp-concat");
const filter = require("gulp-filter");
-const fancyLog = require("fancy-log");
-const ansiColors = require("ansi-colors");
const path = require("path");
+const fs = require("fs");
const pump = require("pump");
const VinylFile = require("vinyl");
const bundle = require("./bundle");
-const i18n_1 = require("./i18n");
-const stats_1 = require("./stats");
-const util = require("./util");
const postcss_1 = require("./postcss");
+const esbuild = require("esbuild");
+const sourcemaps = require("gulp-sourcemaps");
const REPO_ROOT_PATH = path.join(__dirname, '../..');
-function log(prefix, message) {
- fancyLog(ansiColors.cyan('[' + prefix + ']'), message);
-}
-function loaderConfig() {
- const result = {
- paths: {
- 'vs': 'out-build/vs',
- 'vscode': 'empty:'
- },
- amdModulesPattern: /^vs\//
- };
- result['vs/css'] = { inlineResources: true };
- return result;
-}
-const IS_OUR_COPYRIGHT_REGEXP = /Copyright \(C\) Microsoft Corporation/i;
-function loaderPlugin(src, base, amdModuleId) {
- return (gulp
- .src(src, { base })
- .pipe(es.through(function (data) {
- if (amdModuleId) {
- let contents = data.contents.toString('utf8');
- contents = contents.replace(/^define\(/m, `define("${amdModuleId}",`);
- data.contents = Buffer.from(contents);
- }
- this.emit('data', data);
- })));
-}
-function loader(src, bundledFileHeader, bundleLoader, externalLoaderInfo) {
- let loaderStream = gulp.src(`${src}/vs/loader.js`, { base: `${src}` });
- if (bundleLoader) {
- loaderStream = es.merge(loaderStream, loaderPlugin(`${src}/vs/css.js`, `${src}`, 'vs/css'), loaderPlugin(`${src}/vs/nls.js`, `${src}`, 'vs/nls'));
- }
- const files = [];
- const order = (f) => {
- if (f.path.endsWith('loader.js')) {
- return 0;
- }
- if (f.path.endsWith('css.js')) {
- return 1;
- }
- if (f.path.endsWith('nls.js')) {
- return 2;
- }
- return 3;
- };
- return (loaderStream
- .pipe(es.through(function (data) {
- files.push(data);
- }, function () {
- files.sort((a, b) => {
- return order(a) - order(b);
- });
- files.unshift(new VinylFile({
- path: 'fake',
- base: '.',
- contents: Buffer.from(bundledFileHeader)
- }));
- if (externalLoaderInfo !== undefined) {
- files.push(new VinylFile({
- path: 'fake2',
- base: '.',
- contents: Buffer.from(emitExternalLoaderInfo(externalLoaderInfo))
- }));
- }
- for (const file of files) {
- this.emit('data', file);
- }
- this.emit('end');
- }))
- .pipe(concat('vs/loader.js')));
-}
-function emitExternalLoaderInfo(externalLoaderInfo) {
- const externalBaseUrl = externalLoaderInfo.baseUrl;
- externalLoaderInfo.baseUrl = '$BASE_URL';
- // If defined, use the runtime configured baseUrl.
- const code = `
-(function() {
- const baseUrl = require.getConfig().baseUrl || ${JSON.stringify(externalBaseUrl)};
- require.config(${JSON.stringify(externalLoaderInfo, undefined, 2)});
-})();`;
- return code.replace('"$BASE_URL"', 'baseUrl');
-}
-function toConcatStream(src, bundledFileHeader, sources, dest, fileContentMapper) {
- const useSourcemaps = /\.js$/.test(dest) && !/\.nls\.js$/.test(dest);
- // If a bundle ends up including in any of the sources our copyright, then
- // insert a fake source at the beginning of each bundle with our copyright
- let containsOurCopyright = false;
- for (let i = 0, len = sources.length; i < len; i++) {
- const fileContents = sources[i].contents;
- if (IS_OUR_COPYRIGHT_REGEXP.test(fileContents)) {
- containsOurCopyright = true;
- break;
- }
- }
- if (containsOurCopyright) {
- sources.unshift({
- path: null,
- contents: bundledFileHeader
- });
- }
- const treatedSources = sources.map(function (source) {
- const root = source.path ? REPO_ROOT_PATH.replace(/\\/g, '/') : '';
- const base = source.path ? root + `/${src}` : '.';
- const path = source.path ? root + '/' + source.path.replace(/\\/g, '/') : 'fake';
- const contents = source.path ? fileContentMapper(source.contents, path) : source.contents;
- return new VinylFile({
- path: path,
- base: base,
- contents: Buffer.from(contents)
- });
- });
- return es.readArray(treatedSources)
- .pipe(useSourcemaps ? util.loadSourcemaps() : es.through())
- .pipe(concat(dest))
- .pipe((0, stats_1.createStatsStream)(dest));
-}
-function toBundleStream(src, bundledFileHeader, bundles, fileContentMapper) {
- return es.merge(bundles.map(function (bundle) {
- return toConcatStream(src, bundledFileHeader, bundle.sources, bundle.dest, fileContentMapper);
- }));
-}
const DEFAULT_FILE_HEADER = [
'/*!--------------------------------------------------------',
' * Copyright (C) Microsoft Corporation. All rights reserved.',
' *--------------------------------------------------------*/'
].join('\n');
-function optimizeAMDTask(opts) {
- const src = opts.src;
- const entryPoints = opts.entryPoints;
- const resources = opts.resources;
- const loaderConfig = opts.loaderConfig;
- const bundledFileHeader = opts.header || DEFAULT_FILE_HEADER;
- const fileContentMapper = opts.fileContentMapper || ((contents, _path) => contents);
- const sourcemaps = require('gulp-sourcemaps');
- const bundlesStream = es.through(); // this stream will contain the bundled files
+function optimizeESMTask(opts) {
const resourcesStream = es.through(); // this stream will contain the resources
- const bundleInfoStream = es.through(); // this stream will contain bundleInfo.json
- bundle.bundle(entryPoints, loaderConfig, function (err, result) {
- if (err || !result) {
- return bundlesStream.emit('error', JSON.stringify(err));
+ const bundlesStream = es.through(); // this stream will contain the bundled files
+ const entryPoints = opts.entryPoints.map(entryPoint => {
+ if (typeof entryPoint === 'string') {
+ return { name: path.parse(entryPoint).name };
}
- toBundleStream(src, bundledFileHeader, result.files, fileContentMapper).pipe(bundlesStream);
- // Remove css inlined resources
- const filteredResources = resources.slice();
- result.cssInlinedResources.forEach(function (resource) {
- if (process.env['VSCODE_BUILD_VERBOSE']) {
- log('optimizer', 'excluding inlined: ' + resource);
- }
- filteredResources.push('!' + resource);
- });
- gulp.src(filteredResources, { base: `${src}`, allowEmpty: true }).pipe(resourcesStream);
- const bundleInfoArray = [];
- if (opts.bundleInfo) {
- bundleInfoArray.push(new VinylFile({
- path: 'bundleInfo.json',
- base: '.',
- contents: Buffer.from(JSON.stringify(result.bundleData, null, '\t'))
- }));
- }
- es.readArray(bundleInfoArray).pipe(bundleInfoStream);
+ return entryPoint;
});
- const result = es.merge(loader(src, bundledFileHeader, false, opts.externalLoaderInfo), bundlesStream, resourcesStream, bundleInfoStream);
+ const allMentionedModules = new Set();
+ for (const entryPoint of entryPoints) {
+ allMentionedModules.add(entryPoint.name);
+ entryPoint.include?.forEach(allMentionedModules.add, allMentionedModules);
+ entryPoint.exclude?.forEach(allMentionedModules.add, allMentionedModules);
+ }
+ allMentionedModules.delete('vs/css'); // TODO@esm remove this when vs/css is removed
+ const bundleAsync = async () => {
+ const files = [];
+ const tasks = [];
+ for (const entryPoint of entryPoints) {
+ console.log(`[bundle] '${entryPoint.name}'`);
+ // support for 'dest' via esbuild#in/out
+ const dest = entryPoint.dest?.replace(/\.[^/.]+$/, '') ?? entryPoint.name;
+ // boilerplate massage
+ const banner = {
+ js: DEFAULT_FILE_HEADER,
+ css: DEFAULT_FILE_HEADER
+ };
+ const tslibPath = path.join(require.resolve('tslib'), '../tslib.es6.js');
+ banner.js += await fs.promises.readFile(tslibPath, 'utf-8');
+ const boilerplateTrimmer = {
+ name: 'boilerplate-trimmer',
+ setup(build) {
+ build.onLoad({ filter: /\.js$/ }, async (args) => {
+ const contents = await fs.promises.readFile(args.path, 'utf-8');
+ const newContents = bundle.removeAllTSBoilerplate(contents);
+ return { contents: newContents };
+ });
+ }
+ };
+ const overrideExternalPlugin = {
+ name: 'override-external',
+ setup(build) {
+ // We inline selected modules that are we depend on on startup without
+ // a conditional `await import(...)` by hooking into the resolution.
+ build.onResolve({ filter: /^minimist$/ }, () => {
+ return { path: path.join(REPO_ROOT_PATH, 'node_modules', 'minimist', 'index.js'), external: false };
+ });
+ },
+ };
+ const task = esbuild.build({
+ bundle: true,
+ external: entryPoint.exclude,
+ packages: 'external', // "external all the things", see https://esbuild.github.io/api/#packages
+ platform: 'neutral', // makes esm
+ format: 'esm',
+ sourcemap: 'external',
+ plugins: [boilerplateTrimmer, overrideExternalPlugin],
+ target: ['es2022'],
+ loader: {
+ '.ttf': 'file',
+ '.svg': 'file',
+ '.png': 'file',
+ '.sh': 'file',
+ },
+ assetNames: 'media/[name]', // moves media assets into a sub-folder "media"
+ banner: entryPoint.name === 'vs/workbench/workbench.web.main' ? undefined : banner, // TODO@esm remove line when we stop supporting web-amd-esm-bridge
+ entryPoints: [
+ {
+ in: path.join(REPO_ROOT_PATH, opts.src, `${entryPoint.name}.js`),
+ out: dest,
+ }
+ ],
+ outdir: path.join(REPO_ROOT_PATH, opts.src),
+ write: false, // enables res.outputFiles
+ metafile: true, // enables res.metafile
+ }).then(res => {
+ for (const file of res.outputFiles) {
+ let contents = file.contents;
+ let sourceMapFile = undefined;
+ if (file.path.endsWith('.js')) {
+ if (opts.fileContentMapper) {
+ // UGLY the fileContentMapper is per file but at this point we have all files
+ // bundled already. So, we call the mapper for the same contents but each file
+ // that has been included in the bundle...
+ let newText = file.text;
+ for (const input of Object.keys(res.metafile.inputs)) {
+ newText = opts.fileContentMapper(newText, input);
+ }
+ contents = Buffer.from(newText);
+ }
+ sourceMapFile = res.outputFiles.find(f => f.path === `${file.path}.map`);
+ }
+ const fileProps = {
+ contents: Buffer.from(contents),
+ sourceMap: sourceMapFile ? JSON.parse(sourceMapFile.text) : undefined, // support gulp-sourcemaps
+ path: file.path,
+ base: path.join(REPO_ROOT_PATH, opts.src)
+ };
+ files.push(new VinylFile(fileProps));
+ }
+ });
+ tasks.push(task);
+ }
+ await Promise.all(tasks);
+ return { files };
+ };
+ bundleAsync().then((output) => {
+ // bundle output (JS, CSS, SVG...)
+ es.readArray(output.files).pipe(bundlesStream);
+ // forward all resources
+ gulp.src(opts.resources ?? [], { base: `${opts.src}`, allowEmpty: true }).pipe(resourcesStream);
+ });
+ const result = es.merge(bundlesStream, resourcesStream);
return result
.pipe(sourcemaps.write('./', {
sourceRoot: undefined,
addComment: true,
includeContent: true
- }))
- .pipe(opts.languages && opts.languages.length ? (0, i18n_1.processNlsFiles)({
- fileHeader: bundledFileHeader,
- languages: opts.languages
- }) : es.through());
-}
-function optimizeCommonJSTask(opts) {
- const esbuild = require('esbuild');
- const src = opts.src;
- const entryPoints = opts.entryPoints;
- return gulp.src(entryPoints, { base: `${src}`, allowEmpty: true })
- .pipe(es.map((f, cb) => {
- esbuild.build({
- entryPoints: [f.path],
- bundle: true,
- platform: opts.platform,
- write: false,
- external: opts.external
- }).then(res => {
- const jsFile = res.outputFiles[0];
- f.contents = Buffer.from(jsFile.contents);
- cb(undefined, f);
- });
}));
}
function optimizeManualTask(options) {
@@ -223,15 +153,10 @@ function optimizeManualTask(options) {
});
return es.merge(...concatenations);
}
-function optimizeLoaderTask(src, out, bundleLoader, bundledFileHeader = '', externalLoaderInfo) {
- return () => loader(src, bundledFileHeader, bundleLoader, externalLoaderInfo).pipe(gulp.dest(out));
-}
function optimizeTask(opts) {
return function () {
- const optimizers = [optimizeAMDTask(opts.amd)];
- if (opts.commonJS) {
- optimizers.push(optimizeCommonJSTask(opts.commonJS));
- }
+ const optimizers = [];
+ optimizers.push(optimizeESMTask(opts.esm));
if (opts.manual) {
optimizers.push(optimizeManualTask(opts.manual));
}
@@ -239,11 +164,9 @@ function optimizeTask(opts) {
};
}
function minifyTask(src, sourceMapBaseUrl) {
- const esbuild = require('esbuild');
const sourceMappingURL = sourceMapBaseUrl ? ((f) => `${sourceMapBaseUrl}/${f.relative}.map`) : undefined;
return cb => {
const cssnano = require('cssnano');
- const sourcemaps = require('gulp-sourcemaps');
const svgmin = require('gulp-svgmin');
const jsFilter = filter('**/*.js', { restore: true });
const cssFilter = filter('**/*.css', { restore: true });
@@ -255,7 +178,7 @@ function minifyTask(src, sourceMapBaseUrl) {
sourcemap: 'external',
outdir: '.',
platform: 'node',
- target: ['esnext'],
+ target: ['es2022'],
write: false
}).then(res => {
const jsFile = res.outputFiles.find(f => /\.js$/.test(f.path));
@@ -271,12 +194,7 @@ function minifyTask(src, sourceMapBaseUrl) {
cb(undefined, f);
}
}, cb);
- }), jsFilter.restore, cssFilter, (0, postcss_1.gulpPostcss)([cssnano({ preset: 'default' })]), cssFilter.restore, svgFilter, svgmin(), svgFilter.restore, sourcemaps.mapSources((sourcePath) => {
- if (sourcePath === 'bootstrap-fork.js') {
- return 'bootstrap-fork.orig.js';
- }
- return sourcePath;
- }), sourcemaps.write('./', {
+ }), jsFilter.restore, cssFilter, (0, postcss_1.gulpPostcss)([cssnano({ preset: 'default' })]), cssFilter.restore, svgFilter, svgmin(), svgFilter.restore, sourcemaps.write('./', {
sourceMappingURL,
sourceRoot: undefined,
includeContent: true,
diff --git a/build/lib/optimize.ts b/build/lib/optimize.ts
index 5b6dee9bf65..fc7a547ad71 100644
--- a/build/lib/optimize.ts
+++ b/build/lib/optimize.ts
@@ -7,200 +7,30 @@ import * as es from 'event-stream';
import * as gulp from 'gulp';
import * as concat from 'gulp-concat';
import * as filter from 'gulp-filter';
-import * as fancyLog from 'fancy-log';
-import * as ansiColors from 'ansi-colors';
import * as path from 'path';
+import * as fs from 'fs';
import * as pump from 'pump';
import * as VinylFile from 'vinyl';
import * as bundle from './bundle';
-import { Language, processNlsFiles } from './i18n';
-import { createStatsStream } from './stats';
-import * as util from './util';
import { gulpPostcss } from './postcss';
+import * as esbuild from 'esbuild';
+import * as sourcemaps from 'gulp-sourcemaps';
const REPO_ROOT_PATH = path.join(__dirname, '../..');
-function log(prefix: string, message: string): void {
- fancyLog(ansiColors.cyan('[' + prefix + ']'), message);
-}
-
-export function loaderConfig() {
- const result: any = {
- paths: {
- 'vs': 'out-build/vs',
- 'vscode': 'empty:'
- },
- amdModulesPattern: /^vs\//
- };
-
- result['vs/css'] = { inlineResources: true };
-
- return result;
-}
-
-const IS_OUR_COPYRIGHT_REGEXP = /Copyright \(C\) Microsoft Corporation/i;
-
-function loaderPlugin(src: string, base: string, amdModuleId: string | undefined): NodeJS.ReadWriteStream {
- return (
- gulp
- .src(src, { base })
- .pipe(es.through(function (data: VinylFile) {
- if (amdModuleId) {
- let contents = data.contents.toString('utf8');
- contents = contents.replace(/^define\(/m, `define("${amdModuleId}",`);
- data.contents = Buffer.from(contents);
- }
- this.emit('data', data);
- }))
- );
-}
-
-function loader(src: string, bundledFileHeader: string, bundleLoader: boolean, externalLoaderInfo?: util.IExternalLoaderInfo): NodeJS.ReadWriteStream {
- let loaderStream = gulp.src(`${src}/vs/loader.js`, { base: `${src}` });
- if (bundleLoader) {
- loaderStream = es.merge(
- loaderStream,
- loaderPlugin(`${src}/vs/css.js`, `${src}`, 'vs/css'),
- loaderPlugin(`${src}/vs/nls.js`, `${src}`, 'vs/nls'),
- );
- }
-
- const files: VinylFile[] = [];
- const order = (f: VinylFile) => {
- if (f.path.endsWith('loader.js')) {
- return 0;
- }
- if (f.path.endsWith('css.js')) {
- return 1;
- }
- if (f.path.endsWith('nls.js')) {
- return 2;
- }
- return 3;
- };
-
- return (
- loaderStream
- .pipe(es.through(function (data) {
- files.push(data);
- }, function () {
- files.sort((a, b) => {
- return order(a) - order(b);
- });
- files.unshift(new VinylFile({
- path: 'fake',
- base: '.',
- contents: Buffer.from(bundledFileHeader)
- }));
- if (externalLoaderInfo !== undefined) {
- files.push(new VinylFile({
- path: 'fake2',
- base: '.',
- contents: Buffer.from(emitExternalLoaderInfo(externalLoaderInfo))
- }));
- }
- for (const file of files) {
- this.emit('data', file);
- }
- this.emit('end');
- }))
- .pipe(concat('vs/loader.js'))
- );
-}
-
-function emitExternalLoaderInfo(externalLoaderInfo: util.IExternalLoaderInfo): string {
- const externalBaseUrl = externalLoaderInfo.baseUrl;
- externalLoaderInfo.baseUrl = '$BASE_URL';
-
- // If defined, use the runtime configured baseUrl.
- const code = `
-(function() {
- const baseUrl = require.getConfig().baseUrl || ${JSON.stringify(externalBaseUrl)};
- require.config(${JSON.stringify(externalLoaderInfo, undefined, 2)});
-})();`;
- return code.replace('"$BASE_URL"', 'baseUrl');
-}
-
-function toConcatStream(src: string, bundledFileHeader: string, sources: bundle.IFile[], dest: string, fileContentMapper: (contents: string, path: string) => string): NodeJS.ReadWriteStream {
- const useSourcemaps = /\.js$/.test(dest) && !/\.nls\.js$/.test(dest);
-
- // If a bundle ends up including in any of the sources our copyright, then
- // insert a fake source at the beginning of each bundle with our copyright
- let containsOurCopyright = false;
- for (let i = 0, len = sources.length; i < len; i++) {
- const fileContents = sources[i].contents;
- if (IS_OUR_COPYRIGHT_REGEXP.test(fileContents)) {
- containsOurCopyright = true;
- break;
- }
- }
-
- if (containsOurCopyright) {
- sources.unshift({
- path: null,
- contents: bundledFileHeader
- });
- }
-
- const treatedSources = sources.map(function (source) {
- const root = source.path ? REPO_ROOT_PATH.replace(/\\/g, '/') : '';
- const base = source.path ? root + `/${src}` : '.';
- const path = source.path ? root + '/' + source.path.replace(/\\/g, '/') : 'fake';
- const contents = source.path ? fileContentMapper(source.contents, path) : source.contents;
-
- return new VinylFile({
- path: path,
- base: base,
- contents: Buffer.from(contents)
- });
- });
-
- return es.readArray(treatedSources)
- .pipe(useSourcemaps ? util.loadSourcemaps() : es.through())
- .pipe(concat(dest))
- .pipe(createStatsStream(dest));
-}
-
-function toBundleStream(src: string, bundledFileHeader: string, bundles: bundle.IConcatFile[], fileContentMapper: (contents: string, path: string) => string): NodeJS.ReadWriteStream {
- return es.merge(bundles.map(function (bundle) {
- return toConcatStream(src, bundledFileHeader, bundle.sources, bundle.dest, fileContentMapper);
- }));
-}
-
-export interface IOptimizeAMDTaskOpts {
+export interface IOptimizeESMTaskOpts {
/**
* The folder to read files from.
*/
src: string;
/**
- * (for AMD files, will get bundled and get Copyright treatment)
+ * The entry points to bundle.
*/
- entryPoints: bundle.IEntryPoint[];
+ entryPoints: Array;
/**
- * (svg, etc.)
+ * Other resources to consider (svg, etc.)
*/
- resources: string[];
- loaderConfig: any;
- /**
- * Additional info we append to the end of the loader
- */
- externalLoaderInfo?: util.IExternalLoaderInfo;
- /**
- * (true by default - append css and nls to loader)
- */
- bundleLoader?: boolean;
- /**
- * (basically the Copyright treatment)
- */
- header?: string;
- /**
- * (emit bundleInfo.json file)
- */
- bundleInfo: boolean;
- /**
- * Language configuration.
- */
- languages?: Language[];
+ resources?: string[];
/**
* File contents interceptor
* @param contents The contents of the file
@@ -215,51 +45,146 @@ const DEFAULT_FILE_HEADER = [
' *--------------------------------------------------------*/'
].join('\n');
-function optimizeAMDTask(opts: IOptimizeAMDTaskOpts): NodeJS.ReadWriteStream {
- const src = opts.src;
- const entryPoints = opts.entryPoints;
- const resources = opts.resources;
- const loaderConfig = opts.loaderConfig;
- const bundledFileHeader = opts.header || DEFAULT_FILE_HEADER;
- const fileContentMapper = opts.fileContentMapper || ((contents: string, _path: string) => contents);
-
- const sourcemaps = require('gulp-sourcemaps') as typeof import('gulp-sourcemaps');
-
- const bundlesStream = es.through(); // this stream will contain the bundled files
+function optimizeESMTask(opts: IOptimizeESMTaskOpts): NodeJS.ReadWriteStream {
const resourcesStream = es.through(); // this stream will contain the resources
- const bundleInfoStream = es.through(); // this stream will contain bundleInfo.json
+ const bundlesStream = es.through(); // this stream will contain the bundled files
- bundle.bundle(entryPoints, loaderConfig, function (err, result) {
- if (err || !result) { return bundlesStream.emit('error', JSON.stringify(err)); }
-
- toBundleStream(src, bundledFileHeader, result.files, fileContentMapper).pipe(bundlesStream);
-
- // Remove css inlined resources
- const filteredResources = resources.slice();
- result.cssInlinedResources.forEach(function (resource) {
- if (process.env['VSCODE_BUILD_VERBOSE']) {
- log('optimizer', 'excluding inlined: ' + resource);
- }
- filteredResources.push('!' + resource);
- });
- gulp.src(filteredResources, { base: `${src}`, allowEmpty: true }).pipe(resourcesStream);
-
- const bundleInfoArray: VinylFile[] = [];
- if (opts.bundleInfo) {
- bundleInfoArray.push(new VinylFile({
- path: 'bundleInfo.json',
- base: '.',
- contents: Buffer.from(JSON.stringify(result.bundleData, null, '\t'))
- }));
+ const entryPoints = opts.entryPoints.map(entryPoint => {
+ if (typeof entryPoint === 'string') {
+ return { name: path.parse(entryPoint).name };
}
- es.readArray(bundleInfoArray).pipe(bundleInfoStream);
+ return entryPoint;
+ });
+
+ const allMentionedModules = new Set();
+ for (const entryPoint of entryPoints) {
+ allMentionedModules.add(entryPoint.name);
+ entryPoint.include?.forEach(allMentionedModules.add, allMentionedModules);
+ entryPoint.exclude?.forEach(allMentionedModules.add, allMentionedModules);
+ }
+
+ allMentionedModules.delete('vs/css'); // TODO@esm remove this when vs/css is removed
+
+ const bundleAsync = async () => {
+
+ const files: VinylFile[] = [];
+ const tasks: Promise[] = [];
+
+ for (const entryPoint of entryPoints) {
+
+ console.log(`[bundle] '${entryPoint.name}'`);
+
+ // support for 'dest' via esbuild#in/out
+ const dest = entryPoint.dest?.replace(/\.[^/.]+$/, '') ?? entryPoint.name;
+
+ // boilerplate massage
+ const banner = {
+ js: DEFAULT_FILE_HEADER,
+ css: DEFAULT_FILE_HEADER
+ };
+ const tslibPath = path.join(require.resolve('tslib'), '../tslib.es6.js');
+ banner.js += await fs.promises.readFile(tslibPath, 'utf-8');
+
+ const boilerplateTrimmer: esbuild.Plugin = {
+ name: 'boilerplate-trimmer',
+ setup(build) {
+ build.onLoad({ filter: /\.js$/ }, async args => {
+ const contents = await fs.promises.readFile(args.path, 'utf-8');
+ const newContents = bundle.removeAllTSBoilerplate(contents);
+ return { contents: newContents };
+ });
+ }
+ };
+
+ const overrideExternalPlugin: esbuild.Plugin = {
+ name: 'override-external',
+ setup(build) {
+ // We inline selected modules that are we depend on on startup without
+ // a conditional `await import(...)` by hooking into the resolution.
+ build.onResolve({ filter: /^minimist$/ }, () => {
+ return { path: path.join(REPO_ROOT_PATH, 'node_modules', 'minimist', 'index.js'), external: false };
+ });
+ },
+ };
+
+ const task = esbuild.build({
+ bundle: true,
+ external: entryPoint.exclude,
+ packages: 'external', // "external all the things", see https://esbuild.github.io/api/#packages
+ platform: 'neutral', // makes esm
+ format: 'esm',
+ sourcemap: 'external',
+ plugins: [boilerplateTrimmer, overrideExternalPlugin],
+ target: ['es2022'],
+ loader: {
+ '.ttf': 'file',
+ '.svg': 'file',
+ '.png': 'file',
+ '.sh': 'file',
+ },
+ assetNames: 'media/[name]', // moves media assets into a sub-folder "media"
+ banner: entryPoint.name === 'vs/workbench/workbench.web.main' ? undefined : banner, // TODO@esm remove line when we stop supporting web-amd-esm-bridge
+ entryPoints: [
+ {
+ in: path.join(REPO_ROOT_PATH, opts.src, `${entryPoint.name}.js`),
+ out: dest,
+ }
+ ],
+ outdir: path.join(REPO_ROOT_PATH, opts.src),
+ write: false, // enables res.outputFiles
+ metafile: true, // enables res.metafile
+
+ }).then(res => {
+ for (const file of res.outputFiles) {
+
+ let contents = file.contents;
+ let sourceMapFile: esbuild.OutputFile | undefined = undefined;
+
+ if (file.path.endsWith('.js')) {
+
+ if (opts.fileContentMapper) {
+ // UGLY the fileContentMapper is per file but at this point we have all files
+ // bundled already. So, we call the mapper for the same contents but each file
+ // that has been included in the bundle...
+ let newText = file.text;
+ for (const input of Object.keys(res.metafile.inputs)) {
+ newText = opts.fileContentMapper(newText, input);
+ }
+ contents = Buffer.from(newText);
+ }
+
+ sourceMapFile = res.outputFiles.find(f => f.path === `${file.path}.map`);
+ }
+
+ const fileProps = {
+ contents: Buffer.from(contents),
+ sourceMap: sourceMapFile ? JSON.parse(sourceMapFile.text) : undefined, // support gulp-sourcemaps
+ path: file.path,
+ base: path.join(REPO_ROOT_PATH, opts.src)
+ };
+ files.push(new VinylFile(fileProps));
+ }
+ });
+
+ tasks.push(task);
+ }
+
+ await Promise.all(tasks);
+ return { files };
+ };
+
+ bundleAsync().then((output) => {
+
+ // bundle output (JS, CSS, SVG...)
+ es.readArray(output.files).pipe(bundlesStream);
+
+ // forward all resources
+ gulp.src(opts.resources ?? [], { base: `${opts.src}`, allowEmpty: true }).pipe(resourcesStream);
});
const result = es.merge(
- loader(src, bundledFileHeader, false, opts.externalLoaderInfo),
bundlesStream,
- resourcesStream,
- bundleInfoStream
+ resourcesStream
);
return result
@@ -267,52 +192,6 @@ function optimizeAMDTask(opts: IOptimizeAMDTaskOpts): NodeJS.ReadWriteStream {
sourceRoot: undefined,
addComment: true,
includeContent: true
- }))
- .pipe(opts.languages && opts.languages.length ? processNlsFiles({
- fileHeader: bundledFileHeader,
- languages: opts.languages
- }) : es.through());
-}
-
-export interface IOptimizeCommonJSTaskOpts {
- /**
- * The paths to consider for optimizing.
- */
- entryPoints: string[];
- /**
- * The folder to read files from.
- */
- src: string;
- /**
- * ESBuild `platform` option: https://esbuild.github.io/api/#platform
- */
- platform: 'browser' | 'node' | 'neutral';
- /**
- * ESBuild `external` option: https://esbuild.github.io/api/#external
- */
- external: string[];
-}
-
-function optimizeCommonJSTask(opts: IOptimizeCommonJSTaskOpts): NodeJS.ReadWriteStream {
- const esbuild = require('esbuild') as typeof import('esbuild');
-
- const src = opts.src;
- const entryPoints = opts.entryPoints;
-
- return gulp.src(entryPoints, { base: `${src}`, allowEmpty: true })
- .pipe(es.map((f: any, cb) => {
- esbuild.build({
- entryPoints: [f.path],
- bundle: true,
- platform: opts.platform,
- write: false,
- external: opts.external
- }).then(res => {
- const jsFile = res.outputFiles[0];
- f.contents = Buffer.from(jsFile.contents);
-
- cb(undefined, f);
- });
}));
}
@@ -338,23 +217,15 @@ function optimizeManualTask(options: IOptimizeManualTaskOpts[]): NodeJS.ReadWrit
return es.merge(...concatenations);
}
-export function optimizeLoaderTask(src: string, out: string, bundleLoader: boolean, bundledFileHeader = '', externalLoaderInfo?: util.IExternalLoaderInfo): () => NodeJS.ReadWriteStream {
- return () => loader(src, bundledFileHeader, bundleLoader, externalLoaderInfo).pipe(gulp.dest(out));
-}
-
export interface IOptimizeTaskOpts {
/**
* Destination folder for the optimized files.
*/
out: string;
/**
- * Optimize AMD modules (using our AMD loader).
- */
- amd: IOptimizeAMDTaskOpts;
- /**
- * Optimize CommonJS modules (using esbuild).
- */
- commonJS?: IOptimizeCommonJSTaskOpts;
+ * Optimize ESM modules (using esbuild).
+ */
+ esm: IOptimizeESMTaskOpts;
/**
* Optimize manually by concatenating files.
*/
@@ -363,10 +234,8 @@ export interface IOptimizeTaskOpts {
export function optimizeTask(opts: IOptimizeTaskOpts): () => NodeJS.ReadWriteStream {
return function () {
- const optimizers = [optimizeAMDTask(opts.amd)];
- if (opts.commonJS) {
- optimizers.push(optimizeCommonJSTask(opts.commonJS));
- }
+ const optimizers: NodeJS.ReadWriteStream[] = [];
+ optimizers.push(optimizeESMTask(opts.esm));
if (opts.manual) {
optimizers.push(optimizeManualTask(opts.manual));
@@ -377,12 +246,10 @@ export function optimizeTask(opts: IOptimizeTaskOpts): () => NodeJS.ReadWriteStr
}
export function minifyTask(src: string, sourceMapBaseUrl?: string): (cb: any) => void {
- const esbuild = require('esbuild') as typeof import('esbuild');
const sourceMappingURL = sourceMapBaseUrl ? ((f: any) => `${sourceMapBaseUrl}/${f.relative}.map`) : undefined;
return cb => {
const cssnano = require('cssnano') as typeof import('cssnano');
- const sourcemaps = require('gulp-sourcemaps') as typeof import('gulp-sourcemaps');
const svgmin = require('gulp-svgmin') as typeof import('gulp-svgmin');
const jsFilter = filter('**/*.js', { restore: true });
@@ -400,7 +267,7 @@ export function minifyTask(src: string, sourceMapBaseUrl?: string): (cb: any) =>
sourcemap: 'external',
outdir: '.',
platform: 'node',
- target: ['esnext'],
+ target: ['es2022'],
write: false
}).then(res => {
const jsFile = res.outputFiles.find(f => /\.js$/.test(f.path))!;
@@ -425,13 +292,6 @@ export function minifyTask(src: string, sourceMapBaseUrl?: string): (cb: any) =>
svgFilter,
svgmin(),
svgFilter.restore,
- (sourcemaps).mapSources((sourcePath: string) => {
- if (sourcePath === 'bootstrap-fork.js') {
- return 'bootstrap-fork.orig.js';
- }
-
- return sourcePath;
- }),
sourcemaps.write('./', {
sourceMappingURL,
sourceRoot: undefined,
diff --git a/build/lib/preLaunch.js b/build/lib/preLaunch.js
index 1bfe7f573f6..4791514fdfe 100644
--- a/build/lib/preLaunch.js
+++ b/build/lib/preLaunch.js
@@ -8,7 +8,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
const path = require("path");
const child_process_1 = require("child_process");
const fs_1 = require("fs");
-const yarn = process.platform === 'win32' ? 'yarn.cmd' : 'yarn';
+const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm';
const rootDir = path.resolve(__dirname, '..', '..');
function runProcess(command, args = []) {
return new Promise((resolve, reject) => {
@@ -28,15 +28,15 @@ async function exists(subdir) {
}
async function ensureNodeModules() {
if (!(await exists('node_modules'))) {
- await runProcess(yarn);
+ await runProcess(npm, ['ci']);
}
}
async function getElectron() {
- await runProcess(yarn, ['electron']);
+ await runProcess(npm, ['run', 'electron']);
}
async function ensureCompiled() {
if (!(await exists('out'))) {
- await runProcess(yarn, ['compile']);
+ await runProcess(npm, ['run', 'compile']);
}
}
async function main() {
diff --git a/build/lib/preLaunch.ts b/build/lib/preLaunch.ts
index d6776e62798..e0ea274458a 100644
--- a/build/lib/preLaunch.ts
+++ b/build/lib/preLaunch.ts
@@ -9,7 +9,7 @@ import * as path from 'path';
import { spawn } from 'child_process';
import { promises as fs } from 'fs';
-const yarn = process.platform === 'win32' ? 'yarn.cmd' : 'yarn';
+const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm';
const rootDir = path.resolve(__dirname, '..', '..');
function runProcess(command: string, args: ReadonlyArray = []) {
@@ -31,17 +31,17 @@ async function exists(subdir: string) {
async function ensureNodeModules() {
if (!(await exists('node_modules'))) {
- await runProcess(yarn);
+ await runProcess(npm, ['ci']);
}
}
async function getElectron() {
- await runProcess(yarn, ['electron']);
+ await runProcess(npm, ['run', 'electron']);
}
async function ensureCompiled() {
if (!(await exists('out'))) {
- await runProcess(yarn, ['compile']);
+ await runProcess(npm, ['run', 'compile']);
}
}
diff --git a/build/lib/standalone.js b/build/lib/standalone.js
index dbc47db0833..b724a009e8a 100644
--- a/build/lib/standalone.js
+++ b/build/lib/standalone.js
@@ -51,7 +51,12 @@ function extractEditor(options) {
// Add extra .d.ts files from `node_modules/@types/`
if (Array.isArray(options.compilerOptions?.types)) {
options.compilerOptions.types.forEach((type) => {
- options.typings.push(`../node_modules/@types/${type}/index.d.ts`);
+ if (type === '@webgpu/types') {
+ options.typings.push(`../node_modules/${type}/dist/index.d.ts`);
+ }
+ else {
+ options.typings.push(`../node_modules/@types/${type}/index.d.ts`);
+ }
});
}
const result = tss.shake(options);
@@ -79,13 +84,7 @@ function extractEditor(options) {
const info = ts.preProcessFile(fileContents);
for (let i = info.importedFiles.length - 1; i >= 0; i--) {
const importedFileName = info.importedFiles[i].fileName;
- let importedFilePath;
- if (/^vs\/css!/.test(importedFileName)) {
- importedFilePath = importedFileName.substr('vs/css!'.length) + '.css';
- }
- else {
- importedFilePath = importedFileName;
- }
+ let importedFilePath = importedFileName;
if (/(^\.\/)|(^\.\.\/)/.test(importedFilePath)) {
importedFilePath = path.join(path.dirname(fileName), importedFilePath);
}
@@ -93,8 +92,9 @@ function extractEditor(options) {
transportCSS(importedFilePath, copyFile, writeOutputFile);
}
else {
- if (fs.existsSync(path.join(options.sourcesRoot, importedFilePath + '.js'))) {
- copyFile(importedFilePath + '.js');
+ const pathToCopy = path.join(options.sourcesRoot, importedFilePath);
+ if (fs.existsSync(pathToCopy) && !fs.statSync(pathToCopy).isDirectory()) {
+ copyFile(importedFilePath);
}
}
}
@@ -106,14 +106,10 @@ function extractEditor(options) {
'vs/css.build.ts',
'vs/css.ts',
'vs/loader.js',
- 'vs/loader.d.ts',
- 'vs/nls.build.ts',
- 'vs/nls.ts',
- 'vs/nls.mock.ts',
+ 'vs/loader.d.ts'
].forEach(copyFile);
}
function createESMSourcesAndResources2(options) {
- const ts = require('typescript');
const SRC_FOLDER = path.join(REPO_ROOT, options.srcFolder);
const OUT_FOLDER = path.join(REPO_ROOT, options.outFolder);
const OUT_RESOURCES_FOLDER = path.join(REPO_ROOT, options.outResourcesFolder);
@@ -134,58 +130,16 @@ function createESMSourcesAndResources2(options) {
}
if (file === 'tsconfig.json') {
const tsConfig = JSON.parse(fs.readFileSync(path.join(SRC_FOLDER, file)).toString());
- tsConfig.compilerOptions.module = 'es6';
+ tsConfig.compilerOptions.module = 'es2022';
tsConfig.compilerOptions.outDir = path.join(path.relative(OUT_FOLDER, OUT_RESOURCES_FOLDER), 'vs').replace(/\\/g, '/');
write(getDestAbsoluteFilePath(file), JSON.stringify(tsConfig, null, '\t'));
continue;
}
- if (/\.d\.ts$/.test(file) || /\.css$/.test(file) || /\.js$/.test(file) || /\.ttf$/.test(file)) {
+ if (/\.ts$/.test(file) || /\.d\.ts$/.test(file) || /\.css$/.test(file) || /\.js$/.test(file) || /\.ttf$/.test(file)) {
// Transport the files directly
write(getDestAbsoluteFilePath(file), fs.readFileSync(path.join(SRC_FOLDER, file)));
continue;
}
- if (/\.ts$/.test(file)) {
- // Transform the .ts file
- let fileContents = fs.readFileSync(path.join(SRC_FOLDER, file)).toString();
- const info = ts.preProcessFile(fileContents);
- for (let i = info.importedFiles.length - 1; i >= 0; i--) {
- const importedFilename = info.importedFiles[i].fileName;
- const pos = info.importedFiles[i].pos;
- const end = info.importedFiles[i].end;
- let importedFilepath;
- if (/^vs\/css!/.test(importedFilename)) {
- importedFilepath = importedFilename.substr('vs/css!'.length) + '.css';
- }
- else {
- importedFilepath = importedFilename;
- }
- if (/(^\.\/)|(^\.\.\/)/.test(importedFilepath)) {
- importedFilepath = path.join(path.dirname(file), importedFilepath);
- }
- let relativePath;
- if (importedFilepath === path.dirname(file).replace(/\\/g, '/')) {
- relativePath = '../' + path.basename(path.dirname(file));
- }
- else if (importedFilepath === path.dirname(path.dirname(file)).replace(/\\/g, '/')) {
- relativePath = '../../' + path.basename(path.dirname(path.dirname(file)));
- }
- else {
- relativePath = path.relative(path.dirname(file), importedFilepath);
- }
- relativePath = relativePath.replace(/\\/g, '/');
- if (!/(^\.\/)|(^\.\.\/)/.test(relativePath)) {
- relativePath = './' + relativePath;
- }
- fileContents = (fileContents.substring(0, pos + 1)
- + relativePath
- + fileContents.substring(end + 1));
- }
- fileContents = fileContents.replace(/import ([a-zA-Z0-9]+) = require\(('[^']+')\);/g, function (_, m1, m2) {
- return `import * as ${m1} from ${m2};`;
- });
- write(getDestAbsoluteFilePath(file), fileContents);
- continue;
- }
console.log(`UNKNOWN FILE: ${file}`);
}
function walkDirRecursive(dir) {
diff --git a/build/lib/standalone.ts b/build/lib/standalone.ts
index 775a1be5996..9563cd6670b 100644
--- a/build/lib/standalone.ts
+++ b/build/lib/standalone.ts
@@ -59,7 +59,11 @@ export function extractEditor(options: tss.ITreeShakingOptions & { destRoot: str
// Add extra .d.ts files from `node_modules/@types/`
if (Array.isArray(options.compilerOptions?.types)) {
options.compilerOptions.types.forEach((type: string) => {
- options.typings.push(`../node_modules/@types/${type}/index.d.ts`);
+ if (type === '@webgpu/types') {
+ options.typings.push(`../node_modules/${type}/dist/index.d.ts`);
+ } else {
+ options.typings.push(`../node_modules/@types/${type}/index.d.ts`);
+ }
});
}
@@ -90,12 +94,7 @@ export function extractEditor(options: tss.ITreeShakingOptions & { destRoot: str
for (let i = info.importedFiles.length - 1; i >= 0; i--) {
const importedFileName = info.importedFiles[i].fileName;
- let importedFilePath: string;
- if (/^vs\/css!/.test(importedFileName)) {
- importedFilePath = importedFileName.substr('vs/css!'.length) + '.css';
- } else {
- importedFilePath = importedFileName;
- }
+ let importedFilePath = importedFileName;
if (/(^\.\/)|(^\.\.\/)/.test(importedFilePath)) {
importedFilePath = path.join(path.dirname(fileName), importedFilePath);
}
@@ -103,8 +102,9 @@ export function extractEditor(options: tss.ITreeShakingOptions & { destRoot: str
if (/\.css$/.test(importedFilePath)) {
transportCSS(importedFilePath, copyFile, writeOutputFile);
} else {
- if (fs.existsSync(path.join(options.sourcesRoot, importedFilePath + '.js'))) {
- copyFile(importedFilePath + '.js');
+ const pathToCopy = path.join(options.sourcesRoot, importedFilePath);
+ if (fs.existsSync(pathToCopy) && !fs.statSync(pathToCopy).isDirectory()) {
+ copyFile(importedFilePath);
}
}
}
@@ -118,10 +118,7 @@ export function extractEditor(options: tss.ITreeShakingOptions & { destRoot: str
'vs/css.build.ts',
'vs/css.ts',
'vs/loader.js',
- 'vs/loader.d.ts',
- 'vs/nls.build.ts',
- 'vs/nls.ts',
- 'vs/nls.mock.ts',
+ 'vs/loader.d.ts'
].forEach(copyFile);
}
@@ -134,7 +131,6 @@ export interface IOptions2 {
}
export function createESMSourcesAndResources2(options: IOptions2): void {
- const ts = require('typescript') as typeof import('typescript');
const SRC_FOLDER = path.join(REPO_ROOT, options.srcFolder);
const OUT_FOLDER = path.join(REPO_ROOT, options.outFolder);
@@ -160,66 +156,18 @@ export function createESMSourcesAndResources2(options: IOptions2): void {
if (file === 'tsconfig.json') {
const tsConfig = JSON.parse(fs.readFileSync(path.join(SRC_FOLDER, file)).toString());
- tsConfig.compilerOptions.module = 'es6';
+ tsConfig.compilerOptions.module = 'es2022';
tsConfig.compilerOptions.outDir = path.join(path.relative(OUT_FOLDER, OUT_RESOURCES_FOLDER), 'vs').replace(/\\/g, '/');
write(getDestAbsoluteFilePath(file), JSON.stringify(tsConfig, null, '\t'));
continue;
}
- if (/\.d\.ts$/.test(file) || /\.css$/.test(file) || /\.js$/.test(file) || /\.ttf$/.test(file)) {
+ if (/\.ts$/.test(file) || /\.d\.ts$/.test(file) || /\.css$/.test(file) || /\.js$/.test(file) || /\.ttf$/.test(file)) {
// Transport the files directly
write(getDestAbsoluteFilePath(file), fs.readFileSync(path.join(SRC_FOLDER, file)));
continue;
}
- if (/\.ts$/.test(file)) {
- // Transform the .ts file
- let fileContents = fs.readFileSync(path.join(SRC_FOLDER, file)).toString();
-
- const info = ts.preProcessFile(fileContents);
-
- for (let i = info.importedFiles.length - 1; i >= 0; i--) {
- const importedFilename = info.importedFiles[i].fileName;
- const pos = info.importedFiles[i].pos;
- const end = info.importedFiles[i].end;
-
- let importedFilepath: string;
- if (/^vs\/css!/.test(importedFilename)) {
- importedFilepath = importedFilename.substr('vs/css!'.length) + '.css';
- } else {
- importedFilepath = importedFilename;
- }
- if (/(^\.\/)|(^\.\.\/)/.test(importedFilepath)) {
- importedFilepath = path.join(path.dirname(file), importedFilepath);
- }
-
- let relativePath: string;
- if (importedFilepath === path.dirname(file).replace(/\\/g, '/')) {
- relativePath = '../' + path.basename(path.dirname(file));
- } else if (importedFilepath === path.dirname(path.dirname(file)).replace(/\\/g, '/')) {
- relativePath = '../../' + path.basename(path.dirname(path.dirname(file)));
- } else {
- relativePath = path.relative(path.dirname(file), importedFilepath);
- }
- relativePath = relativePath.replace(/\\/g, '/');
- if (!/(^\.\/)|(^\.\.\/)/.test(relativePath)) {
- relativePath = './' + relativePath;
- }
- fileContents = (
- fileContents.substring(0, pos + 1)
- + relativePath
- + fileContents.substring(end + 1)
- );
- }
-
- fileContents = fileContents.replace(/import ([a-zA-Z0-9]+) = require\(('[^']+')\);/g, function (_, m1, m2) {
- return `import * as ${m1} from ${m2};`;
- });
-
- write(getDestAbsoluteFilePath(file), fileContents);
- continue;
- }
-
console.log(`UNKNOWN FILE: ${file}`);
}
diff --git a/build/lib/stylelint/vscode-known-variables.json b/build/lib/stylelint/vscode-known-variables.json
index 0c974a46e00..3f82544faa2 100644
--- a/build/lib/stylelint/vscode-known-variables.json
+++ b/build/lib/stylelint/vscode-known-variables.json
@@ -17,6 +17,10 @@
"--vscode-activityBarTop-dropBorder",
"--vscode-activityBarTop-foreground",
"--vscode-activityBarTop-inactiveForeground",
+ "--vscode-activityErrorBadge-background",
+ "--vscode-activityErrorBadge-foreground",
+ "--vscode-activityWarningBadge-background",
+ "--vscode-activityWarningBadge-foreground",
"--vscode-badge-background",
"--vscode-badge-foreground",
"--vscode-banner-background",
@@ -94,6 +98,7 @@
"--vscode-debugTokenExpression-name",
"--vscode-debugTokenExpression-number",
"--vscode-debugTokenExpression-string",
+ "--vscode-debugTokenExpression-type",
"--vscode-debugTokenExpression-value",
"--vscode-debugToolBar-background",
"--vscode-debugToolBar-border",
@@ -137,6 +142,7 @@
"--vscode-editor-findRangeHighlightBorder",
"--vscode-editor-focusedStackFrameHighlightBackground",
"--vscode-editor-foldBackground",
+ "--vscode-editor-foldPlaceholderForeground",
"--vscode-editor-foreground",
"--vscode-editor-hoverHighlightBackground",
"--vscode-editor-inactiveSelectionBackground",
@@ -148,6 +154,7 @@
"--vscode-editor-placeholder-foreground",
"--vscode-editor-rangeHighlightBackground",
"--vscode-editor-rangeHighlightBorder",
+ "--vscode-editor-compositionBorder",
"--vscode-editor-selectionBackground",
"--vscode-editor-selectionForeground",
"--vscode-editor-selectionHighlightBackground",
@@ -165,6 +172,10 @@
"--vscode-editor-wordHighlightStrongBorder",
"--vscode-editor-wordHighlightTextBackground",
"--vscode-editor-wordHighlightTextBorder",
+ "--vscode-editorActionList-background",
+ "--vscode-editorActionList-focusBackground",
+ "--vscode-editorActionList-focusForeground",
+ "--vscode-editorActionList-foreground",
"--vscode-editorActiveLineNumber-foreground",
"--vscode-editorBracketHighlight-foreground1",
"--vscode-editorBracketHighlight-foreground2",
@@ -337,7 +348,7 @@
"--vscode-icon-foreground",
"--vscode-inlineChat-background",
"--vscode-inlineChat-border",
- "--vscode-inlineChat-regionHighlight",
+ "--vscode-inlineChat-foreground",
"--vscode-inlineChat-shadow",
"--vscode-inlineChatDiff-inserted",
"--vscode-inlineChatDiff-removed",
@@ -529,11 +540,27 @@
"--vscode-quickInputList-focusForeground",
"--vscode-quickInputList-focusIconForeground",
"--vscode-quickInputTitle-background",
+ "--vscode-radio-activeBackground",
+ "--vscode-radio-activeBorder",
+ "--vscode-radio-activeForeground",
+ "--vscode-radio-inactiveBackground",
+ "--vscode-radio-inactiveBorder",
+ "--vscode-radio-inactiveForeground",
+ "--vscode-radio-inactiveHoverBackground",
"--vscode-sash-hoverBorder",
- "--vscode-scm-historyItemAdditionsForeground",
- "--vscode-scm-historyItemDeletionsForeground",
- "--vscode-scm-historyItemSelectedStatisticsBorder",
- "--vscode-scm-historyItemStatisticsBorder",
+ "--vscode-scmGraph-foreground1",
+ "--vscode-scmGraph-foreground2",
+ "--vscode-scmGraph-foreground3",
+ "--vscode-scmGraph-foreground4",
+ "--vscode-scmGraph-foreground5",
+ "--vscode-scmGraph-historyItemBaseRefColor",
+ "--vscode-scmGraph-historyItemHoverAdditionsForeground",
+ "--vscode-scmGraph-historyItemHoverDefaultLabelBackground",
+ "--vscode-scmGraph-historyItemHoverDefaultLabelForeground",
+ "--vscode-scmGraph-historyItemHoverDeletionsForeground",
+ "--vscode-scmGraph-historyItemHoverLabelForeground",
+ "--vscode-scmGraph-historyItemRefColor",
+ "--vscode-scmGraph-historyItemRemoteRefColor",
"--vscode-scrollbar-shadow",
"--vscode-scrollbarSlider-activeBackground",
"--vscode-scrollbarSlider-background",
@@ -709,11 +736,14 @@
"--vscode-terminalCommandDecoration-defaultBackground",
"--vscode-terminalCommandDecoration-errorBackground",
"--vscode-terminalCommandDecoration-successBackground",
+ "--vscode-terminalCommandGuide-foreground",
"--vscode-terminalCursor-background",
"--vscode-terminalCursor-foreground",
+ "--vscode-terminalOverviewRuler-border",
"--vscode-terminalOverviewRuler-cursorForeground",
"--vscode-terminalOverviewRuler-findMatchForeground",
"--vscode-terminalStickyScroll-background",
+ "--vscode-terminalStickyScroll-border",
"--vscode-terminalStickyScrollHover-background",
"--vscode-testing-coverCountBadgeBackground",
"--vscode-testing-coverCountBadgeForeground",
@@ -808,6 +838,7 @@
"--testMessageDecorationFontFamily",
"--testMessageDecorationFontSize",
"--title-border-bottom-color",
+ "--title-wco-width",
"--vscode-chat-list-background",
"--vscode-editorCodeLens-fontFamily",
"--vscode-editorCodeLens-fontFamilyDefault",
@@ -818,8 +849,6 @@
"--vscode-hover-maxWidth",
"--vscode-hover-sourceWhiteSpace",
"--vscode-hover-whiteSpace",
- "--vscode-inline-chat-quick-voice-height",
- "--vscode-inline-chat-quick-voice-width",
"--vscode-editor-dictation-widget-height",
"--vscode-editor-dictation-widget-width",
"--vscode-interactive-session-foreground",
@@ -834,6 +863,8 @@
"--vscode-editorStickyScroll-scrollableWidth",
"--vscode-editorStickyScroll-foldingOpacityTransition",
"--window-border-color",
+ "--vscode-parameterHintsWidget-editorFontFamily",
+ "--vscode-parameterHintsWidget-editorFontFamilyDefault",
"--workspace-trust-check-color",
"--workspace-trust-selected-color",
"--workspace-trust-unselected-color",
@@ -853,6 +884,8 @@
"--z-index-notebook-scrollbar",
"--z-index-run-button-container",
"--zoom-factor",
- "--test-bar-width"
+ "--test-bar-width",
+ "--widget-color",
+ "--text-link-decoration"
]
}
\ No newline at end of file
diff --git a/build/lib/treeshaking.js b/build/lib/treeshaking.js
index c8e95511877..af06f4e3ec5 100644
--- a/build/lib/treeshaking.js
+++ b/build/lib/treeshaking.js
@@ -100,35 +100,36 @@ function discoverAndReadFiles(ts, options) {
options.entryPoints.forEach((entryPoint) => enqueue(entryPoint));
while (queue.length > 0) {
const moduleId = queue.shift();
- const dts_filename = path.join(options.sourcesRoot, moduleId + '.d.ts');
+ let redirectedModuleId = moduleId;
+ if (options.redirects[moduleId]) {
+ redirectedModuleId = options.redirects[moduleId];
+ }
+ const dts_filename = path.join(options.sourcesRoot, redirectedModuleId + '.d.ts');
if (fs.existsSync(dts_filename)) {
const dts_filecontents = fs.readFileSync(dts_filename).toString();
FILES[`${moduleId}.d.ts`] = dts_filecontents;
continue;
}
- const js_filename = path.join(options.sourcesRoot, moduleId + '.js');
+ const js_filename = path.join(options.sourcesRoot, redirectedModuleId + '.js');
if (fs.existsSync(js_filename)) {
// This is an import for a .js file, so ignore it...
continue;
}
- let ts_filename;
- if (options.redirects[moduleId]) {
- ts_filename = path.join(options.sourcesRoot, options.redirects[moduleId] + '.ts');
- }
- else {
- ts_filename = path.join(options.sourcesRoot, moduleId + '.ts');
- }
+ const ts_filename = path.join(options.sourcesRoot, redirectedModuleId + '.ts');
const ts_filecontents = fs.readFileSync(ts_filename).toString();
const info = ts.preProcessFile(ts_filecontents);
for (let i = info.importedFiles.length - 1; i >= 0; i--) {
const importedFileName = info.importedFiles[i].fileName;
if (options.importIgnorePattern.test(importedFileName)) {
- // Ignore vs/css! imports
+ // Ignore *.css imports
continue;
}
let importedModuleId = importedFileName;
if (/(^\.\/)|(^\.\.\/)/.test(importedModuleId)) {
importedModuleId = path.join(path.dirname(moduleId), importedModuleId);
+ if (importedModuleId.endsWith('.js')) { // ESM: code imports require to be relative and have a '.js' file extension
+ importedModuleId = importedModuleId.substr(0, importedModuleId.length - 3);
+ }
}
enqueue(importedModuleId);
}
@@ -455,6 +456,9 @@ function markNodes(ts, languageService, options) {
const nodeSourceFile = node.getSourceFile();
let fullPath;
if (/(^\.\/)|(^\.\.\/)/.test(importText)) {
+ if (importText.endsWith('.js')) { // ESM: code imports require to be relative and to have a '.js' file extension
+ importText = importText.substr(0, importText.length - 3);
+ }
fullPath = path.join(path.dirname(nodeSourceFile.fileName), importText) + '.ts';
}
else {
diff --git a/build/lib/treeshaking.ts b/build/lib/treeshaking.ts
index 020e567eb72..cd17c5f0278 100644
--- a/build/lib/treeshaking.ts
+++ b/build/lib/treeshaking.ts
@@ -53,7 +53,7 @@ export interface ITreeShakingOptions {
*/
shakeLevel: ShakeLevel;
/**
- * regex pattern to ignore certain imports e.g. `vs/css!` imports
+ * regex pattern to ignore certain imports e.g. `.css` imports
*/
importIgnorePattern: RegExp;
@@ -155,38 +155,43 @@ function discoverAndReadFiles(ts: typeof import('typescript'), options: ITreeSha
while (queue.length > 0) {
const moduleId = queue.shift()!;
- const dts_filename = path.join(options.sourcesRoot, moduleId + '.d.ts');
+ let redirectedModuleId: string = moduleId;
+ if (options.redirects[moduleId]) {
+ redirectedModuleId = options.redirects[moduleId];
+ }
+
+ const dts_filename = path.join(options.sourcesRoot, redirectedModuleId + '.d.ts');
if (fs.existsSync(dts_filename)) {
const dts_filecontents = fs.readFileSync(dts_filename).toString();
FILES[`${moduleId}.d.ts`] = dts_filecontents;
continue;
}
- const js_filename = path.join(options.sourcesRoot, moduleId + '.js');
+
+ const js_filename = path.join(options.sourcesRoot, redirectedModuleId + '.js');
if (fs.existsSync(js_filename)) {
// This is an import for a .js file, so ignore it...
continue;
}
- let ts_filename: string;
- if (options.redirects[moduleId]) {
- ts_filename = path.join(options.sourcesRoot, options.redirects[moduleId] + '.ts');
- } else {
- ts_filename = path.join(options.sourcesRoot, moduleId + '.ts');
- }
+ const ts_filename = path.join(options.sourcesRoot, redirectedModuleId + '.ts');
+
const ts_filecontents = fs.readFileSync(ts_filename).toString();
const info = ts.preProcessFile(ts_filecontents);
for (let i = info.importedFiles.length - 1; i >= 0; i--) {
const importedFileName = info.importedFiles[i].fileName;
if (options.importIgnorePattern.test(importedFileName)) {
- // Ignore vs/css! imports
+ // Ignore *.css imports
continue;
}
let importedModuleId = importedFileName;
if (/(^\.\/)|(^\.\.\/)/.test(importedModuleId)) {
importedModuleId = path.join(path.dirname(moduleId), importedModuleId);
+ if (importedModuleId.endsWith('.js')) { // ESM: code imports require to be relative and have a '.js' file extension
+ importedModuleId = importedModuleId.substr(0, importedModuleId.length - 3);
+ }
}
enqueue(importedModuleId);
}
@@ -565,6 +570,9 @@ function markNodes(ts: typeof import('typescript'), languageService: ts.Language
const nodeSourceFile = node.getSourceFile();
let fullPath: string;
if (/(^\.\/)|(^\.\.\/)/.test(importText)) {
+ if (importText.endsWith('.js')) { // ESM: code imports require to be relative and to have a '.js' file extension
+ importText = importText.substr(0, importText.length - 3);
+ }
fullPath = path.join(path.dirname(nodeSourceFile.fileName), importText) + '.ts';
} else {
fullPath = importText + '.ts';
diff --git a/build/lib/tsb/builder.js b/build/lib/tsb/builder.js
index fc74bfa8acc..cee2758e896 100644
--- a/build/lib/tsb/builder.js
+++ b/build/lib/tsb/builder.js
@@ -355,7 +355,7 @@ function createTypeScriptBuilder(config, projectFile, cmd) {
// print stats
const headNow = process.memoryUsage().heapUsed;
const MB = 1024 * 1024;
- _log('[tsb]', `time: ${colors.yellow((Date.now() - t1) + 'ms')} + \nmem: ${colors.cyan(Math.ceil(headNow / MB) + 'MB')} ${colors.bgCyan('delta: ' + Math.ceil((headNow - headUsed) / MB))}`);
+ _log('[tsb]', `time: ${colors.yellow((Date.now() - t1) + 'ms')} + \nmem: ${colors.cyan(Math.ceil(headNow / MB) + 'MB')} ${colors.bgcyan('delta: ' + Math.ceil((headNow - headUsed) / MB))}`);
headUsed = headNow;
});
}
@@ -550,7 +550,10 @@ class LanguageServiceHost {
let found = false;
while (!found && dirname.indexOf(stopDirname) === 0) {
dirname = path.dirname(dirname);
- const resolvedPath = path.resolve(dirname, ref.fileName);
+ let resolvedPath = path.resolve(dirname, ref.fileName);
+ if (resolvedPath.endsWith('.js')) {
+ resolvedPath = resolvedPath.slice(0, -3);
+ }
const normalizedPath = normalize(resolvedPath);
if (this.getScriptSnapshot(normalizedPath + '.ts')) {
this._dependencies.inertEdge(filename, normalizedPath + '.ts');
diff --git a/build/lib/tsb/builder.ts b/build/lib/tsb/builder.ts
index 9fc476ae702..70c71591a6e 100644
--- a/build/lib/tsb/builder.ts
+++ b/build/lib/tsb/builder.ts
@@ -427,7 +427,7 @@ export function createTypeScriptBuilder(config: IConfiguration, projectFile: str
const MB = 1024 * 1024;
_log(
'[tsb]',
- `time: ${colors.yellow((Date.now() - t1) + 'ms')} + \nmem: ${colors.cyan(Math.ceil(headNow / MB) + 'MB')} ${colors.bgCyan('delta: ' + Math.ceil((headNow - headUsed) / MB))}`
+ `time: ${colors.yellow((Date.now() - t1) + 'ms')} + \nmem: ${colors.cyan(Math.ceil(headNow / MB) + 'MB')} ${colors.bgcyan('delta: ' + Math.ceil((headNow - headUsed) / MB))}`
);
headUsed = headNow;
});
@@ -660,7 +660,10 @@ class LanguageServiceHost implements ts.LanguageServiceHost {
while (!found && dirname.indexOf(stopDirname) === 0) {
dirname = path.dirname(dirname);
- const resolvedPath = path.resolve(dirname, ref.fileName);
+ let resolvedPath = path.resolve(dirname, ref.fileName);
+ if (resolvedPath.endsWith('.js')) {
+ resolvedPath = resolvedPath.slice(0, -3);
+ }
const normalizedPath = normalize(resolvedPath);
if (this.getScriptSnapshot(normalizedPath + '.ts')) {
diff --git a/build/lib/tsb/transpiler.js b/build/lib/tsb/transpiler.js
index 5dcc4ca1ed3..100b1bac972 100644
--- a/build/lib/tsb/transpiler.js
+++ b/build/lib/tsb/transpiler.js
@@ -62,7 +62,7 @@ class OutputFileNameOracle {
catch (err) {
console.error(file, cmdLine.fileNames);
console.error(err);
- throw new err;
+ throw err;
}
};
}
diff --git a/build/lib/tsb/transpiler.ts b/build/lib/tsb/transpiler.ts
index cbc3d9e8eee..b6a9deeb3c7 100644
--- a/build/lib/tsb/transpiler.ts
+++ b/build/lib/tsb/transpiler.ts
@@ -84,7 +84,7 @@ class OutputFileNameOracle {
} catch (err) {
console.error(file, cmdLine.fileNames);
console.error(err);
- throw new err;
+ throw err;
}
};
}
diff --git a/build/lib/util.js b/build/lib/util.js
index 02ce049b00b..82e4189dd1a 100644
--- a/build/lib/util.js
+++ b/build/lib/util.js
@@ -21,12 +21,8 @@ exports.rreddir = rreddir;
exports.ensureDir = ensureDir;
exports.rebase = rebase;
exports.filter = filter;
-exports.versionStringToNumber = versionStringToNumber;
exports.streamToPromise = streamToPromise;
exports.getElectronVersion = getElectronVersion;
-exports.acquireWebNodePaths = acquireWebNodePaths;
-exports.createExternalLoaderConfig = createExternalLoaderConfig;
-exports.buildWebNodePaths = buildWebNodePaths;
const es = require("event-stream");
const _debounce = require("debounce");
const _filter = require("gulp-filter");
@@ -300,14 +296,6 @@ function filter(fn) {
result.restore = es.through();
return result;
}
-function versionStringToNumber(versionStr) {
- const semverRegex = /(\d+)\.(\d+)\.(\d+)/;
- const match = versionStr.match(semverRegex);
- if (!match) {
- throw new Error('Version string is not properly formatted: ' + versionStr);
- }
- return parseInt(match[1], 10) * 1e4 + parseInt(match[2], 10) * 1e2 + parseInt(match[3], 10);
-}
function streamToPromise(stream) {
return new Promise((c, e) => {
stream.on('error', err => e(err));
@@ -315,93 +303,9 @@ function streamToPromise(stream) {
});
}
function getElectronVersion() {
- const yarnrc = fs.readFileSync(path.join(root, '.yarnrc'), 'utf8');
- const electronVersion = /^target "(.*)"$/m.exec(yarnrc)[1];
- const msBuildId = /^ms_build_id "(.*)"$/m.exec(yarnrc)[1];
+ const npmrc = fs.readFileSync(path.join(root, '.npmrc'), 'utf8');
+ const electronVersion = /^target="(.*)"$/m.exec(npmrc)[1];
+ const msBuildId = /^ms_build_id="(.*)"$/m.exec(npmrc)[1];
return { electronVersion, msBuildId };
}
-function acquireWebNodePaths() {
- const root = path.join(__dirname, '..', '..');
- const webPackageJSON = path.join(root, '/remote/web', 'package.json');
- const webPackages = JSON.parse(fs.readFileSync(webPackageJSON, 'utf8')).dependencies;
- const distroWebPackageJson = path.join(root, '.build/distro/npm/remote/web/package.json');
- if (fs.existsSync(distroWebPackageJson)) {
- const distroWebPackages = JSON.parse(fs.readFileSync(distroWebPackageJson, 'utf8')).dependencies;
- Object.assign(webPackages, distroWebPackages);
- }
- const nodePaths = {};
- for (const key of Object.keys(webPackages)) {
- const packageJSON = path.join(root, 'node_modules', key, 'package.json');
- const packageData = JSON.parse(fs.readFileSync(packageJSON, 'utf8'));
- // Only cases where the browser is a string are handled
- let entryPoint = typeof packageData.browser === 'string' ? packageData.browser : packageData.main;
- // On rare cases a package doesn't have an entrypoint so we assume it has a dist folder with a min.js
- if (!entryPoint) {
- // TODO @lramos15 remove this when jschardet adds an entrypoint so we can warn on all packages w/out entrypoint
- if (key !== 'jschardet') {
- console.warn(`No entry point for ${key} assuming dist/${key}.min.js`);
- }
- entryPoint = `dist/${key}.min.js`;
- }
- // Remove any starting path information so it's all relative info
- if (entryPoint.startsWith('./')) {
- entryPoint = entryPoint.substring(2);
- }
- else if (entryPoint.startsWith('/')) {
- entryPoint = entryPoint.substring(1);
- }
- // Search for a minified entrypoint as well
- if (/(? new Promise((resolve, _) => {
- const root = path.join(__dirname, '..', '..');
- const nodePaths = acquireWebNodePaths();
- // Now we write the node paths to out/vs
- const outDirectory = path.join(root, outDir, 'vs');
- fs.mkdirSync(outDirectory, { recursive: true });
- const headerWithGeneratedFileWarning = `/*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
-
- // This file is generated by build/npm/postinstall.js. Do not edit.`;
- const fileContents = `${headerWithGeneratedFileWarning}\nself.webPackagePaths = ${JSON.stringify(nodePaths, null, 2)};`;
- fs.writeFileSync(path.join(outDirectory, 'webPackagePaths.js'), fileContents, 'utf8');
- resolve();
- });
- result.taskName = 'build-web-node-paths';
- return result;
-}
//# sourceMappingURL=util.js.map
\ No newline at end of file
diff --git a/build/lib/util.ts b/build/lib/util.ts
index 6648ce42364..08921834676 100644
--- a/build/lib/util.ts
+++ b/build/lib/util.ts
@@ -367,16 +367,6 @@ export function filter(fn: (data: any) => boolean): FilterStream {
return result;
}
-export function versionStringToNumber(versionStr: string) {
- const semverRegex = /(\d+)\.(\d+)\.(\d+)/;
- const match = versionStr.match(semverRegex);
- if (!match) {
- throw new Error('Version string is not properly formatted: ' + versionStr);
- }
-
- return parseInt(match[1], 10) * 1e4 + parseInt(match[2], 10) * 1e2 + parseInt(match[3], 10);
-}
-
export function streamToPromise(stream: NodeJS.ReadWriteStream): Promise {
return new Promise((c, e) => {
stream.on('error', err => e(err));
@@ -385,109 +375,8 @@ export function streamToPromise(stream: NodeJS.ReadWriteStream): Promise {
}
export function getElectronVersion(): Record {
- const yarnrc = fs.readFileSync(path.join(root, '.yarnrc'), 'utf8');
- const electronVersion = /^target "(.*)"$/m.exec(yarnrc)![1];
- const msBuildId = /^ms_build_id "(.*)"$/m.exec(yarnrc)![1];
+ const npmrc = fs.readFileSync(path.join(root, '.npmrc'), 'utf8');
+ const electronVersion = /^target="(.*)"$/m.exec(npmrc)![1];
+ const msBuildId = /^ms_build_id="(.*)"$/m.exec(npmrc)![1];
return { electronVersion, msBuildId };
}
-
-export function acquireWebNodePaths() {
- const root = path.join(__dirname, '..', '..');
- const webPackageJSON = path.join(root, '/remote/web', 'package.json');
- const webPackages = JSON.parse(fs.readFileSync(webPackageJSON, 'utf8')).dependencies;
-
- const distroWebPackageJson = path.join(root, '.build/distro/npm/remote/web/package.json');
- if (fs.existsSync(distroWebPackageJson)) {
- const distroWebPackages = JSON.parse(fs.readFileSync(distroWebPackageJson, 'utf8')).dependencies;
- Object.assign(webPackages, distroWebPackages);
- }
-
- const nodePaths: { [key: string]: string } = {};
- for (const key of Object.keys(webPackages)) {
- const packageJSON = path.join(root, 'node_modules', key, 'package.json');
- const packageData = JSON.parse(fs.readFileSync(packageJSON, 'utf8'));
- // Only cases where the browser is a string are handled
- let entryPoint: string = typeof packageData.browser === 'string' ? packageData.browser : packageData.main;
-
- // On rare cases a package doesn't have an entrypoint so we assume it has a dist folder with a min.js
- if (!entryPoint) {
- // TODO @lramos15 remove this when jschardet adds an entrypoint so we can warn on all packages w/out entrypoint
- if (key !== 'jschardet') {
- console.warn(`No entry point for ${key} assuming dist/${key}.min.js`);
- }
-
- entryPoint = `dist/${key}.min.js`;
- }
-
- // Remove any starting path information so it's all relative info
- if (entryPoint.startsWith('./')) {
- entryPoint = entryPoint.substring(2);
- } else if (entryPoint.startsWith('/')) {
- entryPoint = entryPoint.substring(1);
- }
-
- // Search for a minified entrypoint as well
- if (/(? new Promise((resolve, _) => {
- const root = path.join(__dirname, '..', '..');
- const nodePaths = acquireWebNodePaths();
- // Now we write the node paths to out/vs
- const outDirectory = path.join(root, outDir, 'vs');
- fs.mkdirSync(outDirectory, { recursive: true });
- const headerWithGeneratedFileWarning = `/*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
-
- // This file is generated by build/npm/postinstall.js. Do not edit.`;
- const fileContents = `${headerWithGeneratedFileWarning}\nself.webPackagePaths = ${JSON.stringify(nodePaths, null, 2)};`;
- fs.writeFileSync(path.join(outDirectory, 'webPackagePaths.js'), fileContents, 'utf8');
- resolve();
- });
- result.taskName = 'build-web-node-paths';
- return result;
-}
diff --git a/build/linux/debian/dep-lists.js b/build/linux/debian/dep-lists.js
index d843c090063..3bb58fb1215 100644
--- a/build/linux/debian/dep-lists.js
+++ b/build/linux/debian/dep-lists.js
@@ -31,6 +31,7 @@ exports.referenceGeneratedDepsByArch = {
'libc6 (>= 2.16)',
'libc6 (>= 2.17)',
'libc6 (>= 2.2.5)',
+ 'libc6 (>= 2.25)',
'libc6 (>= 2.28)',
'libcairo2 (>= 1.6.0)',
'libcurl3-gnutls | libcurl3-nss | libcurl4 | libcurl3',
@@ -39,10 +40,8 @@ exports.referenceGeneratedDepsByArch = {
'libexpat1 (>= 2.1~beta3)',
'libgbm1 (>= 17.1.0~rc2)',
'libglib2.0-0 (>= 2.37.3)',
- 'libgssapi-krb5-2 (>= 1.17)',
'libgtk-3-0 (>= 3.9.10)',
'libgtk-3-0 (>= 3.9.10) | libgtk-4-1',
- 'libkrb5-3 (>= 1.6.dfsg.2)',
'libnspr4 (>= 2:4.9-2~)',
'libnss3 (>= 2:3.30)',
'libnss3 (>= 3.26)',
@@ -67,6 +66,7 @@ exports.referenceGeneratedDepsByArch = {
'libatspi2.0-0 (>= 2.9.90)',
'libc6 (>= 2.16)',
'libc6 (>= 2.17)',
+ 'libc6 (>= 2.25)',
'libc6 (>= 2.28)',
'libc6 (>= 2.4)',
'libc6 (>= 2.9)',
@@ -77,10 +77,8 @@ exports.referenceGeneratedDepsByArch = {
'libexpat1 (>= 2.1~beta3)',
'libgbm1 (>= 17.1.0~rc2)',
'libglib2.0-0 (>= 2.37.3)',
- 'libgssapi-krb5-2 (>= 1.17)',
'libgtk-3-0 (>= 3.9.10)',
'libgtk-3-0 (>= 3.9.10) | libgtk-4-1',
- 'libkrb5-3 (>= 1.6.dfsg.2)',
'libnspr4 (>= 2:4.9-2~)',
'libnss3 (>= 2:3.30)',
'libnss3 (>= 3.26)',
@@ -108,6 +106,7 @@ exports.referenceGeneratedDepsByArch = {
'libatk1.0-0 (>= 2.2.0)',
'libatspi2.0-0 (>= 2.9.90)',
'libc6 (>= 2.17)',
+ 'libc6 (>= 2.25)',
'libc6 (>= 2.28)',
'libcairo2 (>= 1.6.0)',
'libcurl3-gnutls | libcurl3-nss | libcurl4 | libcurl3',
@@ -116,10 +115,8 @@ exports.referenceGeneratedDepsByArch = {
'libexpat1 (>= 2.1~beta3)',
'libgbm1 (>= 17.1.0~rc2)',
'libglib2.0-0 (>= 2.37.3)',
- 'libgssapi-krb5-2 (>= 1.17)',
'libgtk-3-0 (>= 3.9.10)',
'libgtk-3-0 (>= 3.9.10) | libgtk-4-1',
- 'libkrb5-3 (>= 1.6.dfsg.2)',
'libnspr4 (>= 2:4.9-2~)',
'libnss3 (>= 2:3.30)',
'libnss3 (>= 3.26)',
diff --git a/build/linux/debian/dep-lists.ts b/build/linux/debian/dep-lists.ts
index 4028370cd02..e3d78d1139a 100644
--- a/build/linux/debian/dep-lists.ts
+++ b/build/linux/debian/dep-lists.ts
@@ -31,6 +31,7 @@ export const referenceGeneratedDepsByArch = {
'libc6 (>= 2.16)',
'libc6 (>= 2.17)',
'libc6 (>= 2.2.5)',
+ 'libc6 (>= 2.25)',
'libc6 (>= 2.28)',
'libcairo2 (>= 1.6.0)',
'libcurl3-gnutls | libcurl3-nss | libcurl4 | libcurl3',
@@ -39,10 +40,8 @@ export const referenceGeneratedDepsByArch = {
'libexpat1 (>= 2.1~beta3)',
'libgbm1 (>= 17.1.0~rc2)',
'libglib2.0-0 (>= 2.37.3)',
- 'libgssapi-krb5-2 (>= 1.17)',
'libgtk-3-0 (>= 3.9.10)',
'libgtk-3-0 (>= 3.9.10) | libgtk-4-1',
- 'libkrb5-3 (>= 1.6.dfsg.2)',
'libnspr4 (>= 2:4.9-2~)',
'libnss3 (>= 2:3.30)',
'libnss3 (>= 3.26)',
@@ -67,6 +66,7 @@ export const referenceGeneratedDepsByArch = {
'libatspi2.0-0 (>= 2.9.90)',
'libc6 (>= 2.16)',
'libc6 (>= 2.17)',
+ 'libc6 (>= 2.25)',
'libc6 (>= 2.28)',
'libc6 (>= 2.4)',
'libc6 (>= 2.9)',
@@ -77,10 +77,8 @@ export const referenceGeneratedDepsByArch = {
'libexpat1 (>= 2.1~beta3)',
'libgbm1 (>= 17.1.0~rc2)',
'libglib2.0-0 (>= 2.37.3)',
- 'libgssapi-krb5-2 (>= 1.17)',
'libgtk-3-0 (>= 3.9.10)',
'libgtk-3-0 (>= 3.9.10) | libgtk-4-1',
- 'libkrb5-3 (>= 1.6.dfsg.2)',
'libnspr4 (>= 2:4.9-2~)',
'libnss3 (>= 2:3.30)',
'libnss3 (>= 3.26)',
@@ -108,6 +106,7 @@ export const referenceGeneratedDepsByArch = {
'libatk1.0-0 (>= 2.2.0)',
'libatspi2.0-0 (>= 2.9.90)',
'libc6 (>= 2.17)',
+ 'libc6 (>= 2.25)',
'libc6 (>= 2.28)',
'libcairo2 (>= 1.6.0)',
'libcurl3-gnutls | libcurl3-nss | libcurl4 | libcurl3',
@@ -116,10 +115,8 @@ export const referenceGeneratedDepsByArch = {
'libexpat1 (>= 2.1~beta3)',
'libgbm1 (>= 17.1.0~rc2)',
'libglib2.0-0 (>= 2.37.3)',
- 'libgssapi-krb5-2 (>= 1.17)',
'libgtk-3-0 (>= 3.9.10)',
'libgtk-3-0 (>= 3.9.10) | libgtk-4-1',
- 'libkrb5-3 (>= 1.6.dfsg.2)',
'libnspr4 (>= 2:4.9-2~)',
'libnss3 (>= 2:3.30)',
'libnss3 (>= 3.26)',
diff --git a/build/linux/debian/install-sysroot.js b/build/linux/debian/install-sysroot.js
index feca7d3fa9d..77ff92151e8 100644
--- a/build/linux/debian/install-sysroot.js
+++ b/build/linux/debian/install-sysroot.js
@@ -29,9 +29,9 @@ const ghDownloadHeaders = {
Accept: 'application/octet-stream',
};
function getElectronVersion() {
- const yarnrc = fs.readFileSync(path.join(REPO_ROOT, '.yarnrc'), 'utf8');
- const electronVersion = /^target "(.*)"$/m.exec(yarnrc)[1];
- const msBuildId = /^ms_build_id "(.*)"$/m.exec(yarnrc)[1];
+ const npmrc = fs.readFileSync(path.join(REPO_ROOT, '.npmrc'), 'utf8');
+ const electronVersion = /^target="(.*)"$/m.exec(npmrc)[1];
+ const msBuildId = /^ms_build_id="(.*)"$/m.exec(npmrc)[1];
return { electronVersion, msBuildId };
}
function getSha(filename) {
diff --git a/build/linux/debian/install-sysroot.ts b/build/linux/debian/install-sysroot.ts
index aa417dcc722..76a31d63cdb 100644
--- a/build/linux/debian/install-sysroot.ts
+++ b/build/linux/debian/install-sysroot.ts
@@ -38,9 +38,9 @@ interface IFetchOptions {
}
function getElectronVersion(): Record {
- const yarnrc = fs.readFileSync(path.join(REPO_ROOT, '.yarnrc'), 'utf8');
- const electronVersion = /^target "(.*)"$/m.exec(yarnrc)![1];
- const msBuildId = /^ms_build_id "(.*)"$/m.exec(yarnrc)![1];
+ const npmrc = fs.readFileSync(path.join(REPO_ROOT, '.npmrc'), 'utf8');
+ const electronVersion = /^target="(.*)"$/m.exec(npmrc)![1];
+ const msBuildId = /^ms_build_id="(.*)"$/m.exec(npmrc)![1];
return { electronVersion, msBuildId };
}
diff --git a/build/linux/dependencies-generator.js b/build/linux/dependencies-generator.js
index bff0c9a25df..eec4bd790cd 100644
--- a/build/linux/dependencies-generator.js
+++ b/build/linux/dependencies-generator.js
@@ -23,7 +23,7 @@ const product = require("../../product.json");
// The reference dependencies, which one has to update when the new dependencies
// are valid, are in dep-lists.ts
const FAIL_BUILD_FOR_NEW_DEPENDENCIES = true;
-// Based on https://source.chromium.org/chromium/chromium/src/+/refs/tags/122.0.6261.156:chrome/installer/linux/BUILD.gn;l=64-80
+// Based on https://source.chromium.org/chromium/chromium/src/+/refs/tags/124.0.6367.243:chrome/installer/linux/BUILD.gn;l=64-80
// and the Linux Archive build
// Shared library dependencies that we already bundle.
const bundledDeps = [
@@ -43,7 +43,8 @@ async function getDependencies(packageType, buildDir, applicationName, arch) {
throw new Error('Invalid RPM arch string ' + arch);
}
// Get the files for which we want to find dependencies.
- const nativeModulesPath = path.join(buildDir, 'resources', 'app', 'node_modules.asar.unpacked');
+ const canAsar = false; // TODO@esm ASAR disabled in ESM
+ const nativeModulesPath = path.join(buildDir, 'resources', 'app', canAsar ? 'node_modules.asar.unpacked' : 'node_modules');
const findResult = (0, child_process_1.spawnSync)('find', [nativeModulesPath, '-name', '*.node']);
if (findResult.status) {
console.error('Error finding files:');
diff --git a/build/linux/dependencies-generator.ts b/build/linux/dependencies-generator.ts
index 226310e1258..7faae4ba104 100644
--- a/build/linux/dependencies-generator.ts
+++ b/build/linux/dependencies-generator.ts
@@ -25,7 +25,7 @@ import product = require('../../product.json');
// are valid, are in dep-lists.ts
const FAIL_BUILD_FOR_NEW_DEPENDENCIES: boolean = true;
-// Based on https://source.chromium.org/chromium/chromium/src/+/refs/tags/122.0.6261.156:chrome/installer/linux/BUILD.gn;l=64-80
+// Based on https://source.chromium.org/chromium/chromium/src/+/refs/tags/124.0.6367.243:chrome/installer/linux/BUILD.gn;l=64-80
// and the Linux Archive build
// Shared library dependencies that we already bundle.
const bundledDeps = [
@@ -47,7 +47,8 @@ export async function getDependencies(packageType: 'deb' | 'rpm', buildDir: stri
}
// Get the files for which we want to find dependencies.
- const nativeModulesPath = path.join(buildDir, 'resources', 'app', 'node_modules.asar.unpacked');
+ const canAsar = false; // TODO@esm ASAR disabled in ESM
+ const nativeModulesPath = path.join(buildDir, 'resources', 'app', canAsar ? 'node_modules.asar.unpacked' : 'node_modules');
const findResult = spawnSync('find', [nativeModulesPath, '-name', '*.node']);
if (findResult.status) {
console.error('Error finding files:');
diff --git a/build/linux/rpm/dep-lists.js b/build/linux/rpm/dep-lists.js
index 8be477290bb..fa393808c53 100644
--- a/build/linux/rpm/dep-lists.js
+++ b/build/linux/rpm/dep-lists.js
@@ -45,12 +45,14 @@ exports.referenceGeneratedDepsByArch = {
'libc.so.6(GLIBC_2.17)(64bit)',
'libc.so.6(GLIBC_2.18)(64bit)',
'libc.so.6(GLIBC_2.2.5)(64bit)',
+ 'libc.so.6(GLIBC_2.25)(64bit)',
'libc.so.6(GLIBC_2.28)(64bit)',
'libc.so.6(GLIBC_2.3)(64bit)',
'libc.so.6(GLIBC_2.3.2)(64bit)',
'libc.so.6(GLIBC_2.3.3)(64bit)',
'libc.so.6(GLIBC_2.3.4)(64bit)',
'libc.so.6(GLIBC_2.4)(64bit)',
+ 'libc.so.6(GLIBC_2.5)(64bit)',
'libc.so.6(GLIBC_2.6)(64bit)',
'libc.so.6(GLIBC_2.7)(64bit)',
'libc.so.6(GLIBC_2.8)(64bit)',
@@ -71,11 +73,7 @@ exports.referenceGeneratedDepsByArch = {
'libgio-2.0.so.0()(64bit)',
'libglib-2.0.so.0()(64bit)',
'libgobject-2.0.so.0()(64bit)',
- 'libgssapi_krb5.so.2()(64bit)',
- 'libgssapi_krb5.so.2(gssapi_krb5_2_MIT)(64bit)',
'libgtk-3.so.0()(64bit)',
- 'libkrb5.so.3()(64bit)',
- 'libkrb5.so.3(krb5_3_MIT)(64bit)',
'libm.so.6()(64bit)',
'libm.so.6(GLIBC_2.2.5)(64bit)',
'libnspr4.so()(64bit)',
@@ -140,8 +138,10 @@ exports.referenceGeneratedDepsByArch = {
'libc.so.6(GLIBC_2.16)',
'libc.so.6(GLIBC_2.17)',
'libc.so.6(GLIBC_2.18)',
+ 'libc.so.6(GLIBC_2.25)',
'libc.so.6(GLIBC_2.28)',
'libc.so.6(GLIBC_2.4)',
+ 'libc.so.6(GLIBC_2.5)',
'libc.so.6(GLIBC_2.6)',
'libc.so.6(GLIBC_2.7)',
'libc.so.6(GLIBC_2.8)',
@@ -162,12 +162,8 @@ exports.referenceGeneratedDepsByArch = {
'libgio-2.0.so.0',
'libglib-2.0.so.0',
'libgobject-2.0.so.0',
- 'libgssapi_krb5.so.2',
- 'libgssapi_krb5.so.2(gssapi_krb5_2_MIT)',
'libgtk-3.so.0',
'libgtk-3.so.0()(64bit)',
- 'libkrb5.so.3',
- 'libkrb5.so.3(krb5_3_MIT)',
'libm.so.6',
'libm.so.6(GLIBC_2.4)',
'libnspr4.so',
@@ -241,6 +237,7 @@ exports.referenceGeneratedDepsByArch = {
'libc.so.6()(64bit)',
'libc.so.6(GLIBC_2.17)(64bit)',
'libc.so.6(GLIBC_2.18)(64bit)',
+ 'libc.so.6(GLIBC_2.25)(64bit)',
'libc.so.6(GLIBC_2.28)(64bit)',
'libcairo.so.2()(64bit)',
'libcurl.so.4()(64bit)',
@@ -259,11 +256,7 @@ exports.referenceGeneratedDepsByArch = {
'libgio-2.0.so.0()(64bit)',
'libglib-2.0.so.0()(64bit)',
'libgobject-2.0.so.0()(64bit)',
- 'libgssapi_krb5.so.2()(64bit)',
- 'libgssapi_krb5.so.2(gssapi_krb5_2_MIT)(64bit)',
'libgtk-3.so.0()(64bit)',
- 'libkrb5.so.3()(64bit)',
- 'libkrb5.so.3(krb5_3_MIT)(64bit)',
'libm.so.6()(64bit)',
'libm.so.6(GLIBC_2.17)(64bit)',
'libnspr4.so()(64bit)',
diff --git a/build/linux/rpm/dep-lists.ts b/build/linux/rpm/dep-lists.ts
index 24b18d504c8..9eed3a79f7e 100644
--- a/build/linux/rpm/dep-lists.ts
+++ b/build/linux/rpm/dep-lists.ts
@@ -44,12 +44,14 @@ export const referenceGeneratedDepsByArch = {
'libc.so.6(GLIBC_2.17)(64bit)',
'libc.so.6(GLIBC_2.18)(64bit)',
'libc.so.6(GLIBC_2.2.5)(64bit)',
+ 'libc.so.6(GLIBC_2.25)(64bit)',
'libc.so.6(GLIBC_2.28)(64bit)',
'libc.so.6(GLIBC_2.3)(64bit)',
'libc.so.6(GLIBC_2.3.2)(64bit)',
'libc.so.6(GLIBC_2.3.3)(64bit)',
'libc.so.6(GLIBC_2.3.4)(64bit)',
'libc.so.6(GLIBC_2.4)(64bit)',
+ 'libc.so.6(GLIBC_2.5)(64bit)',
'libc.so.6(GLIBC_2.6)(64bit)',
'libc.so.6(GLIBC_2.7)(64bit)',
'libc.so.6(GLIBC_2.8)(64bit)',
@@ -70,11 +72,7 @@ export const referenceGeneratedDepsByArch = {
'libgio-2.0.so.0()(64bit)',
'libglib-2.0.so.0()(64bit)',
'libgobject-2.0.so.0()(64bit)',
- 'libgssapi_krb5.so.2()(64bit)',
- 'libgssapi_krb5.so.2(gssapi_krb5_2_MIT)(64bit)',
'libgtk-3.so.0()(64bit)',
- 'libkrb5.so.3()(64bit)',
- 'libkrb5.so.3(krb5_3_MIT)(64bit)',
'libm.so.6()(64bit)',
'libm.so.6(GLIBC_2.2.5)(64bit)',
'libnspr4.so()(64bit)',
@@ -139,8 +137,10 @@ export const referenceGeneratedDepsByArch = {
'libc.so.6(GLIBC_2.16)',
'libc.so.6(GLIBC_2.17)',
'libc.so.6(GLIBC_2.18)',
+ 'libc.so.6(GLIBC_2.25)',
'libc.so.6(GLIBC_2.28)',
'libc.so.6(GLIBC_2.4)',
+ 'libc.so.6(GLIBC_2.5)',
'libc.so.6(GLIBC_2.6)',
'libc.so.6(GLIBC_2.7)',
'libc.so.6(GLIBC_2.8)',
@@ -161,12 +161,8 @@ export const referenceGeneratedDepsByArch = {
'libgio-2.0.so.0',
'libglib-2.0.so.0',
'libgobject-2.0.so.0',
- 'libgssapi_krb5.so.2',
- 'libgssapi_krb5.so.2(gssapi_krb5_2_MIT)',
'libgtk-3.so.0',
'libgtk-3.so.0()(64bit)',
- 'libkrb5.so.3',
- 'libkrb5.so.3(krb5_3_MIT)',
'libm.so.6',
'libm.so.6(GLIBC_2.4)',
'libnspr4.so',
@@ -240,6 +236,7 @@ export const referenceGeneratedDepsByArch = {
'libc.so.6()(64bit)',
'libc.so.6(GLIBC_2.17)(64bit)',
'libc.so.6(GLIBC_2.18)(64bit)',
+ 'libc.so.6(GLIBC_2.25)(64bit)',
'libc.so.6(GLIBC_2.28)(64bit)',
'libcairo.so.2()(64bit)',
'libcurl.so.4()(64bit)',
@@ -258,11 +255,7 @@ export const referenceGeneratedDepsByArch = {
'libgio-2.0.so.0()(64bit)',
'libglib-2.0.so.0()(64bit)',
'libgobject-2.0.so.0()(64bit)',
- 'libgssapi_krb5.so.2()(64bit)',
- 'libgssapi_krb5.so.2(gssapi_krb5_2_MIT)(64bit)',
'libgtk-3.so.0()(64bit)',
- 'libkrb5.so.3()(64bit)',
- 'libkrb5.so.3(krb5_3_MIT)(64bit)',
'libm.so.6()(64bit)',
'libm.so.6(GLIBC_2.17)(64bit)',
'libnspr4.so()(64bit)',
diff --git a/build/loader.min b/build/loader.min
new file mode 100644
index 00000000000..f9d21b58282
--- /dev/null
+++ b/build/loader.min
@@ -0,0 +1,10 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+"use strict";const _amdLoaderGlobal=this,_commonjsGlobal=typeof global=="object"?global:{};var AMDLoader;(function(d){d.global=_amdLoaderGlobal;class _{get isWindows(){return this._detect(),this._isWindows}get isNode(){return this._detect(),this._isNode}get isElectronRenderer(){return this._detect(),this._isElectronRenderer}get isWebWorker(){return this._detect(),this._isWebWorker}get isElectronNodeIntegrationWebWorker(){return this._detect(),this._isElectronNodeIntegrationWebWorker}constructor(){this._detected=!1,this._isWindows=!1,this._isNode=!1,this._isElectronRenderer=!1,this._isWebWorker=!1,this._isElectronNodeIntegrationWebWorker=!1}_detect(){this._detected||(this._detected=!0,this._isWindows=_._isWindows(),this._isNode=typeof module<"u"&&!!module.exports,this._isElectronRenderer=typeof process<"u"&&typeof process.versions<"u"&&typeof process.versions.electron<"u"&&process.type==="renderer",this._isWebWorker=typeof d.global.importScripts=="function",this._isElectronNodeIntegrationWebWorker=this._isWebWorker&&typeof process<"u"&&typeof process.versions<"u"&&typeof process.versions.electron<"u"&&process.type==="worker")}static _isWindows(){return typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.indexOf("Windows")>=0?!0:typeof process<"u"?process.platform==="win32":!1}}d.Environment=_})(AMDLoader||(AMDLoader={}));var AMDLoader;(function(d){class _{constructor(n,c,a){this.type=n,this.detail=c,this.timestamp=a}}d.LoaderEvent=_;class v{constructor(n){this._events=[new _(1,"",n)]}record(n,c){this._events.push(new _(n,c,d.Utilities.getHighPerformanceTimestamp()))}getEvents(){return this._events}}d.LoaderEventRecorder=v;class f{record(n,c){}getEvents(){return[]}}f.INSTANCE=new f,d.NullLoaderEventRecorder=f})(AMDLoader||(AMDLoader={}));var AMDLoader;(function(d){class _{static fileUriToFilePath(f,h){if(h=decodeURI(h).replace(/%23/g,"#"),f){if(/^file:\/\/\//.test(h))return h.substr(8);if(/^file:\/\//.test(h))return h.substr(5)}else if(/^file:\/\//.test(h))return h.substr(7);return h}static startsWith(f,h){return f.length>=h.length&&f.substr(0,h.length)===h}static endsWith(f,h){return f.length>=h.length&&f.substr(f.length-h.length)===h}static containsQueryString(f){return/^[^\#]*\?/gi.test(f)}static isAbsolutePath(f){return/^((http:\/\/)|(https:\/\/)|(file:\/\/)|(\/))/.test(f)}static forEachProperty(f,h){if(f){let n;for(n in f)f.hasOwnProperty(n)&&h(n,f[n])}}static isEmpty(f){let h=!0;return _.forEachProperty(f,()=>{h=!1}),h}static recursiveClone(f){if(!f||typeof f!="object"||f instanceof RegExp||!Array.isArray(f)&&Object.getPrototypeOf(f)!==Object.prototype)return f;let h=Array.isArray(f)?[]:{};return _.forEachProperty(f,(n,c)=>{c&&typeof c=="object"?h[n]=_.recursiveClone(c):h[n]=c}),h}static generateAnonymousModule(){return"===anonymous"+_.NEXT_ANONYMOUS_ID+++"==="}static isAnonymousModule(f){return _.startsWith(f,"===anonymous")}static getHighPerformanceTimestamp(){return this.PERFORMANCE_NOW_PROBED||(this.PERFORMANCE_NOW_PROBED=!0,this.HAS_PERFORMANCE_NOW=d.global.performance&&typeof d.global.performance.now=="function"),this.HAS_PERFORMANCE_NOW?d.global.performance.now():Date.now()}}_.NEXT_ANONYMOUS_ID=1,_.PERFORMANCE_NOW_PROBED=!1,_.HAS_PERFORMANCE_NOW=!1,d.Utilities=_})(AMDLoader||(AMDLoader={}));var AMDLoader;(function(d){function _(h){if(h instanceof Error)return h;const n=new Error(h.message||String(h)||"Unknown Error");return h.stack&&(n.stack=h.stack),n}d.ensureError=_;class v{static validateConfigurationOptions(n){function c(a){if(a.phase==="loading"){console.error('Loading "'+a.moduleId+'" failed'),console.error(a),console.error("Here are the modules that depend on it:"),console.error(a.neededBy);return}if(a.phase==="factory"){console.error('The factory function of "'+a.moduleId+'" has thrown an exception'),console.error(a),console.error("Here are the modules that depend on it:"),console.error(a.neededBy);return}}if(n=n||{},typeof n.baseUrl!="string"&&(n.baseUrl=""),typeof n.isBuild!="boolean"&&(n.isBuild=!1),typeof n.paths!="object"&&(n.paths={}),typeof n.config!="object"&&(n.config={}),typeof n.catchError>"u"&&(n.catchError=!1),typeof n.recordStats>"u"&&(n.recordStats=!1),typeof n.urlArgs!="string"&&(n.urlArgs=""),typeof n.onError!="function"&&(n.onError=c),Array.isArray(n.ignoreDuplicateModules)||(n.ignoreDuplicateModules=[]),n.baseUrl.length>0&&(d.Utilities.endsWith(n.baseUrl,"/")||(n.baseUrl+="/")),typeof n.cspNonce!="string"&&(n.cspNonce=""),typeof n.preferScriptTags>"u"&&(n.preferScriptTags=!1),n.nodeCachedData&&typeof n.nodeCachedData=="object"&&(typeof n.nodeCachedData.seed!="string"&&(n.nodeCachedData.seed="seed"),(typeof n.nodeCachedData.writeDelay!="number"||n.nodeCachedData.writeDelay<0)&&(n.nodeCachedData.writeDelay=1e3*7),!n.nodeCachedData.path||typeof n.nodeCachedData.path!="string")){const a=_(new Error("INVALID cached data configuration, 'path' MUST be set"));a.phase="configuration",n.onError(a),n.nodeCachedData=void 0}return n}static mergeConfigurationOptions(n=null,c=null){let a=d.Utilities.recursiveClone(c||{});return d.Utilities.forEachProperty(n,(t,e)=>{t==="ignoreDuplicateModules"&&typeof a.ignoreDuplicateModules<"u"?a.ignoreDuplicateModules=a.ignoreDuplicateModules.concat(e):t==="paths"&&typeof a.paths<"u"?d.Utilities.forEachProperty(e,(i,s)=>a.paths[i]=s):t==="config"&&typeof a.config<"u"?d.Utilities.forEachProperty(e,(i,s)=>a.config[i]=s):a[t]=d.Utilities.recursiveClone(e)}),v.validateConfigurationOptions(a)}}d.ConfigurationOptionsUtil=v;class f{constructor(n,c){if(this._env=n,this.options=v.mergeConfigurationOptions(c),this._createIgnoreDuplicateModulesMap(),this._createSortedPathsRules(),this.options.baseUrl===""&&this.options.nodeRequire&&this.options.nodeRequire.main&&this.options.nodeRequire.main.filename&&this._env.isNode){let a=this.options.nodeRequire.main.filename,t=Math.max(a.lastIndexOf("/"),a.lastIndexOf("\\"));this.options.baseUrl=a.substring(0,t+1)}}_createIgnoreDuplicateModulesMap(){this.ignoreDuplicateModulesMap={};for(let n=0;n{Array.isArray(c)?this.sortedPathsRules.push({from:n,to:c}):this.sortedPathsRules.push({from:n,to:[c]})}),this.sortedPathsRules.sort((n,c)=>c.from.length-n.from.length)}cloneAndMerge(n){return new f(this._env,v.mergeConfigurationOptions(n,this.options))}getOptionsLiteral(){return this.options}_applyPaths(n){let c;for(let a=0,t=this.sortedPathsRules.length;athis.triggerCallback(i),u=>this.triggerErrorback(i,u))}triggerCallback(e){let i=this._callbackMap[e];delete this._callbackMap[e];for(let s=0;s{e.removeEventListener("load",o),e.removeEventListener("error",u)},o=l=>{r(),i()},u=l=>{r(),s(l)};e.addEventListener("load",o),e.addEventListener("error",u)}load(e,i,s,r){if(/^node\|/.test(i)){let o=e.getConfig().getOptionsLiteral(),u=c(e.getRecorder(),o.nodeRequire||d.global.nodeRequire),l=i.split("|"),g=null;try{g=u(l[1])}catch(p){r(p);return}e.enqueueDefineAnonymousModule([],()=>g),s()}else{let o=document.createElement("script");o.setAttribute("async","async"),o.setAttribute("type","text/javascript"),this.attachListeners(o,s,r);const{trustedTypesPolicy:u}=e.getConfig().getOptionsLiteral();u&&(i=u.createScriptURL(i)),o.setAttribute("src",i);const{cspNonce:l}=e.getConfig().getOptionsLiteral();l&&o.setAttribute("nonce",l),document.getElementsByTagName("head")[0].appendChild(o)}}}function f(t){const{trustedTypesPolicy:e}=t.getConfig().getOptionsLiteral();try{return(e?self.eval(e.createScript("","true")):new Function("true")).call(self),!0}catch{return!1}}class h{constructor(){this._cachedCanUseEval=null}_canUseEval(e){return this._cachedCanUseEval===null&&(this._cachedCanUseEval=f(e)),this._cachedCanUseEval}load(e,i,s,r){if(/^node\|/.test(i)){const o=e.getConfig().getOptionsLiteral(),u=c(e.getRecorder(),o.nodeRequire||d.global.nodeRequire),l=i.split("|");let g=null;try{g=u(l[1])}catch(p){r(p);return}e.enqueueDefineAnonymousModule([],function(){return g}),s()}else{const{trustedTypesPolicy:o}=e.getConfig().getOptionsLiteral();if(!(/^((http:)|(https:)|(file:))/.test(i)&&i.substring(0,self.origin.length)!==self.origin)&&this._canUseEval(e)){fetch(i).then(l=>{if(l.status!==200)throw new Error(l.statusText);return l.text()}).then(l=>{l=`${l}
+//# sourceURL=${i}`,(o?self.eval(o.createScript("",l)):new Function(l)).call(self),s()}).then(void 0,r);return}try{o&&(i=o.createScriptURL(i)),importScripts(i),s()}catch(l){r(l)}}}}class n{constructor(e){this._env=e,this._didInitialize=!1,this._didPatchNodeRequire=!1}_init(e){this._didInitialize||(this._didInitialize=!0,this._fs=e("fs"),this._vm=e("vm"),this._path=e("path"),this._crypto=e("crypto"))}_initNodeRequire(e,i){const{nodeCachedData:s}=i.getConfig().getOptionsLiteral();if(!s||this._didPatchNodeRequire)return;this._didPatchNodeRequire=!0;const r=this,o=e("module");function u(l){const g=l.constructor;let p=function(y){try{return l.require(y)}finally{}};return p.resolve=function(y,E){return g._resolveFilename(y,l,!1,E)},p.resolve.paths=function(y){return g._resolveLookupPaths(y,l)},p.main=process.mainModule,p.extensions=g._extensions,p.cache=g._cache,p}o.prototype._compile=function(l,g){const p=o.wrap(l.replace(/^#!.*/,"")),m=i.getRecorder(),y=r._getCachedDataPath(s,g),E={filename:g};let R;try{const x=r._fs.readFileSync(y);R=x.slice(0,16),E.cachedData=x.slice(16),m.record(60,y)}catch{m.record(61,y)}const C=new r._vm.Script(p,E),I=C.runInThisContext(E),w=r._path.dirname(g),b=u(this),U=[this.exports,b,this,g,w,process,_commonjsGlobal,Buffer],P=I.apply(this.exports,U);return r._handleCachedData(C,p,y,!E.cachedData,i),r._verifyCachedData(C,p,y,R,i),P}}load(e,i,s,r){const o=e.getConfig().getOptionsLiteral(),u=c(e.getRecorder(),o.nodeRequire||d.global.nodeRequire),l=o.nodeInstrumenter||function(p){return p};this._init(u),this._initNodeRequire(u,e);let g=e.getRecorder();if(/^node\|/.test(i)){let p=i.split("|"),m=null;try{m=u(p[1])}catch(y){r(y);return}e.enqueueDefineAnonymousModule([],()=>m),s()}else{i=d.Utilities.fileUriToFilePath(this._env.isWindows,i);const p=this._path.normalize(i),m=this._getElectronRendererScriptPathOrUri(p),y=!!o.nodeCachedData,E=y?this._getCachedDataPath(o.nodeCachedData,i):void 0;this._readSourceAndCachedData(p,E,g,(R,C,I,w)=>{if(R){r(R);return}let b;C.charCodeAt(0)===n._BOM?b=n._PREFIX+C.substring(1)+n._SUFFIX:b=n._PREFIX+C+n._SUFFIX,b=l(b,p);const U={filename:m,cachedData:I},P=this._createAndEvalScript(e,b,U,s,r);this._handleCachedData(P,b,E,y&&!I,e),this._verifyCachedData(P,b,E,w,e)})}}_createAndEvalScript(e,i,s,r,o){const u=e.getRecorder();u.record(31,s.filename);const l=new this._vm.Script(i,s),g=l.runInThisContext(s),p=e.getGlobalAMDDefineFunc();let m=!1;const y=function(){return m=!0,p.apply(null,arguments)};return y.amd=p.amd,g.call(d.global,e.getGlobalAMDRequireFunc(),y,s.filename,this._path.dirname(s.filename)),u.record(32,s.filename),m?r():o(new Error(`Didn't receive define call in ${s.filename}!`)),l}_getElectronRendererScriptPathOrUri(e){if(!this._env.isElectronRenderer)return e;let i=e.match(/^([a-z])\:(.*)/i);return i?`file:///${(i[1].toUpperCase()+":"+i[2]).replace(/\\/g,"/")}`:`file://${e}`}_getCachedDataPath(e,i){const s=this._crypto.createHash("md5").update(i,"utf8").update(e.seed,"utf8").update(process.arch,"").digest("hex"),r=this._path.basename(i).replace(/\.js$/,"");return this._path.join(e.path,`${r}-${s}.code`)}_handleCachedData(e,i,s,r,o){e.cachedDataRejected?this._fs.unlink(s,u=>{o.getRecorder().record(62,s),this._createAndWriteCachedData(e,i,s,o),u&&o.getConfig().onError(u)}):r&&this._createAndWriteCachedData(e,i,s,o)}_createAndWriteCachedData(e,i,s,r){let o=Math.ceil(r.getConfig().getOptionsLiteral().nodeCachedData.writeDelay*(1+Math.random())),u=-1,l=0,g;const p=()=>{setTimeout(()=>{g||(g=this._crypto.createHash("md5").update(i,"utf8").digest());const m=e.createCachedData();if(!(m.length===0||m.length===u||l>=5)){if(m.length{y&&r.getConfig().onError(y),r.getRecorder().record(63,s),p()})}},o*Math.pow(4,l++))};p()}_readSourceAndCachedData(e,i,s,r){if(!i)this._fs.readFile(e,{encoding:"utf8"},r);else{let o,u,l,g=2;const p=m=>{m?r(m):--g===0&&r(void 0,o,u,l)};this._fs.readFile(e,{encoding:"utf8"},(m,y)=>{o=y,p(m)}),this._fs.readFile(i,(m,y)=>{!m&&y&&y.length>0?(l=y.slice(0,16),u=y.slice(16),s.record(60,i)):s.record(61,i),p()})}}_verifyCachedData(e,i,s,r,o){r&&(e.cachedDataRejected||setTimeout(()=>{const u=this._crypto.createHash("md5").update(i,"utf8").digest();r.equals(u)||(o.getConfig().onError(new Error(`FAILED TO VERIFY CACHED DATA, deleting stale '${s}' now, but a RESTART IS REQUIRED`)),this._fs.unlink(s,l=>{l&&o.getConfig().onError(l)}))},Math.ceil(5e3*(1+Math.random()))))}}n._BOM=65279,n._PREFIX="(function (require, define, __filename, __dirname) { ",n._SUFFIX=`
+});`;function c(t,e){if(e.__$__isRecorded)return e;const i=function(r){t.record(33,r);try{return e(r)}finally{t.record(34,r)}};return i.__$__isRecorded=!0,i}d.ensureRecordedNodeRequire=c;function a(t){return new _(t)}d.createScriptLoader=a})(AMDLoader||(AMDLoader={}));var AMDLoader;(function(d){class _{constructor(t){let e=t.lastIndexOf("/");e!==-1?this.fromModulePath=t.substr(0,e+1):this.fromModulePath=""}static _normalizeModuleId(t){let e=t,i;for(i=/\/\.\//;i.test(e);)e=e.replace(i,"/");for(e=e.replace(/^\.\//g,""),i=/\/(([^\/])|([^\/][^\/\.])|([^\/\.][^\/])|([^\/][^\/][^\/]+))\/\.\.\//;i.test(e);)e=e.replace(i,"/");return e=e.replace(/^(([^\/])|([^\/][^\/\.])|([^\/\.][^\/])|([^\/][^\/][^\/]+))\/\.\.\//,""),e}resolveModule(t){let e=t;return d.Utilities.isAbsolutePath(e)||(d.Utilities.startsWith(e,"./")||d.Utilities.startsWith(e,"../"))&&(e=_._normalizeModuleId(this.fromModulePath+e)),e}}_.ROOT=new _(""),d.ModuleIdResolver=_;class v{constructor(t,e,i,s,r,o){this.id=t,this.strId=e,this.dependencies=i,this._callback=s,this._errorback=r,this.moduleIdResolver=o,this.exports={},this.error=null,this.exportsPassedIn=!1,this.unresolvedDependenciesCount=this.dependencies.length,this._isComplete=!1}static _safeInvokeFunction(t,e){try{return{returnedValue:t.apply(d.global,e),producedError:null}}catch(i){return{returnedValue:null,producedError:i}}}static _invokeFactory(t,e,i,s){return t.shouldInvokeFactory(e)?t.shouldCatchError()?this._safeInvokeFunction(i,s):{returnedValue:i.apply(d.global,s),producedError:null}:{returnedValue:null,producedError:null}}complete(t,e,i,s){this._isComplete=!0;let r=null;if(this._callback)if(typeof this._callback=="function"){t.record(21,this.strId);let o=v._invokeFactory(e,this.strId,this._callback,i);r=o.producedError,t.record(22,this.strId),!r&&typeof o.returnedValue<"u"&&(!this.exportsPassedIn||d.Utilities.isEmpty(this.exports))&&(this.exports=o.returnedValue)}else this.exports=this._callback;if(r){let o=d.ensureError(r);o.phase="factory",o.moduleId=this.strId,o.neededBy=s(this.id),this.error=o,e.onError(o)}this.dependencies=null,this._callback=null,this._errorback=null,this.moduleIdResolver=null}onDependencyError(t){return this._isComplete=!0,this.error=t,this._errorback?(this._errorback(t),!0):!1}isComplete(){return this._isComplete}}d.Module=v;class f{constructor(){this._nextId=0,this._strModuleIdToIntModuleId=new Map,this._intModuleIdToStrModuleId=[],this.getModuleId("exports"),this.getModuleId("module"),this.getModuleId("require")}getMaxModuleId(){return this._nextId}getModuleId(t){let e=this._strModuleIdToIntModuleId.get(t);return typeof e>"u"&&(e=this._nextId++,this._strModuleIdToIntModuleId.set(t,e),this._intModuleIdToStrModuleId[e]=t),e}getStrModuleId(t){return this._intModuleIdToStrModuleId[t]}}class h{constructor(t){this.id=t}}h.EXPORTS=new h(0),h.MODULE=new h(1),h.REQUIRE=new h(2),d.RegularDependency=h;class n{constructor(t,e,i){this.id=t,this.pluginId=e,this.pluginParam=i}}d.PluginDependency=n;class c{constructor(t,e,i,s,r=0){this._env=t,this._scriptLoader=e,this._loaderAvailableTimestamp=r,this._defineFunc=i,this._requireFunc=s,this._moduleIdProvider=new f,this._config=new d.Configuration(this._env),this._hasDependencyCycle=!1,this._modules2=[],this._knownModules2=[],this._inverseDependencies2=[],this._inversePluginDependencies2=new Map,this._currentAnonymousDefineCall=null,this._recorder=null,this._buildInfoPath=[],this._buildInfoDefineStack=[],this._buildInfoDependencies=[],this._requireFunc.moduleManager=this}reset(){return new c(this._env,this._scriptLoader,this._defineFunc,this._requireFunc,this._loaderAvailableTimestamp)}getGlobalAMDDefineFunc(){return this._defineFunc}getGlobalAMDRequireFunc(){return this._requireFunc}static _findRelevantLocationInStack(t,e){let i=o=>o.replace(/\\/g,"/"),s=i(t),r=e.split(/\n/);for(let o=0;othis._moduleIdProvider.getStrModuleId(g.id))),this._resolve(l)}_normalizeDependency(t,e){if(t==="exports")return h.EXPORTS;if(t==="module")return h.MODULE;if(t==="require")return h.REQUIRE;let i=t.indexOf("!");if(i>=0){let s=e.resolveModule(t.substr(0,i)),r=e.resolveModule(t.substr(i+1)),o=this._moduleIdProvider.getModuleId(s+"!"+r),u=this._moduleIdProvider.getModuleId(s);return new n(o,u,r)}return new h(this._moduleIdProvider.getModuleId(e.resolveModule(t)))}_normalizeDependencies(t,e){let i=[],s=0;for(let r=0,o=t.length;rthis._moduleIdProvider.getStrModuleId(o));const r=d.ensureError(e);return r.phase="loading",r.moduleId=i,r.neededBy=s,r}_onLoadError(t,e){const i=this._createLoadError(t,e);this._modules2[t]||(this._modules2[t]=new v(t,this._moduleIdProvider.getStrModuleId(t),[],()=>{},null,null));let s=[];for(let u=0,l=this._moduleIdProvider.getMaxModuleId();u0;){let u=o.shift(),l=this._modules2[u];l&&(r=l.onDependencyError(i)||r);let g=this._inverseDependencies2[u];if(g)for(let p=0,m=g.length;p0;){let u=r.shift().dependencies;if(u)for(let l=0,g=u.length;lthis._relativeRequire(t,i,s,r);return e.toUrl=i=>this._config.requireToUrl(t.resolveModule(i)),e.getStats=()=>this.getLoaderEvents(),e.hasDependencyCycle=()=>this._hasDependencyCycle,e.config=(i,s=!1)=>{this.configure(i,s)},e.__$__nodeRequire=d.global.nodeRequire,e}_loadModule(t){if(this._modules2[t]||this._knownModules2[t])return;this._knownModules2[t]=!0;let e=this._moduleIdProvider.getStrModuleId(t),i=this._config.moduleIdToPaths(e),s=/^@[^\/]+\/[^\/]+$/;this._env.isNode&&(e.indexOf("/")===-1||s.test(e))&&i.push("node|"+e);let r=-1,o=u=>{if(r++,r>=i.length)this._onLoadError(t,u);else{let l=i[r],g=this.getRecorder();if(this._config.isBuild()&&l==="empty:"){this._buildInfoPath[t]=l,this.defineModule(this._moduleIdProvider.getStrModuleId(t),[],null,null,null),this._onLoad(t);return}g.record(10,l),this._scriptLoader.load(this,l,()=>{this._config.isBuild()&&(this._buildInfoPath[t]=l),g.record(11,l),this._onLoad(t)},p=>{g.record(12,l),o(p)})}};o(null)}_loadPluginDependency(t,e){if(this._modules2[e.id]||this._knownModules2[e.id])return;this._knownModules2[e.id]=!0;let i=s=>{this.defineModule(this._moduleIdProvider.getStrModuleId(e.id),[],s,null,null)};i.error=s=>{this._config.onError(this._createLoadError(e.id,s))},t.load(e.pluginParam,this._createRequire(_.ROOT),i,this._config.getOptionsLiteral())}_resolve(t){let e=t.dependencies;if(e)for(let i=0,s=e.length;ithis._moduleIdProvider.getStrModuleId(l)).join(` =>
+`)),t.unresolvedDependenciesCount--;continue}if(this._inverseDependencies2[r.id]=this._inverseDependencies2[r.id]||[],this._inverseDependencies2[r.id].push(t.id),r instanceof n){let u=this._modules2[r.pluginId];if(u&&u.isComplete()){this._loadPluginDependency(u.exports,r);continue}let l=this._inversePluginDependencies2.get(r.pluginId);l||(l=[],this._inversePluginDependencies2.set(r.pluginId,l)),l.push(r),this._loadModule(r.pluginId);continue}this._loadModule(r.id)}t.unresolvedDependenciesCount===0&&this._onModuleComplete(t)}_onModuleComplete(t){let e=this.getRecorder();if(t.isComplete())return;let i=t.dependencies,s=[];if(i)for(let l=0,g=i.length;lthis._config.getConfigForModule(t.strId)};continue}if(p===h.REQUIRE){s[l]=this._createRequire(t.moduleIdResolver);continue}let m=this._modules2[p.id];if(m){s[l]=m.exports;continue}s[l]=null}const r=l=>(this._inverseDependencies2[l]||[]).map(g=>this._moduleIdProvider.getStrModuleId(g));t.complete(e,this._config,s,r);let o=this._inverseDependencies2[t.id];if(this._inverseDependencies2[t.id]=null,o)for(let l=0,g=o.length;l"u"&&c())})(AMDLoader||(AMDLoader={})),define("vs/css",["require","exports"],function(d,_){"use strict";Object.defineProperty(_,"__esModule",{value:!0}),_.load=v;function v(a,t,e,i){if(i=i||{},(i["vs/css"]||{}).disabled){e({});return}const r=t.toUrl(a+".css");f(a,r,()=>{e({})},o=>{typeof e.error=="function"&&e.error("Could not find "+r+".")})}function f(a,t,e,i){if(h(a,t)){e();return}n(a,t,e,i)}function h(a,t){const e=window.document.getElementsByTagName("link");for(let i=0,s=e.length;i{t.removeEventListener("load",r),t.removeEventListener("error",o)},r=u=>{s(),e()},o=u=>{s(),i(u)};t.addEventListener("load",r),t.addEventListener("error",o)}}),function(){const d=require.getConfig().baseUrl||"https://main.vscode-cdn.net/insider/336db9ece67f682159078ea1b54212de7636d88a/out";require.config({baseUrl:d,recordStats:!0,paths:{"@microsoft/1ds-core-js":"../node_modules/@microsoft/1ds-core-js/dist/ms.core.min.js","@microsoft/1ds-post-js":"../node_modules/@microsoft/1ds-post-js/dist/ms.post.min.js","@vscode/iconv-lite-umd":"../node_modules/@vscode/iconv-lite-umd/lib/iconv-lite-umd.js","@vscode/tree-sitter-wasm":"../node_modules/@vscode/tree-sitter-wasm/wasm/tree-sitter.js","@vscode/vscode-languagedetection":"../node_modules/@vscode/vscode-languagedetection/dist/lib/index.js","@xterm/addon-clipboard":"../node_modules/@xterm/addon-clipboard/lib/addon-clipboard.js","@xterm/addon-image":"../node_modules/@xterm/addon-image/lib/addon-image.js","@xterm/addon-search":"../node_modules/@xterm/addon-search/lib/addon-search.js","@xterm/addon-serialize":"../node_modules/@xterm/addon-serialize/lib/addon-serialize.js","@xterm/addon-unicode11":"../node_modules/@xterm/addon-unicode11/lib/addon-unicode11.js","@xterm/addon-webgl":"../node_modules/@xterm/addon-webgl/lib/addon-webgl.js","@xterm/xterm":"../node_modules/@xterm/xterm/lib/xterm.js",jschardet:"../node_modules/jschardet/dist/jschardet.min.js","tas-client-umd":"../node_modules/tas-client-umd/lib/tas-client-umd.js","vscode-oniguruma":"../node_modules/vscode-oniguruma/release/main.js","vscode-textmate":"../node_modules/vscode-textmate/release/main.js","vscode-regexp-languagedetection":"../node_modules/vscode-regexp-languagedetection/dist/index.js",vsda:"../node_modules/vsda/rust/web/vsda.js","@microsoft/dynamicproto-js":"../node_modules/@microsoft/dynamicproto-js/lib/dist/umd/dynamicproto-js.min.js","@microsoft/applicationinsights-shims":"../node_modules/@microsoft/applicationinsights-shims/dist/umd/applicationinsights-shims.min.js","@microsoft/applicationinsights-core-js":"../node_modules/@microsoft/applicationinsights-core-js/browser/applicationinsights-core-js.min.js"}})}();
+
+//# sourceMappingURL=https://main.vscode-cdn.net/sourcemaps/336db9ece67f682159078ea1b54212de7636d88a/core/vs/loader.js.map
diff --git a/build/monaco/monaco.d.ts.recipe b/build/monaco/monaco.d.ts.recipe
index a6eb3b7128f..ef5c2e39ae5 100644
--- a/build/monaco/monaco.d.ts.recipe
+++ b/build/monaco/monaco.d.ts.recipe
@@ -92,7 +92,7 @@ declare namespace monaco.editor {
#includeAll(vs/editor/standalone/browser/standaloneEditor;languages.Token=>Token):
#include(vs/editor/standalone/common/standaloneTheme): BuiltinTheme, IStandaloneThemeData, IColors
#include(vs/editor/common/languages/supports/tokenization): ITokenThemeRule
-#include(vs/editor/browser/services/webWorker): MonacoWebWorker, IWebWorkerOptions
+#include(vs/editor/standalone/browser/standaloneWebWorker): MonacoWebWorker, IWebWorkerOptions
#include(vs/editor/standalone/browser/standaloneCodeEditor): IActionDescriptor, IGlobalEditorOptions, IStandaloneEditorConstructionOptions, IStandaloneDiffEditorConstructionOptions, IStandaloneCodeEditor, IStandaloneDiffEditor
export interface ICommandHandler {
(...args: any[]): void;
diff --git a/build/npm/dirs.js b/build/npm/dirs.js
index 372d546cd78..b9645e6e137 100644
--- a/build/npm/dirs.js
+++ b/build/npm/dirs.js
@@ -5,7 +5,7 @@
const fs = require('fs');
-// Complete list of directories where yarn should be executed to install node modules
+// Complete list of directories where npm should be executed to install node modules
const dirs = [
'',
'build',
@@ -29,7 +29,6 @@ const dirs = [
'extensions/jake',
'extensions/json-language-features',
'extensions/json-language-features/server',
- 'extensions/markdown-language-features/server',
'extensions/markdown-language-features',
'extensions/markdown-math',
'extensions/media-preview',
@@ -52,6 +51,7 @@ const dirs = [
'test/integration/browser',
'test/monaco',
'test/smoke',
+ '.vscode/extensions/vscode-selfhost-import-aid',
'.vscode/extensions/vscode-selfhost-test-provider',
];
diff --git a/build/npm/gyp/package-lock.json b/build/npm/gyp/package-lock.json
new file mode 100644
index 00000000000..a20d85c70dc
--- /dev/null
+++ b/build/npm/gyp/package-lock.json
@@ -0,0 +1,1321 @@
+{
+ "name": "code-oss-dev-build",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "code-oss-dev-build",
+ "version": "1.0.0",
+ "license": "MIT",
+ "devDependencies": {
+ "node-gyp": "^10.1.0"
+ }
+ },
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@npmcli/agent": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz",
+ "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.1",
+ "lru-cache": "^10.0.1",
+ "socks-proxy-agent": "^8.0.3"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@npmcli/fs": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz",
+ "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/abbrev": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz",
+ "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz",
+ "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/aggregate-error": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+ "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/cacache": {
+ "version": "18.0.3",
+ "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.3.tgz",
+ "integrity": "sha512-qXCd4rh6I07cnDqh8V48/94Tc/WSfj+o3Gn6NZ0aZovS255bUx8O13uKxRFd2eWG0xgsco7+YItQNPaa5E85hg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/fs": "^3.1.0",
+ "fs-minipass": "^3.0.0",
+ "glob": "^10.2.2",
+ "lru-cache": "^10.0.1",
+ "minipass": "^7.0.3",
+ "minipass-collect": "^2.0.1",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "p-map": "^4.0.0",
+ "ssri": "^10.0.0",
+ "tar": "^6.1.11",
+ "unique-filename": "^3.0.0"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/chownr": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/clean-stack": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/cross-spawn/node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/cross-spawn/node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.5",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
+ "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/encoding": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
+ "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "iconv-lite": "^0.6.2"
+ }
+ },
+ "node_modules/env-paths": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/err-code": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz",
+ "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/exponential-backoff": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz",
+ "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/foreground-child": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz",
+ "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/fs-minipass": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz",
+ "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/glob": {
+ "version": "10.4.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz",
+ "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.10",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
+ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/http-cache-semantics": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
+ "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz",
+ "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.0.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ip-address": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz",
+ "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "jsbn": "1.1.0",
+ "sprintf-js": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-lambda": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz",
+ "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/isexe": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
+ "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/jackspeak": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz",
+ "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/jsbn": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz",
+ "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lru-cache": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz",
+ "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "14 || >=16.14"
+ }
+ },
+ "node_modules/make-fetch-happen": {
+ "version": "13.0.1",
+ "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz",
+ "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/agent": "^2.0.0",
+ "cacache": "^18.0.0",
+ "http-cache-semantics": "^4.1.1",
+ "is-lambda": "^1.0.1",
+ "minipass": "^7.0.2",
+ "minipass-fetch": "^3.0.0",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "negotiator": "^0.6.3",
+ "proc-log": "^4.2.0",
+ "promise-retry": "^2.0.1",
+ "ssri": "^10.0.0"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/make-fetch-happen/node_modules/proc-log": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz",
+ "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/minipass-collect": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz",
+ "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/minipass-fetch": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz",
+ "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^7.0.3",
+ "minipass-sized": "^1.0.3",
+ "minizlib": "^2.1.2"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ },
+ "optionalDependencies": {
+ "encoding": "^0.1.13"
+ }
+ },
+ "node_modules/minipass-flush": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
+ "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/minipass-flush/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minipass-pipeline": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
+ "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minipass-pipeline/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minipass-sized": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
+ "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minipass-sized/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minizlib": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+ "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^3.0.0",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/minizlib/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/node-gyp": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.1.0.tgz",
+ "integrity": "sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "env-paths": "^2.2.0",
+ "exponential-backoff": "^3.1.1",
+ "glob": "^10.3.10",
+ "graceful-fs": "^4.2.6",
+ "make-fetch-happen": "^13.0.0",
+ "nopt": "^7.0.0",
+ "proc-log": "^3.0.0",
+ "semver": "^7.3.5",
+ "tar": "^6.1.2",
+ "which": "^4.0.0"
+ },
+ "bin": {
+ "node-gyp": "bin/node-gyp.js"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/nopt": {
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz",
+ "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "abbrev": "^2.0.0"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/p-map": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+ "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "aggregate-error": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz",
+ "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0"
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/proc-log": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz",
+ "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/promise-retry": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
+ "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "err-code": "^2.0.2",
+ "retry": "^0.12.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/smart-buffer": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/socks": {
+ "version": "2.8.3",
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz",
+ "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ip-address": "^9.0.5",
+ "smart-buffer": "^4.2.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/socks-proxy-agent": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz",
+ "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.1",
+ "debug": "^4.3.4",
+ "socks": "^2.8.3"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
+ "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/ssri": {
+ "version": "10.0.6",
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz",
+ "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/string-width-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tar": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
+ "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "chownr": "^2.0.0",
+ "fs-minipass": "^2.0.0",
+ "minipass": "^5.0.0",
+ "minizlib": "^2.1.1",
+ "mkdirp": "^1.0.3",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/tar/node_modules/fs-minipass": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+ "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tar/node_modules/minipass": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+ "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/unique-filename": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz",
+ "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "unique-slug": "^4.0.0"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/unique-slug": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz",
+ "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz",
+ "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^3.1.1"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
+ },
+ "engines": {
+ "node": "^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "license": "ISC"
+ }
+ }
+}
diff --git a/build/npm/gyp/package.json b/build/npm/gyp/package.json
index 3961e955a5f..a1564133a1e 100644
--- a/build/npm/gyp/package.json
+++ b/build/npm/gyp/package.json
@@ -4,7 +4,7 @@
"private": true,
"license": "MIT",
"devDependencies": {
- "node-gyp": "^9.4.0"
+ "node-gyp": "^10.1.0"
},
"scripts": {}
}
diff --git a/build/npm/gyp/yarn.lock b/build/npm/gyp/yarn.lock
deleted file mode 100644
index 96d132e7943..00000000000
--- a/build/npm/gyp/yarn.lock
+++ /dev/null
@@ -1,812 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"@isaacs/cliui@^8.0.2":
- version "8.0.2"
- resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550"
- integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==
- dependencies:
- string-width "^5.1.2"
- string-width-cjs "npm:string-width@^4.2.0"
- strip-ansi "^7.0.1"
- strip-ansi-cjs "npm:strip-ansi@^6.0.1"
- wrap-ansi "^8.1.0"
- wrap-ansi-cjs "npm:wrap-ansi@^7.0.0"
-
-"@npmcli/fs@^3.1.0":
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e"
- integrity sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==
- dependencies:
- semver "^7.3.5"
-
-"@pkgjs/parseargs@^0.11.0":
- version "0.11.0"
- resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
- integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
-
-"@tootallnate/once@2":
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf"
- integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==
-
-abbrev@^1.0.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
- integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
-
-agent-base@6, agent-base@^6.0.2:
- version "6.0.2"
- resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
- integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
- dependencies:
- debug "4"
-
-agentkeepalive@^4.2.1:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255"
- integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==
- dependencies:
- debug "^4.1.0"
- depd "^2.0.0"
- humanize-ms "^1.2.1"
-
-aggregate-error@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
- integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==
- dependencies:
- clean-stack "^2.0.0"
- indent-string "^4.0.0"
-
-ansi-regex@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
- integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
-
-ansi-regex@^6.0.1:
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a"
- integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==
-
-ansi-styles@^4.0.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
- integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
- dependencies:
- color-convert "^2.0.1"
-
-ansi-styles@^6.1.0:
- version "6.2.1"
- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5"
- integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
-
-"aproba@^1.0.3 || ^2.0.0":
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc"
- integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==
-
-are-we-there-yet@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd"
- integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==
- dependencies:
- delegates "^1.0.0"
- readable-stream "^3.6.0"
-
-balanced-match@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
- integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
-
-brace-expansion@^1.1.7:
- version "1.1.11"
- resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
- integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
- dependencies:
- balanced-match "^1.0.0"
- concat-map "0.0.1"
-
-brace-expansion@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
- integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
- dependencies:
- balanced-match "^1.0.0"
-
-cacache@^17.0.0:
- version "17.1.3"
- resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.3.tgz#c6ac23bec56516a7c0c52020fd48b4909d7c7044"
- integrity sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==
- dependencies:
- "@npmcli/fs" "^3.1.0"
- fs-minipass "^3.0.0"
- glob "^10.2.2"
- lru-cache "^7.7.1"
- minipass "^5.0.0"
- minipass-collect "^1.0.2"
- minipass-flush "^1.0.5"
- minipass-pipeline "^1.2.4"
- p-map "^4.0.0"
- ssri "^10.0.0"
- tar "^6.1.11"
- unique-filename "^3.0.0"
-
-chownr@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
- integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
-
-clean-stack@^2.0.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
- integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
-
-color-convert@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
- integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
- dependencies:
- color-name "~1.1.4"
-
-color-name@~1.1.4:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
- integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
-
-color-support@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
- integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==
-
-concat-map@0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
- integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
-
-console-control-strings@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
- integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==
-
-cross-spawn@^7.0.0:
- version "7.0.3"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
- integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
- dependencies:
- path-key "^3.1.0"
- shebang-command "^2.0.0"
- which "^2.0.1"
-
-debug@4, debug@^4.1.0, debug@^4.3.3:
- version "4.3.4"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
- integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
- dependencies:
- ms "2.1.2"
-
-delegates@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
- integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==
-
-depd@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
- integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
-
-eastasianwidth@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
- integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
-
-emoji-regex@^8.0.0:
- version "8.0.0"
- resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
- integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
-
-emoji-regex@^9.2.2:
- version "9.2.2"
- resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
- integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
-
-encoding@^0.1.13:
- version "0.1.13"
- resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9"
- integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==
- dependencies:
- iconv-lite "^0.6.2"
-
-env-paths@^2.2.0:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
- integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
-
-err-code@^2.0.2:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9"
- integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==
-
-exponential-backoff@^3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6"
- integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==
-
-foreground-child@^3.1.0:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d"
- integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==
- dependencies:
- cross-spawn "^7.0.0"
- signal-exit "^4.0.1"
-
-fs-minipass@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
- integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
- dependencies:
- minipass "^3.0.0"
-
-fs-minipass@^3.0.0:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.2.tgz#5b383858efa8c1eb8c33b39e994f7e8555b8b3a3"
- integrity sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==
- dependencies:
- minipass "^5.0.0"
-
-fs.realpath@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
- integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
-
-gauge@^4.0.3:
- version "4.0.4"
- resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce"
- integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==
- dependencies:
- aproba "^1.0.3 || ^2.0.0"
- color-support "^1.1.3"
- console-control-strings "^1.1.0"
- has-unicode "^2.0.1"
- signal-exit "^3.0.7"
- string-width "^4.2.3"
- strip-ansi "^6.0.1"
- wide-align "^1.1.5"
-
-glob@^10.2.2:
- version "10.3.3"
- resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.3.tgz#8360a4ffdd6ed90df84aa8d52f21f452e86a123b"
- integrity sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==
- dependencies:
- foreground-child "^3.1.0"
- jackspeak "^2.0.3"
- minimatch "^9.0.1"
- minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
- path-scurry "^1.10.1"
-
-glob@^7.1.3, glob@^7.1.4:
- version "7.2.3"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
- integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
- dependencies:
- fs.realpath "^1.0.0"
- inflight "^1.0.4"
- inherits "2"
- minimatch "^3.1.1"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
-
-graceful-fs@^4.2.6:
- version "4.2.10"
- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
- integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
-
-has-unicode@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
- integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==
-
-http-cache-semantics@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a"
- integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==
-
-http-proxy-agent@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43"
- integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==
- dependencies:
- "@tootallnate/once" "2"
- agent-base "6"
- debug "4"
-
-https-proxy-agent@^5.0.0:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6"
- integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==
- dependencies:
- agent-base "6"
- debug "4"
-
-humanize-ms@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
- integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==
- dependencies:
- ms "^2.0.0"
-
-iconv-lite@^0.6.2:
- version "0.6.3"
- resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
- integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
- dependencies:
- safer-buffer ">= 2.1.2 < 3.0.0"
-
-imurmurhash@^0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
- integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
-
-indent-string@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
- integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
-
-inflight@^1.0.4:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
- integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
- dependencies:
- once "^1.3.0"
- wrappy "1"
-
-inherits@2, inherits@^2.0.3:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
- integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
-
-ip@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.1.tgz#e8f3595d33a3ea66490204234b77636965307105"
- integrity sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==
-
-is-fullwidth-code-point@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
- integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
-
-is-lambda@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5"
- integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==
-
-isexe@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
- integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
-
-jackspeak@^2.0.3:
- version "2.2.2"
- resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.2.2.tgz#707c62733924b8dc2a0a629dc6248577788b5385"
- integrity sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg==
- dependencies:
- "@isaacs/cliui" "^8.0.2"
- optionalDependencies:
- "@pkgjs/parseargs" "^0.11.0"
-
-lru-cache@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
- integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
- dependencies:
- yallist "^4.0.0"
-
-lru-cache@^7.7.1:
- version "7.18.3"
- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89"
- integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==
-
-"lru-cache@^9.1.1 || ^10.0.0":
- version "10.0.0"
- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.0.tgz#b9e2a6a72a129d81ab317202d93c7691df727e61"
- integrity sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==
-
-make-fetch-happen@^11.0.3:
- version "11.1.1"
- resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz#85ceb98079584a9523d4bf71d32996e7e208549f"
- integrity sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==
- dependencies:
- agentkeepalive "^4.2.1"
- cacache "^17.0.0"
- http-cache-semantics "^4.1.1"
- http-proxy-agent "^5.0.0"
- https-proxy-agent "^5.0.0"
- is-lambda "^1.0.1"
- lru-cache "^7.7.1"
- minipass "^5.0.0"
- minipass-fetch "^3.0.0"
- minipass-flush "^1.0.5"
- minipass-pipeline "^1.2.4"
- negotiator "^0.6.3"
- promise-retry "^2.0.1"
- socks-proxy-agent "^7.0.0"
- ssri "^10.0.0"
-
-minimatch@^3.1.1:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
- integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
- dependencies:
- brace-expansion "^1.1.7"
-
-minimatch@^9.0.1:
- version "9.0.3"
- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825"
- integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==
- dependencies:
- brace-expansion "^2.0.1"
-
-minipass-collect@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617"
- integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==
- dependencies:
- minipass "^3.0.0"
-
-minipass-fetch@^3.0.0:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.3.tgz#d9df70085609864331b533c960fd4ffaa78d15ce"
- integrity sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==
- dependencies:
- minipass "^5.0.0"
- minipass-sized "^1.0.3"
- minizlib "^2.1.2"
- optionalDependencies:
- encoding "^0.1.13"
-
-minipass-flush@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373"
- integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==
- dependencies:
- minipass "^3.0.0"
-
-minipass-pipeline@^1.2.4:
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c"
- integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==
- dependencies:
- minipass "^3.0.0"
-
-minipass-sized@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70"
- integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==
- dependencies:
- minipass "^3.0.0"
-
-minipass@^3.0.0:
- version "3.3.6"
- resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a"
- integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==
- dependencies:
- yallist "^4.0.0"
-
-minipass@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d"
- integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==
-
-"minipass@^5.0.0 || ^6.0.2 || ^7.0.0":
- version "7.0.2"
- resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.2.tgz#58a82b7d81c7010da5bd4b2c0c85ac4b4ec5131e"
- integrity sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==
-
-minizlib@^2.1.1, minizlib@^2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
- integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==
- dependencies:
- minipass "^3.0.0"
- yallist "^4.0.0"
-
-mkdirp@^1.0.3:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
- integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
-
-ms@2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
- integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-
-ms@^2.0.0:
- version "2.1.3"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
- integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
-
-negotiator@^0.6.3:
- version "0.6.3"
- resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
- integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
-
-node-gyp@^9.4.0:
- version "9.4.0"
- resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.0.tgz#2a7a91c7cba4eccfd95e949369f27c9ba704f369"
- integrity sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==
- dependencies:
- env-paths "^2.2.0"
- exponential-backoff "^3.1.1"
- glob "^7.1.4"
- graceful-fs "^4.2.6"
- make-fetch-happen "^11.0.3"
- nopt "^6.0.0"
- npmlog "^6.0.0"
- rimraf "^3.0.2"
- semver "^7.3.5"
- tar "^6.1.2"
- which "^2.0.2"
-
-nopt@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d"
- integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==
- dependencies:
- abbrev "^1.0.0"
-
-npmlog@^6.0.0:
- version "6.0.2"
- resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830"
- integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==
- dependencies:
- are-we-there-yet "^3.0.0"
- console-control-strings "^1.1.0"
- gauge "^4.0.3"
- set-blocking "^2.0.0"
-
-once@^1.3.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
- integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
- dependencies:
- wrappy "1"
-
-p-map@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b"
- integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==
- dependencies:
- aggregate-error "^3.0.0"
-
-path-is-absolute@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
- integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
-
-path-key@^3.1.0:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
- integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
-
-path-scurry@^1.10.1:
- version "1.10.1"
- resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698"
- integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==
- dependencies:
- lru-cache "^9.1.1 || ^10.0.0"
- minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
-
-promise-retry@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22"
- integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==
- dependencies:
- err-code "^2.0.2"
- retry "^0.12.0"
-
-readable-stream@^3.6.0:
- version "3.6.0"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
- integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
- dependencies:
- inherits "^2.0.3"
- string_decoder "^1.1.1"
- util-deprecate "^1.0.1"
-
-retry@^0.12.0:
- version "0.12.0"
- resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
- integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==
-
-rimraf@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
- integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
- dependencies:
- glob "^7.1.3"
-
-safe-buffer@~5.2.0:
- version "5.2.1"
- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
- integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
-
-"safer-buffer@>= 2.1.2 < 3.0.0":
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
- integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
-
-semver@^7.3.5:
- version "7.5.4"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
- integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
- dependencies:
- lru-cache "^6.0.0"
-
-set-blocking@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
- integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==
-
-shebang-command@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
- integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
- dependencies:
- shebang-regex "^3.0.0"
-
-shebang-regex@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
- integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
-
-signal-exit@^3.0.7:
- version "3.0.7"
- resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
- integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
-
-signal-exit@^4.0.1:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04"
- integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==
-
-smart-buffer@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae"
- integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==
-
-socks-proxy-agent@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6"
- integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==
- dependencies:
- agent-base "^6.0.2"
- debug "^4.3.3"
- socks "^2.6.2"
-
-socks@^2.6.2:
- version "2.7.1"
- resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55"
- integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==
- dependencies:
- ip "^2.0.0"
- smart-buffer "^4.2.0"
-
-ssri@^10.0.0:
- version "10.0.4"
- resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.4.tgz#5a20af378be586df139ddb2dfb3bf992cf0daba6"
- integrity sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==
- dependencies:
- minipass "^5.0.0"
-
-"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.3:
- version "4.2.3"
- resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
- integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
- dependencies:
- emoji-regex "^8.0.0"
- is-fullwidth-code-point "^3.0.0"
- strip-ansi "^6.0.1"
-
-string-width@^5.0.1, string-width@^5.1.2:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794"
- integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==
- dependencies:
- eastasianwidth "^0.2.0"
- emoji-regex "^9.2.2"
- strip-ansi "^7.0.1"
-
-string_decoder@^1.1.1:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
- integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
- dependencies:
- safe-buffer "~5.2.0"
-
-"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
- integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
- dependencies:
- ansi-regex "^5.0.1"
-
-strip-ansi@^7.0.1:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45"
- integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==
- dependencies:
- ansi-regex "^6.0.1"
-
-tar@^6.1.11, tar@^6.1.2:
- version "6.2.1"
- resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a"
- integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==
- dependencies:
- chownr "^2.0.0"
- fs-minipass "^2.0.0"
- minipass "^5.0.0"
- minizlib "^2.1.1"
- mkdirp "^1.0.3"
- yallist "^4.0.0"
-
-unique-filename@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea"
- integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==
- dependencies:
- unique-slug "^4.0.0"
-
-unique-slug@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3"
- integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==
- dependencies:
- imurmurhash "^0.1.4"
-
-util-deprecate@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
- integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
-
-which@^2.0.1, which@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
- integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
- dependencies:
- isexe "^2.0.0"
-
-wide-align@^1.1.5:
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3"
- integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==
- dependencies:
- string-width "^1.0.2 || 2 || 3 || 4"
-
-"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
- integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
- dependencies:
- ansi-styles "^4.0.0"
- string-width "^4.1.0"
- strip-ansi "^6.0.0"
-
-wrap-ansi@^8.1.0:
- version "8.1.0"
- resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"
- integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==
- dependencies:
- ansi-styles "^6.1.0"
- string-width "^5.0.1"
- strip-ansi "^7.0.1"
-
-wrappy@1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
- integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
-
-yallist@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
- integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
diff --git a/build/npm/postinstall.js b/build/npm/postinstall.js
index bcac781e265..e38c2cb003e 100644
--- a/build/npm/postinstall.js
+++ b/build/npm/postinstall.js
@@ -8,12 +8,19 @@ const path = require('path');
const os = require('os');
const cp = require('child_process');
const { dirs } = require('./dirs');
-const { setupBuildYarnrc } = require('./setupBuildYarnrc');
-const yarn = process.platform === 'win32' ? 'yarn.cmd' : 'yarn';
+const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm';
const root = path.dirname(path.dirname(__dirname));
+function log(dir, message) {
+ if (process.stdout.isTTY) {
+ console.log(`\x1b[34m[${dir}]\x1b[0m`, message);
+ } else {
+ console.log(`[${dir}]`, message);
+ }
+}
+
function run(command, args, opts) {
- console.log('$ ' + command + ' ' + args.join(' '));
+ log(opts.cwd || '.', '$ ' + command + ' ' + args.join(' '));
const result = cp.spawnSync(command, args, opts);
@@ -30,7 +37,7 @@ function run(command, args, opts) {
* @param {string} dir
* @param {*} [opts]
*/
-function yarnInstall(dir, opts) {
+function npmInstall(dir, opts) {
opts = {
env: { ...process.env },
...(opts ?? {}),
@@ -39,97 +46,95 @@ function yarnInstall(dir, opts) {
shell: true
};
- const raw = process.env['npm_config_argv'] || '{}';
- const argv = JSON.parse(raw);
- const original = argv.original || [];
- const args = original.filter(arg => arg === '--ignore-optional' || arg === '--frozen-lockfile' || arg === '--check-files');
-
- if (opts.ignoreEngines) {
- args.push('--ignore-engines');
- delete opts.ignoreEngines;
- }
+ const command = process.env['npm_command'] || 'install';
if (process.env['VSCODE_REMOTE_DEPENDENCIES_CONTAINER_NAME'] && /^(.build\/distro\/npm\/)?remote$/.test(dir)) {
const userinfo = os.userInfo();
- console.log(`Installing dependencies in ${dir} inside container ${process.env['VSCODE_REMOTE_DEPENDENCIES_CONTAINER_NAME']}...`);
+ log(dir, `Installing dependencies inside container ${process.env['VSCODE_REMOTE_DEPENDENCIES_CONTAINER_NAME']}...`);
opts.cwd = root;
- if (process.env['npm_config_arch'] === 'arm64' || process.env['npm_config_arch'] === 'arm') {
+ if (process.env['npm_config_arch'] === 'arm64') {
run('sudo', ['docker', 'run', '--rm', '--privileged', 'multiarch/qemu-user-static', '--reset', '-p', 'yes'], opts);
}
- if (process.env['npm_config_arch'] === 'arm') {
- run('sudo', ['docker', 'run', '-e', 'GITHUB_TOKEN', '-e', 'npm_config_arch', '-v', `${process.env['VSCODE_HOST_MOUNT']}:/home/builduser`, '-v', `${process.env['VSCODE_HOST_MOUNT']}/.build/.netrc:/home/builduser/.netrc`, process.env['VSCODE_REMOTE_DEPENDENCIES_CONTAINER_NAME'], 'yarn', '--cwd', dir, ...args], opts);
- } else {
- run('sudo', ['docker', 'run', '-e', 'GITHUB_TOKEN', '-e', 'npm_config_arch', '-v', `${process.env['VSCODE_HOST_MOUNT']}:/root/vscode`, '-v', `${process.env['VSCODE_HOST_MOUNT']}/.build/.netrc:/root/.netrc`, process.env['VSCODE_REMOTE_DEPENDENCIES_CONTAINER_NAME'], 'yarn', '--cwd', dir, ...args], opts);
- }
- run('sudo', ['chown', '-R', `${userinfo.uid}:${userinfo.gid}`, `${dir}/node_modules`], opts);
+ run('sudo', ['docker', 'run', '-e', 'GITHUB_TOKEN', '-v', `${process.env['VSCODE_HOST_MOUNT']}:/root/vscode`, '-v', `${process.env['VSCODE_HOST_MOUNT']}/.build/.netrc:/root/.netrc`, '-w', path.resolve('/root/vscode', dir), process.env['VSCODE_REMOTE_DEPENDENCIES_CONTAINER_NAME'], 'sh', '-c', `\"chown -R root:root ${path.resolve('/root/vscode', dir)} && npm i -g node-gyp-build && npm ci\"`], opts);
+ run('sudo', ['chown', '-R', `${userinfo.uid}:${userinfo.gid}`, `${path.resolve(root, dir)}`], opts);
} else {
- console.log(`Installing dependencies in ${dir}...`);
- run(yarn, args, opts);
+ log(dir, 'Installing dependencies...');
+ run(npm, [command], opts);
+ }
+}
+
+function setNpmrcConfig(dir, env) {
+ const npmrcPath = path.join(root, dir, '.npmrc');
+ const lines = fs.readFileSync(npmrcPath, 'utf8').split('\n');
+
+ for (const line of lines) {
+ const trimmedLine = line.trim();
+ if (trimmedLine && !trimmedLine.startsWith('#')) {
+ const [key, value] = trimmedLine.split('=');
+ env[`npm_config_${key}`] = value.replace(/^"(.*)"$/, '$1');
+ }
+ }
+
+ if (dir === 'build') {
+ env['npm_config_target'] = process.versions.node;
+ env['npm_config_arch'] = process.arch;
}
}
for (let dir of dirs) {
if (dir === '') {
- // `yarn` already executed in root
- continue;
- }
-
- if (/^.build\/distro\/npm(\/?)/.test(dir)) {
- const ossPath = path.relative('.build/distro/npm', dir);
- const ossYarnRc = path.join(ossPath, '.yarnrc');
-
- if (fs.existsSync(ossYarnRc)) {
- fs.cpSync(ossYarnRc, path.join(dir, '.yarnrc'));
- }
- }
-
- if (/^(.build\/distro\/npm\/)?remote/.test(dir) && process.platform === 'win32' && (process.arch === 'arm64' || process.env['npm_config_arch'] === 'arm64')) {
- // windows arm: do not execute `yarn` on remote folder
+ // already executed in root
continue;
}
let opts;
if (dir === 'build') {
- const env = { ...process.env };
- setupBuildYarnrc();
- opts = { env };
- if (process.env['CC']) { env['CC'] = 'gcc'; }
- if (process.env['CXX']) { env['CXX'] = 'g++'; }
- if (process.env['CXXFLAGS']) { env['CXXFLAGS'] = ''; }
- if (process.env['LDFLAGS']) { env['LDFLAGS'] = ''; }
- yarnInstall('build', opts);
+ opts = {
+ env: {
+ ...process.env
+ },
+ }
+ if (process.env['CC']) { opts.env['CC'] = 'gcc'; }
+ if (process.env['CXX']) { opts.env['CXX'] = 'g++'; }
+ if (process.env['CXXFLAGS']) { opts.env['CXXFLAGS'] = ''; }
+ if (process.env['LDFLAGS']) { opts.env['LDFLAGS'] = ''; }
+
+ setNpmrcConfig('build', opts.env);
+ npmInstall('build', opts);
continue;
}
if (/^(.build\/distro\/npm\/)?remote$/.test(dir)) {
// node modules used by vscode server
- const env = { ...process.env };
+ opts = {
+ env: {
+ ...process.env
+ },
+ }
if (process.env['VSCODE_REMOTE_CC']) {
- env['CC'] = process.env['VSCODE_REMOTE_CC'];
+ opts.env['CC'] = process.env['VSCODE_REMOTE_CC'];
} else {
- delete env['CC'];
+ delete opts.env['CC'];
}
if (process.env['VSCODE_REMOTE_CXX']) {
- env['CXX'] = process.env['VSCODE_REMOTE_CXX'];
+ opts.env['CXX'] = process.env['VSCODE_REMOTE_CXX'];
} else {
- delete env['CXX'];
+ delete opts.env['CXX'];
}
- if (process.env['CXXFLAGS']) { delete env['CXXFLAGS']; }
- if (process.env['CFLAGS']) { delete env['CFLAGS']; }
- if (process.env['LDFLAGS']) { delete env['LDFLAGS']; }
- if (process.env['VSCODE_REMOTE_CXXFLAGS']) { env['CXXFLAGS'] = process.env['VSCODE_REMOTE_CXXFLAGS']; }
- if (process.env['VSCODE_REMOTE_LDFLAGS']) { env['LDFLAGS'] = process.env['VSCODE_REMOTE_LDFLAGS']; }
- if (process.env['VSCODE_REMOTE_NODE_GYP']) { env['npm_config_node_gyp'] = process.env['VSCODE_REMOTE_NODE_GYP']; }
+ if (process.env['CXXFLAGS']) { delete opts.env['CXXFLAGS']; }
+ if (process.env['CFLAGS']) { delete opts.env['CFLAGS']; }
+ if (process.env['LDFLAGS']) { delete opts.env['LDFLAGS']; }
+ if (process.env['VSCODE_REMOTE_CXXFLAGS']) { opts.env['CXXFLAGS'] = process.env['VSCODE_REMOTE_CXXFLAGS']; }
+ if (process.env['VSCODE_REMOTE_LDFLAGS']) { opts.env['LDFLAGS'] = process.env['VSCODE_REMOTE_LDFLAGS']; }
+ if (process.env['VSCODE_REMOTE_NODE_GYP']) { opts.env['npm_config_node_gyp'] = process.env['VSCODE_REMOTE_NODE_GYP']; }
- opts = { env };
- } else if (/^extensions\//.test(dir)) {
- opts = { ignoreEngines: true };
+ setNpmrcConfig('remote', opts.env);
}
- yarnInstall(dir, opts);
+ npmInstall(dir, opts);
}
cp.execSync('git config pull.rebase merges');
diff --git a/build/npm/preinstall.js b/build/npm/preinstall.js
index fdb01f579d6..b98f22977bf 100644
--- a/build/npm/preinstall.js
+++ b/build/npm/preinstall.js
@@ -2,7 +2,6 @@
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
-let err = false;
const nodeVersion = /^(\d+)\.(\d+)\.(\d+)/.exec(process.versions.node);
const majorNodeVersion = parseInt(nodeVersion[1]);
@@ -12,48 +11,25 @@ const patchNodeVersion = parseInt(nodeVersion[3]);
if (!process.env['VSCODE_SKIP_NODE_VERSION_CHECK']) {
if (majorNodeVersion < 20) {
console.error('\x1b[1;31m*** Please use latest Node.js v20 LTS for development.\x1b[0;0m');
- err = true;
+ throw new Error();
}
}
+if (process.env['npm_execpath'].includes('yarn')) {
+ console.error('\x1b[1;31m*** Seems like you are using `yarn` which is not supported in this repo any more, please use `npm i` instead. ***\x1b[0;0m');
+ throw new Error();
+}
+
const path = require('path');
const fs = require('fs');
const cp = require('child_process');
-const yarnVersion = cp.execSync('yarn -v', { encoding: 'utf8' }).trim();
-const parsedYarnVersion = /^(\d+)\.(\d+)\.(\d+)/.exec(yarnVersion);
-const majorYarnVersion = parseInt(parsedYarnVersion[1]);
-const minorYarnVersion = parseInt(parsedYarnVersion[2]);
-const patchYarnVersion = parseInt(parsedYarnVersion[3]);
-
-if (
- majorYarnVersion < 1 ||
- majorYarnVersion === 1 && (
- minorYarnVersion < 10 || (minorYarnVersion === 10 && patchYarnVersion < 1)
- ) ||
- majorYarnVersion >= 2
-) {
- console.error('\x1b[1;31m*** Please use yarn >=1.10.1 and <2.\x1b[0;0m');
- err = true;
-}
-
-if (!/yarn[\w-.]*\.c?js$|yarnpkg$/.test(process.env['npm_execpath'])) {
- console.error('\x1b[1;31m*** Please use yarn to install dependencies.\x1b[0;0m');
- err = true;
-}
if (process.platform === 'win32') {
if (!hasSupportedVisualStudioVersion()) {
console.error('\x1b[1;31m*** Invalid C/C++ Compiler Toolchain. Please check https://github.com/microsoft/vscode/wiki/How-to-Contribute#prerequisites.\x1b[0;0m');
- err = true;
+ throw new Error();
}
- if (!err) {
- installHeaders();
- }
-}
-
-if (err) {
- console.error('');
- process.exit(1);
+ installHeaders();
}
function hasSupportedVisualStudioVersion() {
@@ -73,9 +49,9 @@ function hasSupportedVisualStudioVersion() {
const programFiles86Path = process.env['ProgramFiles(x86)'];
const programFiles64Path = process.env['ProgramFiles'];
+ const vsTypes = ['Enterprise', 'Professional', 'Community', 'Preview', 'BuildTools', 'IntPreview'];
if (programFiles64Path) {
vsPath = `${programFiles64Path}/Microsoft Visual Studio/${version}`;
- const vsTypes = ['Enterprise', 'Professional', 'Community', 'Preview', 'BuildTools'];
if (vsTypes.some(vsType => fs.existsSync(path.join(vsPath, vsType)))) {
availableVersions.push(version);
break;
@@ -84,7 +60,6 @@ function hasSupportedVisualStudioVersion() {
if (programFiles86Path) {
vsPath = `${programFiles86Path}/Microsoft Visual Studio/${version}`;
- const vsTypes = ['Enterprise', 'Professional', 'Community', 'Preview', 'BuildTools'];
if (vsTypes.some(vsType => fs.existsSync(path.join(vsPath, vsType)))) {
availableVersions.push(version);
break;
@@ -95,47 +70,28 @@ function hasSupportedVisualStudioVersion() {
}
function installHeaders() {
- const yarn = 'yarn.cmd';
- const yarnResult = cp.spawnSync(yarn, ['install'], {
+ cp.execSync(`npm.cmd ${process.env['npm_command'] || 'ci'}`, {
env: process.env,
cwd: path.join(__dirname, 'gyp'),
- stdio: 'inherit',
- shell: true
+ stdio: 'inherit'
});
- if (yarnResult.error || yarnResult.status !== 0) {
- console.error(`Installing node-gyp failed`);
- err = true;
- return;
- }
- // The node gyp package got installed using the above yarn command using the gyp/package.json
+ // The node gyp package got installed using the above npm command using the gyp/package.json
// file checked into our repository. So from that point it is save to construct the path
// to that executable
const node_gyp = path.join(__dirname, 'gyp', 'node_modules', '.bin', 'node-gyp.cmd');
const result = cp.execFileSync(node_gyp, ['list'], { encoding: 'utf8', shell: true });
const versions = new Set(result.split(/\n/g).filter(line => !line.startsWith('gyp info')).map(value => value));
- const local = getHeaderInfo(path.join(__dirname, '..', '..', '.yarnrc'));
- const remote = getHeaderInfo(path.join(__dirname, '..', '..', 'remote', '.yarnrc'));
+ const local = getHeaderInfo(path.join(__dirname, '..', '..', '.npmrc'));
+ const remote = getHeaderInfo(path.join(__dirname, '..', '..', 'remote', '.npmrc'));
if (local !== undefined && !versions.has(local.target)) {
// Both disturl and target come from a file checked into our repository
cp.execFileSync(node_gyp, ['install', '--dist-url', local.disturl, local.target], { shell: true });
}
- // Avoid downloading headers for Windows arm64 till we move to Nodejs v19 in remote
- // which is the first official release with support for the architecture. Downloading
- // the headers for older versions now redirect to https://origin.nodejs.org/404.html
- // which causes checksum validation error in node-gyp.
- //
- // gyp http 200 https://origin.nodejs.org/404.html
- // gyp WARN install got an error, rolling back install
- // gyp ERR! install error
- // gyp ERR! stack Error: win-arm64/node.lib local checksum 4c62bed7a032f7b36984321b7ffdd60b596fac870672037ff879ae9ac9548fb7 not match remote undefined
- //
- if (remote !== undefined && !versions.has(remote.target) &&
- process.env['npm_config_arch'] !== "arm64" &&
- process.arch !== "arm64") {
+ if (remote !== undefined && !versions.has(remote.target)) {
// Both disturl and target come from a file checked into our repository
cp.execFileSync(node_gyp, ['install', '--dist-url', remote.disturl, remote.target], { shell: true });
}
@@ -149,11 +105,11 @@ function getHeaderInfo(rcFile) {
const lines = fs.readFileSync(rcFile, 'utf8').split(/\r\n?/g);
let disturl, target;
for (const line of lines) {
- let match = line.match(/\s*disturl\s*\"(.*)\"\s*$/);
+ let match = line.match(/\s*disturl=*\"(.*)\"\s*$/);
if (match !== null && match.length >= 1) {
disturl = match[1];
}
- match = line.match(/\s*target\s*\"(.*)\"\s*$/);
+ match = line.match(/\s*target=*\"(.*)\"\s*$/);
if (match !== null && match.length >= 1) {
target = match[1];
}
diff --git a/build/npm/setupBuildYarnrc.js b/build/npm/setupBuildYarnrc.js
deleted file mode 100644
index f8027dcfcb0..00000000000
--- a/build/npm/setupBuildYarnrc.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
-
-const path = require('path');
-const fs = require('fs');
-
-// make sure we install the deps of build for the system installed
-// node, since that is the driver of gulp
-function setupBuildYarnrc() {
- const yarnrcPath = path.join(path.dirname(__dirname), '.yarnrc');
- const yarnrc = `disturl "https://nodejs.org/download/release"
-target "${process.versions.node}"
-runtime "node"
-arch "${process.arch}"`;
-
- fs.writeFileSync(yarnrcPath, yarnrc, 'utf8');
-}
-
-exports.setupBuildYarnrc = setupBuildYarnrc;
-
-if (require.main === module) {
- setupBuildYarnrc();
-}
diff --git a/build/npm/update-all-grammars.mjs b/build/npm/update-all-grammars.mjs
index e0d34e42beb..7e303a655f7 100644
--- a/build/npm/update-all-grammars.mjs
+++ b/build/npm/update-all-grammars.mjs
@@ -16,7 +16,7 @@ async function spawn(cmd, args, opts) {
}
async function main() {
- await spawn('yarn', [], { cwd: 'extensions' });
+ await spawn('npm', ['ci'], { cwd: 'extensions' });
for (const extension of readdirSync('extensions')) {
try {
diff --git a/build/package-lock.json b/build/package-lock.json
new file mode 100644
index 00000000000..4499f7cf541
--- /dev/null
+++ b/build/package-lock.json
@@ -0,0 +1,4630 @@
+{
+ "name": "code-oss-dev-build",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "code-oss-dev-build",
+ "version": "1.0.0",
+ "license": "MIT",
+ "devDependencies": {
+ "@azure/cosmos": "^3",
+ "@azure/identity": "^4.2.1",
+ "@azure/storage-blob": "^12.17.0",
+ "@electron/get": "^2.0.0",
+ "@types/ansi-colors": "^3.2.0",
+ "@types/byline": "^4.2.32",
+ "@types/debounce": "^1.0.0",
+ "@types/debug": "^4.1.5",
+ "@types/fancy-log": "^1.3.0",
+ "@types/fs-extra": "^9.0.12",
+ "@types/glob": "^7.1.1",
+ "@types/gulp": "^4.0.17",
+ "@types/gulp-concat": "^0.0.32",
+ "@types/gulp-filter": "^3.0.32",
+ "@types/gulp-gzip": "^0.0.31",
+ "@types/gulp-json-editor": "^2.2.31",
+ "@types/gulp-rename": "^0.0.33",
+ "@types/gulp-sort": "^2.0.4",
+ "@types/gulp-sourcemaps": "^0.0.32",
+ "@types/mime": "0.0.29",
+ "@types/minimatch": "^3.0.3",
+ "@types/minimist": "^1.2.1",
+ "@types/mocha": "^9.1.1",
+ "@types/node": "20.x",
+ "@types/pump": "^1.0.1",
+ "@types/rimraf": "^2.0.4",
+ "@types/through": "^0.0.29",
+ "@types/through2": "^2.0.36",
+ "@types/tmp": "^0.2.1",
+ "@types/workerpool": "^6.4.0",
+ "@types/xml2js": "0.0.33",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "@vscode/vsce": "2.20.1",
+ "byline": "^5.0.0",
+ "colors": "^1.4.0",
+ "commander": "^7.0.0",
+ "debug": "^4.3.2",
+ "electron-osx-sign": "^0.4.16",
+ "esbuild": "0.23.0",
+ "extract-zip": "^2.0.1",
+ "gulp-merge-json": "^2.1.1",
+ "gulp-sort": "^2.0.0",
+ "jsonc-parser": "^2.3.0",
+ "mime": "^1.4.1",
+ "source-map": "0.6.1",
+ "ternary-stream": "^3.0.0",
+ "through2": "^4.0.2",
+ "tmp": "^0.2.1",
+ "vscode-universal-bundler": "^0.1.3",
+ "workerpool": "^6.4.0",
+ "yauzl": "^2.10.0"
+ },
+ "optionalDependencies": {
+ "tree-sitter": "^0.20.5",
+ "tree-sitter-typescript": "^0.20.5",
+ "vscode-gulp-watch": "^5.0.3"
+ }
+ },
+ "node_modules/@azure/abort-controller": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.0.2.tgz",
+ "integrity": "sha512-XUyTo+bcyxHEf+jlN2MXA7YU9nxVehaubngHV1MIZZaqYmZqykkoeAz/JMMEeR7t3TcyDwbFa3Zw8BZywmIx4g==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@azure/core-asynciterator-polyfill": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@azure/core-asynciterator-polyfill/-/core-asynciterator-polyfill-1.0.0.tgz",
+ "integrity": "sha512-kmv8CGrPfN9SwMwrkiBK9VTQYxdFQEGe0BmQk+M8io56P9KNzpAxcWE/1fxJj7uouwN4kXF0BHW8DNlgx+wtCg==",
+ "dev": true
+ },
+ "node_modules/@azure/core-auth": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.5.0.tgz",
+ "integrity": "sha512-udzoBuYG1VBoHVohDTrvKjyzel34zt77Bhp7dQntVGGD0ehVq48owENbBG8fIgkHRNUBQH5k1r0hpoMu5L8+kw==",
+ "dev": true,
+ "dependencies": {
+ "@azure/abort-controller": "^1.0.0",
+ "@azure/core-util": "^1.1.0",
+ "tslib": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@azure/core-client": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.5.0.tgz",
+ "integrity": "sha512-YNk8i9LT6YcFdFO+RRU0E4Ef+A8Y5lhXo6lz61rwbG8Uo7kSqh0YqK04OexiilM43xd6n3Y9yBhLnb1NFNI9dA==",
+ "dev": true,
+ "dependencies": {
+ "@azure/abort-controller": "^1.0.0",
+ "@azure/core-asynciterator-polyfill": "^1.0.0",
+ "@azure/core-auth": "^1.3.0",
+ "@azure/core-rest-pipeline": "^1.5.0",
+ "@azure/core-tracing": "1.0.0-preview.13",
+ "@azure/logger": "^1.0.0",
+ "tslib": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@azure/core-client/node_modules/@azure/core-tracing": {
+ "version": "1.0.0-preview.13",
+ "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz",
+ "integrity": "sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==",
+ "dev": true,
+ "dependencies": {
+ "@opentelemetry/api": "^1.0.1",
+ "tslib": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@azure/core-http": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-3.0.4.tgz",
+ "integrity": "sha512-Fok9VVhMdxAFOtqiiAtg74fL0UJkt0z3D+ouUUxcRLzZNBioPRAMJFVxiWoJljYpXsRi4GDQHzQHDc9AiYaIUQ==",
+ "deprecated": "deprecating as we migrated to core v2",
+ "dev": true,
+ "dependencies": {
+ "@azure/abort-controller": "^1.0.0",
+ "@azure/core-auth": "^1.3.0",
+ "@azure/core-tracing": "1.0.0-preview.13",
+ "@azure/core-util": "^1.1.1",
+ "@azure/logger": "^1.0.0",
+ "@types/node-fetch": "^2.5.0",
+ "@types/tunnel": "^0.0.3",
+ "form-data": "^4.0.0",
+ "node-fetch": "^2.6.7",
+ "process": "^0.11.10",
+ "tslib": "^2.2.0",
+ "tunnel": "^0.0.6",
+ "uuid": "^8.3.0",
+ "xml2js": "^0.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@azure/core-http/node_modules/@azure/core-tracing": {
+ "version": "1.0.0-preview.13",
+ "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz",
+ "integrity": "sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==",
+ "dev": true,
+ "dependencies": {
+ "@opentelemetry/api": "^1.0.1",
+ "tslib": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@azure/core-lro": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.2.1.tgz",
+ "integrity": "sha512-HE6PBl+mlKa0eBsLwusHqAqjLc5n9ByxeDo3Hz4kF3B1hqHvRkBr4oMgoT6tX7Hc3q97KfDctDUon7EhvoeHPA==",
+ "dev": true,
+ "dependencies": {
+ "@azure/abort-controller": "^1.0.0",
+ "@azure/core-tracing": "1.0.0-preview.13",
+ "@azure/logger": "^1.0.0",
+ "tslib": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@azure/core-lro/node_modules/@azure/core-tracing": {
+ "version": "1.0.0-preview.13",
+ "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz",
+ "integrity": "sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==",
+ "dev": true,
+ "dependencies": {
+ "@opentelemetry/api": "^1.0.1",
+ "tslib": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@azure/core-paging": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.1.3.tgz",
+ "integrity": "sha512-his7Ah40ThEYORSpIAwuh6B8wkGwO/zG7gqVtmSE4WAJ46e36zUDXTKReUCLBDc6HmjjApQQxxcRFy5FruG79A==",
+ "dev": true,
+ "dependencies": {
+ "@azure/core-asynciterator-polyfill": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@azure/core-rest-pipeline": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.7.0.tgz",
+ "integrity": "sha512-e2awPzwMKHrmvYgZ0qIKNkqnCM1QoDs7A0rOiS3OSAlOQOz/kL7PPKHXwFMuBeaRvS8i7fgobJn79q2Cji5f+Q==",
+ "dev": true,
+ "dependencies": {
+ "@azure/abort-controller": "^1.0.0",
+ "@azure/core-auth": "^1.3.0",
+ "@azure/core-tracing": "1.0.0-preview.13",
+ "@azure/logger": "^1.0.0",
+ "form-data": "^4.0.0",
+ "http-proxy-agent": "^4.0.1",
+ "https-proxy-agent": "^5.0.0",
+ "tslib": "^2.2.0",
+ "uuid": "^8.3.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@azure/core-rest-pipeline/node_modules/@azure/core-tracing": {
+ "version": "1.0.0-preview.13",
+ "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz",
+ "integrity": "sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==",
+ "dev": true,
+ "dependencies": {
+ "@opentelemetry/api": "^1.0.1",
+ "tslib": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@azure/core-tracing": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz",
+ "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@azure/core-util": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.9.0.tgz",
+ "integrity": "sha512-AfalUQ1ZppaKuxPPMsFEUdX6GZPB3d9paR9d/TTL7Ow2De8cJaC7ibi7kWVlFAVPCYo31OcnGymc0R89DX8Oaw==",
+ "dev": true,
+ "dependencies": {
+ "@azure/abort-controller": "^2.0.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@azure/core-util/node_modules/@azure/abort-controller": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz",
+ "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@azure/cosmos": {
+ "version": "3.17.3",
+ "resolved": "https://registry.npmjs.org/@azure/cosmos/-/cosmos-3.17.3.tgz",
+ "integrity": "sha512-wBglkQ6Irjv5Vo2iw8fd6eYj60WYRSSg4/0DBkeOP6BwQ4RA91znsOHd6s3qG6UAbNgYuzC9Nnq07vlFFZkHEw==",
+ "dev": true,
+ "dependencies": {
+ "@azure/abort-controller": "^1.0.0",
+ "@azure/core-auth": "^1.3.0",
+ "@azure/core-rest-pipeline": "^1.2.0",
+ "@azure/core-tracing": "^1.0.0",
+ "debug": "^4.1.1",
+ "fast-json-stable-stringify": "^2.1.0",
+ "jsbi": "^3.1.3",
+ "node-abort-controller": "^3.0.0",
+ "priorityqueuejs": "^1.0.0",
+ "semaphore": "^1.0.5",
+ "tslib": "^2.2.0",
+ "universal-user-agent": "^6.0.0",
+ "uuid": "^8.3.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@azure/identity": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.2.1.tgz",
+ "integrity": "sha512-U8hsyC9YPcEIzoaObJlRDvp7KiF0MGS7xcWbyJSVvXRkC/HXo1f0oYeBYmEvVgRfacw7GHf6D6yAoh9JHz6A5Q==",
+ "dev": true,
+ "dependencies": {
+ "@azure/abort-controller": "^1.0.0",
+ "@azure/core-auth": "^1.5.0",
+ "@azure/core-client": "^1.4.0",
+ "@azure/core-rest-pipeline": "^1.1.0",
+ "@azure/core-tracing": "^1.0.0",
+ "@azure/core-util": "^1.3.0",
+ "@azure/logger": "^1.0.0",
+ "@azure/msal-browser": "^3.11.1",
+ "@azure/msal-node": "^2.9.2",
+ "events": "^3.0.0",
+ "jws": "^4.0.0",
+ "open": "^8.0.0",
+ "stoppable": "^1.1.0",
+ "tslib": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@azure/logger": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.1.tgz",
+ "integrity": "sha512-QYQeaJ+A5x6aMNu8BG5qdsVBnYBop9UMwgUvGihSjf1PdZZXB+c/oMdM2ajKwzobLBh9e9QuMQkN9iL+IxLBLA==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@azure/msal-browser": {
+ "version": "3.17.0",
+ "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.17.0.tgz",
+ "integrity": "sha512-csccKXmW2z7EkZ0I3yAoW/offQt+JECdTIV/KrnRoZyM7wCSsQWODpwod8ZhYy7iOyamcHApR9uCh0oD1M+0/A==",
+ "dev": true,
+ "dependencies": {
+ "@azure/msal-common": "14.12.0"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/@azure/msal-common": {
+ "version": "14.12.0",
+ "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.12.0.tgz",
+ "integrity": "sha512-IDDXmzfdwmDkv4SSmMEyAniJf6fDu3FJ7ncOjlxkDuT85uSnLEhZi3fGZpoR7T4XZpOMx9teM9GXBgrfJgyeBw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/@azure/msal-node": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.9.2.tgz",
+ "integrity": "sha512-8tvi6Cos3m+0KmRbPjgkySXi+UQU/QiuVRFnrxIwt5xZlEEFa69O04RTaNESGgImyBBlYbo2mfE8/U8Bbdk1WQ==",
+ "dev": true,
+ "dependencies": {
+ "@azure/msal-common": "14.12.0",
+ "jsonwebtoken": "^9.0.0",
+ "uuid": "^8.3.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@azure/storage-blob": {
+ "version": "12.17.0",
+ "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.17.0.tgz",
+ "integrity": "sha512-sM4vpsCpcCApagRW5UIjQNlNylo02my2opgp0Emi8x888hZUvJ3dN69Oq20cEGXkMUWnoCrBaB0zyS3yeB87sQ==",
+ "dev": true,
+ "dependencies": {
+ "@azure/abort-controller": "^1.0.0",
+ "@azure/core-http": "^3.0.0",
+ "@azure/core-lro": "^2.2.0",
+ "@azure/core-paging": "^1.1.1",
+ "@azure/core-tracing": "1.0.0-preview.13",
+ "@azure/logger": "^1.0.0",
+ "events": "^3.0.0",
+ "tslib": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@azure/storage-blob/node_modules/@azure/core-tracing": {
+ "version": "1.0.0-preview.13",
+ "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz",
+ "integrity": "sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==",
+ "dev": true,
+ "dependencies": {
+ "@opentelemetry/api": "^1.0.1",
+ "tslib": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@electron/asar": {
+ "version": "3.2.10",
+ "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.10.tgz",
+ "integrity": "sha512-mvBSwIBUeiRscrCeJE1LwctAriBj65eUDm0Pc11iE5gRwzkmsdbS7FnZ1XUWjpSeQWL1L5g12Fc/SchPM9DUOw==",
+ "dev": true,
+ "dependencies": {
+ "commander": "^5.0.0",
+ "glob": "^7.1.6",
+ "minimatch": "^3.0.4"
+ },
+ "bin": {
+ "asar": "bin/asar.js"
+ },
+ "engines": {
+ "node": ">=10.12.0"
+ }
+ },
+ "node_modules/@electron/asar/node_modules/commander": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
+ "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@electron/get": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz",
+ "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.1",
+ "env-paths": "^2.2.0",
+ "fs-extra": "^8.1.0",
+ "got": "^11.8.5",
+ "progress": "^2.0.3",
+ "semver": "^6.2.0",
+ "sumchecker": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "global-agent": "^3.0.0"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz",
+ "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz",
+ "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz",
+ "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz",
+ "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz",
+ "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz",
+ "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz",
+ "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz",
+ "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz",
+ "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz",
+ "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz",
+ "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz",
+ "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz",
+ "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz",
+ "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz",
+ "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz",
+ "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz",
+ "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz",
+ "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz",
+ "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz",
+ "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz",
+ "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz",
+ "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz",
+ "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz",
+ "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@malept/cross-spawn-promise": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz",
+ "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/malept"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund"
+ }
+ ],
+ "dependencies": {
+ "cross-spawn": "^7.0.1"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ }
+ },
+ "node_modules/@opentelemetry/api": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.3.tgz",
+ "integrity": "sha512-puWxACExDe9nxbBB3lOymQFrLYml2dVOrd7USiVRnSbgXE+KwBu+HxFvxrzfqsiSda9IWsXJG1ef7C1O2/GmKQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@sindresorhus/is": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
+ "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/is?sponsor=1"
+ }
+ },
+ "node_modules/@szmarczak/http-timer": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
+ "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
+ "dev": true,
+ "dependencies": {
+ "defer-to-connect": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@tootallnate/once": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
+ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@types/ansi-colors": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/@types/ansi-colors/-/ansi-colors-3.2.0.tgz",
+ "integrity": "sha512-0caWAhXht9N2lOdMzJLXybsSkYCx1QOdxx6pae48tswI9QV3DFX26AoOpy0JxwhCb+zISTqmd6H8t9Zby9BoZg==",
+ "dev": true
+ },
+ "node_modules/@types/byline": {
+ "version": "4.2.32",
+ "resolved": "https://registry.npmjs.org/@types/byline/-/byline-4.2.32.tgz",
+ "integrity": "sha512-qtlm/J6XOO9p+Ep/ZB5+mCFEDhzWDDHWU4a1eReN7lkPZXW9rkloq2jcAhvKKmlO5tL2GSvKROb+PTsNVhBiyQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/cacheable-request": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz",
+ "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==",
+ "dev": true,
+ "dependencies": {
+ "@types/http-cache-semantics": "*",
+ "@types/keyv": "^3.1.4",
+ "@types/node": "*",
+ "@types/responselike": "^1.0.0"
+ }
+ },
+ "node_modules/@types/debounce": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@types/debounce/-/debounce-1.0.0.tgz",
+ "integrity": "sha1-QXVgIAMx4buE1y2oU5EQLC/NYbc= sha512-B7FcD9ry40L831t7iuHQyDfYi+qVEV75qkEI2ROOyfjb2PfkAspL+NK6B2A0BceMuNhiYRmtKTNnNP7Ul4N2Pg==",
+ "dev": true
+ },
+ "node_modules/@types/debug": {
+ "version": "4.1.9",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.9.tgz",
+ "integrity": "sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow==",
+ "dev": true,
+ "dependencies": {
+ "@types/ms": "*"
+ }
+ },
+ "node_modules/@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "node_modules/@types/expect": {
+ "version": "1.20.4",
+ "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz",
+ "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==",
+ "dev": true
+ },
+ "node_modules/@types/fancy-log": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@types/fancy-log/-/fancy-log-1.3.0.tgz",
+ "integrity": "sha512-mQjDxyOM1Cpocd+vm1kZBP7smwKZ4TNokFeds9LV7OZibmPJFEzY3+xZMrKfUdNT71lv8GoCPD6upKwHxubClw==",
+ "dev": true
+ },
+ "node_modules/@types/fs-extra": {
+ "version": "9.0.12",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.12.tgz",
+ "integrity": "sha512-I+bsBr67CurCGnSenZZ7v94gd3tc3+Aj2taxMT4yu4ABLuOgOjeFxX3dokG24ztSRg5tnT00sL8BszO7gSMoIw==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/glob": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz",
+ "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==",
+ "dev": true,
+ "dependencies": {
+ "@types/events": "*",
+ "@types/minimatch": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/glob-stream": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@types/glob-stream/-/glob-stream-6.1.0.tgz",
+ "integrity": "sha512-RHv6ZQjcTncXo3thYZrsbAVwoy4vSKosSWhuhuQxLOTv74OJuFQxXkmUuZCr3q9uNBEVCvIzmZL/FeRNbHZGUg==",
+ "dev": true,
+ "dependencies": {
+ "@types/glob": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/gulp": {
+ "version": "4.0.17",
+ "resolved": "https://registry.npmjs.org/@types/gulp/-/gulp-4.0.17.tgz",
+ "integrity": "sha512-+pKQynu2C/HS16kgmDlAicjtFYP8kaa86eE9P0Ae7GB5W29we/E2TIdbOWtEZD5XkpY+jr8fyqfwO6SWZecLpQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "@types/undertaker": ">=1.2.6",
+ "@types/vinyl-fs": "*",
+ "chokidar": "^3.3.1"
+ }
+ },
+ "node_modules/@types/gulp-concat": {
+ "version": "0.0.32",
+ "resolved": "https://registry.npmjs.org/@types/gulp-concat/-/gulp-concat-0.0.32.tgz",
+ "integrity": "sha512-CUCFADlITzzBfBa2bdGzhKtvBr4eFh+evb+4igVbvPoO5RyPfHifmyQlZl6lM7q19+OKncRlFXDU7B4X9Ayo2g==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/gulp-filter": {
+ "version": "3.0.32",
+ "resolved": "https://registry.npmjs.org/@types/gulp-filter/-/gulp-filter-3.0.32.tgz",
+ "integrity": "sha512-JvY4qTxXehoK2yCUxYVxTMvckVbDM5TWHWeUoYJyX31gwFqw4YDD6JNzhuTxI3yHPUTY4BBRTqgm6puQEZVCNg==",
+ "dev": true,
+ "dependencies": {
+ "@types/minimatch": "*",
+ "@types/node": "*",
+ "@types/vinyl": "*"
+ }
+ },
+ "node_modules/@types/gulp-gzip": {
+ "version": "0.0.31",
+ "resolved": "https://registry.npmjs.org/@types/gulp-gzip/-/gulp-gzip-0.0.31.tgz",
+ "integrity": "sha512-KQjHz1FTqLse8/EiktfhN/vo33vamX4gVAQhMTp55STDBA7UToW5CJqYyP7iRorkHK9/aJ2nL2hLkNZkY4M8+w==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/gulp-json-editor": {
+ "version": "2.2.31",
+ "resolved": "https://registry.npmjs.org/@types/gulp-json-editor/-/gulp-json-editor-2.2.31.tgz",
+ "integrity": "sha512-piis0ImYAy0dt18R4EtTbAY+RV8jwTq5VisnUV6OfP8kD4743aHGkAdAd08No4NY3rFa5mD6ytIu8L0YU7nL9w==",
+ "dev": true,
+ "dependencies": {
+ "@types/js-beautify": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/gulp-rename": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/@types/gulp-rename/-/gulp-rename-0.0.33.tgz",
+ "integrity": "sha512-FIZQvbZJj6V1gHPTzO+g/BCWpDur7fJrroae4gwV3LaoHBQ+MrR9sB+2HssK8fHv4WdY6hVNxkcft9bYatuPIA==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/gulp-sort": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@types/gulp-sort/-/gulp-sort-2.0.4.tgz",
+ "integrity": "sha512-HUHxH+oMox1ct0SnxPqCXBni0MSws1ygcSAoLO4ISRmR/UuvNIz40rgNveZxwxQk+p78kw09z/qKQkgKJmNUOQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/gulp-util": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/gulp-sourcemaps": {
+ "version": "0.0.32",
+ "resolved": "https://registry.npmjs.org/@types/gulp-sourcemaps/-/gulp-sourcemaps-0.0.32.tgz",
+ "integrity": "sha512-+7BAmptW2bxyJnJcCEuie7vLoop3FwWgCdBMzyv7MYXED/HeNMeQuX7uPCkp4vfU1TTu4CYFH0IckNPvo0VePA==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/gulp-util": {
+ "version": "3.0.41",
+ "resolved": "https://registry.npmjs.org/@types/gulp-util/-/gulp-util-3.0.41.tgz",
+ "integrity": "sha512-BK0kJZ8euQNlISsmD6mBr/1RZkB0mljdtBsz2usv+QHPV10alH2AJw5p05S9LU6S+VdTjbFmGU0OxpH++2W9/Q==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "@types/through2": "*",
+ "@types/vinyl": "*",
+ "chalk": "^2.2.0"
+ }
+ },
+ "node_modules/@types/http-cache-semantics": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz",
+ "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==",
+ "dev": true
+ },
+ "node_modules/@types/js-beautify": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@types/js-beautify/-/js-beautify-1.8.0.tgz",
+ "integrity": "sha512-/siF86XrwDKLuHe8l7h6NhrAWgLdgqbxmjZv9NvGWmgYRZoTipkjKiWb0SQHy/jcR+ee0GvbG6uGd+LEBMGNvA==",
+ "dev": true
+ },
+ "node_modules/@types/keyv": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz",
+ "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/mime": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-0.0.29.tgz",
+ "integrity": "sha1-+8/TMFc7kS71nu7hRgK/rOYwdUs= sha512-EqWQSlonwbNgLMq2dMkokuzv/pwevb4q0JrPjfc7zzieG/cpqt+HsCE9dYoQd1snp2zlksl6k3rQ4LLfyQbQdA==",
+ "dev": true
+ },
+ "node_modules/@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "node_modules/@types/minimist": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz",
+ "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==",
+ "dev": true
+ },
+ "node_modules/@types/mocha": {
+ "version": "9.1.1",
+ "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz",
+ "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==",
+ "dev": true
+ },
+ "node_modules/@types/ms": {
+ "version": "0.7.32",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.32.tgz",
+ "integrity": "sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g==",
+ "dev": true
+ },
+ "node_modules/@types/node": {
+ "version": "20.11.24",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz",
+ "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==",
+ "dev": true,
+ "dependencies": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "node_modules/@types/node-fetch": {
+ "version": "2.5.8",
+ "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.8.tgz",
+ "integrity": "sha512-fbjI6ja0N5ZA8TV53RUqzsKNkl9fv8Oj3T7zxW7FGv1GSH7gwJaNF8dzCjrqKaxKeUpTz4yT1DaJFq/omNpGfw==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "form-data": "^3.0.0"
+ }
+ },
+ "node_modules/@types/node-fetch/node_modules/form-data": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz",
+ "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==",
+ "dev": true,
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@types/pump": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@types/pump/-/pump-1.0.1.tgz",
+ "integrity": "sha1-roFXzv7wTRpNJMHMkdQDwvXaXNA= sha512-WGcg4jdczx60mEh0pWLUhw/2215BFYfSob5fHp/fJFZ+UFOiOxIqCnqRGSLWRsJ6Hvh4u2SBokxHDQ0wF9ujqQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/responselike": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz",
+ "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/rimraf": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-2.0.4.tgz",
+ "integrity": "sha512-8gBudvllD2A/c0CcEX/BivIDorHFt5UI5m46TsNj8DjWCCTTZT74kEe4g+QsY7P/B9WdO98d82zZgXO/RQzu2Q==",
+ "dev": true,
+ "dependencies": {
+ "@types/glob": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/through": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.29.tgz",
+ "integrity": "sha512-9a7C5VHh+1BKblaYiq+7Tfc+EOmjMdZaD1MYtkQjSoxgB69tBjW98ry6SKsi4zEIWztLOMRuL87A3bdT/Fc/4w==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/through2": {
+ "version": "2.0.36",
+ "resolved": "https://registry.npmjs.org/@types/through2/-/through2-2.0.36.tgz",
+ "integrity": "sha512-vuifQksQHJXhV9McpVsXKuhnf3lsoX70PnhcqIAbs9dqLH2NgrGz0DzZPDY3+Yh6eaRqcE1gnCQ6QhBn1/PT5A==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/tmp": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.1.tgz",
+ "integrity": "sha512-7cTXwKP/HLOPVgjg+YhBdQ7bMiobGMuoBmrGmqwIWJv8elC6t1DfVc/mn4fD9UE1IjhwmhaQ5pGVXkmXbH0rhg==",
+ "dev": true
+ },
+ "node_modules/@types/tunnel": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/@types/tunnel/-/tunnel-0.0.3.tgz",
+ "integrity": "sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/undertaker": {
+ "version": "1.2.11",
+ "resolved": "https://registry.npmjs.org/@types/undertaker/-/undertaker-1.2.11.tgz",
+ "integrity": "sha512-j1Z0V2ByRHr8ZK7eOeGq0LGkkdthNFW0uAZGY22iRkNQNL9/vAV0yFPr1QN3FM/peY5bxs9P+1f0PYJTQVa5iA==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "@types/undertaker-registry": "*",
+ "async-done": "~1.3.2"
+ }
+ },
+ "node_modules/@types/undertaker-registry": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@types/undertaker-registry/-/undertaker-registry-1.0.1.tgz",
+ "integrity": "sha512-Z4TYuEKn9+RbNVk1Ll2SS4x1JeLHecolIbM/a8gveaHsW0Hr+RQMraZACwTO2VD7JvepgA6UO1A1VrbktQrIbQ==",
+ "dev": true
+ },
+ "node_modules/@types/vinyl": {
+ "version": "2.0.12",
+ "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.12.tgz",
+ "integrity": "sha512-Sr2fYMBUVGYq8kj3UthXFAu5UN6ZW+rYr4NACjZQJvHvj+c8lYv0CahmZ2P/r7iUkN44gGUBwqxZkrKXYPb7cw==",
+ "dev": true,
+ "dependencies": {
+ "@types/expect": "^1.20.4",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/vinyl-fs": {
+ "version": "2.4.9",
+ "resolved": "https://registry.npmjs.org/@types/vinyl-fs/-/vinyl-fs-2.4.9.tgz",
+ "integrity": "sha512-Q0EXd6c1fORjiOuK4ZaKdfFcMyFzJlTi56dqktwaWVLIDAzE49wUs3bKnYbZwzyMWoH+NcMWnRuR73S9A0jnRA==",
+ "dev": true,
+ "dependencies": {
+ "@types/events": "*",
+ "@types/glob-stream": "*",
+ "@types/node": "*",
+ "@types/vinyl": "*"
+ }
+ },
+ "node_modules/@types/workerpool": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/@types/workerpool/-/workerpool-6.4.0.tgz",
+ "integrity": "sha512-SIF2/169pDsLKeM8GQGHkOFifGalDbZgiBSaLUnnlVSRsAOenkAvQ6h4uhV2W+PZZczS+8LQxACwNkSykdT91A==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/xml2js": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.0.33.tgz",
+ "integrity": "sha1-IMXdZGAkUoTWSlVpABW5XkCft94= sha512-6dx6V6EdddqLjhxGdQrNdSu+O+3F7tOlyj660SpkO4/5uDSZM+LXcGQKAFnIJbvTzkQ6d2g3rWxyEXVwYAUoJg==",
+ "dev": true
+ },
+ "node_modules/@types/yauzl": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz",
+ "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@vscode/iconv-lite-umd": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/@vscode/iconv-lite-umd/-/iconv-lite-umd-0.7.0.tgz",
+ "integrity": "sha512-bRRFxLfg5dtAyl5XyiVWz/ZBPahpOpPrNYnnHpOpUZvam4tKH35wdhP4Kj6PbM0+KdliOsPzbGWpkxcdpNB/sg==",
+ "dev": true
+ },
+ "node_modules/@vscode/vsce": {
+ "version": "2.20.1",
+ "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.20.1.tgz",
+ "integrity": "sha512-ilbvoqvR/1/zseRPBAzYR6aKqSJ+jvda4/BqIwOqTxajpvLtEpK3kMLs77+dJdrlygS+VrP7Yhad8j0ukyD96g==",
+ "dev": true,
+ "dependencies": {
+ "azure-devops-node-api": "^11.0.1",
+ "chalk": "^2.4.2",
+ "cheerio": "^1.0.0-rc.9",
+ "commander": "^6.1.0",
+ "glob": "^7.0.6",
+ "hosted-git-info": "^4.0.2",
+ "jsonc-parser": "^3.2.0",
+ "leven": "^3.1.0",
+ "markdown-it": "^12.3.2",
+ "mime": "^1.3.4",
+ "minimatch": "^3.0.3",
+ "parse-semver": "^1.1.1",
+ "read": "^1.0.7",
+ "semver": "^7.5.2",
+ "tmp": "^0.2.1",
+ "typed-rest-client": "^1.8.4",
+ "url-join": "^4.0.1",
+ "xml2js": "^0.5.0",
+ "yauzl": "^2.3.1",
+ "yazl": "^2.2.2"
+ },
+ "bin": {
+ "vsce": "vsce"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "optionalDependencies": {
+ "keytar": "^7.7.0"
+ }
+ },
+ "node_modules/@vscode/vsce/node_modules/commander": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
+ "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@vscode/vsce/node_modules/jsonc-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz",
+ "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==",
+ "dev": true
+ },
+ "node_modules/@vscode/vsce/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@xmldom/xmldom": {
+ "version": "0.8.10",
+ "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz",
+ "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "dev": true,
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/ansi-colors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
+ "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
+ "devOptional": true,
+ "dependencies": {
+ "ansi-wrap": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ansi-gray": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
+ "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE= sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==",
+ "optional": true,
+ "dependencies": {
+ "ansi-wrap": "0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ansi-wrap": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
+ "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768= sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==",
+ "devOptional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "devOptional": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==",
+ "devOptional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==",
+ "devOptional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==",
+ "devOptional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/async-done": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz",
+ "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==",
+ "dev": true,
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.2",
+ "process-nextick-args": "^2.0.0",
+ "stream-exhaust": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k= sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "dev": true
+ },
+ "node_modules/azure-devops-node-api": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.2.0.tgz",
+ "integrity": "sha512-XdiGPhrpaT5J8wdERRKs5g8E0Zy1pvOYTli7z9E8nmOn3YGp4FhtjhrOyFmX/8veWCwdI69mCHKJw6l+4J/bHA==",
+ "dev": true,
+ "dependencies": {
+ "tunnel": "0.0.6",
+ "typed-rest-client": "^1.8.4"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "devOptional": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "devOptional": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "optional": true,
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "dev": true
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "dev": true
+ },
+ "node_modules/boolean": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.1.2.tgz",
+ "integrity": "sha512-YN6UmV0FfLlBVvRvNPx3pz5W/mUoYB24J4WSXOKP/OOJpi+Oq6WYqPaNTHzjI0QzwWtnvEd5CGYyQPgp1jFxnw==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "devOptional": true,
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "optional": true,
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/buffer-alloc": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
+ "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
+ "dev": true,
+ "dependencies": {
+ "buffer-alloc-unsafe": "^1.1.0",
+ "buffer-fill": "^1.0.0"
+ }
+ },
+ "node_modules/buffer-alloc-unsafe": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
+ "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==",
+ "dev": true
+ },
+ "node_modules/buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/buffer-equal-constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
+ "dev": true
+ },
+ "node_modules/buffer-fill": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
+ "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw= sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==",
+ "dev": true
+ },
+ "node_modules/byline": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz",
+ "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE= sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/cacheable-lookup": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
+ "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.6.0"
+ }
+ },
+ "node_modules/cacheable-request": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz",
+ "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==",
+ "dev": true,
+ "dependencies": {
+ "clone-response": "^1.0.2",
+ "get-stream": "^5.1.0",
+ "http-cache-semantics": "^4.0.0",
+ "keyv": "^4.0.0",
+ "lowercase-keys": "^2.0.0",
+ "normalize-url": "^6.0.1",
+ "responselike": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
+ "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+ "dev": true,
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cheerio": {
+ "version": "1.0.0-rc.12",
+ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz",
+ "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==",
+ "dev": true,
+ "dependencies": {
+ "cheerio-select": "^2.1.0",
+ "dom-serializer": "^2.0.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1",
+ "htmlparser2": "^8.0.1",
+ "parse5": "^7.0.0",
+ "parse5-htmlparser2-tree-adapter": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
+ }
+ },
+ "node_modules/cheerio-select": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz",
+ "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-select": "^5.1.0",
+ "css-what": "^6.1.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz",
+ "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
+ "devOptional": true,
+ "dependencies": {
+ "anymatch": "~3.1.1",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.0",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.5.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.1"
+ }
+ },
+ "node_modules/chownr": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+ "optional": true
+ },
+ "node_modules/clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
+ "devOptional": true,
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/clone-buffer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
+ "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg= sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==",
+ "devOptional": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/clone-response": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
+ "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==",
+ "dev": true,
+ "dependencies": {
+ "mimic-response": "^1.0.0"
+ }
+ },
+ "node_modules/clone-stats": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
+ "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==",
+ "devOptional": true
+ },
+ "node_modules/cloneable-readable": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz",
+ "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==",
+ "devOptional": true,
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "process-nextick-args": "^2.0.0",
+ "readable-stream": "^2.3.5"
+ }
+ },
+ "node_modules/cloneable-readable/node_modules/readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "devOptional": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "node_modules/color-support": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+ "optional": true,
+ "bin": {
+ "color-support": "bin.js"
+ }
+ },
+ "node_modules/colors": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
+ "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.0.0.tgz",
+ "integrity": "sha512-ovx/7NkTrnPuIV8sqk/GjUIIM1+iUQeqA3ye2VNpq9sVoiZsooObWlQy+OPWGI17GDaEoybuAGJm6U8yC077BA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/compare-version": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz",
+ "integrity": "sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA= sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
+ "devOptional": true
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/css-select": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
+ "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.1.0",
+ "domhandler": "^5.0.2",
+ "domutils": "^3.0.1",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
+ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decompress-response": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+ "devOptional": true,
+ "dependencies": {
+ "mimic-response": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/decompress-response/node_modules/mimic-response": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+ "devOptional": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "optional": true,
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/defer-to-connect": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
+ "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dev": true,
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/define-lazy-prop": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
+ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "object-keys": "^1.0.12"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk= sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
+ "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==",
+ "optional": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/detect-node": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
+ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/dir-compare": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz",
+ "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==",
+ "dev": true,
+ "dependencies": {
+ "minimatch": "^3.0.5",
+ "p-limit": "^3.1.0 "
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ]
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
+ "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==",
+ "dev": true,
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/duplexify": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
+ "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==",
+ "dev": true,
+ "dependencies": {
+ "end-of-stream": "^1.4.1",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.1.1",
+ "stream-shift": "^1.0.0"
+ }
+ },
+ "node_modules/ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/electron-osx-sign": {
+ "version": "0.4.16",
+ "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.4.16.tgz",
+ "integrity": "sha512-ziMWfc3NmQlwnWLW6EaZq8nH2BWVng/atX5GWsGwhexJYpdW6hsg//MkAfRTRx1kR3Veiqkeiog1ibkbA4x0rg==",
+ "deprecated": "Please use @electron/osx-sign moving forward. Be aware the API is slightly different",
+ "dev": true,
+ "dependencies": {
+ "bluebird": "^3.5.0",
+ "compare-version": "^0.1.2",
+ "debug": "^2.6.8",
+ "isbinaryfile": "^3.0.2",
+ "minimist": "^1.2.0",
+ "plist": "^3.0.1"
+ },
+ "bin": {
+ "electron-osx-flat": "bin/electron-osx-flat.js",
+ "electron-osx-sign": "bin/electron-osx-sign.js"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/electron-osx-sign/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/electron-osx-sign/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "devOptional": true,
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/entities": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
+ "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/env-paths": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
+ "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.2.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es6-error": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
+ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/esbuild": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz",
+ "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.23.0",
+ "@esbuild/android-arm": "0.23.0",
+ "@esbuild/android-arm64": "0.23.0",
+ "@esbuild/android-x64": "0.23.0",
+ "@esbuild/darwin-arm64": "0.23.0",
+ "@esbuild/darwin-x64": "0.23.0",
+ "@esbuild/freebsd-arm64": "0.23.0",
+ "@esbuild/freebsd-x64": "0.23.0",
+ "@esbuild/linux-arm": "0.23.0",
+ "@esbuild/linux-arm64": "0.23.0",
+ "@esbuild/linux-ia32": "0.23.0",
+ "@esbuild/linux-loong64": "0.23.0",
+ "@esbuild/linux-mips64el": "0.23.0",
+ "@esbuild/linux-ppc64": "0.23.0",
+ "@esbuild/linux-riscv64": "0.23.0",
+ "@esbuild/linux-s390x": "0.23.0",
+ "@esbuild/linux-x64": "0.23.0",
+ "@esbuild/netbsd-x64": "0.23.0",
+ "@esbuild/openbsd-arm64": "0.23.0",
+ "@esbuild/openbsd-x64": "0.23.0",
+ "@esbuild/sunos-x64": "0.23.0",
+ "@esbuild/win32-arm64": "0.23.0",
+ "@esbuild/win32-ia32": "0.23.0",
+ "@esbuild/win32-x64": "0.23.0"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/events": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz",
+ "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/expand-template": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
+ "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
+ "optional": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==",
+ "devOptional": true,
+ "dependencies": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/extract-zip": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
+ "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.1",
+ "get-stream": "^5.1.0",
+ "yauzl": "^2.10.0"
+ },
+ "bin": {
+ "extract-zip": "cli.js"
+ },
+ "engines": {
+ "node": ">= 10.17.0"
+ },
+ "optionalDependencies": {
+ "@types/yauzl": "^2.9.1"
+ }
+ },
+ "node_modules/fancy-log": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz",
+ "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==",
+ "optional": true,
+ "dependencies": {
+ "ansi-gray": "^0.1.1",
+ "color-support": "^1.1.3",
+ "parse-node-version": "^1.0.0",
+ "time-stamp": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fd-slicer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+ "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+ "dev": true,
+ "dependencies": {
+ "pend": "~1.2.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "devOptional": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/first-chunk-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz",
+ "integrity": "sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA= sha512-X8Z+b/0L4lToKYq+lwnKqi9X/Zek0NibLpsJgVsSxpoYq7JtiCtRb5HqKVEjEw/qAb/4AKKRLOwwKHlWNpm2Eg==",
+ "optional": true,
+ "dependencies": {
+ "readable-stream": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/first-chunk-stream/node_modules/readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "optional": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/fork-stream": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz",
+ "integrity": "sha512-Pqq5NnT78ehvUnAk/We/Jr22vSvanRlFTpAmQ88xBY/M1TlHe+P0ILuEyXS595ysdGfaj22634LBkGMA2GTcpA==",
+ "dev": true
+ },
+ "node_modules/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dev": true,
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fs-constants": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
+ "optional": true
+ },
+ "node_modules/fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8= sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+ "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "dev": true,
+ "dependencies": {
+ "pump": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/github-from-package": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
+ "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
+ "optional": true
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "devOptional": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/global-agent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz",
+ "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "boolean": "^3.0.1",
+ "es6-error": "^4.1.1",
+ "matcher": "^3.0.0",
+ "roarr": "^2.15.3",
+ "semver": "^7.3.2",
+ "serialize-error": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=10.0"
+ }
+ },
+ "node_modules/global-agent/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz",
+ "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "define-properties": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.1.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/got": {
+ "version": "11.8.6",
+ "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz",
+ "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==",
+ "dev": true,
+ "dependencies": {
+ "@sindresorhus/is": "^4.0.0",
+ "@szmarczak/http-timer": "^4.0.5",
+ "@types/cacheable-request": "^6.0.1",
+ "@types/responselike": "^1.0.0",
+ "cacheable-lookup": "^5.0.3",
+ "cacheable-request": "^7.0.2",
+ "decompress-response": "^6.0.0",
+ "http2-wrapper": "^1.0.0-beta.5.2",
+ "lowercase-keys": "^2.0.0",
+ "p-cancelable": "^2.0.0",
+ "responselike": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.19.0"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/got?sponsor=1"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
+ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==",
+ "devOptional": true
+ },
+ "node_modules/gulp-merge-json": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/gulp-merge-json/-/gulp-merge-json-2.1.1.tgz",
+ "integrity": "sha512-VhvAlcf+dcCb94j/2yDPWxJ3X7x4P/Xwcrv1dhjYuRgvADwFJmaQwl4zbuq+GDZvzMacbVncWtEdsETpUSkhYw==",
+ "dev": true,
+ "dependencies": {
+ "json5": "^2.1.3",
+ "lodash.mergewith": "^4.6.1",
+ "plugin-error": "^1.0.1",
+ "through": "^2.3.8",
+ "vinyl": "^2.1.0"
+ }
+ },
+ "node_modules/gulp-sort": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/gulp-sort/-/gulp-sort-2.0.0.tgz",
+ "integrity": "sha512-MyTel3FXOdh1qhw1yKhpimQrAmur9q1X0ZigLmCOxouQD+BD3za9/89O+HfbgBQvvh4igEbp0/PUWO+VqGYG1g==",
+ "dev": true,
+ "dependencies": {
+ "through2": "^2.0.1"
+ }
+ },
+ "node_modules/gulp-sort/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "dev": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/gulp-sort/node_modules/through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dev": true,
+ "dependencies": {
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0= sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "dev": true,
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
+ "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/hosted-git-info": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
+ "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/htmlparser2": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz",
+ "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==",
+ "dev": true,
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "domutils": "^3.0.1",
+ "entities": "^4.3.0"
+ }
+ },
+ "node_modules/http-cache-semantics": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
+ "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
+ "dev": true
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
+ "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
+ "dev": true,
+ "dependencies": {
+ "@tootallnate/once": "1",
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/http2-wrapper": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
+ "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
+ "dev": true,
+ "dependencies": {
+ "quick-lru": "^5.1.1",
+ "resolve-alpn": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=10.19.0"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "dev": true,
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "optional": true
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "devOptional": true
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "optional": true
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "devOptional": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "dev": true,
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "devOptional": true,
+ "dependencies": {
+ "is-plain-object": "^2.0.4"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "devOptional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "devOptional": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "devOptional": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "devOptional": true,
+ "dependencies": {
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-utf8": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==",
+ "optional": true
+ },
+ "node_modules/is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "dev": true,
+ "dependencies": {
+ "is-docker": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "devOptional": true
+ },
+ "node_modules/isbinaryfile": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz",
+ "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==",
+ "dev": true,
+ "dependencies": {
+ "buffer-alloc": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8= sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+ "devOptional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/jsbi": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-3.1.4.tgz",
+ "integrity": "sha512-52QRRFSsi9impURE8ZUbzAMCLjPm4THO7H2fcuIvaaeFTbSysvkodbQQXIVsNgq/ypDbq6dJiuGKL0vZ/i9hUg==",
+ "dev": true
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true
+ },
+ "node_modules/json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/json5": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz",
+ "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==",
+ "dev": true,
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonc-parser": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.0.tgz",
+ "integrity": "sha512-b0EBt8SWFNnixVdvoR2ZtEGa9ZqLhbJnOjezn+WP+8kspFm+PFYDN8Z4Bc7pRlDjvuVcADSUkroIuTWWn/YiIA==",
+ "dev": true
+ },
+ "node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jsonwebtoken": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz",
+ "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==",
+ "dev": true,
+ "dependencies": {
+ "jws": "^3.2.2",
+ "lodash": "^4.17.21",
+ "ms": "^2.1.1",
+ "semver": "^7.3.8"
+ },
+ "engines": {
+ "node": ">=12",
+ "npm": ">=6"
+ }
+ },
+ "node_modules/jsonwebtoken/node_modules/jwa": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+ "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+ "dev": true,
+ "dependencies": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/jsonwebtoken/node_modules/jws": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+ "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+ "dev": true,
+ "dependencies": {
+ "jwa": "^1.4.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/jsonwebtoken/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jwa": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz",
+ "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==",
+ "dev": true,
+ "dependencies": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/jws": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz",
+ "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==",
+ "dev": true,
+ "dependencies": {
+ "jwa": "^2.0.0",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/keytar": {
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz",
+ "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "dependencies": {
+ "node-addon-api": "^4.3.0",
+ "prebuild-install": "^7.0.1"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/linkify-it": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz",
+ "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==",
+ "dev": true,
+ "dependencies": {
+ "uc.micro": "^1.0.1"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "node_modules/lodash.mergewith": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz",
+ "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==",
+ "dev": true
+ },
+ "node_modules/lowercase-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+ "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "devOptional": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/markdown-it": {
+ "version": "12.3.2",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz",
+ "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1",
+ "entities": "~2.1.0",
+ "linkify-it": "^3.0.1",
+ "mdurl": "^1.0.1",
+ "uc.micro": "^1.0.5"
+ },
+ "bin": {
+ "markdown-it": "bin/markdown-it.js"
+ }
+ },
+ "node_modules/markdown-it/node_modules/entities": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
+ "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/matcher": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz",
+ "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "escape-string-regexp": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/matcher/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mdurl": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
+ "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==",
+ "dev": true
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.45.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz",
+ "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.28",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz",
+ "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==",
+ "dev": true,
+ "dependencies": {
+ "mime-db": "1.45.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-response": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+ "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
+ "devOptional": true
+ },
+ "node_modules/mkdirp-classic": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
+ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
+ "optional": true
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/mute-stream": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
+ "dev": true
+ },
+ "node_modules/nan": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.19.0.tgz",
+ "integrity": "sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==",
+ "optional": true
+ },
+ "node_modules/napi-build-utils": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz",
+ "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==",
+ "optional": true
+ },
+ "node_modules/node-abi": {
+ "version": "3.30.0",
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.30.0.tgz",
+ "integrity": "sha512-qWO5l3SCqbwQavymOmtTVuCWZE23++S+rxyoHjXqUmPyzRcaoI4lA2gO55/drddGnedAyjA7sk76SfQ5lfUMnw==",
+ "optional": true,
+ "dependencies": {
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/node-abi/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "optional": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/node-abort-controller": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz",
+ "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==",
+ "dev": true
+ },
+ "node_modules/node-addon-api": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz",
+ "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/node-fetch": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz",
+ "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==",
+ "dev": true,
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "devOptional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-url": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
+ "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz",
+ "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E= sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "devOptional": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/open": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz",
+ "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
+ "dev": true,
+ "dependencies": {
+ "define-lazy-prop": "^2.0.0",
+ "is-docker": "^2.1.1",
+ "is-wsl": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-cancelable": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
+ "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parse-node-version": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
+ "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/parse-semver": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz",
+ "integrity": "sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==",
+ "dev": true,
+ "dependencies": {
+ "semver": "^5.1.0"
+ }
+ },
+ "node_modules/parse-semver/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/parse5": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
+ "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
+ "dev": true,
+ "dependencies": {
+ "entities": "^4.4.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/parse5-htmlparser2-tree-adapter": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz",
+ "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==",
+ "dev": true,
+ "dependencies": {
+ "domhandler": "^5.0.2",
+ "parse5": "^7.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18= sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA= sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
+ "dev": true
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
+ "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+ "devOptional": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/plist": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz",
+ "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==",
+ "dev": true,
+ "dependencies": {
+ "@xmldom/xmldom": "^0.8.8",
+ "base64-js": "^1.5.1",
+ "xmlbuilder": "^15.1.1"
+ },
+ "engines": {
+ "node": ">=10.4.0"
+ }
+ },
+ "node_modules/plugin-error": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
+ "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
+ "devOptional": true,
+ "dependencies": {
+ "ansi-colors": "^1.0.1",
+ "arr-diff": "^4.0.0",
+ "arr-union": "^3.1.0",
+ "extend-shallow": "^3.0.2"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/prebuild-install": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz",
+ "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==",
+ "optional": true,
+ "dependencies": {
+ "detect-libc": "^2.0.0",
+ "expand-template": "^2.0.3",
+ "github-from-package": "0.0.0",
+ "minimist": "^1.2.3",
+ "mkdirp-classic": "^0.5.3",
+ "napi-build-utils": "^1.0.1",
+ "node-abi": "^3.3.0",
+ "pump": "^3.0.0",
+ "rc": "^1.2.7",
+ "simple-get": "^4.0.0",
+ "tar-fs": "^2.0.0",
+ "tunnel-agent": "^0.6.0"
+ },
+ "bin": {
+ "prebuild-install": "bin.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/priorityqueuejs": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/priorityqueuejs/-/priorityqueuejs-1.0.0.tgz",
+ "integrity": "sha1-LuTyPCVgkT4IwHzlzN1t498sWvg= sha512-lg++21mreCEOuGWTbO5DnJKAdxfjrdN0S9ysoW9SzdSJvbkWpkaDdpG/cdsPCsEnoLUwmd9m3WcZhngW7yKA2g==",
+ "dev": true
+ },
+ "node_modules/process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI= sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "devOptional": true
+ },
+ "node_modules/progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/pump": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+ "devOptional": true,
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+ "dev": true,
+ "dependencies": {
+ "side-channel": "^1.0.6"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/quick-lru": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/rc": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "optional": true,
+ "dependencies": {
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ },
+ "bin": {
+ "rc": "cli.js"
+ }
+ },
+ "node_modules/read": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz",
+ "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==",
+ "dev": true,
+ "dependencies": {
+ "mute-stream": "~0.0.4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "devOptional": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
+ "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
+ "devOptional": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/remove-trailing-separator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8= sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==",
+ "devOptional": true
+ },
+ "node_modules/replace-ext": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz",
+ "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==",
+ "devOptional": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/resolve-alpn": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
+ "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==",
+ "dev": true
+ },
+ "node_modules/responselike": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
+ "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
+ "dev": true,
+ "dependencies": {
+ "lowercase-keys": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/roarr": {
+ "version": "2.15.4",
+ "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz",
+ "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "boolean": "^3.0.1",
+ "detect-node": "^2.0.4",
+ "globalthis": "^1.0.1",
+ "json-stringify-safe": "^5.0.1",
+ "semver-compare": "^1.0.0",
+ "sprintf-js": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "devOptional": true
+ },
+ "node_modules/sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+ "dev": true
+ },
+ "node_modules/semaphore": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz",
+ "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/semver-compare": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
+ "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w= sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/serialize-error": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz",
+ "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "type-fest": "^0.13.1"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "dev": true,
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
+ "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4",
+ "object-inspect": "^1.13.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/simple-concat": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "optional": true
+ },
+ "node_modules/simple-get": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
+ "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "optional": true,
+ "dependencies": {
+ "decompress-response": "^6.0.0",
+ "once": "^1.3.1",
+ "simple-concat": "^1.0.0"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
+ "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/stoppable": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz",
+ "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4",
+ "npm": ">=6"
+ }
+ },
+ "node_modules/stream-exhaust": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz",
+ "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==",
+ "dev": true
+ },
+ "node_modules/stream-shift": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
+ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
+ "dev": true
+ },
+ "node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "devOptional": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==",
+ "optional": true,
+ "dependencies": {
+ "is-utf8": "^0.2.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/strip-bom-buf": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz",
+ "integrity": "sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI= sha512-1sUIL1jck0T1mhOLP2c696BIznzT525Lkub+n4jjMHjhjhoAQA6Ye659DxdlZBr0aLDMQoTxKIpnlqxgtwjsuQ==",
+ "optional": true,
+ "dependencies": {
+ "is-utf8": "^0.2.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-bom-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz",
+ "integrity": "sha1-+H217yYT9paKpUWr/h7HKLaoKco= sha512-yH0+mD8oahBZWnY43vxs4pSinn8SMKAdml/EOGBewoe1Y0Eitd0h2Mg3ZRiXruUW6L4P+lvZiEgbh0NgUGia1w==",
+ "optional": true,
+ "dependencies": {
+ "first-chunk-stream": "^2.0.0",
+ "strip-bom": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo= sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sumchecker": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz",
+ "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.0"
+ },
+ "engines": {
+ "node": ">= 8.0"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/tar-fs": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
+ "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
+ "optional": true,
+ "dependencies": {
+ "chownr": "^1.1.1",
+ "mkdirp-classic": "^0.5.2",
+ "pump": "^3.0.0",
+ "tar-stream": "^2.1.4"
+ }
+ },
+ "node_modules/tar-stream": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
+ "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+ "optional": true,
+ "dependencies": {
+ "bl": "^4.0.3",
+ "end-of-stream": "^1.4.1",
+ "fs-constants": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.1.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ternary-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-3.0.0.tgz",
+ "integrity": "sha512-oIzdi+UL/JdktkT+7KU5tSIQjj8pbShj3OASuvDEhm0NT5lppsm7aXWAmAq4/QMaBIyfuEcNLbAQA+HpaISobQ==",
+ "dev": true,
+ "dependencies": {
+ "duplexify": "^4.1.1",
+ "fork-stream": "^0.0.4",
+ "merge-stream": "^2.0.0",
+ "through2": "^3.0.1"
+ }
+ },
+ "node_modules/ternary-stream/node_modules/through2": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz",
+ "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.4",
+ "readable-stream": "2 || 3"
+ }
+ },
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+ "dev": true
+ },
+ "node_modules/through2": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
+ "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
+ "dev": true,
+ "dependencies": {
+ "readable-stream": "3"
+ }
+ },
+ "node_modules/time-stamp": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
+ "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM= sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/tmp": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
+ "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "devOptional": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+ "dev": true
+ },
+ "node_modules/tree-sitter": {
+ "version": "0.20.6",
+ "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.20.6.tgz",
+ "integrity": "sha512-GxJodajVpfgb3UREzzIbtA1hyRnTxVbWVXrbC6sk4xTMH5ERMBJk9HJNq4c8jOJeUaIOmLcwg+t6mez/PDvGqg==",
+ "hasInstallScript": true,
+ "optional": true,
+ "dependencies": {
+ "nan": "^2.18.0",
+ "prebuild-install": "^7.1.1"
+ }
+ },
+ "node_modules/tree-sitter-typescript": {
+ "version": "0.20.5",
+ "resolved": "https://registry.npmjs.org/tree-sitter-typescript/-/tree-sitter-typescript-0.20.5.tgz",
+ "integrity": "sha512-RzK/Pc6k4GiXvInIBlo8ZggekP6rODfW2P6KHFCTSUHENsw6ynh+iacFhfkJRa4MT8EIN2WHygFJ7076/+eHKg==",
+ "hasInstallScript": true,
+ "optional": true,
+ "dependencies": {
+ "nan": "^2.18.0",
+ "tree-sitter": "^0.20.6"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
+ "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==",
+ "dev": true
+ },
+ "node_modules/tunnel": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
+ "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.6.11 <=0.7.0 || >=0.7.3"
+ }
+ },
+ "node_modules/tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+ "optional": true,
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
+ "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typed-rest-client": {
+ "version": "1.8.11",
+ "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz",
+ "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==",
+ "dev": true,
+ "dependencies": {
+ "qs": "^6.9.1",
+ "tunnel": "0.0.6",
+ "underscore": "^1.12.1"
+ }
+ },
+ "node_modules/uc.micro": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
+ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==",
+ "dev": true
+ },
+ "node_modules/underscore": {
+ "version": "1.13.7",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz",
+ "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==",
+ "dev": true
+ },
+ "node_modules/undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+ "dev": true
+ },
+ "node_modules/universal-user-agent": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz",
+ "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==",
+ "dev": true
+ },
+ "node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/url-join": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz",
+ "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==",
+ "dev": true
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "devOptional": true
+ },
+ "node_modules/uuid": {
+ "version": "8.3.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz",
+ "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==",
+ "dev": true,
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/vinyl": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz",
+ "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==",
+ "devOptional": true,
+ "dependencies": {
+ "clone": "^2.1.1",
+ "clone-buffer": "^1.0.0",
+ "clone-stats": "^1.0.0",
+ "cloneable-readable": "^1.0.0",
+ "remove-trailing-separator": "^1.0.1",
+ "replace-ext": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/vinyl-file": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/vinyl-file/-/vinyl-file-3.0.0.tgz",
+ "integrity": "sha1-sQTZ5ECf+jJfqt1SBkLQo7SIs2U= sha512-BoJDj+ca3D9xOuPEM6RWVtWQtvEPQiQYn82LvdxhLWplfQsBzBqtgK0yhCP0s1BNTi6dH9BO+dzybvyQIacifg==",
+ "optional": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "pify": "^2.3.0",
+ "strip-bom-buf": "^1.0.0",
+ "strip-bom-stream": "^2.0.0",
+ "vinyl": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/vscode-gulp-watch": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-gulp-watch/-/vscode-gulp-watch-5.0.3.tgz",
+ "integrity": "sha512-MTUp2yLE9CshhkNSNV58EQNxQSeF8lIj3mkXZX9a1vAk+EQNM2PAYdPUDSd/P/08W3PMHGznEiZyfK7JAjLosg==",
+ "optional": true,
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "anymatch": "^3.1.1",
+ "chokidar": "3.5.1",
+ "fancy-log": "^1.3.3",
+ "glob-parent": "^5.1.1",
+ "normalize-path": "^3.0.0",
+ "object-assign": "^4.1.1",
+ "plugin-error": "1.0.1",
+ "readable-stream": "^3.6.0",
+ "vinyl": "^2.2.0",
+ "vinyl-file": "^3.0.0"
+ }
+ },
+ "node_modules/vscode-gulp-watch/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "optional": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/vscode-universal-bundler": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/vscode-universal-bundler/-/vscode-universal-bundler-0.1.3.tgz",
+ "integrity": "sha512-USXJqgD+ySROqgjl+KrGjlF7MvNnqsI6my1kUOsAXARmNqBjXk38w8g2BF6PEXVOYOQ+npRcTA7athXNU4Jjog==",
+ "dev": true,
+ "dependencies": {
+ "@electron/asar": "^3.2.7",
+ "@malept/cross-spawn-promise": "^2.0.0",
+ "debug": "^4.3.1",
+ "dir-compare": "^4.2.0",
+ "fs-extra": "^11.1.1",
+ "minimatch": "^9.0.3",
+ "plist": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=16.4"
+ }
+ },
+ "node_modules/vscode-universal-bundler/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/vscode-universal-bundler/node_modules/fs-extra": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
+ "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/vscode-universal-bundler/node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/vscode-universal-bundler/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/vscode-universal-bundler/node_modules/universalify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+ "dev": true
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0= sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "dev": true,
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/workerpool": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.0.tgz",
+ "integrity": "sha512-r64Ea3glXY2RVzMeNxB+4J+0YHAVzUdV4cM5nHi4BBC2LvnO1pWFAIYKYuGcPElbg1/7eEiaPtZ/jzCjIUuGBg==",
+ "dev": true
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "devOptional": true
+ },
+ "node_modules/xml2js": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz",
+ "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==",
+ "dev": true,
+ "dependencies": {
+ "sax": ">=0.6.0",
+ "xmlbuilder": "~11.0.0"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/xml2js/node_modules/xmlbuilder": {
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
+ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/xmlbuilder": {
+ "version": "15.1.1",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz",
+ "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "devOptional": true
+ },
+ "node_modules/yauzl": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+ "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
+ "dev": true,
+ "dependencies": {
+ "buffer-crc32": "~0.2.3",
+ "fd-slicer": "~1.1.0"
+ }
+ },
+ "node_modules/yazl": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz",
+ "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==",
+ "dev": true,
+ "dependencies": {
+ "buffer-crc32": "~0.2.3"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/build/package.json b/build/package.json
index fa37e89b6fa..7017b9144e0 100644
--- a/build/package.json
+++ b/build/package.json
@@ -4,7 +4,7 @@
"license": "MIT",
"devDependencies": {
"@azure/cosmos": "^3",
- "@azure/identity": "^3.4.1",
+ "@azure/identity": "^4.2.1",
"@azure/storage-blob": "^12.17.0",
"@electron/get": "^2.0.0",
"@types/ansi-colors": "^3.2.0",
@@ -20,11 +20,11 @@
"@types/gulp-gzip": "^0.0.31",
"@types/gulp-json-editor": "^2.2.31",
"@types/gulp-rename": "^0.0.33",
+ "@types/gulp-sort": "^2.0.4",
"@types/gulp-sourcemaps": "^0.0.32",
"@types/mime": "0.0.29",
"@types/minimatch": "^3.0.3",
"@types/minimist": "^1.2.1",
- "@types/mkdirp": "^1.0.1",
"@types/mocha": "^9.1.1",
"@types/node": "20.x",
"@types/pump": "^1.0.1",
@@ -35,26 +35,27 @@
"@types/workerpool": "^6.4.0",
"@types/xml2js": "0.0.33",
"@vscode/iconv-lite-umd": "0.7.0",
- "@vscode/vsce": "^2.16.0",
+ "@vscode/vsce": "2.20.1",
"byline": "^5.0.0",
"colors": "^1.4.0",
"commander": "^7.0.0",
"debug": "^4.3.2",
"electron-osx-sign": "^0.4.16",
- "esbuild": "0.20.0",
+ "esbuild": "0.23.0",
"extract-zip": "^2.0.1",
"gulp-merge-json": "^2.1.1",
+ "gulp-sort": "^2.0.0",
"jsonc-parser": "^2.3.0",
"mime": "^1.4.1",
- "mkdirp": "^1.0.4",
"source-map": "0.6.1",
"ternary-stream": "^3.0.0",
"through2": "^4.0.2",
"tmp": "^0.2.1",
- "vscode-universal-bundler": "^0.0.2",
+ "vscode-universal-bundler": "^0.1.3",
"workerpool": "^6.4.0",
"yauzl": "^2.10.0"
},
+ "type": "commonjs",
"scripts": {
"compile": "../node_modules/.bin/tsc -p tsconfig.build.json",
"watch": "../node_modules/.bin/tsc -p tsconfig.build.json --watch",
diff --git a/build/setup-npm-registry.js b/build/setup-npm-registry.js
index 98bc836b072..24c850dbb84 100644
--- a/build/setup-npm-registry.js
+++ b/build/setup-npm-registry.js
@@ -8,7 +8,7 @@
const fs = require('fs').promises;
const path = require('path');
-async function* getYarnLockFiles(dir) {
+async function* getPackageLockFiles(dir) {
const files = await fs.readdir(dir);
for (const file of files) {
@@ -16,8 +16,8 @@ async function* getYarnLockFiles(dir) {
const stat = await fs.stat(fullPath);
if (stat.isDirectory()) {
- yield* getYarnLockFiles(fullPath);
- } else if (file === 'yarn.lock') {
+ yield* getPackageLockFiles(fullPath);
+ } else if (file === 'package-lock.json') {
yield fullPath;
}
}
@@ -32,7 +32,7 @@ async function setup(url, file) {
async function main(url, dir) {
const root = dir ?? process.cwd();
- for await (const file of getYarnLockFiles(root)) {
+ for await (const file of getPackageLockFiles(root)) {
console.log(`Enabling custom NPM registry: ${path.relative(root, file)}`);
await setup(url, file);
}
diff --git a/build/yarn.lock b/build/yarn.lock
deleted file mode 100644
index 81cf7fcf3d5..00000000000
--- a/build/yarn.lock
+++ /dev/null
@@ -1,2787 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"@azure/abort-controller@^1.0.0":
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/@azure/abort-controller/-/abort-controller-1.0.2.tgz#822405c966b2aec16fb62c1b19d37eaccf231995"
- integrity sha512-XUyTo+bcyxHEf+jlN2MXA7YU9nxVehaubngHV1MIZZaqYmZqykkoeAz/JMMEeR7t3TcyDwbFa3Zw8BZywmIx4g==
- dependencies:
- tslib "^2.0.0"
-
-"@azure/core-asynciterator-polyfill@^1.0.0":
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/@azure/core-asynciterator-polyfill/-/core-asynciterator-polyfill-1.0.0.tgz#dcccebb88406e5c76e0e1d52e8cc4c43a68b3ee7"
- integrity sha512-kmv8CGrPfN9SwMwrkiBK9VTQYxdFQEGe0BmQk+M8io56P9KNzpAxcWE/1fxJj7uouwN4kXF0BHW8DNlgx+wtCg==
-
-"@azure/core-auth@^1.3.0":
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/@azure/core-auth/-/core-auth-1.3.2.tgz#6a2c248576c26df365f6c7881ca04b7f6d08e3d0"
- integrity sha512-7CU6DmCHIZp5ZPiZ9r3J17lTKMmYsm/zGvNkjArQwPkrLlZ1TZ+EUYfGgh2X31OLMVAQCTJZW4cXHJi02EbJnA==
- dependencies:
- "@azure/abort-controller" "^1.0.0"
- tslib "^2.2.0"
-
-"@azure/core-auth@^1.5.0":
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/@azure/core-auth/-/core-auth-1.5.0.tgz#a41848c5c31cb3b7c84c409885267d55a2c92e44"
- integrity sha512-udzoBuYG1VBoHVohDTrvKjyzel34zt77Bhp7dQntVGGD0ehVq48owENbBG8fIgkHRNUBQH5k1r0hpoMu5L8+kw==
- dependencies:
- "@azure/abort-controller" "^1.0.0"
- "@azure/core-util" "^1.1.0"
- tslib "^2.2.0"
-
-"@azure/core-client@^1.4.0":
- version "1.5.0"
- resolved "https://registry.yarnpkg.com/@azure/core-client/-/core-client-1.5.0.tgz#7aabb87d20e08db3683a117191c844bc19adb74e"
- integrity sha512-YNk8i9LT6YcFdFO+RRU0E4Ef+A8Y5lhXo6lz61rwbG8Uo7kSqh0YqK04OexiilM43xd6n3Y9yBhLnb1NFNI9dA==
- dependencies:
- "@azure/abort-controller" "^1.0.0"
- "@azure/core-asynciterator-polyfill" "^1.0.0"
- "@azure/core-auth" "^1.3.0"
- "@azure/core-rest-pipeline" "^1.5.0"
- "@azure/core-tracing" "1.0.0-preview.13"
- "@azure/logger" "^1.0.0"
- tslib "^2.2.0"
-
-"@azure/core-http@^3.0.0":
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/@azure/core-http/-/core-http-3.0.0.tgz#345845f9ba479a5ee41efc3fd7a13e82d2a0ec47"
- integrity sha512-BxI2SlGFPPz6J1XyZNIVUf0QZLBKFX+ViFjKOkzqD18J1zOINIQ8JSBKKr+i+v8+MB6LacL6Nn/sP/TE13+s2Q==
- dependencies:
- "@azure/abort-controller" "^1.0.0"
- "@azure/core-auth" "^1.3.0"
- "@azure/core-tracing" "1.0.0-preview.13"
- "@azure/core-util" "^1.1.1"
- "@azure/logger" "^1.0.0"
- "@types/node-fetch" "^2.5.0"
- "@types/tunnel" "^0.0.3"
- form-data "^4.0.0"
- node-fetch "^2.6.7"
- process "^0.11.10"
- tslib "^2.2.0"
- tunnel "^0.0.6"
- uuid "^8.3.0"
- xml2js "^0.4.19"
-
-"@azure/core-lro@^2.2.0":
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/@azure/core-lro/-/core-lro-2.2.1.tgz#5527b41037c658d3aefc19d68633e51e53d6e6a3"
- integrity sha512-HE6PBl+mlKa0eBsLwusHqAqjLc5n9ByxeDo3Hz4kF3B1hqHvRkBr4oMgoT6tX7Hc3q97KfDctDUon7EhvoeHPA==
- dependencies:
- "@azure/abort-controller" "^1.0.0"
- "@azure/core-tracing" "1.0.0-preview.13"
- "@azure/logger" "^1.0.0"
- tslib "^2.2.0"
-
-"@azure/core-paging@^1.1.1":
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/@azure/core-paging/-/core-paging-1.1.3.tgz#3587c9898a0530cacb64bab216d7318468aa5efc"
- integrity sha512-his7Ah40ThEYORSpIAwuh6B8wkGwO/zG7gqVtmSE4WAJ46e36zUDXTKReUCLBDc6HmjjApQQxxcRFy5FruG79A==
- dependencies:
- "@azure/core-asynciterator-polyfill" "^1.0.0"
-
-"@azure/core-rest-pipeline@^1.1.0", "@azure/core-rest-pipeline@^1.2.0":
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/@azure/core-rest-pipeline/-/core-rest-pipeline-1.3.2.tgz#82bfb4e960b4ecf4f1a1cdb1afde4ce9192aef09"
- integrity sha512-kymICKESeHBpVLgQiAxllgWdSTopkqtmfPac8ITwMCxNEC6hzbSpqApYbjzxbBNkBMgoD4GESo6LLhR/sPh6kA==
- dependencies:
- "@azure/abort-controller" "^1.0.0"
- "@azure/core-auth" "^1.3.0"
- "@azure/core-tracing" "1.0.0-preview.13"
- "@azure/logger" "^1.0.0"
- form-data "^4.0.0"
- http-proxy-agent "^4.0.1"
- https-proxy-agent "^5.0.0"
- tslib "^2.2.0"
- uuid "^8.3.0"
-
-"@azure/core-rest-pipeline@^1.5.0":
- version "1.7.0"
- resolved "https://registry.yarnpkg.com/@azure/core-rest-pipeline/-/core-rest-pipeline-1.7.0.tgz#71f42c19af160422cc84513809ff9668d8047087"
- integrity sha512-e2awPzwMKHrmvYgZ0qIKNkqnCM1QoDs7A0rOiS3OSAlOQOz/kL7PPKHXwFMuBeaRvS8i7fgobJn79q2Cji5f+Q==
- dependencies:
- "@azure/abort-controller" "^1.0.0"
- "@azure/core-auth" "^1.3.0"
- "@azure/core-tracing" "1.0.0-preview.13"
- "@azure/logger" "^1.0.0"
- form-data "^4.0.0"
- http-proxy-agent "^4.0.1"
- https-proxy-agent "^5.0.0"
- tslib "^2.2.0"
- uuid "^8.3.0"
-
-"@azure/core-tracing@1.0.0-preview.13":
- version "1.0.0-preview.13"
- resolved "https://registry.yarnpkg.com/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz#55883d40ae2042f6f1e12b17dd0c0d34c536d644"
- integrity sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==
- dependencies:
- "@opentelemetry/api" "^1.0.1"
- tslib "^2.2.0"
-
-"@azure/core-tracing@^1.0.0":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@azure/core-tracing/-/core-tracing-1.0.1.tgz#352a38cbea438c4a83c86b314f48017d70ba9503"
- integrity sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==
- dependencies:
- tslib "^2.2.0"
-
-"@azure/core-util@^1.1.0", "@azure/core-util@^1.6.1":
- version "1.6.1"
- resolved "https://registry.yarnpkg.com/@azure/core-util/-/core-util-1.6.1.tgz#fea221c4fa43c26543bccf799beb30c1c7878f5a"
- integrity sha512-h5taHeySlsV9qxuK64KZxy4iln1BtMYlNt5jbuEFN3UFSAd1EwKg/Gjl5a6tZ/W8t6li3xPnutOx7zbDyXnPmQ==
- dependencies:
- "@azure/abort-controller" "^1.0.0"
- tslib "^2.2.0"
-
-"@azure/core-util@^1.1.1":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@azure/core-util/-/core-util-1.2.0.tgz#3499deba1fc36dda6f1912b791809b6f15d4a392"
- integrity sha512-ffGIw+Qs8bNKNLxz5UPkz4/VBM/EZY07mPve1ZYFqYUdPwFqRj0RPk0U7LZMOfT7GCck9YjuT1Rfp1PApNl1ng==
- dependencies:
- "@azure/abort-controller" "^1.0.0"
- tslib "^2.2.0"
-
-"@azure/cosmos@^3":
- version "3.17.3"
- resolved "https://registry.yarnpkg.com/@azure/cosmos/-/cosmos-3.17.3.tgz#380398496af8ef3473ae0a9ad8cdbab32d91eb08"
- integrity sha512-wBglkQ6Irjv5Vo2iw8fd6eYj60WYRSSg4/0DBkeOP6BwQ4RA91znsOHd6s3qG6UAbNgYuzC9Nnq07vlFFZkHEw==
- dependencies:
- "@azure/abort-controller" "^1.0.0"
- "@azure/core-auth" "^1.3.0"
- "@azure/core-rest-pipeline" "^1.2.0"
- "@azure/core-tracing" "^1.0.0"
- debug "^4.1.1"
- fast-json-stable-stringify "^2.1.0"
- jsbi "^3.1.3"
- node-abort-controller "^3.0.0"
- priorityqueuejs "^1.0.0"
- semaphore "^1.0.5"
- tslib "^2.2.0"
- universal-user-agent "^6.0.0"
- uuid "^8.3.0"
-
-"@azure/identity@^3.4.1":
- version "3.4.1"
- resolved "https://registry.yarnpkg.com/@azure/identity/-/identity-3.4.1.tgz#18ba48b7421c818ef8116e8eec3c03ec1a62649a"
- integrity sha512-oQ/r5MBdfZTMIUcY5Ch8G7Vv9aIXDkEYyU4Dfqjim4MQN+LY2uiQ57P1JDopMLeHCsZxM4yy8lEdne3tM9Xhzg==
- dependencies:
- "@azure/abort-controller" "^1.0.0"
- "@azure/core-auth" "^1.5.0"
- "@azure/core-client" "^1.4.0"
- "@azure/core-rest-pipeline" "^1.1.0"
- "@azure/core-tracing" "^1.0.0"
- "@azure/core-util" "^1.6.1"
- "@azure/logger" "^1.0.0"
- "@azure/msal-browser" "^3.5.0"
- "@azure/msal-node" "^2.5.1"
- events "^3.0.0"
- jws "^4.0.0"
- open "^8.0.0"
- stoppable "^1.1.0"
- tslib "^2.2.0"
-
-"@azure/logger@^1.0.0":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@azure/logger/-/logger-1.0.1.tgz#19b333203d1b2931353d8879e814b64a7274837a"
- integrity sha512-QYQeaJ+A5x6aMNu8BG5qdsVBnYBop9UMwgUvGihSjf1PdZZXB+c/oMdM2ajKwzobLBh9e9QuMQkN9iL+IxLBLA==
- dependencies:
- tslib "^2.0.0"
-
-"@azure/msal-browser@^3.5.0":
- version "3.5.0"
- resolved "https://registry.yarnpkg.com/@azure/msal-browser/-/msal-browser-3.5.0.tgz#eb64c931c78c2b75c70807f618e1284bbb183380"
- integrity sha512-2NtMuel4CI3UEelCPKkNRXgKzpWEX48fvxIvPz7s0/sTcCaI08r05IOkH2GkXW+czUOtuY6+oGafJCpumnjRLg==
- dependencies:
- "@azure/msal-common" "14.4.0"
-
-"@azure/msal-common@14.4.0":
- version "14.4.0"
- resolved "https://registry.yarnpkg.com/@azure/msal-common/-/msal-common-14.4.0.tgz#f938c1d96bb73d65baab985c96faaa273c97cfd5"
- integrity sha512-ffCymScQuMKVj+YVfwNI52A5Tu+uiZO2eTf+c+3TXxdAssks4nokJhtr+uOOMxH0zDi6d1OjFKFKeXODK0YLSg==
-
-"@azure/msal-node@^2.5.1":
- version "2.5.1"
- resolved "https://registry.yarnpkg.com/@azure/msal-node/-/msal-node-2.5.1.tgz#d180a1ba5fdc611a318a8f018a2db3453e2e2898"
- integrity sha512-PsPRISqCG253HQk1cAS7eJW7NWTbnBGpG+vcGGz5z4JYRdnM2EIXlj1aBpXCdozenEPtXEVvHn2ELleW1w82nQ==
- dependencies:
- "@azure/msal-common" "14.4.0"
- jsonwebtoken "^9.0.0"
- uuid "^8.3.0"
-
-"@azure/storage-blob@^12.17.0":
- version "12.17.0"
- resolved "https://registry.yarnpkg.com/@azure/storage-blob/-/storage-blob-12.17.0.tgz#04aad7f59cb08dbbe5b1b672a9f5b6256c8c9006"
- integrity sha512-sM4vpsCpcCApagRW5UIjQNlNylo02my2opgp0Emi8x888hZUvJ3dN69Oq20cEGXkMUWnoCrBaB0zyS3yeB87sQ==
- dependencies:
- "@azure/abort-controller" "^1.0.0"
- "@azure/core-http" "^3.0.0"
- "@azure/core-lro" "^2.2.0"
- "@azure/core-paging" "^1.1.1"
- "@azure/core-tracing" "1.0.0-preview.13"
- "@azure/logger" "^1.0.0"
- events "^3.0.0"
- tslib "^2.2.0"
-
-"@electron/get@^2.0.0":
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/@electron/get/-/get-2.0.3.tgz#fba552683d387aebd9f3fcadbcafc8e12ee4f960"
- integrity sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==
- dependencies:
- debug "^4.1.1"
- env-paths "^2.2.0"
- fs-extra "^8.1.0"
- got "^11.8.5"
- progress "^2.0.3"
- semver "^6.2.0"
- sumchecker "^3.0.1"
- optionalDependencies:
- global-agent "^3.0.0"
-
-"@esbuild/aix-ppc64@0.20.0":
- version "0.20.0"
- resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.0.tgz#509621cca4e67caf0d18561a0c56f8b70237472f"
- integrity sha512-fGFDEctNh0CcSwsiRPxiaqX0P5rq+AqE0SRhYGZ4PX46Lg1FNR6oCxJghf8YgY0WQEgQuh3lErUFE4KxLeRmmw==
-
-"@esbuild/android-arm64@0.20.0":
- version "0.20.0"
- resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.0.tgz#109a6fdc4a2783fc26193d2687827045d8fef5ab"
- integrity sha512-aVpnM4lURNkp0D3qPoAzSG92VXStYmoVPOgXveAUoQBWRSuQzt51yvSju29J6AHPmwY1BjH49uR29oyfH1ra8Q==
-
-"@esbuild/android-arm@0.20.0":
- version "0.20.0"
- resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.0.tgz#1397a2c54c476c4799f9b9073550ede496c94ba5"
- integrity sha512-3bMAfInvByLHfJwYPJRlpTeaQA75n8C/QKpEaiS4HrFWFiJlNI0vzq/zCjBrhAYcPyVPG7Eo9dMrcQXuqmNk5g==
-
-"@esbuild/android-x64@0.20.0":
- version "0.20.0"
- resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.0.tgz#2b615abefb50dc0a70ac313971102f4ce2fdb3ca"
- integrity sha512-uK7wAnlRvjkCPzh8jJ+QejFyrP8ObKuR5cBIsQZ+qbMunwR8sbd8krmMbxTLSrDhiPZaJYKQAU5Y3iMDcZPhyQ==
-
-"@esbuild/darwin-arm64@0.20.0":
- version "0.20.0"
- resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.0.tgz#5c122ed799eb0c35b9d571097f77254964c276a2"
- integrity sha512-AjEcivGAlPs3UAcJedMa9qYg9eSfU6FnGHJjT8s346HSKkrcWlYezGE8VaO2xKfvvlZkgAhyvl06OJOxiMgOYQ==
-
-"@esbuild/darwin-x64@0.20.0":
- version "0.20.0"
- resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.0.tgz#9561d277002ba8caf1524f209de2b22e93d170c1"
- integrity sha512-bsgTPoyYDnPv8ER0HqnJggXK6RyFy4PH4rtsId0V7Efa90u2+EifxytE9pZnsDgExgkARy24WUQGv9irVbTvIw==
-
-"@esbuild/freebsd-arm64@0.20.0":
- version "0.20.0"
- resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.0.tgz#84178986a3138e8500d17cc380044868176dd821"
- integrity sha512-kQ7jYdlKS335mpGbMW5tEe3IrQFIok9r84EM3PXB8qBFJPSc6dpWfrtsC/y1pyrz82xfUIn5ZrnSHQQsd6jebQ==
-
-"@esbuild/freebsd-x64@0.20.0":
- version "0.20.0"
- resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.0.tgz#3f9ce53344af2f08d178551cd475629147324a83"
- integrity sha512-uG8B0WSepMRsBNVXAQcHf9+Ko/Tr+XqmK7Ptel9HVmnykupXdS4J7ovSQUIi0tQGIndhbqWLaIL/qO/cWhXKyQ==
-
-"@esbuild/linux-arm64@0.20.0":
- version "0.20.0"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.0.tgz#24efa685515689df4ecbc13031fa0a9dda910a11"
- integrity sha512-uTtyYAP5veqi2z9b6Gr0NUoNv9F/rOzI8tOD5jKcCvRUn7T60Bb+42NDBCWNhMjkQzI0qqwXkQGo1SY41G52nw==
-
-"@esbuild/linux-arm@0.20.0":
- version "0.20.0"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.0.tgz#6b586a488e02e9b073a75a957f2952b3b6e87b4c"
- integrity sha512-2ezuhdiZw8vuHf1HKSf4TIk80naTbP9At7sOqZmdVwvvMyuoDiZB49YZKLsLOfKIr77+I40dWpHVeY5JHpIEIg==
-
-"@esbuild/linux-ia32@0.20.0":
- version "0.20.0"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.0.tgz#84ce7864f762708dcebc1b123898a397dea13624"
- integrity sha512-c88wwtfs8tTffPaoJ+SQn3y+lKtgTzyjkD8NgsyCtCmtoIC8RDL7PrJU05an/e9VuAke6eJqGkoMhJK1RY6z4w==
-
-"@esbuild/linux-loong64@0.20.0":
- version "0.20.0"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.0.tgz#1922f571f4cae1958e3ad29439c563f7d4fd9037"
- integrity sha512-lR2rr/128/6svngnVta6JN4gxSXle/yZEZL3o4XZ6esOqhyR4wsKyfu6qXAL04S4S5CgGfG+GYZnjFd4YiG3Aw==
-
-"@esbuild/linux-mips64el@0.20.0":
- version "0.20.0"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.0.tgz#7ca1bd9df3f874d18dbf46af009aebdb881188fe"
- integrity sha512-9Sycc+1uUsDnJCelDf6ZNqgZQoK1mJvFtqf2MUz4ujTxGhvCWw+4chYfDLPepMEvVL9PDwn6HrXad5yOrNzIsQ==
-
-"@esbuild/linux-ppc64@0.20.0":
- version "0.20.0"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.0.tgz#8f95baf05f9486343bceeb683703875d698708a4"
- integrity sha512-CoWSaaAXOZd+CjbUTdXIJE/t7Oz+4g90A3VBCHLbfuc5yUQU/nFDLOzQsN0cdxgXd97lYW/psIIBdjzQIwTBGw==
-
-"@esbuild/linux-riscv64@0.20.0":
- version "0.20.0"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.0.tgz#ca63b921d5fe315e28610deb0c195e79b1a262ca"
- integrity sha512-mlb1hg/eYRJUpv8h/x+4ShgoNLL8wgZ64SUr26KwglTYnwAWjkhR2GpoKftDbPOCnodA9t4Y/b68H4J9XmmPzA==
-
-"@esbuild/linux-s390x@0.20.0":
- version "0.20.0"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.0.tgz#cb3d069f47dc202f785c997175f2307531371ef8"
- integrity sha512-fgf9ubb53xSnOBqyvWEY6ukBNRl1mVX1srPNu06B6mNsNK20JfH6xV6jECzrQ69/VMiTLvHMicQR/PgTOgqJUQ==
-
-"@esbuild/linux-x64@0.20.0":
- version "0.20.0"
- resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.0.tgz#ac617e0dc14e9758d3d7efd70288c14122557dc7"
- integrity sha512-H9Eu6MGse++204XZcYsse1yFHmRXEWgadk2N58O/xd50P9EvFMLJTQLg+lB4E1cF2xhLZU5luSWtGTb0l9UeSg==
-
-"@esbuild/netbsd-x64@0.20.0":
- version "0.20.0"
- resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.0.tgz#6cc778567f1513da6e08060e0aeb41f82eb0f53c"
- integrity sha512-lCT675rTN1v8Fo+RGrE5KjSnfY0x9Og4RN7t7lVrN3vMSjy34/+3na0q7RIfWDAj0e0rCh0OL+P88lu3Rt21MQ==
-
-"@esbuild/openbsd-x64@0.20.0":
- version "0.20.0"
- resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.0.tgz#76848bcf76b4372574fb4d06cd0ed1fb29ec0fbe"
- integrity sha512-HKoUGXz/TOVXKQ+67NhxyHv+aDSZf44QpWLa3I1lLvAwGq8x1k0T+e2HHSRvxWhfJrFxaaqre1+YyzQ99KixoA==
-
-"@esbuild/sunos-x64@0.20.0":
- version "0.20.0"
- resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.0.tgz#ea4cd0639bf294ad51bc08ffbb2dac297e9b4706"
- integrity sha512-GDwAqgHQm1mVoPppGsoq4WJwT3vhnz/2N62CzhvApFD1eJyTroob30FPpOZabN+FgCjhG+AgcZyOPIkR8dfD7g==
-
-"@esbuild/win32-arm64@0.20.0":
- version "0.20.0"
- resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.0.tgz#a5c171e4a7f7e4e8be0e9947a65812c1535a7cf0"
- integrity sha512-0vYsP8aC4TvMlOQYozoksiaxjlvUcQrac+muDqj1Fxy6jh9l9CZJzj7zmh8JGfiV49cYLTorFLxg7593pGldwQ==
-
-"@esbuild/win32-ia32@0.20.0":
- version "0.20.0"
- resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.0.tgz#f8ac5650c412d33ea62d7551e0caf82da52b7f85"
- integrity sha512-p98u4rIgfh4gdpV00IqknBD5pC84LCub+4a3MO+zjqvU5MVXOc3hqR2UgT2jI2nh3h8s9EQxmOsVI3tyzv1iFg==
-
-"@esbuild/win32-x64@0.20.0":
- version "0.20.0"
- resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.0.tgz#2efddf82828aac85e64cef62482af61c29561bee"
- integrity sha512-NgJnesu1RtWihtTtXGFMU5YSE6JyyHPMxCwBZK7a6/8d31GuSo9l0Ss7w1Jw5QnKUawG6UEehs883kcXf5fYwg==
-
-"@malept/cross-spawn-promise@^1.1.0":
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d"
- integrity sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==
- dependencies:
- cross-spawn "^7.0.1"
-
-"@opentelemetry/api@^1.0.1":
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.0.3.tgz#13a12ae9e05c2a782f7b5e84c3cbfda4225eaf80"
- integrity sha512-puWxACExDe9nxbBB3lOymQFrLYml2dVOrd7USiVRnSbgXE+KwBu+HxFvxrzfqsiSda9IWsXJG1ef7C1O2/GmKQ==
-
-"@sindresorhus/is@^4.0.0":
- version "4.6.0"
- resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f"
- integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==
-
-"@szmarczak/http-timer@^4.0.5":
- version "4.0.6"
- resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807"
- integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==
- dependencies:
- defer-to-connect "^2.0.0"
-
-"@tootallnate/once@1":
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
- integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
-
-"@types/ansi-colors@^3.2.0":
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/@types/ansi-colors/-/ansi-colors-3.2.0.tgz#3e4fe85d9131ce1c6994f3040bd0b25306c16a6e"
- integrity sha512-0caWAhXht9N2lOdMzJLXybsSkYCx1QOdxx6pae48tswI9QV3DFX26AoOpy0JxwhCb+zISTqmd6H8t9Zby9BoZg==
-
-"@types/byline@^4.2.32":
- version "4.2.32"
- resolved "https://registry.yarnpkg.com/@types/byline/-/byline-4.2.32.tgz#9d35ec15968056118548412ee24c2c3026c997dc"
- integrity sha512-qtlm/J6XOO9p+Ep/ZB5+mCFEDhzWDDHWU4a1eReN7lkPZXW9rkloq2jcAhvKKmlO5tL2GSvKROb+PTsNVhBiyQ==
- dependencies:
- "@types/node" "*"
-
-"@types/cacheable-request@^6.0.1":
- version "6.0.3"
- resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183"
- integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==
- dependencies:
- "@types/http-cache-semantics" "*"
- "@types/keyv" "^3.1.4"
- "@types/node" "*"
- "@types/responselike" "^1.0.0"
-
-"@types/debounce@^1.0.0":
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/@types/debounce/-/debounce-1.0.0.tgz#417560200331e1bb84d72da85391102c2fcd61b7"
- integrity sha1-QXVgIAMx4buE1y2oU5EQLC/NYbc=
-
-"@types/debug@^4.1.5":
- version "4.1.9"
- resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.9.tgz#906996938bc672aaf2fb8c0d3733ae1dda05b005"
- integrity sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow==
- dependencies:
- "@types/ms" "*"
-
-"@types/events@*":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86"
- integrity sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==
-
-"@types/expect@^1.20.4":
- version "1.20.4"
- resolved "https://registry.yarnpkg.com/@types/expect/-/expect-1.20.4.tgz#8288e51737bf7e3ab5d7c77bfa695883745264e5"
- integrity sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==
-
-"@types/fancy-log@^1.3.0":
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/@types/fancy-log/-/fancy-log-1.3.0.tgz#a61ab476e5e628cd07a846330df53b85e05c8ce0"
- integrity sha512-mQjDxyOM1Cpocd+vm1kZBP7smwKZ4TNokFeds9LV7OZibmPJFEzY3+xZMrKfUdNT71lv8GoCPD6upKwHxubClw==
-
-"@types/fs-extra@^9.0.12":
- version "9.0.12"
- resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.12.tgz#9b8f27973df8a7a3920e8461517ebf8a7d4fdfaf"
- integrity sha512-I+bsBr67CurCGnSenZZ7v94gd3tc3+Aj2taxMT4yu4ABLuOgOjeFxX3dokG24ztSRg5tnT00sL8BszO7gSMoIw==
- dependencies:
- "@types/node" "*"
-
-"@types/glob-stream@*":
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/@types/glob-stream/-/glob-stream-6.1.0.tgz#7ede8a33e59140534f8d8adfb8ac9edfb31897bc"
- integrity sha512-RHv6ZQjcTncXo3thYZrsbAVwoy4vSKosSWhuhuQxLOTv74OJuFQxXkmUuZCr3q9uNBEVCvIzmZL/FeRNbHZGUg==
- dependencies:
- "@types/glob" "*"
- "@types/node" "*"
-
-"@types/glob@*", "@types/glob@^7.1.1":
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575"
- integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==
- dependencies:
- "@types/events" "*"
- "@types/minimatch" "*"
- "@types/node" "*"
-
-"@types/gulp-concat@^0.0.32":
- version "0.0.32"
- resolved "https://registry.yarnpkg.com/@types/gulp-concat/-/gulp-concat-0.0.32.tgz#72486028b1cf5faa94c8c1cf34c626531cecacd6"
- integrity sha512-CUCFADlITzzBfBa2bdGzhKtvBr4eFh+evb+4igVbvPoO5RyPfHifmyQlZl6lM7q19+OKncRlFXDU7B4X9Ayo2g==
- dependencies:
- "@types/node" "*"
-
-"@types/gulp-filter@^3.0.32":
- version "3.0.32"
- resolved "https://registry.yarnpkg.com/@types/gulp-filter/-/gulp-filter-3.0.32.tgz#eeff3e9dbc092268fed01f2421ab00f6c8cb4848"
- integrity sha512-JvY4qTxXehoK2yCUxYVxTMvckVbDM5TWHWeUoYJyX31gwFqw4YDD6JNzhuTxI3yHPUTY4BBRTqgm6puQEZVCNg==
- dependencies:
- "@types/minimatch" "*"
- "@types/node" "*"
- "@types/vinyl" "*"
-
-"@types/gulp-gzip@^0.0.31":
- version "0.0.31"
- resolved "https://registry.yarnpkg.com/@types/gulp-gzip/-/gulp-gzip-0.0.31.tgz#9358def25540442138fd61a7227f40d4c1e26760"
- integrity sha512-KQjHz1FTqLse8/EiktfhN/vo33vamX4gVAQhMTp55STDBA7UToW5CJqYyP7iRorkHK9/aJ2nL2hLkNZkY4M8+w==
- dependencies:
- "@types/node" "*"
-
-"@types/gulp-json-editor@^2.2.31":
- version "2.2.31"
- resolved "https://registry.yarnpkg.com/@types/gulp-json-editor/-/gulp-json-editor-2.2.31.tgz#3c1a8950556c109a0e2d0ab11d5f2a2443665ed2"
- integrity sha512-piis0ImYAy0dt18R4EtTbAY+RV8jwTq5VisnUV6OfP8kD4743aHGkAdAd08No4NY3rFa5mD6ytIu8L0YU7nL9w==
- dependencies:
- "@types/js-beautify" "*"
- "@types/node" "*"
-
-"@types/gulp-rename@^0.0.33":
- version "0.0.33"
- resolved "https://registry.yarnpkg.com/@types/gulp-rename/-/gulp-rename-0.0.33.tgz#38d146e97786569f74f5391a1b1f9b5198674b6c"
- integrity sha512-FIZQvbZJj6V1gHPTzO+g/BCWpDur7fJrroae4gwV3LaoHBQ+MrR9sB+2HssK8fHv4WdY6hVNxkcft9bYatuPIA==
- dependencies:
- "@types/node" "*"
-
-"@types/gulp-sourcemaps@^0.0.32":
- version "0.0.32"
- resolved "https://registry.yarnpkg.com/@types/gulp-sourcemaps/-/gulp-sourcemaps-0.0.32.tgz#e79ee617e0cb15729874be4533fe59c07793a175"
- integrity sha512-+7BAmptW2bxyJnJcCEuie7vLoop3FwWgCdBMzyv7MYXED/HeNMeQuX7uPCkp4vfU1TTu4CYFH0IckNPvo0VePA==
- dependencies:
- "@types/node" "*"
-
-"@types/gulp@^4.0.17":
- version "4.0.17"
- resolved "https://registry.yarnpkg.com/@types/gulp/-/gulp-4.0.17.tgz#b314c3762d08d8d69b7c0b86f78d069bafd65009"
- integrity sha512-+pKQynu2C/HS16kgmDlAicjtFYP8kaa86eE9P0Ae7GB5W29we/E2TIdbOWtEZD5XkpY+jr8fyqfwO6SWZecLpQ==
- dependencies:
- "@types/node" "*"
- "@types/undertaker" ">=1.2.6"
- "@types/vinyl-fs" "*"
- chokidar "^3.3.1"
-
-"@types/http-cache-semantics@*":
- version "4.0.4"
- resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4"
- integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==
-
-"@types/js-beautify@*":
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/@types/js-beautify/-/js-beautify-1.8.0.tgz#0369d3d0e1f35a6aec07cb4da2ee2bcda111367c"
- integrity sha512-/siF86XrwDKLuHe8l7h6NhrAWgLdgqbxmjZv9NvGWmgYRZoTipkjKiWb0SQHy/jcR+ee0GvbG6uGd+LEBMGNvA==
-
-"@types/keyv@^3.1.4":
- version "3.1.4"
- resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6"
- integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==
- dependencies:
- "@types/node" "*"
-
-"@types/mime@0.0.29":
- version "0.0.29"
- resolved "https://registry.yarnpkg.com/@types/mime/-/mime-0.0.29.tgz#fbcfd330573b912ef59eeee14602bface630754b"
- integrity sha1-+8/TMFc7kS71nu7hRgK/rOYwdUs=
-
-"@types/minimatch@*", "@types/minimatch@^3.0.3":
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
- integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
-
-"@types/minimist@^1.2.1":
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.1.tgz#283f669ff76d7b8260df8ab7a4262cc83d988256"
- integrity sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==
-
-"@types/mkdirp@^1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-1.0.1.tgz#0930b948914a78587de35458b86c907b6e98bbf6"
- integrity sha512-HkGSK7CGAXncr8Qn/0VqNtExEE+PHMWb+qlR1faHMao7ng6P3tAaoWWBMdva0gL5h4zprjIO89GJOLXsMcDm1Q==
- dependencies:
- "@types/node" "*"
-
-"@types/mocha@^9.1.1":
- version "9.1.1"
- resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4"
- integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==
-
-"@types/ms@*":
- version "0.7.32"
- resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.32.tgz#f6cd08939ae3ad886fcc92ef7f0109dacddf61ab"
- integrity sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g==
-
-"@types/node-fetch@^2.5.0":
- version "2.5.8"
- resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.8.tgz#e199c835d234c7eb0846f6618012e558544ee2fb"
- integrity sha512-fbjI6ja0N5ZA8TV53RUqzsKNkl9fv8Oj3T7zxW7FGv1GSH7gwJaNF8dzCjrqKaxKeUpTz4yT1DaJFq/omNpGfw==
- dependencies:
- "@types/node" "*"
- form-data "^3.0.0"
-
-"@types/node@*":
- version "8.0.51"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.51.tgz#b31d716fb8d58eeb95c068a039b9b6292817d5fb"
- integrity sha512-El3+WJk2D/ppWNd2X05aiP5l2k4EwF7KwheknQZls+I26eSICoWRhRIJ56jGgw2dqNGQ5LtNajmBU2ajS28EvQ==
-
-"@types/node@20.x":
- version "20.11.24"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.24.tgz#cc207511104694e84e9fb17f9a0c4c42d4517792"
- integrity sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==
- dependencies:
- undici-types "~5.26.4"
-
-"@types/pump@^1.0.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@types/pump/-/pump-1.0.1.tgz#ae8157cefef04d1a4d24c1cc91d403c2f5da5cd0"
- integrity sha1-roFXzv7wTRpNJMHMkdQDwvXaXNA=
- dependencies:
- "@types/node" "*"
-
-"@types/responselike@^1.0.0":
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.3.tgz#cc29706f0a397cfe6df89debfe4bf5cea159db50"
- integrity sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==
- dependencies:
- "@types/node" "*"
-
-"@types/rimraf@^2.0.4":
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-2.0.4.tgz#403887b0b53c6100a6c35d2ab24f6ccc042fec46"
- integrity sha512-8gBudvllD2A/c0CcEX/BivIDorHFt5UI5m46TsNj8DjWCCTTZT74kEe4g+QsY7P/B9WdO98d82zZgXO/RQzu2Q==
- dependencies:
- "@types/glob" "*"
- "@types/node" "*"
-
-"@types/through2@^2.0.36":
- version "2.0.36"
- resolved "https://registry.yarnpkg.com/@types/through2/-/through2-2.0.36.tgz#35fda0db635827d44c0e08e2c94653e647574a00"
- integrity sha512-vuifQksQHJXhV9McpVsXKuhnf3lsoX70PnhcqIAbs9dqLH2NgrGz0DzZPDY3+Yh6eaRqcE1gnCQ6QhBn1/PT5A==
- dependencies:
- "@types/node" "*"
-
-"@types/through@^0.0.29":
- version "0.0.29"
- resolved "https://registry.yarnpkg.com/@types/through/-/through-0.0.29.tgz#72943aac922e179339c651fa34a4428a4d722f93"
- integrity sha512-9a7C5VHh+1BKblaYiq+7Tfc+EOmjMdZaD1MYtkQjSoxgB69tBjW98ry6SKsi4zEIWztLOMRuL87A3bdT/Fc/4w==
- dependencies:
- "@types/node" "*"
-
-"@types/tmp@^0.2.1":
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.1.tgz#83ecf4ec22a8c218c71db25f316619fe5b986011"
- integrity sha512-7cTXwKP/HLOPVgjg+YhBdQ7bMiobGMuoBmrGmqwIWJv8elC6t1DfVc/mn4fD9UE1IjhwmhaQ5pGVXkmXbH0rhg==
-
-"@types/tunnel@^0.0.3":
- version "0.0.3"
- resolved "https://registry.yarnpkg.com/@types/tunnel/-/tunnel-0.0.3.tgz#f109e730b072b3136347561fc558c9358bb8c6e9"
- integrity sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==
- dependencies:
- "@types/node" "*"
-
-"@types/undertaker-registry@*":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@types/undertaker-registry/-/undertaker-registry-1.0.1.tgz#4306d4a03d7acedb974b66530832b90729e1d1da"
- integrity sha512-Z4TYuEKn9+RbNVk1Ll2SS4x1JeLHecolIbM/a8gveaHsW0Hr+RQMraZACwTO2VD7JvepgA6UO1A1VrbktQrIbQ==
-
-"@types/undertaker@>=1.2.6":
- version "1.2.11"
- resolved "https://registry.yarnpkg.com/@types/undertaker/-/undertaker-1.2.11.tgz#d9e08b72c4bea5fc40e5bad63ad5a1a2b675e3ca"
- integrity sha512-j1Z0V2ByRHr8ZK7eOeGq0LGkkdthNFW0uAZGY22iRkNQNL9/vAV0yFPr1QN3FM/peY5bxs9P+1f0PYJTQVa5iA==
- dependencies:
- "@types/node" "*"
- "@types/undertaker-registry" "*"
- async-done "~1.3.2"
-
-"@types/vinyl-fs@*":
- version "2.4.9"
- resolved "https://registry.yarnpkg.com/@types/vinyl-fs/-/vinyl-fs-2.4.9.tgz#d312c24b5ba8d2db456d23ee4a66f9d016af82ea"
- integrity sha512-Q0EXd6c1fORjiOuK4ZaKdfFcMyFzJlTi56dqktwaWVLIDAzE49wUs3bKnYbZwzyMWoH+NcMWnRuR73S9A0jnRA==
- dependencies:
- "@types/events" "*"
- "@types/glob-stream" "*"
- "@types/node" "*"
- "@types/vinyl" "*"
-
-"@types/vinyl@*":
- version "2.0.12"
- resolved "https://registry.yarnpkg.com/@types/vinyl/-/vinyl-2.0.12.tgz#17642ca9a8ae10f3db018e9f885da4188db4c6e6"
- integrity sha512-Sr2fYMBUVGYq8kj3UthXFAu5UN6ZW+rYr4NACjZQJvHvj+c8lYv0CahmZ2P/r7iUkN44gGUBwqxZkrKXYPb7cw==
- dependencies:
- "@types/expect" "^1.20.4"
- "@types/node" "*"
-
-"@types/workerpool@^6.4.0":
- version "6.4.0"
- resolved "https://registry.yarnpkg.com/@types/workerpool/-/workerpool-6.4.0.tgz#c79292915dd08350d10e78e74687b6f401f270b8"
- integrity sha512-SIF2/169pDsLKeM8GQGHkOFifGalDbZgiBSaLUnnlVSRsAOenkAvQ6h4uhV2W+PZZczS+8LQxACwNkSykdT91A==
- dependencies:
- "@types/node" "*"
-
-"@types/xml2js@0.0.33":
- version "0.0.33"
- resolved "https://registry.yarnpkg.com/@types/xml2js/-/xml2js-0.0.33.tgz#20c5dd6460245284d64a55690015b95e409fb7de"
- integrity sha1-IMXdZGAkUoTWSlVpABW5XkCft94=
-
-"@types/yauzl@^2.9.1":
- version "2.9.2"
- resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.2.tgz#c48e5d56aff1444409e39fa164b0b4d4552a7b7a"
- integrity sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==
- dependencies:
- "@types/node" "*"
-
-"@vscode/iconv-lite-umd@0.7.0":
- version "0.7.0"
- resolved "https://registry.yarnpkg.com/@vscode/iconv-lite-umd/-/iconv-lite-umd-0.7.0.tgz#d2f1e0664ee6036408f9743fee264ea0699b0e48"
- integrity sha512-bRRFxLfg5dtAyl5XyiVWz/ZBPahpOpPrNYnnHpOpUZvam4tKH35wdhP4Kj6PbM0+KdliOsPzbGWpkxcdpNB/sg==
-
-"@vscode/vsce@^2.16.0":
- version "2.16.0"
- resolved "https://registry.yarnpkg.com/@vscode/vsce/-/vsce-2.16.0.tgz#a3ddcf7e84914576f35d891e236bc496c568776f"
- integrity sha512-BhJ0zO7UxShLFBZM6jwOLt1ZVoqQ4r5Lj/kHNeYp0ICPXhz/erqBSMQnHkRgkjn2L/bh+TYFGkZyguhu/SKsjw==
- dependencies:
- azure-devops-node-api "^11.0.1"
- chalk "^2.4.2"
- cheerio "^1.0.0-rc.9"
- commander "^6.1.0"
- glob "^7.0.6"
- hosted-git-info "^4.0.2"
- leven "^3.1.0"
- markdown-it "^12.3.2"
- mime "^1.3.4"
- minimatch "^3.0.3"
- parse-semver "^1.1.1"
- read "^1.0.7"
- semver "^5.1.0"
- tmp "^0.2.1"
- typed-rest-client "^1.8.4"
- url-join "^4.0.1"
- xml2js "^0.4.23"
- yauzl "^2.3.1"
- yazl "^2.2.2"
- optionalDependencies:
- keytar "^7.7.0"
-
-agent-base@6:
- version "6.0.2"
- resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
- integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
- dependencies:
- debug "4"
-
-ansi-colors@4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
- integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
-
-ansi-colors@^1.0.1:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9"
- integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==
- dependencies:
- ansi-wrap "^0.1.0"
-
-ansi-gray@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251"
- integrity sha1-KWLPVOyXksSFEKPetSRDaGHvclE=
- dependencies:
- ansi-wrap "0.1.0"
-
-ansi-styles@^3.2.1:
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
- integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
- dependencies:
- color-convert "^1.9.0"
-
-ansi-wrap@0.1.0, ansi-wrap@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf"
- integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768=
-
-anymatch@^3.1.1, anymatch@~3.1.1:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
- integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
- dependencies:
- normalize-path "^3.0.0"
- picomatch "^2.0.4"
-
-anymatch@~3.1.2:
- version "3.1.3"
- resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
- integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
- dependencies:
- normalize-path "^3.0.0"
- picomatch "^2.0.4"
-
-argparse@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
- integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
-
-arr-diff@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
- integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
-
-arr-union@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
- integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
-
-asar@^3.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/asar/-/asar-3.0.3.tgz#1fef03c2d6d2de0cbad138788e4f7ae03b129c7b"
- integrity sha512-k7zd+KoR+n8pl71PvgElcoKHrVNiSXtw7odKbyNpmgKe7EGRF9Pnu3uLOukD37EvavKwVFxOUpqXTIZC5B5Pmw==
- dependencies:
- chromium-pickle-js "^0.2.0"
- commander "^5.0.0"
- glob "^7.1.6"
- minimatch "^3.0.4"
- optionalDependencies:
- "@types/glob" "^7.1.1"
-
-assign-symbols@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
- integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
-
-async-done@~1.3.2:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/async-done/-/async-done-1.3.2.tgz#5e15aa729962a4b07414f528a88cdf18e0b290a2"
- integrity sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==
- dependencies:
- end-of-stream "^1.1.0"
- once "^1.3.2"
- process-nextick-args "^2.0.0"
- stream-exhaust "^1.0.1"
-
-asynckit@^0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
- integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
-
-at-least-node@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
- integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
-
-azure-devops-node-api@^11.0.1:
- version "11.2.0"
- resolved "https://registry.yarnpkg.com/azure-devops-node-api/-/azure-devops-node-api-11.2.0.tgz#bf04edbef60313117a0507415eed4790a420ad6b"
- integrity sha512-XdiGPhrpaT5J8wdERRKs5g8E0Zy1pvOYTli7z9E8nmOn3YGp4FhtjhrOyFmX/8veWCwdI69mCHKJw6l+4J/bHA==
- dependencies:
- tunnel "0.0.6"
- typed-rest-client "^1.8.4"
-
-balanced-match@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
- integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
-
-base64-js@^1.3.1, base64-js@^1.5.1:
- version "1.5.1"
- resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
- integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
-
-binary-extensions@^2.0.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
- integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
-
-bl@^4.0.3:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
- integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
- dependencies:
- buffer "^5.5.0"
- inherits "^2.0.4"
- readable-stream "^3.4.0"
-
-bluebird@^3.5.0:
- version "3.7.2"
- resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
- integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
-
-boolbase@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
- integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==
-
-boolean@^3.0.1:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.1.2.tgz#e30f210a26b02458482a8cc353ab06f262a780c2"
- integrity sha512-YN6UmV0FfLlBVvRvNPx3pz5W/mUoYB24J4WSXOKP/OOJpi+Oq6WYqPaNTHzjI0QzwWtnvEd5CGYyQPgp1jFxnw==
-
-brace-expansion@^1.1.7:
- version "1.1.11"
- resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
- integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
- dependencies:
- balanced-match "^1.0.0"
- concat-map "0.0.1"
-
-braces@~3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
- integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
- dependencies:
- fill-range "^7.0.1"
-
-buffer-alloc-unsafe@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
- integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==
-
-buffer-alloc@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
- integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
- dependencies:
- buffer-alloc-unsafe "^1.1.0"
- buffer-fill "^1.0.0"
-
-buffer-crc32@~0.2.3:
- version "0.2.13"
- resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
- integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
-
-buffer-equal-constant-time@1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
- integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=
-
-buffer-equal@1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe"
- integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74=
-
-buffer-fill@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
- integrity sha1-+PeLdniYiO858gXNY39o5wISKyw=
-
-buffer@^5.5.0:
- version "5.7.1"
- resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
- integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
- dependencies:
- base64-js "^1.3.1"
- ieee754 "^1.1.13"
-
-byline@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1"
- integrity sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=
-
-cacheable-lookup@^5.0.3:
- version "5.0.4"
- resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005"
- integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==
-
-cacheable-request@^7.0.2:
- version "7.0.4"
- resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817"
- integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==
- dependencies:
- clone-response "^1.0.2"
- get-stream "^5.1.0"
- http-cache-semantics "^4.0.0"
- keyv "^4.0.0"
- lowercase-keys "^2.0.0"
- normalize-url "^6.0.1"
- responselike "^2.0.0"
-
-call-bind@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
- integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
- dependencies:
- function-bind "^1.1.1"
- get-intrinsic "^1.0.2"
-
-chalk@^2.4.2:
- version "2.4.2"
- resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
- integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
- dependencies:
- ansi-styles "^3.2.1"
- escape-string-regexp "^1.0.5"
- supports-color "^5.3.0"
-
-cheerio-select@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4"
- integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==
- dependencies:
- boolbase "^1.0.0"
- css-select "^5.1.0"
- css-what "^6.1.0"
- domelementtype "^2.3.0"
- domhandler "^5.0.3"
- domutils "^3.0.1"
-
-cheerio@^1.0.0-rc.9:
- version "1.0.0-rc.12"
- resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683"
- integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==
- dependencies:
- cheerio-select "^2.1.0"
- dom-serializer "^2.0.0"
- domhandler "^5.0.3"
- domutils "^3.0.1"
- htmlparser2 "^8.0.1"
- parse5 "^7.0.0"
- parse5-htmlparser2-tree-adapter "^7.0.0"
-
-chokidar@3.5.1:
- version "3.5.1"
- resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a"
- integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==
- dependencies:
- anymatch "~3.1.1"
- braces "~3.0.2"
- glob-parent "~5.1.0"
- is-binary-path "~2.1.0"
- is-glob "~4.0.1"
- normalize-path "~3.0.0"
- readdirp "~3.5.0"
- optionalDependencies:
- fsevents "~2.3.1"
-
-chokidar@^3.3.1:
- version "3.6.0"
- resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b"
- integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
- dependencies:
- anymatch "~3.1.2"
- braces "~3.0.2"
- glob-parent "~5.1.2"
- is-binary-path "~2.1.0"
- is-glob "~4.0.1"
- normalize-path "~3.0.0"
- readdirp "~3.6.0"
- optionalDependencies:
- fsevents "~2.3.2"
-
-chownr@^1.1.1:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
- integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
-
-chromium-pickle-js@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205"
- integrity sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=
-
-clone-buffer@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58"
- integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg=
-
-clone-response@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
- integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
- dependencies:
- mimic-response "^1.0.0"
-
-clone-stats@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680"
- integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=
-
-clone@^2.1.1:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
- integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
-
-cloneable-readable@^1.0.0:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz#120a00cb053bfb63a222e709f9683ea2e11d8cec"
- integrity sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==
- dependencies:
- inherits "^2.0.1"
- process-nextick-args "^2.0.0"
- readable-stream "^2.3.5"
-
-color-convert@^1.9.0:
- version "1.9.3"
- resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
- integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
- dependencies:
- color-name "1.1.3"
-
-color-name@1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
- integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
-
-color-support@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
- integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==
-
-colors@1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
- integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=
-
-colors@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
- integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
-
-combined-stream@^1.0.8:
- version "1.0.8"
- resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
- integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
- dependencies:
- delayed-stream "~1.0.0"
-
-commander@2.9.0:
- version "2.9.0"
- resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
- integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=
- dependencies:
- graceful-readlink ">= 1.0.0"
-
-commander@^5.0.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae"
- integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==
-
-commander@^6.1.0:
- version "6.2.1"
- resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c"
- integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==
-
-commander@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/commander/-/commander-7.0.0.tgz#3e2bbfd8bb6724760980988fb5b22b7ee6b71ab2"
- integrity sha512-ovx/7NkTrnPuIV8sqk/GjUIIM1+iUQeqA3ye2VNpq9sVoiZsooObWlQy+OPWGI17GDaEoybuAGJm6U8yC077BA==
-
-compare-version@^0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080"
- integrity sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=
-
-concat-map@0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
- integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
-
-core-util-is@~1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
- integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
-
-cross-spawn@^7.0.1:
- version "7.0.3"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
- integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
- dependencies:
- path-key "^3.1.0"
- shebang-command "^2.0.0"
- which "^2.0.1"
-
-css-select@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6"
- integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==
- dependencies:
- boolbase "^1.0.0"
- css-what "^6.1.0"
- domhandler "^5.0.2"
- domutils "^3.0.1"
- nth-check "^2.0.1"
-
-css-what@^6.1.0:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4"
- integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==
-
-debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2:
- version "4.3.4"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
- integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
- dependencies:
- ms "2.1.2"
-
-debug@^2.6.8:
- version "2.6.9"
- resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
- integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
- dependencies:
- ms "2.0.0"
-
-decompress-response@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
- integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==
- dependencies:
- mimic-response "^3.1.0"
-
-deep-extend@^0.6.0:
- version "0.6.0"
- resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
- integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
-
-defer-to-connect@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587"
- integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==
-
-define-lazy-prop@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f"
- integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==
-
-define-properties@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
- integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
- dependencies:
- object-keys "^1.0.12"
-
-delayed-stream@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
- integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
-
-detect-libc@^2.0.0:
- 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"
- integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==
-
-dir-compare@^2.4.0:
- version "2.4.0"
- resolved "https://registry.yarnpkg.com/dir-compare/-/dir-compare-2.4.0.tgz#785c41dc5f645b34343a4eafc50b79bac7f11631"
- integrity sha512-l9hmu8x/rjVC9Z2zmGzkhOEowZvW7pmYws5CWHutg8u1JgvsKWMx7Q/UODeu4djLZ4FgW5besw5yvMQnBHzuCA==
- dependencies:
- buffer-equal "1.0.0"
- colors "1.0.3"
- commander "2.9.0"
- minimatch "3.0.4"
-
-dom-serializer@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53"
- integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==
- dependencies:
- domelementtype "^2.3.0"
- domhandler "^5.0.2"
- entities "^4.2.0"
-
-domelementtype@^2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d"
- integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==
-
-domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31"
- integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==
- dependencies:
- domelementtype "^2.3.0"
-
-domutils@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c"
- integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==
- dependencies:
- dom-serializer "^2.0.0"
- domelementtype "^2.3.0"
- domhandler "^5.0.1"
-
-duplexify@^4.1.1:
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.2.tgz#18b4f8d28289132fa0b9573c898d9f903f81c7b0"
- integrity sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==
- dependencies:
- end-of-stream "^1.4.1"
- inherits "^2.0.3"
- readable-stream "^3.1.1"
- stream-shift "^1.0.0"
-
-ecdsa-sig-formatter@1.0.11:
- version "1.0.11"
- resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf"
- integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==
- dependencies:
- safe-buffer "^5.0.1"
-
-electron-osx-sign@^0.4.16:
- version "0.4.16"
- resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.4.16.tgz#0be8e579b2d9fa4c12d2a21f063898294b3434aa"
- integrity sha512-ziMWfc3NmQlwnWLW6EaZq8nH2BWVng/atX5GWsGwhexJYpdW6hsg//MkAfRTRx1kR3Veiqkeiog1ibkbA4x0rg==
- dependencies:
- bluebird "^3.5.0"
- compare-version "^0.1.2"
- debug "^2.6.8"
- isbinaryfile "^3.0.2"
- minimist "^1.2.0"
- plist "^3.0.1"
-
-end-of-stream@^1.1.0, end-of-stream@^1.4.1:
- version "1.4.4"
- resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
- integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
- dependencies:
- once "^1.4.0"
-
-entities@^4.2.0, entities@^4.3.0, entities@^4.4.0:
- version "4.4.0"
- resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174"
- integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==
-
-entities@~2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5"
- integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==
-
-env-paths@^2.2.0:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
- integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
-
-es6-error@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d"
- integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==
-
-esbuild@0.20.0:
- version "0.20.0"
- resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.0.tgz#a7170b63447286cd2ff1f01579f09970e6965da4"
- integrity sha512-6iwE3Y2RVYCME1jLpBqq7LQWK3MW6vjV2bZy6gt/WrqkY+WE74Spyc0ThAOYpMtITvnjX09CrC6ym7A/m9mebA==
- optionalDependencies:
- "@esbuild/aix-ppc64" "0.20.0"
- "@esbuild/android-arm" "0.20.0"
- "@esbuild/android-arm64" "0.20.0"
- "@esbuild/android-x64" "0.20.0"
- "@esbuild/darwin-arm64" "0.20.0"
- "@esbuild/darwin-x64" "0.20.0"
- "@esbuild/freebsd-arm64" "0.20.0"
- "@esbuild/freebsd-x64" "0.20.0"
- "@esbuild/linux-arm" "0.20.0"
- "@esbuild/linux-arm64" "0.20.0"
- "@esbuild/linux-ia32" "0.20.0"
- "@esbuild/linux-loong64" "0.20.0"
- "@esbuild/linux-mips64el" "0.20.0"
- "@esbuild/linux-ppc64" "0.20.0"
- "@esbuild/linux-riscv64" "0.20.0"
- "@esbuild/linux-s390x" "0.20.0"
- "@esbuild/linux-x64" "0.20.0"
- "@esbuild/netbsd-x64" "0.20.0"
- "@esbuild/openbsd-x64" "0.20.0"
- "@esbuild/sunos-x64" "0.20.0"
- "@esbuild/win32-arm64" "0.20.0"
- "@esbuild/win32-ia32" "0.20.0"
- "@esbuild/win32-x64" "0.20.0"
-
-escape-string-regexp@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
- integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
-
-escape-string-regexp@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
- integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
-
-events@^3.0.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379"
- integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==
-
-expand-template@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c"
- integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==
-
-extend-shallow@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
- integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
- dependencies:
- assign-symbols "^1.0.0"
- is-extendable "^1.0.1"
-
-extract-zip@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a"
- integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==
- dependencies:
- debug "^4.1.1"
- get-stream "^5.1.0"
- yauzl "^2.10.0"
- optionalDependencies:
- "@types/yauzl" "^2.9.1"
-
-fancy-log@^1.3.3:
- version "1.3.3"
- resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7"
- integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==
- dependencies:
- ansi-gray "^0.1.1"
- color-support "^1.1.3"
- parse-node-version "^1.0.0"
- time-stamp "^1.0.0"
-
-fast-json-stable-stringify@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
- integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
-
-fd-slicer@~1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
- integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=
- dependencies:
- pend "~1.2.0"
-
-fill-range@^7.0.1:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
- integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
- dependencies:
- to-regex-range "^5.0.1"
-
-first-chunk-stream@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-2.0.0.tgz#1bdecdb8e083c0664b91945581577a43a9f31d70"
- integrity sha1-G97NuOCDwGZLkZRVgVd6Q6nzHXA=
- dependencies:
- readable-stream "^2.0.2"
-
-fork-stream@^0.0.4:
- version "0.0.4"
- resolved "https://registry.yarnpkg.com/fork-stream/-/fork-stream-0.0.4.tgz#db849fce77f6708a5f8f386ae533a0907b54ae70"
- integrity sha512-Pqq5NnT78ehvUnAk/We/Jr22vSvanRlFTpAmQ88xBY/M1TlHe+P0ILuEyXS595ysdGfaj22634LBkGMA2GTcpA==
-
-form-data@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682"
- integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==
- dependencies:
- asynckit "^0.4.0"
- combined-stream "^1.0.8"
- mime-types "^2.1.12"
-
-form-data@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
- integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
- dependencies:
- asynckit "^0.4.0"
- combined-stream "^1.0.8"
- mime-types "^2.1.12"
-
-fs-constants@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
- integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
-
-fs-extra@^8.1.0:
- version "8.1.0"
- resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
- integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
- dependencies:
- graceful-fs "^4.2.0"
- jsonfile "^4.0.0"
- universalify "^0.1.0"
-
-fs-extra@^9.0.1:
- version "9.1.0"
- resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d"
- integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
- dependencies:
- at-least-node "^1.0.0"
- graceful-fs "^4.2.0"
- jsonfile "^6.0.1"
- universalify "^2.0.0"
-
-fs.realpath@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
- integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
-
-fsevents@~2.3.1:
- version "2.3.2"
- resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
- integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
-
-fsevents@~2.3.2:
- version "2.3.3"
- resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
- integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
-
-function-bind@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
- integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
-
-get-intrinsic@^1.0.2:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385"
- integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==
- dependencies:
- function-bind "^1.1.1"
- has "^1.0.3"
- has-symbols "^1.0.3"
-
-get-stream@^5.1.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
- integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
- dependencies:
- pump "^3.0.0"
-
-github-from-package@0.0.0:
- version "0.0.0"
- resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
- integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=
-
-glob-parent@^5.1.1, glob-parent@~5.1.0, glob-parent@~5.1.2:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
- integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
- dependencies:
- is-glob "^4.0.1"
-
-glob@^7.0.6:
- version "7.2.3"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
- integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
- dependencies:
- fs.realpath "^1.0.0"
- inflight "^1.0.4"
- inherits "2"
- minimatch "^3.1.1"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
-
-glob@^7.1.3, glob@^7.1.6:
- version "7.1.7"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
- integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
- dependencies:
- fs.realpath "^1.0.0"
- inflight "^1.0.4"
- inherits "2"
- minimatch "^3.0.4"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
-
-global-agent@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6"
- integrity sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==
- dependencies:
- boolean "^3.0.1"
- es6-error "^4.1.1"
- matcher "^3.0.0"
- roarr "^2.15.3"
- semver "^7.3.2"
- serialize-error "^7.0.1"
-
-globalthis@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.2.tgz#2a235d34f4d8036219f7e34929b5de9e18166b8b"
- integrity sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==
- dependencies:
- define-properties "^1.1.3"
-
-got@^11.8.5:
- version "11.8.6"
- resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a"
- integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==
- dependencies:
- "@sindresorhus/is" "^4.0.0"
- "@szmarczak/http-timer" "^4.0.5"
- "@types/cacheable-request" "^6.0.1"
- "@types/responselike" "^1.0.0"
- cacheable-lookup "^5.0.3"
- cacheable-request "^7.0.2"
- decompress-response "^6.0.0"
- http2-wrapper "^1.0.0-beta.5.2"
- lowercase-keys "^2.0.0"
- p-cancelable "^2.0.0"
- responselike "^2.0.0"
-
-graceful-fs@^4.1.2:
- version "4.2.10"
- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
- integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
-
-graceful-fs@^4.1.6, graceful-fs@^4.2.0:
- version "4.2.8"
- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
- integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==
-
-"graceful-readlink@>= 1.0.0":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
- integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=
-
-gulp-merge-json@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/gulp-merge-json/-/gulp-merge-json-2.1.1.tgz#cfb1d066467577545b8c1c289a278e6ef4b4e0de"
- integrity sha512-VhvAlcf+dcCb94j/2yDPWxJ3X7x4P/Xwcrv1dhjYuRgvADwFJmaQwl4zbuq+GDZvzMacbVncWtEdsETpUSkhYw==
- dependencies:
- json5 "^2.1.3"
- lodash.mergewith "^4.6.1"
- plugin-error "^1.0.1"
- through "^2.3.8"
- vinyl "^2.1.0"
-
-has-flag@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
- integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
-
-has-symbols@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
- integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
-
-has@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
- integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
- dependencies:
- function-bind "^1.1.1"
-
-hosted-git-info@^4.0.2:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224"
- integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==
- dependencies:
- lru-cache "^6.0.0"
-
-htmlparser2@^8.0.1:
- version "8.0.1"
- resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.1.tgz#abaa985474fcefe269bc761a779b544d7196d010"
- integrity sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==
- dependencies:
- domelementtype "^2.3.0"
- domhandler "^5.0.2"
- domutils "^3.0.1"
- entities "^4.3.0"
-
-http-cache-semantics@^4.0.0:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a"
- integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==
-
-http-proxy-agent@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a"
- integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==
- dependencies:
- "@tootallnate/once" "1"
- agent-base "6"
- debug "4"
-
-http2-wrapper@^1.0.0-beta.5.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d"
- integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==
- dependencies:
- quick-lru "^5.1.1"
- resolve-alpn "^1.0.0"
-
-https-proxy-agent@^5.0.0:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6"
- integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==
- dependencies:
- agent-base "6"
- debug "4"
-
-ieee754@^1.1.13:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
- integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
-
-inflight@^1.0.4:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
- integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
- dependencies:
- once "^1.3.0"
- wrappy "1"
-
-inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
- integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
-
-ini@~1.3.0:
- version "1.3.8"
- resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
- integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
-
-is-binary-path@~2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
- integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
- dependencies:
- binary-extensions "^2.0.0"
-
-is-docker@^2.0.0, is-docker@^2.1.1:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
- integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
-
-is-extendable@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
- integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
- dependencies:
- is-plain-object "^2.0.4"
-
-is-extglob@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
- integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
-
-is-glob@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
- integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
- dependencies:
- is-extglob "^2.1.1"
-
-is-glob@~4.0.1:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
- integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
- dependencies:
- is-extglob "^2.1.1"
-
-is-number@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
- integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
-
-is-plain-object@^2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
- integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
- dependencies:
- isobject "^3.0.1"
-
-is-utf8@^0.2.0, is-utf8@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
- integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
-
-is-wsl@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
- integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
- dependencies:
- is-docker "^2.0.0"
-
-isarray@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
- integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
-
-isbinaryfile@^3.0.2:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80"
- integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==
- dependencies:
- buffer-alloc "^1.2.0"
-
-isexe@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
- integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
-
-isobject@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
- integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
-
-jsbi@^3.1.3:
- version "3.1.4"
- resolved "https://registry.yarnpkg.com/jsbi/-/jsbi-3.1.4.tgz#9654dd02207a66a4911b4e4bb74265bc2cbc9dd0"
- integrity sha512-52QRRFSsi9impURE8ZUbzAMCLjPm4THO7H2fcuIvaaeFTbSysvkodbQQXIVsNgq/ypDbq6dJiuGKL0vZ/i9hUg==
-
-json-buffer@3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
- integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
-
-json-stringify-safe@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
- integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
-
-json5@^2.1.3:
- version "2.2.2"
- resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.2.tgz#64471c5bdcc564c18f7c1d4df2e2297f2457c5ab"
- integrity sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==
-
-jsonc-parser@^2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-2.3.0.tgz#7c7fc988ee1486d35734faaaa866fadb00fa91ee"
- integrity sha512-b0EBt8SWFNnixVdvoR2ZtEGa9ZqLhbJnOjezn+WP+8kspFm+PFYDN8Z4Bc7pRlDjvuVcADSUkroIuTWWn/YiIA==
-
-jsonfile@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
- integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
- optionalDependencies:
- graceful-fs "^4.1.6"
-
-jsonfile@^6.0.1:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
- integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
- dependencies:
- universalify "^2.0.0"
- optionalDependencies:
- graceful-fs "^4.1.6"
-
-jsonwebtoken@^9.0.0:
- version "9.0.0"
- resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz#d0faf9ba1cc3a56255fe49c0961a67e520c1926d"
- integrity sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==
- dependencies:
- jws "^3.2.2"
- lodash "^4.17.21"
- ms "^2.1.1"
- semver "^7.3.8"
-
-jwa@^1.4.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a"
- integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==
- dependencies:
- buffer-equal-constant-time "1.0.1"
- ecdsa-sig-formatter "1.0.11"
- safe-buffer "^5.0.1"
-
-jwa@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.0.tgz#a7e9c3f29dae94027ebcaf49975c9345593410fc"
- integrity sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==
- dependencies:
- buffer-equal-constant-time "1.0.1"
- ecdsa-sig-formatter "1.0.11"
- safe-buffer "^5.0.1"
-
-jws@^3.2.2:
- version "3.2.2"
- resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304"
- integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==
- dependencies:
- jwa "^1.4.1"
- safe-buffer "^5.0.1"
-
-jws@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.0.tgz#2d4e8cf6a318ffaa12615e9dec7e86e6c97310f4"
- integrity sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==
- dependencies:
- jwa "^2.0.0"
- safe-buffer "^5.0.1"
-
-keytar@^7.7.0:
- version "7.9.0"
- resolved "https://registry.yarnpkg.com/keytar/-/keytar-7.9.0.tgz#4c6225708f51b50cbf77c5aae81721964c2918cb"
- integrity sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==
- dependencies:
- node-addon-api "^4.3.0"
- prebuild-install "^7.0.1"
-
-keyv@^4.0.0:
- version "4.5.4"
- resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
- integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
- dependencies:
- json-buffer "3.0.1"
-
-leven@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
- integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
-
-linkify-it@^3.0.1:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.3.tgz#a98baf44ce45a550efb4d49c769d07524cc2fa2e"
- integrity sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==
- dependencies:
- uc.micro "^1.0.1"
-
-lodash.mergewith@^4.6.1:
- version "4.6.2"
- resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55"
- integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==
-
-lodash@^4.17.21:
- version "4.17.21"
- resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
- integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
-
-lowercase-keys@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
- integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
-
-lru-cache@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
- integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
- dependencies:
- yallist "^4.0.0"
-
-markdown-it@^12.3.2:
- version "12.3.2"
- resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.3.2.tgz#bf92ac92283fe983fe4de8ff8abfb5ad72cd0c90"
- integrity sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==
- dependencies:
- argparse "^2.0.1"
- entities "~2.1.0"
- linkify-it "^3.0.1"
- mdurl "^1.0.1"
- uc.micro "^1.0.5"
-
-matcher@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca"
- integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==
- dependencies:
- escape-string-regexp "^4.0.0"
-
-mdurl@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e"
- integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==
-
-merge-stream@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
- integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
-
-mime-db@1.45.0:
- version "1.45.0"
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea"
- integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==
-
-mime-types@^2.1.12:
- version "2.1.28"
- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd"
- integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==
- dependencies:
- mime-db "1.45.0"
-
-mime@^1.3.4, mime@^1.4.1:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
- integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
-
-mimic-response@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
- integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
-
-mimic-response@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
- integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
-
-minimatch@3.0.4, minimatch@^3.0.4:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
- integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
- dependencies:
- brace-expansion "^1.1.7"
-
-minimatch@^3.0.3, minimatch@^3.1.1:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
- integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
- dependencies:
- brace-expansion "^1.1.7"
-
-minimist@^1.2.0, minimist@^1.2.3:
- version "1.2.6"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
- integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
-
-mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3:
- version "0.5.3"
- resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
- integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
-
-mkdirp@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
- integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
-
-ms@2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
- integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
-
-ms@2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
- integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-
-ms@^2.1.1:
- version "2.1.3"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
- integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
-
-mute-stream@~0.0.4:
- version "0.0.8"
- resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
- integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
-
-nan@^2.18.0:
- version "2.19.0"
- resolved "https://registry.yarnpkg.com/nan/-/nan-2.19.0.tgz#bb58122ad55a6c5bc973303908d5b16cfdd5a8c0"
- integrity sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==
-
-napi-build-utils@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806"
- integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==
-
-node-abi@^3.3.0:
- version "3.30.0"
- resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.30.0.tgz#d84687ad5d24ca81cdfa912a36f2c5c19b137359"
- integrity sha512-qWO5l3SCqbwQavymOmtTVuCWZE23++S+rxyoHjXqUmPyzRcaoI4lA2gO55/drddGnedAyjA7sk76SfQ5lfUMnw==
- dependencies:
- semver "^7.3.5"
-
-node-abort-controller@^3.0.0:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548"
- integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==
-
-node-addon-api@^4.3.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f"
- integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==
-
-node-fetch@^2.6.7:
- version "2.6.9"
- resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6"
- integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==
- dependencies:
- whatwg-url "^5.0.0"
-
-normalize-path@^3.0.0, normalize-path@~3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
- integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
-
-normalize-url@^6.0.1:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a"
- integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==
-
-nth-check@^2.0.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d"
- integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==
- dependencies:
- boolbase "^1.0.0"
-
-object-assign@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
- integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
-
-object-inspect@^1.9.0:
- version "1.12.2"
- resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea"
- integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==
-
-object-keys@^1.0.12:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
- integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
-
-once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
- integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
- dependencies:
- wrappy "1"
-
-open@^8.0.0:
- version "8.4.0"
- resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8"
- integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==
- dependencies:
- define-lazy-prop "^2.0.0"
- is-docker "^2.1.1"
- is-wsl "^2.2.0"
-
-p-cancelable@^2.0.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf"
- integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==
-
-parse-node-version@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b"
- integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==
-
-parse-semver@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/parse-semver/-/parse-semver-1.1.1.tgz#9a4afd6df063dc4826f93fba4a99cf223f666cb8"
- integrity sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==
- dependencies:
- semver "^5.1.0"
-
-parse5-htmlparser2-tree-adapter@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1"
- integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==
- dependencies:
- domhandler "^5.0.2"
- parse5 "^7.0.0"
-
-parse5@^7.0.0:
- version "7.1.2"
- resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32"
- integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==
- dependencies:
- entities "^4.4.0"
-
-path-is-absolute@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
- integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
-
-path-key@^3.1.0:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
- integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
-
-pend@~1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
- integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA=
-
-picomatch@^2.0.4:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
- integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==
-
-picomatch@^2.2.1:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
- integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
-
-pify@^2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
- integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==
-
-plist@^3.0.1:
- version "3.0.5"
- resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.5.tgz#2cbeb52d10e3cdccccf0c11a63a85d830970a987"
- integrity sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA==
- dependencies:
- base64-js "^1.5.1"
- xmlbuilder "^9.0.7"
-
-plugin-error@1.0.1, plugin-error@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c"
- integrity sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==
- dependencies:
- ansi-colors "^1.0.1"
- arr-diff "^4.0.0"
- arr-union "^3.1.0"
- extend-shallow "^3.0.2"
-
-prebuild-install@^7.0.1:
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45"
- integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==
- dependencies:
- detect-libc "^2.0.0"
- expand-template "^2.0.3"
- github-from-package "0.0.0"
- minimist "^1.2.3"
- mkdirp-classic "^0.5.3"
- napi-build-utils "^1.0.1"
- node-abi "^3.3.0"
- pump "^3.0.0"
- rc "^1.2.7"
- simple-get "^4.0.0"
- tar-fs "^2.0.0"
- tunnel-agent "^0.6.0"
-
-prebuild-install@^7.1.1:
- version "7.1.2"
- resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.2.tgz#a5fd9986f5a6251fbc47e1e5c65de71e68c0a056"
- integrity sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==
- dependencies:
- detect-libc "^2.0.0"
- expand-template "^2.0.3"
- github-from-package "0.0.0"
- minimist "^1.2.3"
- mkdirp-classic "^0.5.3"
- napi-build-utils "^1.0.1"
- node-abi "^3.3.0"
- pump "^3.0.0"
- rc "^1.2.7"
- simple-get "^4.0.0"
- tar-fs "^2.0.0"
- tunnel-agent "^0.6.0"
-
-priorityqueuejs@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/priorityqueuejs/-/priorityqueuejs-1.0.0.tgz#2ee4f23c2560913e08c07ce5ccdd6de3df2c5af8"
- integrity sha1-LuTyPCVgkT4IwHzlzN1t498sWvg=
-
-process-nextick-args@^2.0.0, process-nextick-args@~2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
- integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
-
-process@^0.11.10:
- version "0.11.10"
- resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
- integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
-
-progress@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
- integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
-
-pump@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
- integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
- dependencies:
- end-of-stream "^1.1.0"
- once "^1.3.1"
-
-qs@^6.9.1:
- 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"
-
-quick-lru@^5.1.1:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932"
- integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==
-
-rc@^1.2.7:
- version "1.2.8"
- resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
- integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
- dependencies:
- deep-extend "^0.6.0"
- ini "~1.3.0"
- minimist "^1.2.0"
- strip-json-comments "~2.0.1"
-
-read@^1.0.7:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4"
- integrity sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==
- dependencies:
- mute-stream "~0.0.4"
-
-"readable-stream@2 || 3", readable-stream@3, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0:
- version "3.6.0"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
- integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
- dependencies:
- inherits "^2.0.3"
- string_decoder "^1.1.1"
- util-deprecate "^1.0.1"
-
-readable-stream@^2.0.2, readable-stream@^2.3.5:
- version "2.3.7"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
- integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
- dependencies:
- core-util-is "~1.0.0"
- inherits "~2.0.3"
- isarray "~1.0.0"
- process-nextick-args "~2.0.0"
- safe-buffer "~5.1.1"
- string_decoder "~1.1.1"
- util-deprecate "~1.0.1"
-
-readdirp@~3.5.0:
- version "3.5.0"
- resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e"
- integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==
- dependencies:
- picomatch "^2.2.1"
-
-readdirp@~3.6.0:
- version "3.6.0"
- resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
- integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
- dependencies:
- picomatch "^2.2.1"
-
-remove-trailing-separator@^1.0.1:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
- integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
-
-replace-ext@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.1.tgz#2d6d996d04a15855d967443631dd5f77825b016a"
- integrity sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==
-
-resolve-alpn@^1.0.0:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9"
- integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==
-
-responselike@^2.0.0:
- 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"
-
-rimraf@^3.0.0:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
- integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
- dependencies:
- glob "^7.1.3"
-
-roarr@^2.15.3:
- version "2.15.4"
- resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd"
- integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==
- dependencies:
- boolean "^3.0.1"
- detect-node "^2.0.4"
- globalthis "^1.0.1"
- json-stringify-safe "^5.0.1"
- semver-compare "^1.0.0"
- sprintf-js "^1.1.2"
-
-safe-buffer@^5.0.1, safe-buffer@~5.2.0:
- version "5.2.1"
- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
- integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
-
-safe-buffer@~5.1.0, safe-buffer@~5.1.1:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
- integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
-
-sax@>=0.6.0:
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
- integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
-
-semaphore@^1.0.5:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa"
- integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==
-
-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=
-
-semver@^5.1.0:
- version "5.7.2"
- resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
- integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
-
-semver@^6.2.0:
- version "6.3.1"
- resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
- integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
-
-semver@^7.3.2, semver@^7.3.5, semver@^7.3.8:
- version "7.5.4"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
- integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
- dependencies:
- lru-cache "^6.0.0"
-
-serialize-error@^7.0.1:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18"
- integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==
- dependencies:
- type-fest "^0.13.1"
-
-shebang-command@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
- integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
- dependencies:
- shebang-regex "^3.0.0"
-
-shebang-regex@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
- integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
-
-side-channel@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
- integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
- dependencies:
- call-bind "^1.0.0"
- get-intrinsic "^1.0.2"
- object-inspect "^1.9.0"
-
-simple-concat@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
- integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
-
-simple-get@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543"
- integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==
- dependencies:
- decompress-response "^6.0.0"
- once "^1.3.1"
- simple-concat "^1.0.0"
-
-source-map@0.6.1:
- version "0.6.1"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
- integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
-
-sprintf-js@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673"
- integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==
-
-stoppable@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/stoppable/-/stoppable-1.1.0.tgz#32da568e83ea488b08e4d7ea2c3bcc9d75015d5b"
- integrity sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==
-
-stream-exhaust@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/stream-exhaust/-/stream-exhaust-1.0.2.tgz#acdac8da59ef2bc1e17a2c0ccf6c320d120e555d"
- integrity sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==
-
-stream-shift@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d"
- integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==
-
-string_decoder@^1.1.1:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
- integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
- dependencies:
- safe-buffer "~5.2.0"
-
-string_decoder@~1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
- integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
- dependencies:
- safe-buffer "~5.1.0"
-
-strip-bom-buf@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz#1cb45aaf57530f4caf86c7f75179d2c9a51dd572"
- integrity sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI=
- dependencies:
- is-utf8 "^0.2.1"
-
-strip-bom-stream@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-2.0.0.tgz#f87db5ef2613f6968aa545abfe1ec728b6a829ca"
- integrity sha1-+H217yYT9paKpUWr/h7HKLaoKco=
- dependencies:
- first-chunk-stream "^2.0.0"
- strip-bom "^2.0.0"
-
-strip-bom@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
- integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=
- dependencies:
- is-utf8 "^0.2.0"
-
-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=
-
-sumchecker@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42"
- integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==
- dependencies:
- debug "^4.1.0"
-
-supports-color@^5.3.0:
- version "5.5.0"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
- integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
- dependencies:
- has-flag "^3.0.0"
-
-tar-fs@^2.0.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784"
- integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==
- dependencies:
- chownr "^1.1.1"
- mkdirp-classic "^0.5.2"
- pump "^3.0.0"
- tar-stream "^2.1.4"
-
-tar-stream@^2.1.4:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
- integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==
- dependencies:
- bl "^4.0.3"
- end-of-stream "^1.4.1"
- fs-constants "^1.0.0"
- inherits "^2.0.3"
- readable-stream "^3.1.1"
-
-ternary-stream@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/ternary-stream/-/ternary-stream-3.0.0.tgz#7951930ea9e823924d956f03d516151a2d516253"
- integrity sha512-oIzdi+UL/JdktkT+7KU5tSIQjj8pbShj3OASuvDEhm0NT5lppsm7aXWAmAq4/QMaBIyfuEcNLbAQA+HpaISobQ==
- dependencies:
- duplexify "^4.1.1"
- fork-stream "^0.0.4"
- merge-stream "^2.0.0"
- through2 "^3.0.1"
-
-through2@^3.0.1:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4"
- integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==
- dependencies:
- inherits "^2.0.4"
- readable-stream "2 || 3"
-
-through2@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764"
- integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==
- dependencies:
- readable-stream "3"
-
-through@^2.3.8:
- version "2.3.8"
- resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
- integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
-
-time-stamp@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3"
- integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=
-
-tmp@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14"
- integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==
- dependencies:
- rimraf "^3.0.0"
-
-to-regex-range@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
- integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
- dependencies:
- is-number "^7.0.0"
-
-tr46@~0.0.3:
- version "0.0.3"
- resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
- integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=
-
-tree-sitter-typescript@^0.20.5:
- version "0.20.5"
- resolved "https://registry.yarnpkg.com/tree-sitter-typescript/-/tree-sitter-typescript-0.20.5.tgz#29e30c052bcb06cb992ffd2d392e010b0e1768b3"
- integrity sha512-RzK/Pc6k4GiXvInIBlo8ZggekP6rODfW2P6KHFCTSUHENsw6ynh+iacFhfkJRa4MT8EIN2WHygFJ7076/+eHKg==
- dependencies:
- nan "^2.18.0"
- tree-sitter "^0.20.6"
-
-tree-sitter@^0.20.5, tree-sitter@^0.20.6:
- version "0.20.6"
- resolved "https://registry.yarnpkg.com/tree-sitter/-/tree-sitter-0.20.6.tgz#fec52e5d7cc6c583135756479f2440dd89b25cbe"
- integrity sha512-GxJodajVpfgb3UREzzIbtA1hyRnTxVbWVXrbC6sk4xTMH5ERMBJk9HJNq4c8jOJeUaIOmLcwg+t6mez/PDvGqg==
- dependencies:
- nan "^2.18.0"
- prebuild-install "^7.1.1"
-
-tslib@^2.0.0:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c"
- integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==
-
-tslib@^2.2.0:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
- integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
-
-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=
- dependencies:
- safe-buffer "^5.0.1"
-
-tunnel@0.0.6, tunnel@^0.0.6:
- version "0.0.6"
- resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c"
- integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==
-
-type-fest@^0.13.1:
- version "0.13.1"
- resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934"
- integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==
-
-typed-rest-client@^1.8.4:
- version "1.8.9"
- resolved "https://registry.yarnpkg.com/typed-rest-client/-/typed-rest-client-1.8.9.tgz#e560226bcadfe71b0fb5c416b587f8da3b8f92d8"
- integrity sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==
- dependencies:
- qs "^6.9.1"
- tunnel "0.0.6"
- underscore "^1.12.1"
-
-uc.micro@^1.0.1, uc.micro@^1.0.5:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac"
- integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==
-
-underscore@^1.12.1:
- version "1.13.6"
- resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441"
- integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==
-
-undici-types@~5.26.4:
- version "5.26.5"
- resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
- integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
-
-universal-user-agent@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee"
- integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==
-
-universalify@^0.1.0:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
- integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
-
-universalify@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
- integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
-
-url-join@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7"
- integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==
-
-util-deprecate@^1.0.1, 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=
-
-uuid@^8.3.0:
- version "8.3.1"
- resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31"
- integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==
-
-vinyl-file@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/vinyl-file/-/vinyl-file-3.0.0.tgz#b104d9e4409ffa325faadd520642d0a3b488b365"
- integrity sha1-sQTZ5ECf+jJfqt1SBkLQo7SIs2U=
- dependencies:
- graceful-fs "^4.1.2"
- pify "^2.3.0"
- strip-bom-buf "^1.0.0"
- strip-bom-stream "^2.0.0"
- vinyl "^2.0.1"
-
-vinyl@^2.0.1, vinyl@^2.1.0, vinyl@^2.2.0:
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.1.tgz#23cfb8bbab5ece3803aa2c0a1eb28af7cbba1974"
- integrity sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==
- dependencies:
- clone "^2.1.1"
- clone-buffer "^1.0.0"
- clone-stats "^1.0.0"
- cloneable-readable "^1.0.0"
- remove-trailing-separator "^1.0.1"
- replace-ext "^1.0.0"
-
-vscode-gulp-watch@^5.0.3:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/vscode-gulp-watch/-/vscode-gulp-watch-5.0.3.tgz#1ca1c03581d43692ecb1fe0b9afd4256faeb701b"
- integrity sha512-MTUp2yLE9CshhkNSNV58EQNxQSeF8lIj3mkXZX9a1vAk+EQNM2PAYdPUDSd/P/08W3PMHGznEiZyfK7JAjLosg==
- dependencies:
- ansi-colors "4.1.1"
- anymatch "^3.1.1"
- chokidar "3.5.1"
- fancy-log "^1.3.3"
- glob-parent "^5.1.1"
- normalize-path "^3.0.0"
- object-assign "^4.1.1"
- plugin-error "1.0.1"
- readable-stream "^3.6.0"
- vinyl "^2.2.0"
- vinyl-file "^3.0.0"
-
-vscode-universal-bundler@^0.0.2:
- version "0.0.2"
- resolved "https://registry.yarnpkg.com/vscode-universal-bundler/-/vscode-universal-bundler-0.0.2.tgz#2c988dac681d3ffe6baec6defac0995cb833c55a"
- integrity sha512-FPJcvKnQGBqFzy6M6Nm2yvAczNLUeXsfYM6GwCex/pUOkvIM2icIHmiSvtMJINlLW1iG+oEwE3/LVbABmcjEmQ==
- dependencies:
- "@malept/cross-spawn-promise" "^1.1.0"
- asar "^3.0.3"
- debug "^4.3.1"
- dir-compare "^2.4.0"
- fs-extra "^9.0.1"
-
-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=
-
-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=
- dependencies:
- tr46 "~0.0.3"
- webidl-conversions "^3.0.0"
-
-which@^2.0.1:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
- integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
- dependencies:
- isexe "^2.0.0"
-
-workerpool@^6.4.0:
- version "6.5.0"
- resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.0.tgz#f8474762c5e2f81646994aa113685f6c424a2416"
- integrity sha512-r64Ea3glXY2RVzMeNxB+4J+0YHAVzUdV4cM5nHi4BBC2LvnO1pWFAIYKYuGcPElbg1/7eEiaPtZ/jzCjIUuGBg==
-
-wrappy@1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
- integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
-
-xml2js@^0.4.19, xml2js@^0.4.23:
- version "0.4.23"
- resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66"
- integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==
- dependencies:
- sax ">=0.6.0"
- xmlbuilder "~11.0.0"
-
-xmlbuilder@^9.0.7:
- version "9.0.7"
- resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d"
- integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=
-
-xmlbuilder@~11.0.0:
- version "11.0.1"
- resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3"
- integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==
-
-yallist@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
- integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
-
-yauzl@^2.10.0, yauzl@^2.3.1:
- version "2.10.0"
- resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
- integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=
- dependencies:
- buffer-crc32 "~0.2.3"
- fd-slicer "~1.1.0"
-
-yazl@^2.2.2:
- version "2.5.1"
- resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.5.1.tgz#a3d65d3dd659a5b0937850e8609f22fffa2b5c35"
- integrity sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==
- dependencies:
- buffer-crc32 "~0.2.3"
diff --git a/cglicenses.json b/cglicenses.json
index d90d55d7315..0b4e03e502b 100644
--- a/cglicenses.json
+++ b/cglicenses.json
@@ -1,7 +1,7 @@
// -----------------------------------------------------------------------------------------
// -----------------------------------------------------------------------------------------
// This file overrides licenses only for OSS components which do not appear in `cgmanifest.json`.
-// i.e. for OSS components that are detected from `yarn.lock` or `Cargo.lock` files.
+// i.e. for OSS components that are detected from `package-lock.json` or `Cargo.lock` files.
//
// DO NOT EDIT THIS FILE UNLESS THE OSS TOOL INDICATES THAT YOU SHOULD.
//
@@ -40,12 +40,6 @@
"Copyright (c) Microsoft Corporation. All rights reserved."
]
},
- {
- "name": "big-integer",
- "prependLicenseText": [
- "Copyright released to public domain"
- ]
- },
{
// Reason: The license cannot be found by the tool due to access controls on the repository
"name": "vscode-tas-client",
@@ -247,33 +241,6 @@
"CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
]
},
- {
- // Reason: The substack org has been deleted on GH
- "name": "mkdirp",
- "fullLicenseText": [
- "Copyright 2010 James Halliday (mail@substack.net)",
- "",
- "This project is free software released under the MIT/X11 license:",
- "",
- "Permission is hereby granted, free of charge, to any person obtaining a copy",
- "of this software and associated documentation files (the \"Software\"), to deal",
- "in the Software without restriction, including without limitation the rights",
- "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell",
- "copies of the Software, and to permit persons to whom the Software is",
- "furnished to do so, subject to the following conditions:",
- "",
- "The above copyright notice and this permission notice shall be included in",
- "all copies or substantial portions of the Software.",
- "",
- "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR",
- "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,",
- "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE",
- "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER",
- "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,",
- "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN",
- "THE SOFTWARE."
- ]
- },
{
// Reason: repo URI is wrong on crate, pending https://github.com/warp-tech/russh/pull/53
"name": "russh-cryptovec",
@@ -567,6 +534,32 @@
"SOFTWARE"
]
},
+ {
+ "name":"vscode-markdown-languageserver",
+ "fullLicenseText": [
+ "MIT License",
+ "",
+ "Copyright (c) Microsoft Corporation.",
+ "",
+ "Permission is hereby granted, free of charge, to any person obtaining a copy",
+ "of this software and associated documentation files (the \"Software\"), to deal",
+ "in the Software without restriction, including without limitation the rights",
+ "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell",
+ "copies of the Software, and to permit persons to whom the Software is",
+ "furnished to do so, subject to the following conditions:",
+ "",
+ "The above copyright notice and this permission notice shall be included in all",
+ "copies or substantial portions of the Software.",
+ "",
+ "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR",
+ "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,",
+ "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE",
+ "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER",
+ "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,",
+ "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE",
+ "SOFTWARE"
+ ]
+ },
{
// Reason: mono-repo where the individual packages are also dual-licensed under MIT and Apache-2.0
"name": "system-configuration",
diff --git a/cgmanifest.json b/cgmanifest.json
index 61747342eef..d81b79c0e0c 100644
--- a/cgmanifest.json
+++ b/cgmanifest.json
@@ -6,7 +6,7 @@
"git": {
"name": "chromium",
"repositoryUrl": "https://chromium.googlesource.com/chromium/src",
- "commitHash": "f1a45d7ded05d64ca8136cc142ddc0c271b1dd43"
+ "commitHash": "7fa4f6e14e0707c0e604cf7c1da33566e78169ce"
}
},
"licenseDetail": [
@@ -40,7 +40,7 @@
"SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
],
"isOnlyProductionDependency": true,
- "version": "122.0.6261.156"
+ "version": "124.0.6367.243"
},
{
"component": {
@@ -48,7 +48,7 @@
"git": {
"name": "ffmpeg",
"repositoryUrl": "https://chromium.googlesource.com/chromium/third_party/ffmpeg",
- "commitHash": "17525de887d54b970ffdd421a0879c1db1952307"
+ "commitHash": "52d8ef3799b2f16b66351dd0972bb0bcee1648ac"
}
},
"isOnlyProductionDependency": true,
@@ -516,11 +516,11 @@
"git": {
"name": "nodejs",
"repositoryUrl": "https://github.com/nodejs/node",
- "commitHash": "9b1bf44ea9e7785e38c93b7d22d32dbca262df6c"
+ "commitHash": "1968ef32415607643770efb320d7d4e941baaa25"
}
},
"isOnlyProductionDependency": true,
- "version": "20.11.1"
+ "version": "20.16.0"
},
{
"component": {
@@ -528,12 +528,12 @@
"git": {
"name": "electron",
"repositoryUrl": "https://github.com/electron/electron",
- "commitHash": "f9ed0eaee4b172733872c2f84e5061882dd08e5c"
+ "commitHash": "a07a70e8db21718dd76644d99892d3e15e0ed440"
}
},
"isOnlyProductionDependency": true,
"license": "MIT",
- "version": "29.4.0"
+ "version": "30.5.1"
},
{
"component": {
@@ -732,6 +732,39 @@
"SOFTWARE."
],
"license": "MIT"
+ },
+ {
+ "component": {
+ "type": "npm",
+ "npm": {
+ "name": "cacheable-request",
+ "version": "7.0.4"
+ }
+ },
+ "licenseDetail": [
+ "Copyright (c) cacheable-request authors",
+ "",
+ "MIT License",
+ "",
+ "Permission is hereby granted, free of charge, to any person obtaining a copy",
+ "of this software and associated documentation files (the \"Software\"), to",
+ "deal in the Software without restriction, including without limitation the",
+ "rights to use, copy, modify, merge, publish, distribute, sublicense, and/or",
+ "sell copies of the Software, and to permit persons to whom the Software is",
+ "furnished to do so, subject to the following conditions:",
+ "",
+ "The above copyright notice and this permission notice shall be included in",
+ "all copies or substantial portions of the Software.",
+ "",
+ "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR",
+ "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,",
+ "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE",
+ "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER",
+ "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING",
+ "FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER",
+ "DEALINGS IN THE SOFTWARE."
+ ],
+ "license": "MIT"
}
],
"version": 1
diff --git a/cli/Cargo.lock b/cli/Cargo.lock
index 3be3815a748..27fe79896a2 100644
--- a/cli/Cargo.lock
+++ b/cli/Cargo.lock
@@ -1571,9 +1571,9 @@ dependencies = [
[[package]]
name = "openssl"
-version = "0.10.64"
+version = "0.10.66"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f"
+checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1"
dependencies = [
"bitflags 2.5.0",
"cfg-if",
@@ -1603,9 +1603,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
[[package]]
name = "openssl-sys"
-version = "0.9.102"
+version = "0.9.103"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2"
+checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6"
dependencies = [
"cc",
"libc",
diff --git a/cli/Cargo.toml b/cli/Cargo.toml
index b820ffcc50f..2907ff3d7e7 100644
--- a/cli/Cargo.toml
+++ b/cli/Cargo.toml
@@ -81,4 +81,5 @@ codegen-units = 1
[features]
default = []
+vsda = []
vscode-encrypt = []
diff --git a/cli/ThirdPartyNotices.txt b/cli/ThirdPartyNotices.txt
index 7a74fb503c5..4bbc90b30ee 100644
--- a/cli/ThirdPartyNotices.txt
+++ b/cli/ThirdPartyNotices.txt
@@ -22,31 +22,16 @@ required to debug changes to any libraries licensed under the GNU Lesser General
addr2line 0.21.0 - Apache-2.0 OR MIT
https://github.com/gimli-rs/addr2line
-Copyright (c) 2016-2018 The gimli Developers
+Licensed under either of
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
+ * Apache License, Version 2.0 ([`LICENSE-APACHE`](./LICENSE-APACHE) or https://www.apache.org/licenses/LICENSE-2.0)
+ * MIT license ([`LICENSE-MIT`](./LICENSE-MIT) or https://opensource.org/licenses/MIT)
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
+at your option.
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
+Unless you explicitly state otherwise, any contribution intentionally submitted
+for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
+dual licensed as above, without any additional terms or conditions.
---------------------------------------------------------
---------------------------------------------------------
@@ -292,27 +277,18 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
async-broadcast 0.5.1 - MIT OR Apache-2.0
https://github.com/smol-rs/async-broadcast
-The MIT License (MIT)
+
+Licensed under either of Apache License, Version
+2.0 (LICENSE-APACHE) or MIT license (LICENSE-MIT) at your option.
+
-Copyright (c) 2020 Yoshua Wuyts
+
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
+
+Unless you explicitly state otherwise, any contribution intentionally submitted
+for inclusion in this crate by you, as defined in the Apache-2.0 license, shall
+be dual licensed as above, without any additional terms or conditions.
+
---------------------------------------------------------
---------------------------------------------------------
@@ -320,29 +296,18 @@ SOFTWARE.
async-channel 2.3.1 - Apache-2.0 OR MIT
https://github.com/smol-rs/async-channel
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
+Licensed under either of
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
+ * Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
+ * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
+at your option.
+
+#### Contribution
+
+Unless you explicitly state otherwise, any contribution intentionally submitted
+for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
+dual licensed as above, without any additional terms or conditions.
---------------------------------------------------------
---------------------------------------------------------
@@ -382,29 +347,18 @@ async-lock 2.8.0 - Apache-2.0 OR MIT
async-lock 3.3.0 - Apache-2.0 OR MIT
https://github.com/smol-rs/async-lock
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
+Licensed under either of
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
+ * Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
+ * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
+at your option.
+
+#### Contribution
+
+Unless you explicitly state otherwise, any contribution intentionally submitted
+for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
+dual licensed as above, without any additional terms or conditions.
---------------------------------------------------------
---------------------------------------------------------
@@ -412,29 +366,18 @@ DEALINGS IN THE SOFTWARE.
async-process 1.8.1 - Apache-2.0 OR MIT
https://github.com/smol-rs/async-process
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
+Licensed under either of
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
+ * Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
+ * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
+at your option.
+
+#### Contribution
+
+Unless you explicitly state otherwise, any contribution intentionally submitted
+for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
+dual licensed as above, without any additional terms or conditions.
---------------------------------------------------------
---------------------------------------------------------
@@ -442,29 +385,13 @@ DEALINGS IN THE SOFTWARE.
async-recursion 1.1.1 - MIT OR Apache-2.0
https://github.com/dcchut/async-recursion
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
+Licensed under either of
+ * Apache License, Version 2.0
+ ([LICENSE-APACHE](LICENSE-APACHE) or )
+ * MIT license
+ ([LICENSE-MIT](LICENSE-MIT) or )
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
+at your option.
---------------------------------------------------------
---------------------------------------------------------
@@ -502,29 +429,18 @@ DEALINGS IN THE SOFTWARE.
async-task 4.7.1 - Apache-2.0 OR MIT
https://github.com/smol-rs/async-task
-Permission is hereby granted, free of charge, to any
-person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the
-Software without restriction, including without
-limitation the rights to use, copy, modify, merge,
-publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software
-is furnished to do so, subject to the following
-conditions:
+Licensed under either of
-The above copyright notice and this permission notice
-shall be included in all copies or substantial portions
-of the Software.
+ * Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
+ * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
-ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
-IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
+at your option.
+
+#### Contribution
+
+Unless you explicitly state otherwise, any contribution intentionally submitted
+for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
+dual licensed as above, without any additional terms or conditions.
---------------------------------------------------------
---------------------------------------------------------
@@ -1341,7 +1257,7 @@ SOFTWARE.
---------------------------------------------------------
clap_derive 4.5.4 - MIT OR Apache-2.0
-https://github.com/clap-rs/clap/tree/master/clap_derive
+https://github.com/clap-rs/clap
Copyright (c) Individual contributors
@@ -1367,7 +1283,7 @@ SOFTWARE.
---------------------------------------------------------
clap_lex 0.7.0 - MIT OR Apache-2.0
-https://github.com/clap-rs/clap/tree/master/clap_lex
+https://github.com/clap-rs/clap
Copyright (c) Individual contributors
@@ -3343,6 +3259,7 @@ Unless you explicitly state otherwise, any contribution intentionally submitted
[`cmac`]: ./cmac
[`hmac`]: ./hmac
[`pmac`]: ./pmac
+[`retail-mac`]: ./retail-mac
[//]: # (footnotes)
@@ -3355,6 +3272,7 @@ Unless you explicitly state otherwise, any contribution intentionally submitted
[CMAC]: https://en.wikipedia.org/wiki/One-key_MAC
[HMAC]: https://en.wikipedia.org/wiki/HMAC
[PMAC]: https://en.wikipedia.org/wiki/PMAC_(cryptography)
+[Retail MAC]: https://en.wikipedia.org/wiki/ISO/IEC_9797-1#MAC_algorithm_3
---------------------------------------------------------
---------------------------------------------------------
@@ -3396,7 +3314,7 @@ https://github.com/hyperium/http-body
The MIT License (MIT)
-Copyright (c) 2019 Hyper Contributors
+Copyright (c) 2019-2024 Sean McArthur & Hyper Contributors
Permission is hereby granted, free of charge, to any
person obtaining a copy of this software and associated
@@ -3428,7 +3346,7 @@ DEALINGS IN THE SOFTWARE.
httparse 1.8.0 - MIT/Apache-2.0
https://github.com/seanmonstar/httparse
-Copyright (c) 2015-2021 Sean McArthur
+Copyright (c) 2015-2024 Sean McArthur
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -4896,7 +4814,7 @@ OTHER DEALINGS IN THE SOFTWARE.
---------------------------------------------------------
-openssl 0.10.64 - Apache-2.0
+openssl 0.10.66 - Apache-2.0
https://github.com/sfackler/rust-openssl
Copyright 2011-2017 Google Inc.
@@ -4975,7 +4893,7 @@ DEALINGS IN THE SOFTWARE.
---------------------------------------------------------
-openssl-sys 0.9.102 - MIT
+openssl-sys 0.9.103 - MIT
https://github.com/sfackler/rust-openssl
The MIT License (MIT)
@@ -8507,6 +8425,7 @@ subtle 2.5.0 - BSD-3-Clause
https://github.com/dalek-cryptography/subtle
Copyright (c) 2016-2017 Isis Agora Lovecruft, Henry de Valence. All rights reserved.
+Copyright (c) 2016-2024 Isis Agora Lovecruft. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
diff --git a/cli/src/async_pipe.rs b/cli/src/async_pipe.rs
index e9b710c1d68..78aed6fe3e7 100644
--- a/cli/src/async_pipe.rs
+++ b/cli/src/async_pipe.rs
@@ -227,7 +227,7 @@ impl hyper::server::accept::Accept for PollableAsyncListener {
}
}
-/// Gets a random name for a pipe/socket on the paltform
+/// Gets a random name for a pipe/socket on the platform
pub fn get_socket_name() -> PathBuf {
cfg_if::cfg_if! {
if #[cfg(unix)] {
diff --git a/cli/src/auth.rs b/cli/src/auth.rs
index 67f1bfa6bc7..51942c96c75 100644
--- a/cli/src/auth.rs
+++ b/cli/src/auth.rs
@@ -287,7 +287,7 @@ impl StorageImplementation for ThreadKeyringStorage {
#[derive(Default)]
struct KeyringStorage {
- // keywring storage can be split into multiple entries due to entry length limits
+ // keyring storage can be split into multiple entries due to entry length limits
// on Windows https://github.com/microsoft/vscode-cli/issues/358
entries: Vec,
}
@@ -723,7 +723,7 @@ impl Auth {
match &init_code_json.message {
Some(m) => self.log.result(m),
- None => self.log.result(&format!(
+ None => self.log.result(format!(
"To grant access to the server, please log into {} and use code {}",
init_code_json.verification_uri, init_code_json.user_code
)),
diff --git a/cli/src/commands/args.rs b/cli/src/commands/args.rs
index 79c4d3767a1..7a8cf1f4f62 100644
--- a/cli/src/commands/args.rs
+++ b/cli/src/commands/args.rs
@@ -64,7 +64,7 @@ pub struct IntegratedCli {
pub core: CliCore,
}
-/// Common CLI shared between intergated and standalone interfaces.
+/// Common CLI shared between integrated and standalone interfaces.
#[derive(Args, Debug, Default, Clone)]
pub struct CliCore {
/// One or more files, folders, or URIs to open.
@@ -226,12 +226,15 @@ pub struct ServeWebArgs {
#[derive(Args, Debug, Clone)]
pub struct CommandShellArgs {
+ #[clap(flatten)]
+ pub server_args: BaseServerArgs,
+
/// Listen on a socket instead of stdin/stdout.
#[clap(long)]
pub on_socket: bool,
/// Listen on a host/port instead of stdin/stdout.
- #[clap(long, num_args = 0..=1, default_missing_value = "0")]
- pub on_port: Option,
+ #[clap(long, num_args = 0..=2, default_missing_value = "0")]
+ pub on_port: Vec,
/// Listen on a host/port instead of stdin/stdout.
#[clap[long]]
pub on_host: Option,
@@ -619,7 +622,7 @@ pub enum OutputFormat {
#[derive(Args, Clone, Debug, Default)]
pub struct ExistingTunnelArgs {
/// Name you'd like to assign preexisting tunnel to use to connect the tunnel
- /// Old option, new code sohuld just use `--name`.
+ /// Old option, new code should just use `--name`.
#[clap(long, hide = true)]
pub tunnel_name: Option,
@@ -638,6 +641,9 @@ pub struct ExistingTunnelArgs {
#[derive(Args, Debug, Clone, Default)]
pub struct TunnelServeArgs {
+ #[clap(flatten)]
+ pub server_args: BaseServerArgs,
+
/// Optional details to connect to an existing tunnel
#[clap(flatten, next_help_heading = Some("ADVANCED OPTIONS"))]
pub tunnel: ExistingTunnelArgs,
@@ -661,7 +667,10 @@ pub struct TunnelServeArgs {
/// If set, the user accepts the server license terms and the server will be started without a user prompt.
#[clap(long)]
pub accept_server_license_terms: bool,
+}
+#[derive(Args, Debug, Clone, Default)]
+pub struct BaseServerArgs {
/// Requests that extensions be preloaded and installed on connecting servers.
#[clap(long)]
pub install_extension: Vec,
@@ -675,8 +684,8 @@ pub struct TunnelServeArgs {
pub extensions_dir: Option,
}
-impl TunnelServeArgs {
- pub fn apply_to_server_args(&self, csa: &mut CodeServerArgs) {
+impl BaseServerArgs {
+ pub fn apply_to(&self, csa: &mut CodeServerArgs) {
csa.install_extensions
.extend_from_slice(&self.install_extension);
diff --git a/cli/src/commands/serve_web.rs b/cli/src/commands/serve_web.rs
index 12c0cdafec9..4acb9a18c73 100644
--- a/cli/src/commands/serve_web.rs
+++ b/cli/src/commands/serve_web.rs
@@ -15,7 +15,7 @@ use std::time::{Duration, Instant};
use hyper::service::{make_service_fn, service_fn};
use hyper::{Body, Request, Response, Server};
use tokio::io::{AsyncBufReadExt, BufReader};
-use tokio::pin;
+use tokio::{pin, time};
use crate::async_pipe::{
get_socket_name, get_socket_rw_stream, listen_socket_rw_stream, AsyncPipe,
@@ -50,7 +50,7 @@ const SERVER_IDLE_TIMEOUT_SECS: u64 = 60 * 60;
/// (should be large enough to basically never happen)
const SERVER_ACTIVE_TIMEOUT_SECS: u64 = SERVER_IDLE_TIMEOUT_SECS * 24 * 30 * 12;
/// How long to cache the "latest" version we get from the update service.
-const RELEASE_CACHE_SECS: u64 = 60 * 60;
+const RELEASE_CHECK_INTERVAL: u64 = 60 * 60;
/// Number of bytes for the secret keys. See workbench.ts for their usage.
const SECRET_KEY_BYTES: usize = 32;
@@ -71,16 +71,26 @@ pub async fn serve_web(ctx: CommandContext, mut args: ServeWebArgs) -> Result = ConnectionManager::new(&ctx, platform, args.clone());
+ let update_check_interval = 3600;
+ cm.clone()
+ .start_update_checker(Duration::from_secs(update_check_interval));
+
let key = get_server_key_half(&ctx.paths);
let make_svc = move || {
let ctx = HandleContext {
@@ -169,7 +179,7 @@ async fn handle_proxied(ctx: &HandleContext, req: Request) -> Response r,
Err(e) => {
error!(ctx.log, "error getting latest version: {}", e);
@@ -532,21 +542,67 @@ impl ConnectionManager {
pub fn new(ctx: &CommandContext, platform: Platform, args: ServeWebArgs) -> Arc {
let base_path = normalize_base_path(args.server_base_path.as_deref().unwrap_or_default());
+ let cache = DownloadCache::new(ctx.paths.web_server_storage());
+ let target_kind = TargetKind::Web;
+
+ let quality = VSCODE_CLI_QUALITY.map_or(Quality::Stable, |q| match Quality::try_from(q) {
+ Ok(q) => q,
+ Err(_) => Quality::Stable,
+ });
+
+ let latest_version = tokio::sync::Mutex::new(cache.get().first().map(|latest_commit| {
+ (
+ Instant::now() - Duration::from_secs(RELEASE_CHECK_INTERVAL),
+ Release {
+ name: String::from("0.0.0"), // Version information not stored on cache
+ commit: latest_commit.clone(),
+ platform,
+ target: target_kind,
+ quality,
+ },
+ )
+ }));
+
Arc::new(Self {
platform,
args,
base_path,
log: ctx.log.clone(),
- cache: DownloadCache::new(ctx.paths.web_server_storage()),
+ cache,
update_service: UpdateService::new(
ctx.log.clone(),
Arc::new(ReqwestSimpleHttp::with_client(ctx.http.clone())),
),
state: ConnectionStateMap::default(),
- latest_version: tokio::sync::Mutex::default(),
+ latest_version,
})
}
+ // spawns a task that checks for updates every n seconds duration
+ pub fn start_update_checker(self: Arc, duration: Duration) {
+ tokio::spawn(async move {
+ let mut interval = time::interval(duration);
+ loop {
+ interval.tick().await;
+
+ if let Err(e) = self.get_latest_release().await {
+ warning!(self.log, "error getting latest version: {}", e);
+ }
+ }
+ });
+ }
+
+ // Returns the latest release from the cache, if one exists.
+ pub async fn get_release_from_cache(&self) -> Result {
+ let latest = self.latest_version.lock().await;
+ if let Some((_, release)) = &*latest {
+ return Ok(release.clone());
+ }
+
+ drop(latest);
+ self.get_latest_release().await
+ }
+
/// Gets a connection to a server version
pub async fn get_connection(
&self,
@@ -565,11 +621,7 @@ impl ConnectionManager {
pub async fn get_latest_release(&self) -> Result {
let mut latest = self.latest_version.lock().await;
let now = Instant::now();
- if let Some((checked_at, release)) = &*latest {
- if checked_at.elapsed() < Duration::from_secs(RELEASE_CACHE_SECS) {
- return Ok(release.clone());
- }
- }
+ let target_kind = TargetKind::Web;
let quality = VSCODE_CLI_QUALITY
.ok_or_else(|| CodeError::UpdatesNotConfigured("no configured quality"))
@@ -579,13 +631,14 @@ impl ConnectionManager {
let release = self
.update_service
- .get_latest_commit(self.platform, TargetKind::Web, quality)
+ .get_latest_commit(self.platform, target_kind, quality)
.await
.map_err(|e| CodeError::UpdateCheckFailed(e.to_string()));
// If the update service is unavailable and we have stale data, use that
- if let (Err(e), Some((_, previous))) = (&release, &*latest) {
+ if let (Err(e), Some((_, previous))) = (&release, latest.clone()) {
warning!(self.log, "error getting latest release, using stale: {}", e);
+ *latest = Some((now, previous.clone()));
return Ok(previous.clone());
}
diff --git a/cli/src/commands/tunnels.rs b/cli/src/commands/tunnels.rs
index 688f603f593..dc4206e8316 100644
--- a/cli/src/commands/tunnels.rs
+++ b/cli/src/commands/tunnels.rs
@@ -155,43 +155,54 @@ pub async fn command_shell(ctx: CommandContext, args: CommandShellArgs) -> Resul
code_server_args: (&ctx.args).into(),
};
- let mut listener: Box = match (args.on_port, &args.on_host, args.on_socket)
- {
- (_, _, true) => {
- let socket = get_socket_name();
- let listener = listen_socket_rw_stream(&socket)
- .await
- .map_err(|e| wrap(e, "error listening on socket"))?;
+ args.server_args.apply_to(&mut params.code_server_args);
- params
- .log
- .result(format!("Listening on {}", socket.display()));
+ let mut listener: Box =
+ match (args.on_port.first(), &args.on_host, args.on_socket) {
+ (_, _, true) => {
+ let socket = get_socket_name();
+ let listener = listen_socket_rw_stream(&socket)
+ .await
+ .map_err(|e| wrap(e, "error listening on socket"))?;
- Box::new(listener)
- }
- (Some(_), _, _) | (_, Some(_), _) => {
- let addr = SocketAddr::new(
- args.on_host
+ params
+ .log
+ .result(format!("Listening on {}", socket.display()));
+
+ Box::new(listener)
+ }
+ (Some(_), _, _) | (_, Some(_), _) => {
+ let host = args
+ .on_host
.as_ref()
.map(|h| h.parse().map_err(CodeError::InvalidHostAddress))
- .unwrap_or(Ok(IpAddr::V4(Ipv4Addr::LOCALHOST)))?,
- args.on_port.unwrap_or_default(),
- );
- let listener = tokio::net::TcpListener::bind(addr)
- .await
- .map_err(|e| wrap(e, "error listening on port"))?;
+ .unwrap_or(Ok(IpAddr::V4(Ipv4Addr::LOCALHOST)))?;
- params
- .log
- .result(format!("Listening on {}", listener.local_addr().unwrap()));
+ let lower_port = args.on_port.first().copied().unwrap_or_default();
+ let port_no = if let Some(upper) = args.on_port.get(1) {
+ find_unused_port(&host, lower_port, *upper)
+ .await
+ .unwrap_or_default()
+ } else {
+ lower_port
+ };
- Box::new(listener)
- }
- _ => {
- serve_stream(tokio::io::stdin(), tokio::io::stderr(), params).await;
- return Ok(0);
- }
- };
+ let addr = SocketAddr::new(host, port_no);
+ let listener = tokio::net::TcpListener::bind(addr)
+ .await
+ .map_err(|e| wrap(e, "error listening on port"))?;
+
+ params
+ .log
+ .result(format!("Listening on {}", listener.local_addr().unwrap()));
+
+ Box::new(listener)
+ }
+ _ => {
+ serve_stream(tokio::io::stdin(), tokio::io::stderr(), params).await;
+ return Ok(0);
+ }
+ };
let mut servers = FuturesUnordered::new();
@@ -216,6 +227,21 @@ pub async fn command_shell(ctx: CommandContext, args: CommandShellArgs) -> Resul
}
}
+async fn find_unused_port(host: &IpAddr, start_port: u16, end_port: u16) -> Option {
+ for port in start_port..=end_port {
+ if is_port_available(*host, port).await {
+ return Some(port);
+ }
+ }
+ None
+}
+
+async fn is_port_available(host: IpAddr, port: u16) -> bool {
+ tokio::net::TcpListener::bind(SocketAddr::new(host, port))
+ .await
+ .is_ok()
+}
+
pub async fn service(
ctx: CommandContext,
service_args: TunnelServiceSubCommands,
@@ -416,7 +442,7 @@ pub async fn serve(ctx: CommandContext, gateway_args: TunnelServeArgs) -> Result
legal::require_consent(&paths, gateway_args.accept_server_license_terms)?;
let mut csa = (&args).into();
- gateway_args.apply_to_server_args(&mut csa);
+ gateway_args.server_args.apply_to(&mut csa);
let result = serve_with_csa(paths, log, gateway_args, csa, TUNNEL_CLI_LOCK_NAME).await;
drop(no_sleep);
@@ -563,7 +589,7 @@ async fn serve_with_csa(
Ok(SingletonConnection::Client(stream)) => {
debug!(log, "starting as client to singleton");
if gateway_args.name.is_some()
- || !gateway_args.install_extension.is_empty()
+ || !gateway_args.server_args.install_extension.is_empty()
|| gateway_args.tunnel.tunnel_id.is_some()
{
warning!(
diff --git a/cli/src/constants.rs b/cli/src/constants.rs
index 6f604e8876e..1e277a89d6a 100644
--- a/cli/src/constants.rs
+++ b/cli/src/constants.rs
@@ -13,7 +13,7 @@ use crate::options::Quality;
pub const CONTROL_PORT: u16 = 31545;
-/// Protocol version sent to clients. This can be used to indiciate new or
+/// Protocol version sent to clients. This can be used to indicate new or
/// changed capabilities that clients may wish to leverage.
/// 1 - Initial protocol version
/// 2 - Addition of `serve.compressed` property to control whether servermsg's
diff --git a/cli/src/download_cache.rs b/cli/src/download_cache.rs
index d3f05d2237f..cd02b02d75a 100644
--- a/cli/src/download_cache.rs
+++ b/cli/src/download_cache.rs
@@ -20,6 +20,7 @@ const KEEP_LRU: usize = 5;
const STAGING_SUFFIX: &str = ".staging";
const RENAME_ATTEMPTS: u32 = 20;
const RENAME_DELAY: std::time::Duration = std::time::Duration::from_millis(200);
+const PERSISTED_STATE_FILE_NAME: &str = "lru.json";
#[derive(Clone)]
pub struct DownloadCache {
@@ -30,11 +31,16 @@ pub struct DownloadCache {
impl DownloadCache {
pub fn new(path: PathBuf) -> DownloadCache {
DownloadCache {
- state: PersistedState::new(path.join("lru.json")),
+ state: PersistedState::new(path.join(PERSISTED_STATE_FILE_NAME)),
path,
}
}
+ /// Gets the value stored on the state
+ pub fn get(&self) -> Vec {
+ self.state.load()
+ }
+
/// Gets the download cache path. Names of cache entries can be formed by
/// joining them to the path.
pub fn path(&self) -> &Path {
diff --git a/cli/src/tunnels/code_server.rs b/cli/src/tunnels/code_server.rs
index 0579f8ef0dc..465f6e24230 100644
--- a/cli/src/tunnels/code_server.rs
+++ b/cli/src/tunnels/code_server.rs
@@ -674,7 +674,7 @@ where
let write_line = |line: &str| -> std::io::Result<()> {
if let Some(mut f) = log_file.as_ref() {
f.write_all(line.as_bytes())?;
- f.write_all(&[b'\n'])?;
+ f.write_all(b"\n")?;
}
if write_directly {
println!("{}", line);
diff --git a/cli/src/tunnels/control_server.rs b/cli/src/tunnels/control_server.rs
index f42984cfac1..dfb5e381179 100644
--- a/cli/src/tunnels/control_server.rs
+++ b/cli/src/tunnels/control_server.rs
@@ -920,9 +920,14 @@ async fn handle_update(
info!(log, "Updating CLI to {}", latest_release);
- updater
+ let r = updater
.do_update(&latest_release, SilentCopyProgress())
- .await?;
+ .await;
+
+ if let Err(e) = r {
+ did_update.store(false, Ordering::SeqCst);
+ return Err(e);
+ }
Ok(UpdateResult {
up_to_date: true,
diff --git a/cli/src/update_service.rs b/cli/src/update_service.rs
index 4bec13d6e86..90339148188 100644
--- a/cli/src/update_service.rs
+++ b/cli/src/update_service.rs
@@ -3,7 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
-use std::{ffi::OsStr, fmt, path::Path};
+use std::{fmt, path::Path};
use serde::{Deserialize, Serialize};
@@ -11,10 +11,11 @@ use crate::{
constants::VSCODE_CLI_UPDATE_ENDPOINT,
debug, log, options, spanf,
util::{
- errors::{AnyError, CodeError, WrappedError},
+ errors::{wrap, AnyError, CodeError, WrappedError},
http::{BoxedHttp, SimpleResponse},
io::ReportCopyProgress,
- tar, zipper,
+ tar::{self, has_gzip_header},
+ zipper,
},
};
@@ -178,10 +179,10 @@ pub fn unzip_downloaded_release(
where
T: ReportCopyProgress,
{
- if compressed_file.extension() == Some(OsStr::new("zip")) {
- zipper::unzip_file(compressed_file, target_dir, reporter)
- } else {
- tar::decompress_tarball(compressed_file, target_dir, reporter)
+ match has_gzip_header(compressed_file) {
+ Ok((f, true)) => tar::decompress_tarball(f, target_dir, reporter),
+ Ok((f, false)) => zipper::unzip_file(f, target_dir, reporter),
+ Err(e) => Err(wrap(e, "error checking for gzip header")),
}
}
@@ -249,7 +250,7 @@ impl Platform {
Platform::DarwinARM64 => "server-darwin-arm64",
Platform::WindowsX64 => "server-win32-x64",
Platform::WindowsX86 => "server-win32",
- Platform::WindowsARM64 => "server-win32-x64", // we don't publish an arm64 server build yet
+ Platform::WindowsARM64 => "server-win32-arm64",
}
.to_owned()
}
diff --git a/cli/src/util/errors.rs b/cli/src/util/errors.rs
index 7d28ce9f741..67519d5437e 100644
--- a/cli/src/util/errors.rs
+++ b/cli/src/util/errors.rs
@@ -512,6 +512,8 @@ pub enum CodeError {
// todo: can be specialized when update service is moved to CodeErrors
#[error("Could not check for update: {0}")]
UpdateCheckFailed(String),
+ #[error("Could not read connection token file: {0}")]
+ CouldNotReadConnectionTokenFile(std::io::Error),
#[error("Could not write connection token file: {0}")]
CouldNotCreateConnectionTokenFile(std::io::Error),
#[error("A tunnel with the name {0} exists and is in-use. Please pick a different name or stop the existing tunnel.")]
diff --git a/cli/src/util/prereqs.rs b/cli/src/util/prereqs.rs
index 5d4953acbb2..0f49ab20887 100644
--- a/cli/src/util/prereqs.rs
+++ b/cli/src/util/prereqs.rs
@@ -19,12 +19,22 @@ lazy_static! {
static ref GENERIC_VERSION_RE: Regex = Regex::new(r"^([0-9]+)\.([0-9]+)$").unwrap();
static ref LIBSTD_CXX_VERSION_RE: BinRegex =
BinRegex::new(r"GLIBCXX_([0-9]+)\.([0-9]+)(?:\.([0-9]+))?").unwrap();
- static ref MIN_CXX_VERSION: SimpleSemver = SimpleSemver::new(3, 4, 25);
- static ref MIN_LEGACY_CXX_VERSION: SimpleSemver = SimpleSemver::new(3, 4, 19);
static ref MIN_LDD_VERSION: SimpleSemver = SimpleSemver::new(2, 28, 0);
static ref MIN_LEGACY_LDD_VERSION: SimpleSemver = SimpleSemver::new(2, 17, 0);
}
+#[cfg(target_arch = "arm")]
+lazy_static! {
+ static ref MIN_CXX_VERSION: SimpleSemver = SimpleSemver::new(3, 4, 26);
+ static ref MIN_LEGACY_CXX_VERSION: SimpleSemver = SimpleSemver::new(3, 4, 22);
+}
+
+#[cfg(not(target_arch = "arm"))]
+lazy_static! {
+ static ref MIN_CXX_VERSION: SimpleSemver = SimpleSemver::new(3, 4, 25);
+ static ref MIN_LEGACY_CXX_VERSION: SimpleSemver = SimpleSemver::new(3, 4, 19);
+}
+
const NIXOS_TEST_PATH: &str = "/etc/NIXOS";
pub struct PreReqChecker {}
diff --git a/cli/src/util/tar.rs b/cli/src/util/tar.rs
index fe4d4269700..10577140325 100644
--- a/cli/src/util/tar.rs
+++ b/cli/src/util/tar.rs
@@ -5,8 +5,8 @@
use crate::util::errors::{wrap, WrappedError};
use flate2::read::GzDecoder;
-use std::fs;
-use std::io::Seek;
+use std::fs::{self, File};
+use std::io::{Read, Seek};
use std::path::{Path, PathBuf};
use tar::Archive;
@@ -57,16 +57,13 @@ fn should_skip_first_segment(file: &fs::File) -> Result<(bool, u64), WrappedErro
}
pub fn decompress_tarball(
- path: &Path,
+ mut tar_gz: File,
parent_path: &Path,
mut reporter: T,
) -> Result<(), WrappedError>
where
T: ReportCopyProgress,
{
- let mut tar_gz = fs::File::open(path)
- .map_err(|e| wrap(e, format!("error opening file {}", path.display())))?;
-
let (skip_first, num_entries) = should_skip_first_segment(&tar_gz)?;
let report_progress_every = num_entries / 20;
let mut entries_so_far = 0;
@@ -81,7 +78,7 @@ where
let mut archive = Archive::new(tar);
archive
.entries()
- .map_err(|e| wrap(e, format!("error opening archive {}", path.display())))?
+ .map_err(|e| wrap(e, "error opening archive"))?
.filter_map(|e| e.ok())
.try_for_each::<_, Result<_, WrappedError>>(|mut entry| {
// approximate progress based on where we are in the archive:
@@ -118,3 +115,13 @@ where
Ok(())
}
+
+pub fn has_gzip_header(path: &Path) -> std::io::Result<(File, bool)> {
+ let mut file = fs::File::open(path)?;
+ let mut header = [0; 2];
+ let _ = file.read_exact(&mut header);
+
+ file.rewind()?;
+
+ Ok((file, header[0] == 0x1f && header[1] == 0x8b))
+}
diff --git a/cli/src/util/zipper.rs b/cli/src/util/zipper.rs
index 69bcf2d23f6..5521fa42c54 100644
--- a/cli/src/util/zipper.rs
+++ b/cli/src/util/zipper.rs
@@ -44,15 +44,12 @@ fn should_skip_first_segment(archive: &mut ZipArchive) -> bool {
archive.len() > 1 // prefix removal is invalid if there's only a single file
}
-pub fn unzip_file(path: &Path, parent_path: &Path, mut reporter: T) -> Result<(), WrappedError>
+pub fn unzip_file(file: File, parent_path: &Path, mut reporter: T) -> Result<(), WrappedError>
where
T: ReportCopyProgress,
{
- let file = fs::File::open(path)
- .map_err(|e| wrap(e, format!("unable to open file {}", path.display())))?;
-
- let mut archive = zip::ZipArchive::new(file)
- .map_err(|e| wrap(e, format!("failed to open zip archive {}", path.display())))?;
+ let mut archive =
+ zip::ZipArchive::new(file).map_err(|e| wrap(e, "failed to open zip archive"))?;
let skip_segments_no = usize::from(should_skip_first_segment(&mut archive));
let report_progress_every = archive.len() / 20;
diff --git a/extensions/.npmrc b/extensions/.npmrc
new file mode 100644
index 00000000000..a9c57709666
--- /dev/null
+++ b/extensions/.npmrc
@@ -0,0 +1,2 @@
+legacy-peer-deps="true"
+timeout=180000
diff --git a/extensions/bat/yarn.lock b/extensions/bat/yarn.lock
deleted file mode 100644
index fb57ccd13af..00000000000
--- a/extensions/bat/yarn.lock
+++ /dev/null
@@ -1,4 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
diff --git a/extensions/clojure/yarn.lock b/extensions/clojure/yarn.lock
deleted file mode 100644
index fb57ccd13af..00000000000
--- a/extensions/clojure/yarn.lock
+++ /dev/null
@@ -1,4 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
diff --git a/extensions/coffeescript/yarn.lock b/extensions/coffeescript/yarn.lock
deleted file mode 100644
index fb57ccd13af..00000000000
--- a/extensions/coffeescript/yarn.lock
+++ /dev/null
@@ -1,4 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
diff --git a/extensions/configuration-editing/.npmrc b/extensions/configuration-editing/.npmrc
new file mode 100644
index 00000000000..a9c57709666
--- /dev/null
+++ b/extensions/configuration-editing/.npmrc
@@ -0,0 +1,2 @@
+legacy-peer-deps="true"
+timeout=180000
diff --git a/extensions/configuration-editing/.vscodeignore b/extensions/configuration-editing/.vscodeignore
index cfa2d155c50..679a6d6859f 100644
--- a/extensions/configuration-editing/.vscodeignore
+++ b/extensions/configuration-editing/.vscodeignore
@@ -4,7 +4,7 @@ tsconfig.json
out/**
extension.webpack.config.js
extension-browser.webpack.config.js
-yarn.lock
+package-lock.json
build/**
schemas/devContainer.codespaces.schema.json
schemas/devContainer.vscode.schema.json
diff --git a/extensions/configuration-editing/package-lock.json b/extensions/configuration-editing/package-lock.json
new file mode 100644
index 00000000000..199dcf7f755
--- /dev/null
+++ b/extensions/configuration-editing/package-lock.json
@@ -0,0 +1,296 @@
+{
+ "name": "configuration-editing",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "configuration-editing",
+ "version": "1.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/rest": "19.0.4",
+ "jsonc-parser": "^3.2.0",
+ "tunnel": "^0.0.6"
+ },
+ "devDependencies": {
+ "@types/node": "20.x"
+ },
+ "engines": {
+ "vscode": "^1.0.0"
+ }
+ },
+ "node_modules/@octokit/auth-token": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz",
+ "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/@octokit/core": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz",
+ "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==",
+ "dependencies": {
+ "@octokit/auth-token": "^3.0.0",
+ "@octokit/graphql": "^5.0.0",
+ "@octokit/request": "^6.0.0",
+ "@octokit/request-error": "^3.0.0",
+ "@octokit/types": "^9.0.0",
+ "before-after-hook": "^2.2.0",
+ "universal-user-agent": "^6.0.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/@octokit/endpoint": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz",
+ "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==",
+ "dependencies": {
+ "@octokit/types": "^9.0.0",
+ "is-plain-object": "^5.0.0",
+ "universal-user-agent": "^6.0.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/@octokit/graphql": {
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz",
+ "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==",
+ "dependencies": {
+ "@octokit/request": "^6.0.0",
+ "@octokit/types": "^9.0.0",
+ "universal-user-agent": "^6.0.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/@octokit/openapi-types": {
+ "version": "18.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz",
+ "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw=="
+ },
+ "node_modules/@octokit/plugin-paginate-rest": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-4.3.1.tgz",
+ "integrity": "sha512-h8KKxESmSFTcXX409CAxlaOYscEDvN2KGQRsLCGT1NSqRW+D6EXLVQ8vuHhFznS9MuH9QYw1GfsUN30bg8hjVA==",
+ "dependencies": {
+ "@octokit/types": "^7.5.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "peerDependencies": {
+ "@octokit/core": ">=4"
+ }
+ },
+ "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": {
+ "version": "13.13.1",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-13.13.1.tgz",
+ "integrity": "sha512-4EuKSk3N95UBWFau3Bz9b3pheQ8jQYbKmBL5+GSuY8YDPDwu03J4BjI+66yNi8aaX/3h1qDpb0mbBkLdr+cfGQ=="
+ },
+ "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": {
+ "version": "7.5.1",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-7.5.1.tgz",
+ "integrity": "sha512-Zk4OUMLCSpXNI8KZZn47lVLJSsgMyCimsWWQI5hyjZg7hdYm0kjotaIkbG0Pp8SfU2CofMBzonboTqvzn3FrJA==",
+ "dependencies": {
+ "@octokit/openapi-types": "^13.11.0"
+ }
+ },
+ "node_modules/@octokit/plugin-request-log": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz",
+ "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==",
+ "peerDependencies": {
+ "@octokit/core": ">=3"
+ }
+ },
+ "node_modules/@octokit/plugin-rest-endpoint-methods": {
+ "version": "6.8.1",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.8.1.tgz",
+ "integrity": "sha512-QrlaTm8Lyc/TbU7BL/8bO49vp+RZ6W3McxxmmQTgYxf2sWkO8ZKuj4dLhPNJD6VCUW1hetCmeIM0m6FTVpDiEg==",
+ "dependencies": {
+ "@octokit/types": "^8.1.1",
+ "deprecation": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "peerDependencies": {
+ "@octokit/core": ">=3"
+ }
+ },
+ "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-14.0.0.tgz",
+ "integrity": "sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw=="
+ },
+ "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": {
+ "version": "8.2.1",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-8.2.1.tgz",
+ "integrity": "sha512-8oWMUji8be66q2B9PmEIUyQm00VPDPun07umUWSaCwxmeaquFBro4Hcc3ruVoDo3zkQyZBlRvhIMEYS3pBhanw==",
+ "dependencies": {
+ "@octokit/openapi-types": "^14.0.0"
+ }
+ },
+ "node_modules/@octokit/request": {
+ "version": "6.2.8",
+ "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz",
+ "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==",
+ "dependencies": {
+ "@octokit/endpoint": "^7.0.0",
+ "@octokit/request-error": "^3.0.0",
+ "@octokit/types": "^9.0.0",
+ "is-plain-object": "^5.0.0",
+ "node-fetch": "^2.6.7",
+ "universal-user-agent": "^6.0.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/@octokit/request-error": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz",
+ "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==",
+ "dependencies": {
+ "@octokit/types": "^9.0.0",
+ "deprecation": "^2.0.0",
+ "once": "^1.4.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/@octokit/rest": {
+ "version": "19.0.4",
+ "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.4.tgz",
+ "integrity": "sha512-LwG668+6lE8zlSYOfwPj4FxWdv/qFXYBpv79TWIQEpBLKA9D/IMcWsF/U9RGpA3YqMVDiTxpgVpEW3zTFfPFTA==",
+ "dependencies": {
+ "@octokit/core": "^4.0.0",
+ "@octokit/plugin-paginate-rest": "^4.0.0",
+ "@octokit/plugin-request-log": "^1.0.4",
+ "@octokit/plugin-rest-endpoint-methods": "^6.0.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/@octokit/types": {
+ "version": "9.3.2",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz",
+ "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==",
+ "dependencies": {
+ "@octokit/openapi-types": "^18.0.0"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "20.11.24",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz",
+ "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==",
+ "dev": true,
+ "dependencies": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "node_modules/before-after-hook": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz",
+ "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ=="
+ },
+ "node_modules/deprecation": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
+ "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ=="
+ },
+ "node_modules/is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/jsonc-parser": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz",
+ "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w=="
+ },
+ "node_modules/node-fetch": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+ },
+ "node_modules/tunnel": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
+ "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
+ "engines": {
+ "node": ">=0.6.11 <=0.7.0 || >=0.7.3"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+ "dev": true
+ },
+ "node_modules/universal-user-agent": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz",
+ "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w=="
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ }
+ }
+}
diff --git a/extensions/configuration-editing/package.json b/extensions/configuration-editing/package.json
index 8a00fda49b8..f6bfd751895 100644
--- a/extensions/configuration-editing/package.json
+++ b/extensions/configuration-editing/package.json
@@ -11,7 +11,9 @@
"icon": "images/icon.png",
"activationEvents": [
"onProfile",
- "onProfile:github"
+ "onProfile:github",
+ "onLanguage:json",
+ "onLanguage:jsonc"
],
"enabledApiProposals": [
"profileContentHandlers"
diff --git a/extensions/configuration-editing/schemas/devContainer.codespaces.schema.json b/extensions/configuration-editing/schemas/devContainer.codespaces.schema.json
index 681ca6105cf..3f8400a7bd4 100644
--- a/extensions/configuration-editing/schemas/devContainer.codespaces.schema.json
+++ b/extensions/configuration-editing/schemas/devContainer.codespaces.schema.json
@@ -180,6 +180,11 @@
"items": {
"type": "string"
}
+ },
+ "disableAutomaticConfiguration": {
+ "type": "boolean",
+ "description": "Disables the setup that is automatically run in a codespace if no `postCreateCommand` is specified.",
+ "default": false
}
}
}
diff --git a/extensions/configuration-editing/yarn.lock b/extensions/configuration-editing/yarn.lock
deleted file mode 100644
index 0e7d733c76f..00000000000
--- a/extensions/configuration-editing/yarn.lock
+++ /dev/null
@@ -1,205 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"@octokit/auth-token@^3.0.0":
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-3.0.4.tgz#70e941ba742bdd2b49bdb7393e821dea8520a3db"
- integrity sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==
-
-"@octokit/core@^4.0.0":
- version "4.2.4"
- resolved "https://registry.yarnpkg.com/@octokit/core/-/core-4.2.4.tgz#d8769ec2b43ff37cc3ea89ec4681a20ba58ef907"
- integrity sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==
- dependencies:
- "@octokit/auth-token" "^3.0.0"
- "@octokit/graphql" "^5.0.0"
- "@octokit/request" "^6.0.0"
- "@octokit/request-error" "^3.0.0"
- "@octokit/types" "^9.0.0"
- before-after-hook "^2.2.0"
- universal-user-agent "^6.0.0"
-
-"@octokit/endpoint@^7.0.0":
- version "7.0.6"
- resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-7.0.6.tgz#791f65d3937555141fb6c08f91d618a7d645f1e2"
- integrity sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==
- dependencies:
- "@octokit/types" "^9.0.0"
- is-plain-object "^5.0.0"
- universal-user-agent "^6.0.0"
-
-"@octokit/graphql@^5.0.0":
- version "5.0.6"
- resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-5.0.6.tgz#9eac411ac4353ccc5d3fca7d76736e6888c5d248"
- integrity sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==
- dependencies:
- "@octokit/request" "^6.0.0"
- "@octokit/types" "^9.0.0"
- universal-user-agent "^6.0.0"
-
-"@octokit/openapi-types@^13.11.0":
- version "13.13.1"
- resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-13.13.1.tgz#a783bacb1817c9f61a2a0c3f81ea22ad62340fdf"
- integrity sha512-4EuKSk3N95UBWFau3Bz9b3pheQ8jQYbKmBL5+GSuY8YDPDwu03J4BjI+66yNi8aaX/3h1qDpb0mbBkLdr+cfGQ==
-
-"@octokit/openapi-types@^14.0.0":
- version "14.0.0"
- resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-14.0.0.tgz#949c5019028c93f189abbc2fb42f333290f7134a"
- integrity sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw==
-
-"@octokit/openapi-types@^18.0.0":
- version "18.0.0"
- resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-18.0.0.tgz#f43d765b3c7533fd6fb88f3f25df079c24fccf69"
- integrity sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==
-
-"@octokit/plugin-paginate-rest@^4.0.0":
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-4.3.1.tgz#553e653ee0318605acd23bf3a799c8bfafdedae3"
- integrity sha512-h8KKxESmSFTcXX409CAxlaOYscEDvN2KGQRsLCGT1NSqRW+D6EXLVQ8vuHhFznS9MuH9QYw1GfsUN30bg8hjVA==
- dependencies:
- "@octokit/types" "^7.5.0"
-
-"@octokit/plugin-request-log@^1.0.4":
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz#5e50ed7083a613816b1e4a28aeec5fb7f1462e85"
- integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==
-
-"@octokit/plugin-rest-endpoint-methods@^6.0.0":
- version "6.8.1"
- resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.8.1.tgz#97391fda88949eb15f68dc291957ccbe1d3e8ad1"
- integrity sha512-QrlaTm8Lyc/TbU7BL/8bO49vp+RZ6W3McxxmmQTgYxf2sWkO8ZKuj4dLhPNJD6VCUW1hetCmeIM0m6FTVpDiEg==
- dependencies:
- "@octokit/types" "^8.1.1"
- deprecation "^2.3.1"
-
-"@octokit/request-error@^3.0.0":
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-3.0.3.tgz#ef3dd08b8e964e53e55d471acfe00baa892b9c69"
- integrity sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==
- dependencies:
- "@octokit/types" "^9.0.0"
- deprecation "^2.0.0"
- once "^1.4.0"
-
-"@octokit/request@^6.0.0":
- version "6.2.8"
- resolved "https://registry.yarnpkg.com/@octokit/request/-/request-6.2.8.tgz#aaf480b32ab2b210e9dadd8271d187c93171d8eb"
- integrity sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==
- dependencies:
- "@octokit/endpoint" "^7.0.0"
- "@octokit/request-error" "^3.0.0"
- "@octokit/types" "^9.0.0"
- is-plain-object "^5.0.0"
- node-fetch "^2.6.7"
- universal-user-agent "^6.0.0"
-
-"@octokit/rest@19.0.4":
- version "19.0.4"
- resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-19.0.4.tgz#fd8bed1cefffa486e9ae46a9dc608ce81bcfcbdd"
- integrity sha512-LwG668+6lE8zlSYOfwPj4FxWdv/qFXYBpv79TWIQEpBLKA9D/IMcWsF/U9RGpA3YqMVDiTxpgVpEW3zTFfPFTA==
- dependencies:
- "@octokit/core" "^4.0.0"
- "@octokit/plugin-paginate-rest" "^4.0.0"
- "@octokit/plugin-request-log" "^1.0.4"
- "@octokit/plugin-rest-endpoint-methods" "^6.0.0"
-
-"@octokit/types@^7.5.0":
- version "7.5.1"
- resolved "https://registry.yarnpkg.com/@octokit/types/-/types-7.5.1.tgz#4e8b182933c17e1f41cc25d44757dbdb7bd76c1b"
- integrity sha512-Zk4OUMLCSpXNI8KZZn47lVLJSsgMyCimsWWQI5hyjZg7hdYm0kjotaIkbG0Pp8SfU2CofMBzonboTqvzn3FrJA==
- dependencies:
- "@octokit/openapi-types" "^13.11.0"
-
-"@octokit/types@^8.1.1":
- version "8.2.1"
- resolved "https://registry.yarnpkg.com/@octokit/types/-/types-8.2.1.tgz#a6de091ae68b5541f8d4fcf9a12e32836d4648aa"
- integrity sha512-8oWMUji8be66q2B9PmEIUyQm00VPDPun07umUWSaCwxmeaquFBro4Hcc3ruVoDo3zkQyZBlRvhIMEYS3pBhanw==
- dependencies:
- "@octokit/openapi-types" "^14.0.0"
-
-"@octokit/types@^9.0.0":
- version "9.3.2"
- resolved "https://registry.yarnpkg.com/@octokit/types/-/types-9.3.2.tgz#3f5f89903b69f6a2d196d78ec35f888c0013cac5"
- integrity sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==
- dependencies:
- "@octokit/openapi-types" "^18.0.0"
-
-"@types/node@20.x":
- version "20.11.24"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.24.tgz#cc207511104694e84e9fb17f9a0c4c42d4517792"
- integrity sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==
- dependencies:
- undici-types "~5.26.4"
-
-before-after-hook@^2.2.0:
- version "2.2.3"
- resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c"
- integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==
-
-deprecation@^2.0.0, deprecation@^2.3.1:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919"
- integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==
-
-is-plain-object@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344"
- integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==
-
-jsonc-parser@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76"
- integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==
-
-node-fetch@^2.6.7:
- version "2.7.0"
- resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d"
- integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==
- dependencies:
- whatwg-url "^5.0.0"
-
-once@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
- integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
- dependencies:
- wrappy "1"
-
-tr46@~0.0.3:
- version "0.0.3"
- resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
- integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
-
-tunnel@^0.0.6:
- version "0.0.6"
- resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c"
- integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==
-
-undici-types@~5.26.4:
- version "5.26.5"
- resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
- integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
-
-universal-user-agent@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee"
- integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==
-
-webidl-conversions@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
- integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==
-
-whatwg-url@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
- integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==
- dependencies:
- tr46 "~0.0.3"
- webidl-conversions "^3.0.0"
-
-wrappy@1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
- integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
diff --git a/extensions/cpp/package.json b/extensions/cpp/package.json
index c1d3f4882f6..9f3c890a48b 100644
--- a/extensions/cpp/package.json
+++ b/extensions/cpp/package.json
@@ -30,9 +30,13 @@
"id": "cpp",
"extensions": [
".cpp",
+ ".cppm",
".cc",
+ ".ccm",
".cxx",
+ ".cxxm",
".c++",
+ ".c++m",
".hpp",
".hh",
".hxx",
diff --git a/extensions/cpp/yarn.lock b/extensions/cpp/yarn.lock
deleted file mode 100644
index fb57ccd13af..00000000000
--- a/extensions/cpp/yarn.lock
+++ /dev/null
@@ -1,4 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
diff --git a/extensions/csharp/cgmanifest.json b/extensions/csharp/cgmanifest.json
index 1c88bd17296..58a7408dbbe 100644
--- a/extensions/csharp/cgmanifest.json
+++ b/extensions/csharp/cgmanifest.json
@@ -6,7 +6,7 @@
"git": {
"name": "dotnet/csharp-tmLanguage",
"repositoryUrl": "https://github.com/dotnet/csharp-tmLanguage",
- "commitHash": "7a7482ffc72a6677a87eb1ed76005593a4f7f131"
+ "commitHash": "d63e2661d4e0c83b6c7810eb1d0eedc5da843b04"
}
},
"license": "MIT",
diff --git a/extensions/csharp/syntaxes/csharp.tmLanguage.json b/extensions/csharp/syntaxes/csharp.tmLanguage.json
index 96dbe04473c..4a2497a064a 100644
--- a/extensions/csharp/syntaxes/csharp.tmLanguage.json
+++ b/extensions/csharp/syntaxes/csharp.tmLanguage.json
@@ -4,7 +4,7 @@
"If you want to provide a fix or improvement, please create a pull request against the original repository.",
"Once accepted there, we are happy to receive an update request."
],
- "version": "https://github.com/dotnet/csharp-tmLanguage/commit/7a7482ffc72a6677a87eb1ed76005593a4f7f131",
+ "version": "https://github.com/dotnet/csharp-tmLanguage/commit/d63e2661d4e0c83b6c7810eb1d0eedc5da843b04",
"name": "C#",
"scopeName": "source.cs",
"patterns": [
@@ -512,6 +512,9 @@
{
"include": "#type-name"
},
+ {
+ "include": "#type-arguments"
+ },
{
"include": "#attribute-arguments"
}
diff --git a/extensions/csharp/yarn.lock b/extensions/csharp/yarn.lock
deleted file mode 100644
index fb57ccd13af..00000000000
--- a/extensions/csharp/yarn.lock
+++ /dev/null
@@ -1,4 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
diff --git a/extensions/css-language-features/.npmrc b/extensions/css-language-features/.npmrc
new file mode 100644
index 00000000000..a9c57709666
--- /dev/null
+++ b/extensions/css-language-features/.npmrc
@@ -0,0 +1,2 @@
+legacy-peer-deps="true"
+timeout=180000
diff --git a/extensions/css-language-features/.vscodeignore b/extensions/css-language-features/.vscodeignore
index a08d9b8dec7..f6411e76fdb 100644
--- a/extensions/css-language-features/.vscodeignore
+++ b/extensions/css-language-features/.vscodeignore
@@ -11,9 +11,9 @@ server/tsconfig.json
server/test/**
server/bin/**
server/build/**
-server/yarn.lock
+server/package-lock.json
server/.npmignore
-yarn.lock
+package-lock.json
server/extension.webpack.config.js
extension.webpack.config.js
server/extension-browser.webpack.config.js
diff --git a/extensions/css-language-features/CONTRIBUTING.md b/extensions/css-language-features/CONTRIBUTING.md
index 1c3928b847a..d0f491be3b7 100644
--- a/extensions/css-language-features/CONTRIBUTING.md
+++ b/extensions/css-language-features/CONTRIBUTING.md
@@ -2,13 +2,13 @@
## Setup
- Clone [microsoft/vscode](https://github.com/microsoft/vscode)
-- Run `yarn` at `/`, this will install
+- Run `npm i` at `/`, this will install
- Dependencies for `/extension/css-language-features/`
- Dependencies for `/extension/css-language-features/server/`
- devDependencies such as `gulp`
- Open `/extensions/css-language-features/` as the workspace in VS Code
-- In `/extensions/css-language-features/` run `yarn compile`(or `yarn watch`) to build the client and server
+- In `/extensions/css-language-features/` run `npm run compile`(or `npm run watch`) to build the client and server
- Run the [`Launch Extension`](https://github.com/microsoft/vscode/blob/master/extensions/css-language-features/.vscode/launch.json) debug target in the Debug View. This will:
- Launch a new VS Code instance with the `css-language-features` extension loaded
- Open a `.css` file to activate the extension. The extension will start the CSS language server process.
@@ -30,14 +30,14 @@ However, within this extension, you can run a development version of `vscode-css
#### Linking `vscode-css-languageservice` in `css-language-features/server/`
- Clone [microsoft/vscode-css-languageservice](https://github.com/microsoft/vscode-css-languageservice)
-- Run `yarn` in `vscode-css-languageservice`
-- Run `yarn link` in `vscode-css-languageservice`. This will compile and link `vscode-css-languageservice`
-- In `css-language-features/server/`, run `yarn link vscode-css-languageservice`
+- Run `npm i` in `vscode-css-languageservice`
+- Run `npm link` in `vscode-css-languageservice`. This will compile and link `vscode-css-languageservice`
+- In `css-language-features/server/`, run `npm link vscode-css-languageservice`
#### Testing the development version of `vscode-css-languageservice`
- Open both `vscode-css-languageservice` and this extension in a single workspace with [multi-root workspace](https://code.visualstudio.com/docs/editor/multi-root-workspaces) feature
-- Run `yarn watch` in `vscode-css-languageservice` to recompile the extension whenever it changes
-- Run `yarn watch` at `css-language-features/server/` to recompile this extension with the linked version of `vscode-css-languageservice`
+- Run `npm run watch` in `vscode-css-languageservice` to recompile the extension whenever it changes
+- Run `npm run watch` at `css-language-features/server/` to recompile this extension with the linked version of `vscode-css-languageservice`
- Make some changes in `vscode-css-languageservice`
- Now when you run `Launch Extension` debug target, the launched instance will use your development version of `vscode-css-languageservice`. You can interactively test the language features.
diff --git a/extensions/css-language-features/client/src/browser/cssClientMain.ts b/extensions/css-language-features/client/src/browser/cssClientMain.ts
index 6522c786389..1d4153d9836 100644
--- a/extensions/css-language-features/client/src/browser/cssClientMain.ts
+++ b/extensions/css-language-features/client/src/browser/cssClientMain.ts
@@ -7,13 +7,7 @@ import { ExtensionContext, Uri, l10n } from 'vscode';
import { BaseLanguageClient, LanguageClientOptions } from 'vscode-languageclient';
import { startClient, LanguageClientConstructor } from '../cssClient';
import { LanguageClient } from 'vscode-languageclient/browser';
-
-declare const Worker: {
- new(stringUrl: string): any;
-};
-declare const TextDecoder: {
- new(encoding?: string): { decode(buffer: ArrayBuffer): string };
-};
+import { registerDropOrPasteResourceSupport } from '../dropOrPaste/dropOrPasteResource';
let client: BaseLanguageClient | undefined;
@@ -25,11 +19,12 @@ export async function activate(context: ExtensionContext) {
worker.postMessage({ i10lLocation: l10n.uri?.toString(false) ?? '' });
const newLanguageClient: LanguageClientConstructor = (id: string, name: string, clientOptions: LanguageClientOptions) => {
- return new LanguageClient(id, name, clientOptions, worker);
+ return new LanguageClient(id, name, worker, clientOptions);
};
client = await startClient(context, newLanguageClient, { TextDecoder });
+ context.subscriptions.push(registerDropOrPasteResourceSupport({ language: 'css', scheme: '*' }));
} catch (e) {
console.log(e);
}
diff --git a/extensions/css-language-features/client/src/dropOrPaste/dropOrPasteResource.ts b/extensions/css-language-features/client/src/dropOrPaste/dropOrPasteResource.ts
new file mode 100644
index 00000000000..6a4c38d2417
--- /dev/null
+++ b/extensions/css-language-features/client/src/dropOrPaste/dropOrPasteResource.ts
@@ -0,0 +1,152 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+import * as path from 'path';
+import * as vscode from 'vscode';
+import { getDocumentDir, Mimes, Schemes } from './shared';
+import { UriList } from './uriList';
+
+class DropOrPasteResourceProvider implements vscode.DocumentDropEditProvider, vscode.DocumentPasteEditProvider {
+ readonly kind = vscode.DocumentDropOrPasteEditKind.Empty.append('css', 'url');
+
+ async provideDocumentDropEdits(
+ document: vscode.TextDocument,
+ position: vscode.Position,
+ dataTransfer: vscode.DataTransfer,
+ token: vscode.CancellationToken,
+ ): Promise {
+ const uriList = await this.getUriList(dataTransfer);
+ if (!uriList.entries.length || token.isCancellationRequested) {
+ return;
+ }
+
+ const snippet = await this.createUriListSnippet(document.uri, uriList);
+ if (!snippet || token.isCancellationRequested) {
+ return;
+ }
+
+ return {
+ kind: this.kind,
+ title: snippet.label,
+ insertText: snippet.snippet.value,
+ yieldTo: this.pasteAsCssUrlByDefault(document, position) ? [] : [vscode.DocumentDropOrPasteEditKind.Empty.append('uri')]
+ };
+ }
+
+ async provideDocumentPasteEdits(
+ document: vscode.TextDocument,
+ ranges: readonly vscode.Range[],
+ dataTransfer: vscode.DataTransfer,
+ _context: vscode.DocumentPasteEditContext,
+ token: vscode.CancellationToken
+ ): Promise {
+ const uriList = await this.getUriList(dataTransfer);
+ if (!uriList.entries.length || token.isCancellationRequested) {
+ return;
+ }
+
+ const snippet = await this.createUriListSnippet(document.uri, uriList);
+ if (!snippet || token.isCancellationRequested) {
+ return;
+ }
+
+ return [{
+ kind: this.kind,
+ title: snippet.label,
+ insertText: snippet.snippet.value,
+ yieldTo: this.pasteAsCssUrlByDefault(document, ranges[0].start) ? [] : [vscode.DocumentDropOrPasteEditKind.Empty.append('uri')]
+ }];
+ }
+
+ private async getUriList(dataTransfer: vscode.DataTransfer): Promise {
+ const urlList = await dataTransfer.get(Mimes.uriList)?.asString();
+ if (urlList) {
+ return UriList.from(urlList);
+ }
+
+ // Find file entries
+ const uris: vscode.Uri[] = [];
+ for (const [_, entry] of dataTransfer) {
+ const file = entry.asFile();
+ if (file?.uri) {
+ uris.push(file.uri);
+ }
+ }
+
+ return new UriList(uris.map(uri => ({ uri, str: uri.toString(true) })));
+ }
+
+ private async createUriListSnippet(docUri: vscode.Uri, uriList: UriList): Promise<{ readonly snippet: vscode.SnippetString; readonly label: string } | undefined> {
+ if (!uriList.entries.length) {
+ return;
+ }
+
+ const snippet = new vscode.SnippetString();
+ for (let i = 0; i < uriList.entries.length; i++) {
+ const uri = uriList.entries[i];
+ const relativePath = getRelativePath(getDocumentDir(docUri), uri.uri);
+ const urlText = relativePath ?? uri.str;
+
+ snippet.appendText(`url(${urlText})`);
+ if (i !== uriList.entries.length - 1) {
+ snippet.appendText(' ');
+ }
+ }
+
+ return {
+ snippet,
+ label: uriList.entries.length > 1
+ ? vscode.l10n.t('Insert url() Functions')
+ : vscode.l10n.t('Insert url() Function')
+ };
+ }
+
+ private pasteAsCssUrlByDefault(document: vscode.TextDocument, position: vscode.Position): boolean {
+ const regex = /url\(.+?\)/gi;
+ for (const match of Array.from(document.lineAt(position.line).text.matchAll(regex))) {
+ if (position.character > match.index && position.character < match.index + match[0].length) {
+ return false;
+ }
+ }
+ return true;
+ }
+}
+
+function getRelativePath(fromFile: vscode.Uri | undefined, toFile: vscode.Uri): string | undefined {
+ if (fromFile && fromFile.scheme === toFile.scheme && fromFile.authority === toFile.authority) {
+ if (toFile.scheme === Schemes.file) {
+ // On windows, we must use the native `path.relative` to generate the relative path
+ // so that drive-letters are resolved cast insensitively. However we then want to
+ // convert back to a posix path to insert in to the document
+ const relativePath = path.relative(fromFile.fsPath, toFile.fsPath);
+ return path.posix.normalize(relativePath.split(path.sep).join(path.posix.sep));
+ }
+
+ return path.posix.relative(fromFile.path, toFile.path);
+ }
+
+ return undefined;
+}
+
+export function registerDropOrPasteResourceSupport(selector: vscode.DocumentSelector): vscode.Disposable {
+ const provider = new DropOrPasteResourceProvider();
+
+ return vscode.Disposable.from(
+ vscode.languages.registerDocumentDropEditProvider(selector, provider, {
+ providedDropEditKinds: [provider.kind],
+ dropMimeTypes: [
+ Mimes.uriList,
+ 'files'
+ ]
+ }),
+ vscode.languages.registerDocumentPasteEditProvider(selector, provider, {
+ providedPasteEditKinds: [provider.kind],
+ pasteMimeTypes: [
+ Mimes.uriList,
+ 'files'
+ ]
+ })
+ );
+}
diff --git a/extensions/css-language-features/client/src/dropOrPaste/shared.ts b/extensions/css-language-features/client/src/dropOrPaste/shared.ts
new file mode 100644
index 00000000000..548bccfec69
--- /dev/null
+++ b/extensions/css-language-features/client/src/dropOrPaste/shared.ts
@@ -0,0 +1,42 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+import * as vscode from 'vscode';
+import { Utils } from 'vscode-uri';
+
+export const Schemes = Object.freeze({
+ file: 'file',
+ notebookCell: 'vscode-notebook-cell',
+ untitled: 'untitled',
+});
+
+export const Mimes = Object.freeze({
+ plain: 'text/plain',
+ uriList: 'text/uri-list',
+});
+
+
+export function getDocumentDir(uri: vscode.Uri): vscode.Uri | undefined {
+ const docUri = getParentDocumentUri(uri);
+ if (docUri.scheme === Schemes.untitled) {
+ return vscode.workspace.workspaceFolders?.[0]?.uri;
+ }
+ return Utils.dirname(docUri);
+}
+
+function getParentDocumentUri(uri: vscode.Uri): vscode.Uri {
+ if (uri.scheme === Schemes.notebookCell) {
+ // is notebook documents necessary?
+ for (const notebook of vscode.workspace.notebookDocuments) {
+ for (const cell of notebook.getCells()) {
+ if (cell.document.uri.toString() === uri.toString()) {
+ return notebook.uri;
+ }
+ }
+ }
+ }
+
+ return uri;
+}
diff --git a/extensions/css-language-features/client/src/dropOrPaste/uriList.ts b/extensions/css-language-features/client/src/dropOrPaste/uriList.ts
new file mode 100644
index 00000000000..ed20b1ee797
--- /dev/null
+++ b/extensions/css-language-features/client/src/dropOrPaste/uriList.ts
@@ -0,0 +1,38 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
+import * as vscode from 'vscode';
+
+function splitUriList(str: string): string[] {
+ return str.split('\r\n');
+}
+
+function parseUriList(str: string): string[] {
+ return splitUriList(str)
+ .filter(value => !value.startsWith('#')) // Remove comments
+ .map(value => value.trim());
+}
+
+export class UriList {
+
+ static from(str: string): UriList {
+ return new UriList(coalesce(parseUriList(str).map(line => {
+ try {
+ return { uri: vscode.Uri.parse(line), str: line };
+ } catch {
+ // Uri parse failure
+ return undefined;
+ }
+ })));
+ }
+
+ constructor(
+ public readonly entries: ReadonlyArray<{ readonly uri: vscode.Uri; readonly str: string }>
+ ) { }
+}
+
+function coalesce(array: ReadonlyArray): T[] {
+ return array.filter(e => !!e);
+}
diff --git a/extensions/css-language-features/client/src/node/cssClientMain.ts b/extensions/css-language-features/client/src/node/cssClientMain.ts
index 802b58ab286..96926979b2a 100644
--- a/extensions/css-language-features/client/src/node/cssClientMain.ts
+++ b/extensions/css-language-features/client/src/node/cssClientMain.ts
@@ -3,12 +3,12 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
-import { getNodeFSRequestService } from './nodeFs';
-import { ExtensionContext, extensions, l10n } from 'vscode';
-import { startClient, LanguageClientConstructor } from '../cssClient';
-import { ServerOptions, TransportKind, LanguageClientOptions, LanguageClient, BaseLanguageClient } from 'vscode-languageclient/node';
import { TextDecoder } from 'util';
-
+import { ExtensionContext, extensions, l10n } from 'vscode';
+import { BaseLanguageClient, LanguageClient, LanguageClientOptions, ServerOptions, TransportKind } from 'vscode-languageclient/node';
+import { LanguageClientConstructor, startClient } from '../cssClient';
+import { getNodeFSRequestService } from './nodeFs';
+import { registerDropOrPasteResourceSupport } from '../dropOrPaste/dropOrPasteResource';
let client: BaseLanguageClient | undefined;
@@ -37,6 +37,8 @@ export async function activate(context: ExtensionContext) {
process.env['VSCODE_L10N_BUNDLE_LOCATION'] = l10n.uri?.toString() ?? '';
client = await startClient(context, newLanguageClient, { fs: getNodeFSRequestService(), TextDecoder });
+
+ context.subscriptions.push(registerDropOrPasteResourceSupport({ language: 'css', scheme: '*' }));
}
export async function deactivate(): Promise {
@@ -45,3 +47,4 @@ export async function deactivate(): Promise {
client = undefined;
}
}
+
diff --git a/extensions/css-language-features/client/tsconfig.json b/extensions/css-language-features/client/tsconfig.json
index 573b24b4aa6..17bf7e962a8 100644
--- a/extensions/css-language-features/client/tsconfig.json
+++ b/extensions/css-language-features/client/tsconfig.json
@@ -1,10 +1,14 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
- "outDir": "./out"
+ "outDir": "./out",
+ "lib": [
+ "webworker"
+ ]
},
"include": [
"src/**/*",
- "../../../src/vscode-dts/vscode.d.ts"
+ "../../../src/vscode-dts/vscode.d.ts",
+ "../../../src/vscode-dts/vscode.proposed.documentPaste.d.ts"
]
}
diff --git a/extensions/css-language-features/package-lock.json b/extensions/css-language-features/package-lock.json
new file mode 100644
index 00000000000..e13184cae57
--- /dev/null
+++ b/extensions/css-language-features/package-lock.json
@@ -0,0 +1,135 @@
+{
+ "name": "css-language-features",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "css-language-features",
+ "version": "1.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "vscode-languageclient": "10.0.0-next.8",
+ "vscode-uri": "^3.0.8"
+ },
+ "devDependencies": {
+ "@types/node": "20.x"
+ },
+ "engines": {
+ "vscode": "^1.77.0"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "20.11.24",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz",
+ "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==",
+ "dev": true,
+ "dependencies": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+ "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
+ "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+ "dev": true
+ },
+ "node_modules/vscode-jsonrpc": {
+ "version": "9.0.0-next.4",
+ "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.4.tgz",
+ "integrity": "sha512-zSVIr58lJSMYKIsZ5P7GtBbv1eEx25eNyOf0NmEzxmn1GhUNJAVAb5hkA1poKUwj1FRMwN6CeyWxZypmr8SsQQ==",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/vscode-languageclient": {
+ "version": "10.0.0-next.8",
+ "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-10.0.0-next.8.tgz",
+ "integrity": "sha512-D9inIHgqKayO9Tv0MeLb3XIL76yTuWmKdHqcGZKzjtQrMGJgASJDYWTapu+yAjEpDp0gmVOaCYyIlLB86ncDoQ==",
+ "dependencies": {
+ "minimatch": "^9.0.3",
+ "semver": "^7.6.0",
+ "vscode-languageserver-protocol": "3.17.6-next.6"
+ },
+ "engines": {
+ "vscode": "^1.89.0"
+ }
+ },
+ "node_modules/vscode-languageserver-protocol": {
+ "version": "3.17.6-next.6",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.6.tgz",
+ "integrity": "sha512-naxM9kc/phpl0kAFNVPejMUWUtzFXdPYY/BtQTYtfbBbHf8sceHOrKkmf6yynZRu1A4oFtRZNqV3wyFRTWqUHw==",
+ "dependencies": {
+ "vscode-jsonrpc": "9.0.0-next.4",
+ "vscode-languageserver-types": "3.17.6-next.4"
+ }
+ },
+ "node_modules/vscode-languageserver-types": {
+ "version": "3.17.6-next.4",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.4.tgz",
+ "integrity": "sha512-SeJTpH/S14EbxOAVaOUoGVqPToqpRTld5QO5Ghig3AlbFJTFF9Wu7srHMfa85L0SX1RYAuuCSFKJVVCxDIk1/Q=="
+ },
+ "node_modules/vscode-uri": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz",
+ "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw=="
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ }
+ }
+}
diff --git a/extensions/css-language-features/package.json b/extensions/css-language-features/package.json
index f4f6adfb7f4..802e2fbf113 100644
--- a/extensions/css-language-features/package.json
+++ b/extensions/css-language-features/package.json
@@ -23,11 +23,14 @@
"supported": true
}
},
+ "enabledApiProposals": [
+ "documentPaste"
+ ],
"scripts": {
"compile": "npx gulp compile-extension:css-language-features-client compile-extension:css-language-features-server",
"watch": "npx gulp watch-extension:css-language-features-client watch-extension:css-language-features-server",
"test": "node ../../node_modules/mocha/bin/mocha",
- "install-client-next": "yarn add vscode-languageclient@next"
+ "install-client-next": "npm install vscode-languageclient@next"
},
"categories": [
"Programming Languages"
@@ -994,7 +997,7 @@
]
},
"dependencies": {
- "vscode-languageclient": "^10.0.0-next.5",
+ "vscode-languageclient": "10.0.0-next.8",
"vscode-uri": "^3.0.8"
},
"devDependencies": {
diff --git a/extensions/css-language-features/schemas/package.schema.json b/extensions/css-language-features/schemas/package.schema.json
index 831149caa9e..6c4b91faa27 100644
--- a/extensions/css-language-features/schemas/package.schema.json
+++ b/extensions/css-language-features/schemas/package.schema.json
@@ -1,6 +1,5 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
- "title": "CSS contributions to package.json",
"type": "object",
"properties": {
"contributes": {
diff --git a/extensions/css-language-features/server/.npmrc b/extensions/css-language-features/server/.npmrc
new file mode 100644
index 00000000000..a9c57709666
--- /dev/null
+++ b/extensions/css-language-features/server/.npmrc
@@ -0,0 +1,2 @@
+legacy-peer-deps="true"
+timeout=180000
diff --git a/extensions/css-language-features/server/package-lock.json b/extensions/css-language-features/server/package-lock.json
new file mode 100644
index 00000000000..2f7cb932b0c
--- /dev/null
+++ b/extensions/css-language-features/server/package-lock.json
@@ -0,0 +1,111 @@
+{
+ "name": "vscode-css-languageserver",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "vscode-css-languageserver",
+ "version": "1.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "@vscode/l10n": "^0.0.18",
+ "vscode-css-languageservice": "^6.3.1",
+ "vscode-languageserver": "10.0.0-next.6",
+ "vscode-uri": "^3.0.8"
+ },
+ "devDependencies": {
+ "@types/mocha": "^9.1.1",
+ "@types/node": "20.x"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@types/mocha": {
+ "version": "9.1.1",
+ "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz",
+ "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==",
+ "dev": true
+ },
+ "node_modules/@types/node": {
+ "version": "20.11.24",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz",
+ "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==",
+ "dev": true,
+ "dependencies": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "node_modules/@vscode/l10n": {
+ "version": "0.0.18",
+ "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz",
+ "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ=="
+ },
+ "node_modules/undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+ "dev": true
+ },
+ "node_modules/vscode-css-languageservice": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.3.1.tgz",
+ "integrity": "sha512-1BzTBuJfwMc3A0uX4JBdJgoxp74cjj4q2mDJdp49yD/GuAq4X0k5WtK6fNcMYr+FfJ9nqgR6lpfCSZDkARJ5qQ==",
+ "dependencies": {
+ "@vscode/l10n": "^0.0.18",
+ "vscode-languageserver-textdocument": "^1.0.12",
+ "vscode-languageserver-types": "3.17.5",
+ "vscode-uri": "^3.0.8"
+ }
+ },
+ "node_modules/vscode-jsonrpc": {
+ "version": "9.0.0-next.4",
+ "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.4.tgz",
+ "integrity": "sha512-zSVIr58lJSMYKIsZ5P7GtBbv1eEx25eNyOf0NmEzxmn1GhUNJAVAb5hkA1poKUwj1FRMwN6CeyWxZypmr8SsQQ==",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/vscode-languageserver": {
+ "version": "10.0.0-next.6",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-10.0.0-next.6.tgz",
+ "integrity": "sha512-0Lh1nhQfSxo5Ob+ayYO1QTIsDix2/Lc72Urm1KZrCFxK5zIFYaEh3QFeM9oZih4Rzs0ZkQPXXnoHtpvs5GT+Zw==",
+ "dependencies": {
+ "vscode-languageserver-protocol": "3.17.6-next.6"
+ },
+ "bin": {
+ "installServerIntoExtension": "bin/installServerIntoExtension"
+ }
+ },
+ "node_modules/vscode-languageserver-protocol": {
+ "version": "3.17.6-next.6",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.6.tgz",
+ "integrity": "sha512-naxM9kc/phpl0kAFNVPejMUWUtzFXdPYY/BtQTYtfbBbHf8sceHOrKkmf6yynZRu1A4oFtRZNqV3wyFRTWqUHw==",
+ "dependencies": {
+ "vscode-jsonrpc": "9.0.0-next.4",
+ "vscode-languageserver-types": "3.17.6-next.4"
+ }
+ },
+ "node_modules/vscode-languageserver-protocol/node_modules/vscode-languageserver-types": {
+ "version": "3.17.6-next.4",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.4.tgz",
+ "integrity": "sha512-SeJTpH/S14EbxOAVaOUoGVqPToqpRTld5QO5Ghig3AlbFJTFF9Wu7srHMfa85L0SX1RYAuuCSFKJVVCxDIk1/Q=="
+ },
+ "node_modules/vscode-languageserver-textdocument": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz",
+ "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA=="
+ },
+ "node_modules/vscode-languageserver-types": {
+ "version": "3.17.5",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz",
+ "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg=="
+ },
+ "node_modules/vscode-uri": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz",
+ "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw=="
+ }
+ }
+}
diff --git a/extensions/css-language-features/server/package.json b/extensions/css-language-features/server/package.json
index 0f1750e800a..4d8b9bd41ac 100644
--- a/extensions/css-language-features/server/package.json
+++ b/extensions/css-language-features/server/package.json
@@ -11,8 +11,8 @@
"browser": "./dist/browser/cssServerMain",
"dependencies": {
"@vscode/l10n": "^0.0.18",
- "vscode-css-languageservice": "^6.2.14",
- "vscode-languageserver": "^10.0.0-next.3",
+ "vscode-css-languageservice": "^6.3.1",
+ "vscode-languageserver": "10.0.0-next.6",
"vscode-uri": "^3.0.8"
},
"devDependencies": {
@@ -22,10 +22,10 @@
"scripts": {
"compile": "gulp compile-extension:css-language-features-server",
"watch": "gulp watch-extension:css-language-features-server",
- "install-service-next": "yarn add vscode-css-languageservice@next",
- "install-service-local": "yarn link vscode-css-languageservice",
- "install-server-next": "yarn add vscode-languageserver@next",
- "install-server-local": "yarn link vscode-languageserver",
+ "install-service-next": "npm install vscode-css-languageservice@next",
+ "install-service-local": "npm link vscode-css-languageservice",
+ "install-server-next": "npm install vscode-languageserver@next",
+ "install-server-local": "npm install vscode-languageserver",
"test": "node ./test/index.js"
}
}
diff --git a/extensions/css-language-features/server/yarn.lock b/extensions/css-language-features/server/yarn.lock
deleted file mode 100644
index 8d4c46d641e..00000000000
--- a/extensions/css-language-features/server/yarn.lock
+++ /dev/null
@@ -1,75 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"@types/mocha@^9.1.1":
- version "9.1.1"
- resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4"
- integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==
-
-"@types/node@20.x":
- version "20.11.24"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.24.tgz#cc207511104694e84e9fb17f9a0c4c42d4517792"
- integrity sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==
- dependencies:
- undici-types "~5.26.4"
-
-"@vscode/l10n@^0.0.18":
- version "0.0.18"
- resolved "https://registry.yarnpkg.com/@vscode/l10n/-/l10n-0.0.18.tgz#916d3a5e960dbab47c1c56f58a7cb5087b135c95"
- integrity sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==
-
-undici-types@~5.26.4:
- version "5.26.5"
- resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
- integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
-
-vscode-css-languageservice@^6.2.14:
- version "6.2.14"
- resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-6.2.14.tgz#d44fe75c03942d865a9c1a5ff5fb4e8dec1f89d0"
- integrity sha512-5UPQ9Y1sUTnuMyaMBpO7LrBkqjhEJb5eAwdUlDp+Uez8lry+Tspnk3+3p2qWS4LlNsr4p3v9WkZxUf1ltgFpgw==
- dependencies:
- "@vscode/l10n" "^0.0.18"
- vscode-languageserver-textdocument "^1.0.11"
- vscode-languageserver-types "3.17.5"
- vscode-uri "^3.0.8"
-
-vscode-jsonrpc@9.0.0-next.2:
- version "9.0.0-next.2"
- resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.2.tgz#29e9741c742c80329bba1c60ce38fd014651ba80"
- integrity sha512-meIaXAgChCHzWy45QGU8YpCNyqnZQ/sYeCj32OLDDbUYsCF7AvgpdXx3nnZn9yzr8ed0Od9bW+NGphEmXsqvIQ==
-
-vscode-languageserver-protocol@3.17.6-next.4:
- version "3.17.6-next.4"
- resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.4.tgz#3c56f6eb588bb42fccc0ac54a0d5daf2d02f0a1b"
- integrity sha512-/2bleKBxZLyRObS4mkpaWlVI9xGiUqMVmh/ztZ2vL4uP2XyIpraT45JBpn9AtXr0alqKJPKLuKr+/qcYULvm/w==
- dependencies:
- vscode-jsonrpc "9.0.0-next.2"
- vscode-languageserver-types "3.17.6-next.3"
-
-vscode-languageserver-textdocument@^1.0.11:
- version "1.0.11"
- resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz#0822a000e7d4dc083312580d7575fe9e3ba2e2bf"
- integrity sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==
-
-vscode-languageserver-types@3.17.5:
- version "3.17.5"
- resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz#3273676f0cf2eab40b3f44d085acbb7f08a39d8a"
- integrity sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==
-
-vscode-languageserver-types@3.17.6-next.3:
- version "3.17.6-next.3"
- resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.3.tgz#f71d6c57f18d921346cfe0c227aabd72eb8cd2f0"
- integrity sha512-l5kNFXFRQGuzriXpuBqFpRmkf6f6A4VoU3h95OsVkqIOoi1k7KbwSo600cIdsKSJWrPg/+vX+QMPcMw1oI7ItA==
-
-vscode-languageserver@^10.0.0-next.3:
- version "10.0.0-next.3"
- resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-10.0.0-next.3.tgz#a63c5ea9fab1be93d7732ab0fdc18c9b37956e07"
- integrity sha512-4x1qHImf6ePji4+8PX43lnBCBfBNdi2jneGX2k5FswJhx/cxaYYmusShmmtO/clyL1iurxJacrQoXfw9+ikhvg==
- dependencies:
- vscode-languageserver-protocol "3.17.6-next.4"
-
-vscode-uri@^3.0.8:
- version "3.0.8"
- resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.8.tgz#1770938d3e72588659a172d0fd4642780083ff9f"
- integrity sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==
diff --git a/extensions/css-language-features/yarn.lock b/extensions/css-language-features/yarn.lock
deleted file mode 100644
index 25a22d07ca6..00000000000
--- a/extensions/css-language-features/yarn.lock
+++ /dev/null
@@ -1,85 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"@types/node@20.x":
- version "20.11.24"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.24.tgz#cc207511104694e84e9fb17f9a0c4c42d4517792"
- integrity sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==
- dependencies:
- undici-types "~5.26.4"
-
-balanced-match@^1.0.0:
- version "1.0.2"
- resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
- integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
-
-brace-expansion@^2.0.1:
- version "2.0.1"
- resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz"
- integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
- dependencies:
- balanced-match "^1.0.0"
-
-lru-cache@^6.0.0:
- version "6.0.0"
- resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz"
- integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
- dependencies:
- yallist "^4.0.0"
-
-minimatch@^9.0.3:
- version "9.0.3"
- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825"
- integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==
- dependencies:
- brace-expansion "^2.0.1"
-
-semver@^7.6.0:
- version "7.6.0"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d"
- integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==
- dependencies:
- lru-cache "^6.0.0"
-
-undici-types@~5.26.4:
- version "5.26.5"
- resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
- integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
-
-vscode-jsonrpc@9.0.0-next.2:
- version "9.0.0-next.2"
- resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-9.0.0-next.2.tgz#29e9741c742c80329bba1c60ce38fd014651ba80"
- integrity sha512-meIaXAgChCHzWy45QGU8YpCNyqnZQ/sYeCj32OLDDbUYsCF7AvgpdXx3nnZn9yzr8ed0Od9bW+NGphEmXsqvIQ==
-
-vscode-languageclient@^10.0.0-next.5:
- version "10.0.0-next.5"
- resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-10.0.0-next.5.tgz#7431d88255a5fd99e9423659ac484b1f968200f3"
- integrity sha512-JIf1WE7fvV0RElFM062bAummI433vcxuFwqoYAp+1zTVhta/jznxkTz1zs3Hbj2tiDfclf0TZ0qCxflAP1mY2Q==
- dependencies:
- minimatch "^9.0.3"
- semver "^7.6.0"
- vscode-languageserver-protocol "3.17.6-next.4"
-
-vscode-languageserver-protocol@3.17.6-next.4:
- version "3.17.6-next.4"
- resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.6-next.4.tgz#3c56f6eb588bb42fccc0ac54a0d5daf2d02f0a1b"
- integrity sha512-/2bleKBxZLyRObS4mkpaWlVI9xGiUqMVmh/ztZ2vL4uP2XyIpraT45JBpn9AtXr0alqKJPKLuKr+/qcYULvm/w==
- dependencies:
- vscode-jsonrpc "9.0.0-next.2"
- vscode-languageserver-types "3.17.6-next.3"
-
-vscode-languageserver-types@3.17.6-next.3:
- version "3.17.6-next.3"
- resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.6-next.3.tgz#f71d6c57f18d921346cfe0c227aabd72eb8cd2f0"
- integrity sha512-l5kNFXFRQGuzriXpuBqFpRmkf6f6A4VoU3h95OsVkqIOoi1k7KbwSo600cIdsKSJWrPg/+vX+QMPcMw1oI7ItA==
-
-vscode-uri@^3.0.8:
- version "3.0.8"
- resolved "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz"
- integrity sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==
-
-yallist@^4.0.0:
- version "4.0.0"
- resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz"
- integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
diff --git a/extensions/css/yarn.lock b/extensions/css/yarn.lock
deleted file mode 100644
index fb57ccd13af..00000000000
--- a/extensions/css/yarn.lock
+++ /dev/null
@@ -1,4 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
diff --git a/extensions/dart/cgmanifest.json b/extensions/dart/cgmanifest.json
index df4e4f0aae9..da493cafa70 100644
--- a/extensions/dart/cgmanifest.json
+++ b/extensions/dart/cgmanifest.json
@@ -6,7 +6,7 @@
"git": {
"name": "dart-lang/dart-syntax-highlight",
"repositoryUrl": "https://github.com/dart-lang/dart-syntax-highlight",
- "commitHash": "bb8f7eebf5a1028e70dbebcf35cfef738dddc7fe"
+ "commitHash": "e8b053f9834cb44db0f49ac4a4567177bd943dbf"
}
},
"licenseDetail": [
diff --git a/extensions/dart/syntaxes/dart.tmLanguage.json b/extensions/dart/syntaxes/dart.tmLanguage.json
index 5a4a9393bc7..32ea3f5b0c3 100644
--- a/extensions/dart/syntaxes/dart.tmLanguage.json
+++ b/extensions/dart/syntaxes/dart.tmLanguage.json
@@ -4,7 +4,7 @@
"If you want to provide a fix or improvement, please create a pull request against the original repository.",
"Once accepted there, we are happy to receive an update request."
],
- "version": "https://github.com/dart-lang/dart-syntax-highlight/commit/bb8f7eebf5a1028e70dbebcf35cfef738dddc7fe",
+ "version": "https://github.com/dart-lang/dart-syntax-highlight/commit/e8b053f9834cb44db0f49ac4a4567177bd943dbf",
"name": "Dart",
"scopeName": "source.dart",
"patterns": [
@@ -212,7 +212,7 @@
},
{
"name": "constant.numeric.dart",
- "match": "(?=12.0.0"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/jsonc-parser": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz",
+ "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg=="
+ },
+ "node_modules/queue": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz",
+ "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==",
+ "dependencies": {
+ "inherits": "~2.0.3"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+ "dev": true
+ },
+ "node_modules/vscode-languageserver-textdocument": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.3.tgz",
+ "integrity": "sha512-ynEGytvgTb6HVSUwPJIAZgiHQmPCx8bZ8w5um5Lz+q5DjP0Zj8wTFhQpyg8xaMvefDytw2+HH5yzqS+FhsR28A=="
+ },
+ "node_modules/vscode-languageserver-types": {
+ "version": "3.17.3",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz",
+ "integrity": "sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA=="
+ },
+ "node_modules/vscode-uri": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz",
+ "integrity": "sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A=="
+ }
+ }
+}
diff --git a/extensions/emmet/package.json b/extensions/emmet/package.json
index 1783bc2ceaf..a390a86fc2e 100644
--- a/extensions/emmet/package.json
+++ b/extensions/emmet/package.json
@@ -476,7 +476,7 @@
"scripts": {
"watch": "gulp watch-extension:emmet",
"compile": "gulp compile-extension:emmet",
- "deps": "yarn add @vscode/emmet-helper"
+ "deps": "npm install @vscode/emmet-helper"
},
"devDependencies": {
"@types/node": "20.x"
diff --git a/extensions/emmet/yarn.lock b/extensions/emmet/yarn.lock
deleted file mode 100644
index b75842fe4a4..00000000000
--- a/extensions/emmet/yarn.lock
+++ /dev/null
@@ -1,124 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"@emmetio/abbreviation@^2.3.3":
- version "2.3.3"
- resolved "https://registry.yarnpkg.com/@emmetio/abbreviation/-/abbreviation-2.3.3.tgz#ed2b88fe37b972292d6026c7c540aaf887cecb6e"
- integrity sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==
- dependencies:
- "@emmetio/scanner" "^1.0.4"
-
-"@emmetio/css-abbreviation@^2.1.8":
- version "2.1.8"
- resolved "https://registry.yarnpkg.com/@emmetio/css-abbreviation/-/css-abbreviation-2.1.8.tgz#b785313486eba6cb7eb623ad39378c4e1063dc00"
- integrity sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==
- dependencies:
- "@emmetio/scanner" "^1.0.4"
-
-"@emmetio/css-parser@ramya-rao-a/css-parser#vscode":
- version "0.4.0"
- resolved "https://codeload.github.com/ramya-rao-a/css-parser/tar.gz/370c480ac103bd17c7bcfb34bf5d577dc40d3660"
- dependencies:
- "@emmetio/stream-reader" "^2.2.0"
- "@emmetio/stream-reader-utils" "^0.1.0"
-
-"@emmetio/html-matcher@^0.3.3":
- version "0.3.3"
- resolved "https://registry.yarnpkg.com/@emmetio/html-matcher/-/html-matcher-0.3.3.tgz#0bbdadc0882e185950f03737dc6dbf8f7bd90728"
- integrity sha1-C72twIguGFlQ8Dc33G2/j3vZByg=
- dependencies:
- "@emmetio/stream-reader" "^2.0.0"
- "@emmetio/stream-reader-utils" "^0.1.0"
-
-"@emmetio/math-expression@^1.0.5":
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/@emmetio/math-expression/-/math-expression-1.0.5.tgz#d0cc52ed453a107bc9b19c5d71d1390d3aecbe48"
- integrity sha512-qf5SXD/ViS04rXSeDg9CRGM10xLC9dVaKIbMHrrwxYr5LNB/C0rOfokhGSBwnVQKcidLmdRJeNWH1V1tppZ84Q==
- dependencies:
- "@emmetio/scanner" "^1.0.4"
-
-"@emmetio/scanner@^1.0.4":
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/@emmetio/scanner/-/scanner-1.0.4.tgz#e9cdc67194fd91f8b7eb141014be4f2d086c15f1"
- integrity sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==
-
-"@emmetio/stream-reader-utils@^0.1.0":
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/@emmetio/stream-reader-utils/-/stream-reader-utils-0.1.0.tgz#244cb02c77ec2e74f78a9bd318218abc9c500a61"
- integrity sha1-JEywLHfsLnT3ipvTGCGKvJxQCmE=
-
-"@emmetio/stream-reader@^2.0.0", "@emmetio/stream-reader@^2.2.0":
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/@emmetio/stream-reader/-/stream-reader-2.2.0.tgz#46cffea119a0a003312a21c2d9b5628cb5fcd442"
- integrity sha1-Rs/+oRmgoAMxKiHC2bVijLX81EI=
-
-"@types/node@20.x":
- version "20.11.24"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.24.tgz#cc207511104694e84e9fb17f9a0c4c42d4517792"
- integrity sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==
- dependencies:
- undici-types "~5.26.4"
-
-"@vscode/emmet-helper@^2.8.8":
- version "2.9.3"
- resolved "https://registry.yarnpkg.com/@vscode/emmet-helper/-/emmet-helper-2.9.3.tgz#8a8b228981fcf2d9346fdca77b9ad5a31dc09dba"
- integrity sha512-rB39LHWWPQYYlYfpv9qCoZOVioPCftKXXqrsyqN1mTWZM6dTnONT63Db+03vgrBbHzJN45IrgS/AGxw9iiqfEw==
- dependencies:
- emmet "^2.4.3"
- jsonc-parser "^2.3.0"
- vscode-languageserver-textdocument "^1.0.1"
- vscode-languageserver-types "^3.15.1"
- vscode-uri "^2.1.2"
-
-emmet@^2.4.3:
- version "2.4.7"
- resolved "https://registry.yarnpkg.com/emmet/-/emmet-2.4.7.tgz#19893c34e6274af14ea3c5729101e3c4ed18f01e"
- integrity sha512-O5O5QNqtdlnQM2bmKHtJgyChcrFMgQuulI+WdiOw2NArzprUqqxUW6bgYtKvzKgrsYpuLWalOkdhNP+1jluhCA==
- dependencies:
- "@emmetio/abbreviation" "^2.3.3"
- "@emmetio/css-abbreviation" "^2.1.8"
-
-image-size@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.0.0.tgz#58b31fe4743b1cec0a0ac26f5c914d3c5b2f0750"
- integrity sha512-JLJ6OwBfO1KcA+TvJT+v8gbE6iWbj24LyDNFgFEN0lzegn6cC6a/p3NIDaepMsJjQjlUWqIC7wJv8lBFxPNjcw==
- dependencies:
- queue "6.0.2"
-
-inherits@~2.0.3:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
- integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
-
-jsonc-parser@^2.3.0:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-2.3.1.tgz#59549150b133f2efacca48fe9ce1ec0659af2342"
- integrity sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==
-
-queue@6.0.2:
- version "6.0.2"
- resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65"
- integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==
- dependencies:
- inherits "~2.0.3"
-
-undici-types@~5.26.4:
- version "5.26.5"
- resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
- integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
-
-vscode-languageserver-textdocument@^1.0.1:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.3.tgz#879f2649bfa5a6e07bc8b392c23ede2dfbf43eff"
- integrity sha512-ynEGytvgTb6HVSUwPJIAZgiHQmPCx8bZ8w5um5Lz+q5DjP0Zj8wTFhQpyg8xaMvefDytw2+HH5yzqS+FhsR28A==
-
-vscode-languageserver-types@^3.15.1:
- version "3.17.3"
- resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz#72d05e47b73be93acb84d6e311b5786390f13f64"
- integrity sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==
-
-vscode-uri@^2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-2.1.2.tgz#c8d40de93eb57af31f3c715dd650e2ca2c096f1c"
- integrity sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==
diff --git a/extensions/extension-editing/.npmrc b/extensions/extension-editing/.npmrc
new file mode 100644
index 00000000000..a9c57709666
--- /dev/null
+++ b/extensions/extension-editing/.npmrc
@@ -0,0 +1,2 @@
+legacy-peer-deps="true"
+timeout=180000
diff --git a/extensions/extension-editing/.vscodeignore b/extensions/extension-editing/.vscodeignore
index de8e6dc5913..8d4da76b9cb 100644
--- a/extensions/extension-editing/.vscodeignore
+++ b/extensions/extension-editing/.vscodeignore
@@ -4,4 +4,4 @@ tsconfig.json
out/**
extension.webpack.config.js
extension-browser.webpack.config.js
-yarn.lock
+package-lock.json
diff --git a/extensions/extension-editing/package-lock.json b/extensions/extension-editing/package-lock.json
new file mode 100644
index 00000000000..3fa0c35e2d0
--- /dev/null
+++ b/extensions/extension-editing/package-lock.json
@@ -0,0 +1,110 @@
+{
+ "name": "extension-editing",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "extension-editing",
+ "version": "1.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "jsonc-parser": "^3.2.0",
+ "markdown-it": "^12.3.2",
+ "parse5": "^3.0.2"
+ },
+ "devDependencies": {
+ "@types/markdown-it": "0.0.2",
+ "@types/node": "20.x"
+ },
+ "engines": {
+ "vscode": "^1.4.0"
+ }
+ },
+ "node_modules/@types/markdown-it": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-0.0.2.tgz",
+ "integrity": "sha1-XZrRnm5lCM3S8llt+G/Qqt5ZhmA= sha512-A2seE+zJYSjGHy7L/v0EN/xRfgv2A60TuXOwI8tt5aZxF4UeoYIkM2jERnNH8w4VFr7oFEm0lElGOao7fZgygQ==",
+ "dev": true
+ },
+ "node_modules/@types/node": {
+ "version": "20.11.24",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz",
+ "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==",
+ "dev": true,
+ "dependencies": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+ },
+ "node_modules/entities": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
+ "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/jsonc-parser": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz",
+ "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w=="
+ },
+ "node_modules/linkify-it": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz",
+ "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==",
+ "dependencies": {
+ "uc.micro": "^1.0.1"
+ }
+ },
+ "node_modules/markdown-it": {
+ "version": "12.3.2",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz",
+ "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==",
+ "dependencies": {
+ "argparse": "^2.0.1",
+ "entities": "~2.1.0",
+ "linkify-it": "^3.0.1",
+ "mdurl": "^1.0.1",
+ "uc.micro": "^1.0.5"
+ },
+ "bin": {
+ "markdown-it": "bin/markdown-it.js"
+ }
+ },
+ "node_modules/mdurl": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
+ "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g=="
+ },
+ "node_modules/parse5": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.2.tgz",
+ "integrity": "sha1-Be/1fw70V3+xRKefi5qWemzERRA= sha512-yQW05f47bKFJa0WdnyzP7vh7+B+w8jhVsFBBiaEbIfNDSSt8GADBhcQgsdYxatQ7rVs1nU9cmsYXURGWBH3Siw==",
+ "dependencies": {
+ "@types/node": "^6.0.46"
+ }
+ },
+ "node_modules/parse5/node_modules/@types/node": {
+ "version": "6.0.78",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.78.tgz",
+ "integrity": "sha512-+vD6E8ixntRzzZukoF3uP1iV+ZjVN3koTcaeK+BEoc/kSfGbLDIGC7RmCaUgVpUfN6cWvfczFRERCyKM9mkvXg=="
+ },
+ "node_modules/uc.micro": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
+ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
+ },
+ "node_modules/undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+ "dev": true
+ }
+ }
+}
diff --git a/extensions/extension-editing/src/extensionLinter.ts b/extensions/extension-editing/src/extensionLinter.ts
index dd1727edb7b..b69dac0e2dd 100644
--- a/extensions/extension-editing/src/extensionLinter.ts
+++ b/extensions/extension-editing/src/extensionLinter.ts
@@ -149,7 +149,8 @@ export class ExtensionLinter {
const effectiveProposalNames = extensionEnabledApiProposals[extensionId];
if (Array.isArray(effectiveProposalNames) && enabledApiProposals.children) {
for (const child of enabledApiProposals.children) {
- if (child.type === 'string' && !effectiveProposalNames.includes(getNodeValue(child))) {
+ const proposalName = child.type === 'string' ? getNodeValue(child) : undefined;
+ if (typeof proposalName === 'string' && !effectiveProposalNames.includes(proposalName.split('@')[0])) {
const start = document.positionAt(child.offset);
const end = document.positionAt(child.offset + child.length);
diagnostics.push(new Diagnostic(new Range(start, end), apiProposalNotListed, DiagnosticSeverity.Error));
diff --git a/extensions/extension-editing/yarn.lock b/extensions/extension-editing/yarn.lock
deleted file mode 100644
index 00fad585fd1..00000000000
--- a/extensions/extension-editing/yarn.lock
+++ /dev/null
@@ -1,75 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"@types/markdown-it@0.0.2":
- version "0.0.2"
- resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-0.0.2.tgz#5d9ad19e6e6508cdd2f2596df86fd0aade598660"
- integrity sha1-XZrRnm5lCM3S8llt+G/Qqt5ZhmA=
-
-"@types/node@20.x":
- version "20.11.24"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.24.tgz#cc207511104694e84e9fb17f9a0c4c42d4517792"
- integrity sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==
- dependencies:
- undici-types "~5.26.4"
-
-"@types/node@^6.0.46":
- version "6.0.78"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.78.tgz#5d4a3f579c1524e01ee21bf474e6fba09198f470"
- integrity sha512-+vD6E8ixntRzzZukoF3uP1iV+ZjVN3koTcaeK+BEoc/kSfGbLDIGC7RmCaUgVpUfN6cWvfczFRERCyKM9mkvXg==
-
-argparse@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
- integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
-
-entities@~2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5"
- integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==
-
-jsonc-parser@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76"
- integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==
-
-linkify-it@^3.0.1:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.3.tgz#a98baf44ce45a550efb4d49c769d07524cc2fa2e"
- integrity sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==
- dependencies:
- uc.micro "^1.0.1"
-
-markdown-it@^12.3.2:
- version "12.3.2"
- resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.3.2.tgz#bf92ac92283fe983fe4de8ff8abfb5ad72cd0c90"
- integrity sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==
- dependencies:
- argparse "^2.0.1"
- entities "~2.1.0"
- linkify-it "^3.0.1"
- mdurl "^1.0.1"
- uc.micro "^1.0.5"
-
-mdurl@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e"
- integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=
-
-parse5@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.2.tgz#05eff57f0ef4577fb144a79f8b9a967a6cc44510"
- integrity sha1-Be/1fw70V3+xRKefi5qWemzERRA=
- dependencies:
- "@types/node" "^6.0.46"
-
-uc.micro@^1.0.1, uc.micro@^1.0.5:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac"
- integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==
-
-undici-types@~5.26.4:
- version "5.26.5"
- resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
- integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
diff --git a/extensions/fsharp/cgmanifest.json b/extensions/fsharp/cgmanifest.json
index 524b3fa0d46..75e24896d8e 100644
--- a/extensions/fsharp/cgmanifest.json
+++ b/extensions/fsharp/cgmanifest.json
@@ -6,7 +6,7 @@
"git": {
"name": "ionide/ionide-fsgrammar",
"repositoryUrl": "https://github.com/ionide/ionide-fsgrammar",
- "commitHash": "7d029a46f17637228b2ee85dd02e511c3e8039b3"
+ "commitHash": "c62c78404d0b2c14816aae61ac0688663a5990a3"
}
},
"license": "MIT",
diff --git a/extensions/fsharp/syntaxes/fsharp.tmLanguage.json b/extensions/fsharp/syntaxes/fsharp.tmLanguage.json
index 5063f1c5210..8ba555b7772 100644
--- a/extensions/fsharp/syntaxes/fsharp.tmLanguage.json
+++ b/extensions/fsharp/syntaxes/fsharp.tmLanguage.json
@@ -4,7 +4,7 @@
"If you want to provide a fix or improvement, please create a pull request against the original repository.",
"Once accepted there, we are happy to receive an update request."
],
- "version": "https://github.com/ionide/ionide-fsgrammar/commit/7d029a46f17637228b2ee85dd02e511c3e8039b3",
+ "version": "https://github.com/ionide/ionide-fsgrammar/commit/c62c78404d0b2c14816aae61ac0688663a5990a3",
"name": "fsharp",
"scopeName": "source.fsharp",
"patterns": [
@@ -617,7 +617,7 @@
},
{
"name": "constant.numeric.float.fsharp",
- "match": "\\b-?[0-9][0-9_]*((\\.([0-9][0-9_]*([eE][+-]??[0-9][0-9_]*)?)?)|([eE][+-]??[0-9][0-9_]*))"
+ "match": "\\b-?[0-9][0-9_]*((\\.(?!\\.)([0-9][0-9_]*([eE][+-]??[0-9][0-9_]*)?)?)|([eE][+-]??[0-9][0-9_]*))"
},
{
"name": "constant.numeric.integer.nativeint.fsharp",
@@ -635,7 +635,7 @@
},
"abstract_definition": {
"name": "abstract.definition.fsharp",
- "begin": "\\b(abstract)\\s+(member)?(\\s+\\[\\<.*\\>\\])?\\s*([_[:alpha:]0-9,\\._`\\s]+)(<)?",
+ "begin": "\\b(static\\s+)?(abstract)\\s+(member)?(\\s+\\[\\<.*\\>\\])?\\s*([_[:alpha:]0-9,\\._`\\s]+)(<)?",
"end": "\\s*(with)\\b|=|$",
"beginCaptures": {
"1": {
@@ -645,6 +645,9 @@
"name": "keyword.fsharp"
},
"3": {
+ "name": "keyword.fsharp"
+ },
+ "4": {
"name": "support.function.attribute.fsharp"
},
"5": {
@@ -838,7 +841,7 @@
"name": "keyword.symbol.fsharp"
}
},
- "end": "(\\)\\s*(([?[:alpha:]0-9'`^._ ]+))+)",
+ "end": "(\\)\\s*(([?[:alpha:]0-9'`^._ ]+))*)",
"endCaptures": {
"1": {
"name": "keyword.symbol.fsharp"
@@ -933,7 +936,7 @@
"patterns": [
{
"name": "binding.fsharp",
- "begin": "\\b(let mutable|static let mutable|static let|let inline|let|and|member val|static member inline|static member|default|member|override|let!)(\\s+rec|mutable)?(\\s+\\[\\<.*\\>\\])?\\s*(private|internal|public)?\\s+(\\[[^-=]*\\]|[_[:alpha:]]([_[:alpha:]0-9\\._]+)*|``[_[:alpha:]]([_[:alpha:]0-9\\._`\\s]+|(?<=,)\\s)*)?",
+ "begin": "\\b(let mutable|static let mutable|static let|let inline|let|and|member val|member inline|static member inline|static member val|static member|default|member|override|let!)(\\s+rec|mutable)?(\\s+\\[\\<.*\\>\\])?\\s*(private|internal|public)?\\s+(\\[[^-=]*\\]|[_[:alpha:]]([_[:alpha:]0-9\\._]+)*|``[_[:alpha:]]([_[:alpha:]0-9\\._`\\s]+|(?<=,)\\s)*)?",
"end": "\\s*((with\\b)|(=|\\n+=|(?<=\\=)))",
"beginCaptures": {
"1": {
@@ -1008,7 +1011,7 @@
},
{
"name": "binding.fsharp",
- "begin": "\\b(static val mutable|val mutable|val)(\\s+rec|mutable)?(\\s+\\[\\<.*\\>\\])?\\s*(private|internal|public)?\\s+(\\[[^-=]*\\]|[_[:alpha:]]([_[:alpha:]0-9,\\._]+)*|``[_[:alpha:]]([_[:alpha:]0-9,\\._`\\s]+|(?<=,)\\s)*)?",
+ "begin": "\\b(static val mutable|val mutable|val inline|val)(\\s+rec|mutable)?(\\s+\\[\\<.*\\>\\])?\\s*(private|internal|public)?\\s+(\\[[^-=]*\\]|[_[:alpha:]]([_[:alpha:]0-9,\\._]+)*|``[_[:alpha:]]([_[:alpha:]0-9,\\._`\\s]+|(?<=,)\\s)*)?",
"end": "\\n$",
"beginCaptures": {
"1": {
@@ -1130,7 +1133,7 @@
},
{
"name": "keyword.symbol.fsharp",
- "match": "(&&&|\\|\\|\\||\\^\\^\\^|~~~|~\\+|~\\-|<<<|>>>|\\|>|:>|:\\?>|:|\\[|\\]|\\;|<>|=|@|\\|\\||&&|&|%|{|}|\\||_|\\.\\.|\\,|\\+|\\-|\\*|\\/|\\^|\\!|\\>|\\>\\=|\\>\\>|\\<|\\<\\=|\\(|\\)|\\<\\<)"
+ "match": "[.?]*(&&&|\\|\\|\\||\\^\\^\\^|~~~|~\\+|~\\-|<<<|>>>|\\|>|:>|:\\?>|:|\\[|\\]|\\;|<>|=|@|\\|\\||&&|&|%|{|}|\\||_|\\.\\.|\\,|\\+|\\-|\\*|\\/|\\^|\\!|\\>|\\>\\=|\\>\\>|\\<|\\<\\=|\\(|\\)|\\<\\<)[.?]*"
}
]
},
diff --git a/extensions/fsharp/yarn.lock b/extensions/fsharp/yarn.lock
deleted file mode 100644
index fb57ccd13af..00000000000
--- a/extensions/fsharp/yarn.lock
+++ /dev/null
@@ -1,4 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
diff --git a/extensions/git-base/.npmrc b/extensions/git-base/.npmrc
new file mode 100644
index 00000000000..a9c57709666
--- /dev/null
+++ b/extensions/git-base/.npmrc
@@ -0,0 +1,2 @@
+legacy-peer-deps="true"
+timeout=180000
diff --git a/extensions/git-base/package-lock.json b/extensions/git-base/package-lock.json
new file mode 100644
index 00000000000..f4b29739ca6
--- /dev/null
+++ b/extensions/git-base/package-lock.json
@@ -0,0 +1,34 @@
+{
+ "name": "git-base",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "git-base",
+ "version": "1.0.0",
+ "license": "MIT",
+ "devDependencies": {
+ "@types/node": "20.x"
+ },
+ "engines": {
+ "vscode": "0.10.x"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "20.11.24",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz",
+ "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==",
+ "dev": true,
+ "dependencies": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+ "dev": true
+ }
+ }
+}
diff --git a/extensions/git-base/yarn.lock b/extensions/git-base/yarn.lock
deleted file mode 100644
index 1f4b6c2e8b4..00000000000
--- a/extensions/git-base/yarn.lock
+++ /dev/null
@@ -1,15 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"@types/node@20.x":
- version "20.11.24"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.24.tgz#cc207511104694e84e9fb17f9a0c4c42d4517792"
- integrity sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==
- dependencies:
- undici-types "~5.26.4"
-
-undici-types@~5.26.4:
- version "5.26.5"
- resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
- integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
diff --git a/extensions/git/.npmrc b/extensions/git/.npmrc
new file mode 100644
index 00000000000..a9c57709666
--- /dev/null
+++ b/extensions/git/.npmrc
@@ -0,0 +1,2 @@
+legacy-peer-deps="true"
+timeout=180000
diff --git a/extensions/git/.vscodeignore b/extensions/git/.vscodeignore
index 94d2dc921e0..1e6130d5c7d 100644
--- a/extensions/git/.vscodeignore
+++ b/extensions/git/.vscodeignore
@@ -4,4 +4,4 @@ out/**
tsconfig.json
build/**
extension.webpack.config.js
-yarn.lock
+package-lock.json
diff --git a/extensions/git/package-lock.json b/extensions/git/package-lock.json
new file mode 100644
index 00000000000..b15b708e618
--- /dev/null
+++ b/extensions/git/package-lock.json
@@ -0,0 +1,420 @@
+{
+ "name": "git",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "git",
+ "version": "1.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "@joaomoreno/unique-names-generator": "^5.1.0",
+ "@vscode/extension-telemetry": "^0.9.0",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "byline": "^5.0.0",
+ "file-type": "16.5.4",
+ "jschardet": "3.1.4",
+ "picomatch": "2.3.1",
+ "vscode-uri": "^2.0.0",
+ "which": "4.0.0"
+ },
+ "devDependencies": {
+ "@types/byline": "4.2.31",
+ "@types/mocha": "^9.1.1",
+ "@types/node": "20.x",
+ "@types/picomatch": "2.3.0",
+ "@types/which": "3.0.0"
+ },
+ "engines": {
+ "vscode": "^1.5.0"
+ }
+ },
+ "node_modules/@joaomoreno/unique-names-generator": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@joaomoreno/unique-names-generator/-/unique-names-generator-5.1.0.tgz",
+ "integrity": "sha512-KEVThTpUIKPb7dBKJ9mJ3WYnD1mJZZsEinCSp9CVEPlWbDagurFv1RKRjvvujrLfJzsGc0HkBHS9W8Bughao4A==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@microsoft/1ds-core-js": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-4.0.3.tgz",
+ "integrity": "sha512-FrxNLVAPsAvD7+l63TlNS/Kodvpct2WulpDSn1dI4Xuy0kF4E2H867kHdwL/iY1Bj3zA3FSy/jvE4+OcDws7ug==",
+ "dependencies": {
+ "@microsoft/applicationinsights-core-js": "3.0.4",
+ "@microsoft/applicationinsights-shims": "3.0.1",
+ "@microsoft/dynamicproto-js": "^2.0.2",
+ "@nevware21/ts-async": ">= 0.3.0 < 2.x",
+ "@nevware21/ts-utils": ">= 0.10.1 < 2.x"
+ }
+ },
+ "node_modules/@microsoft/1ds-post-js": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@microsoft/1ds-post-js/-/1ds-post-js-4.0.3.tgz",
+ "integrity": "sha512-uewvmUtXKd7ttypiKQGdYI6i7UUpPkOznLayzIFrJ4r2xnG6jhPjpKRncHFXPQcM4XSWO3yf5PQ3xAbPq9t7ZQ==",
+ "dependencies": {
+ "@microsoft/1ds-core-js": "4.0.3",
+ "@microsoft/applicationinsights-shims": "3.0.1",
+ "@microsoft/dynamicproto-js": "^2.0.2",
+ "@nevware21/ts-async": ">= 0.3.0 < 2.x",
+ "@nevware21/ts-utils": ">= 0.10.1 < 2.x"
+ }
+ },
+ "node_modules/@microsoft/applicationinsights-channel-js": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-channel-js/-/applicationinsights-channel-js-3.0.4.tgz",
+ "integrity": "sha512-6TlfExmErQ8Y+/ChbkyWl+jyt4wg3T6p7lwXDsUCB0LgZmlEWMaCUS0YlT73JCWmE8j7vxW8yUm0lgsgmHns3A==",
+ "dependencies": {
+ "@microsoft/applicationinsights-common": "3.0.4",
+ "@microsoft/applicationinsights-core-js": "3.0.4",
+ "@microsoft/applicationinsights-shims": "3.0.1",
+ "@microsoft/dynamicproto-js": "^2.0.2",
+ "@nevware21/ts-async": ">= 0.3.0 < 2.x",
+ "@nevware21/ts-utils": ">= 0.10.1 < 2.x"
+ },
+ "peerDependencies": {
+ "tslib": "*"
+ }
+ },
+ "node_modules/@microsoft/applicationinsights-common": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-common/-/applicationinsights-common-3.0.4.tgz",
+ "integrity": "sha512-r5gWaw/K9+tKfuo2GtDiDiKASgOkPOCrKW+wZzFvuR06uuwvWjbVQ6yW/YbnfuhRF5M65ksUiMi0eCMwEOGq7Q==",
+ "dependencies": {
+ "@microsoft/applicationinsights-core-js": "3.0.4",
+ "@microsoft/applicationinsights-shims": "3.0.1",
+ "@microsoft/dynamicproto-js": "^2.0.2",
+ "@nevware21/ts-utils": ">= 0.10.1 < 2.x"
+ },
+ "peerDependencies": {
+ "tslib": "*"
+ }
+ },
+ "node_modules/@microsoft/applicationinsights-core-js": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-3.0.4.tgz",
+ "integrity": "sha512-anxy5kEkqBmVoEqJiJzaaXXA0wzqZi9U4zGd05xFJ04lWckP8dG3zyT3+GGdg7rDelqLTNGxndeYoFmDv63u1g==",
+ "dependencies": {
+ "@microsoft/applicationinsights-shims": "3.0.1",
+ "@microsoft/dynamicproto-js": "^2.0.2",
+ "@nevware21/ts-async": ">= 0.3.0 < 2.x",
+ "@nevware21/ts-utils": ">= 0.10.1 < 2.x"
+ },
+ "peerDependencies": {
+ "tslib": "*"
+ }
+ },
+ "node_modules/@microsoft/applicationinsights-shims": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-shims/-/applicationinsights-shims-3.0.1.tgz",
+ "integrity": "sha512-DKwboF47H1nb33rSUfjqI6ryX29v+2QWcTrRvcQDA32AZr5Ilkr7whOOSsD1aBzwqX0RJEIP1Z81jfE3NBm/Lg==",
+ "dependencies": {
+ "@nevware21/ts-utils": ">= 0.9.4 < 2.x"
+ }
+ },
+ "node_modules/@microsoft/applicationinsights-web-basic": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-web-basic/-/applicationinsights-web-basic-3.0.4.tgz",
+ "integrity": "sha512-KfoxPlLlf0JT12ADb23C5iGye/yFouoMgHEKULxkSQcYY9SsW/8rVrqqvoYKAL+u215CZU2A8Kc8sR3ehEaPCQ==",
+ "dependencies": {
+ "@microsoft/applicationinsights-channel-js": "3.0.4",
+ "@microsoft/applicationinsights-common": "3.0.4",
+ "@microsoft/applicationinsights-core-js": "3.0.4",
+ "@microsoft/applicationinsights-shims": "3.0.1",
+ "@microsoft/dynamicproto-js": "^2.0.2",
+ "@nevware21/ts-async": ">= 0.3.0 < 2.x",
+ "@nevware21/ts-utils": ">= 0.10.1 < 2.x"
+ },
+ "peerDependencies": {
+ "tslib": "*"
+ }
+ },
+ "node_modules/@microsoft/dynamicproto-js": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-2.0.2.tgz",
+ "integrity": "sha512-MB8trWaFREpmb037k/d0bB7T2BP7Ai24w1e1tbz3ASLB0/lwphsq3Nq8S9I5AsI5vs4zAQT+SB5nC5/dLYTiOg==",
+ "dependencies": {
+ "@nevware21/ts-utils": ">= 0.9.4 < 2.x"
+ }
+ },
+ "node_modules/@nevware21/ts-async": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@nevware21/ts-async/-/ts-async-0.3.0.tgz",
+ "integrity": "sha512-ZUcgUH12LN/F6nzN0cYd0F/rJaMLmXr0EHVTyYfaYmK55bdwE4338uue4UiVoRqHVqNW4KDUrJc49iGogHKeWA==",
+ "dependencies": {
+ "@nevware21/ts-utils": ">= 0.10.0 < 2.x"
+ }
+ },
+ "node_modules/@nevware21/ts-utils": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/@nevware21/ts-utils/-/ts-utils-0.10.1.tgz",
+ "integrity": "sha512-pMny25NnF2/MJwdqC3Iyjm2pGIXNxni4AROpcqDeWa+td9JMUY4bUS9uU9XW+BoBRqTLUL+WURF9SOd/6OQzRg=="
+ },
+ "node_modules/@tokenizer/token": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz",
+ "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="
+ },
+ "node_modules/@types/byline": {
+ "version": "4.2.31",
+ "resolved": "https://registry.npmjs.org/@types/byline/-/byline-4.2.31.tgz",
+ "integrity": "sha1-DmH8ucA+BH0hxEllVMcRYperYM0= sha512-TC6Ljn7tALesQMQyTNoMWoM44SNvWtCLkJDrA/TxcwE5ILkWt4zi5wbEokqiDk42S75eykAY1onPImWDybOkmQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/mocha": {
+ "version": "9.1.1",
+ "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz",
+ "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==",
+ "dev": true
+ },
+ "node_modules/@types/node": {
+ "version": "20.11.24",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz",
+ "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==",
+ "dev": true,
+ "dependencies": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "node_modules/@types/picomatch": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@types/picomatch/-/picomatch-2.3.0.tgz",
+ "integrity": "sha512-O397rnSS9iQI4OirieAtsDqvCj4+3eY1J+EPdNTKuHuRWIfUoGyzX294o8C4KJYaLqgSrd2o60c5EqCU8Zv02g==",
+ "dev": true
+ },
+ "node_modules/@types/which": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/which/-/which-3.0.0.tgz",
+ "integrity": "sha512-ASCxdbsrwNfSMXALlC3Decif9rwDMu+80KGp5zI2RLRotfMsTv7fHL8W8VDp24wymzDyIFudhUeSCugrgRFfHQ==",
+ "dev": true
+ },
+ "node_modules/@vscode/extension-telemetry": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-0.9.0.tgz",
+ "integrity": "sha512-37RxGHXrs3GoXPgCUKQhghEu0gxs8j27RLjQwwtSf4WhPdJKz8UrqMYzpsXlliQ05zURYmtdGZst9C6+hfWXaQ==",
+ "dependencies": {
+ "@microsoft/1ds-core-js": "^4.0.3",
+ "@microsoft/1ds-post-js": "^4.0.3",
+ "@microsoft/applicationinsights-web-basic": "^3.0.4"
+ },
+ "engines": {
+ "vscode": "^1.75.0"
+ }
+ },
+ "node_modules/@vscode/iconv-lite-umd": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/@vscode/iconv-lite-umd/-/iconv-lite-umd-0.7.0.tgz",
+ "integrity": "sha512-bRRFxLfg5dtAyl5XyiVWz/ZBPahpOpPrNYnnHpOpUZvam4tKH35wdhP4Kj6PbM0+KdliOsPzbGWpkxcdpNB/sg=="
+ },
+ "node_modules/byline": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz",
+ "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE= sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/file-type": {
+ "version": "16.5.4",
+ "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz",
+ "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==",
+ "dependencies": {
+ "readable-web-to-node-stream": "^3.0.0",
+ "strtok3": "^6.2.4",
+ "token-types": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/file-type?sponsor=1"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/isexe": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
+ "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/jschardet": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-3.1.4.tgz",
+ "integrity": "sha512-/kmVISmrwVwtyYU40iQUOp3SUPk2dhNCMsZBQX0R1/jZ8maaXJ/oZIzUOiyOqcgtLnETFKYChbJ5iDC/eWmFHg==",
+ "license": "LGPL-2.1+",
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
+ "node_modules/peek-readable": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz",
+ "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Borewit"
+ }
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/readable-web-to-node-stream": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz",
+ "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==",
+ "dependencies": {
+ "readable-stream": "^3.6.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Borewit"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/strtok3": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz",
+ "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==",
+ "dependencies": {
+ "@tokenizer/token": "^0.3.0",
+ "peek-readable": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Borewit"
+ }
+ },
+ "node_modules/token-types": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.0.tgz",
+ "integrity": "sha512-P0rrp4wUpefLncNamWIef62J0v0kQR/GfDVji9WKY7GDCWy5YbVSrKUTam07iWPZQGy0zWNOfstYTykMmPNR7w==",
+ "dependencies": {
+ "@tokenizer/token": "^0.3.0",
+ "ieee754": "^1.2.1"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Borewit"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+ "dev": true
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ },
+ "node_modules/vscode-uri": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.0.0.tgz",
+ "integrity": "sha512-lWXWofDSYD8r/TIyu64MdwB4FaSirQ608PP/TzUyslyOeHGwQ0eTHUZeJrK1ILOmwUHaJtV693m2JoUYroUDpw=="
+ },
+ "node_modules/which": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz",
+ "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==",
+ "dependencies": {
+ "isexe": "^3.1.1"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
+ },
+ "engines": {
+ "node": "^16.13.0 || >=18.0.0"
+ }
+ }
+ }
+}
diff --git a/extensions/git/package.json b/extensions/git/package.json
index 23b3220a00c..ee3a7a16d27 100644
--- a/extensions/git/package.json
+++ b/extensions/git/package.json
@@ -16,14 +16,15 @@
"contribMergeEditorMenus",
"contribMultiDiffEditorMenus",
"contribDiffEditorGutterToolBarMenus",
- "contribSourceControlHistoryItemGroupMenu",
"contribSourceControlHistoryItemMenu",
+ "contribSourceControlHistoryTitleMenu",
"contribSourceControlInputBoxMenu",
"contribSourceControlTitleMenu",
"contribViewsWelcome",
"diffCommand",
"editSessionIdentityProvider",
"quickDiffProvider",
+ "quickInputButtonLocation",
"quickPickSortByLabel",
"scmActionButton",
"scmHistoryProvider",
@@ -451,6 +452,12 @@
"category": "Git",
"enablement": "!operationInProgress"
},
+ {
+ "command": "git.checkoutRefDetached",
+ "title": "%command.checkoutRefDetached%",
+ "category": "Git",
+ "enablement": "!operationInProgress"
+ },
{
"command": "git.branch",
"title": "%command.branch%",
@@ -526,6 +533,7 @@
{
"command": "git.fetchAll",
"title": "%command.fetchAll%",
+ "icon": "$(git-fetch)",
"category": "Git",
"enablement": "!operationInProgress"
},
@@ -616,6 +624,12 @@
"category": "Git",
"enablement": "!operationInProgress"
},
+ {
+ "command": "git.cherryPickRef",
+ "title": "%command.cherryPickRef%",
+ "category": "Git",
+ "enablement": "!operationInProgress"
+ },
{
"command": "git.addRemote",
"title": "%command.addRemote%",
@@ -891,6 +905,16 @@
"icon": "$(diff-multiple)",
"category": "Git",
"enablement": "!operationInProgress"
+ },
+ {
+ "command": "git.copyCommitId",
+ "title": "%command.timelineCopyCommitId%",
+ "category": "Git"
+ },
+ {
+ "command": "git.copyCommitMessage",
+ "title": "%command.timelineCopyCommitMessage%",
+ "category": "Git"
}
],
"continueEditSession": [
@@ -1426,6 +1450,22 @@
{
"command": "git.pushRef",
"when": "false"
+ },
+ {
+ "command": "git.copyCommitId",
+ "when": "false"
+ },
+ {
+ "command": "git.copyCommitMessage",
+ "when": "false"
+ },
+ {
+ "command": "git.checkoutRefDetached",
+ "when": "false"
+ },
+ {
+ "command": "git.cherryPickRef",
+ "when": "false"
}
],
"scm/title": [
@@ -1915,100 +1955,43 @@
"group": "1_modification@3"
}
],
- "scm/incomingChanges": [
+ "scm/history/title": [
{
- "command": "git.fetchRef",
- "group": "navigation",
- "when": "scmProvider == git"
- },
- {
- "command": "git.pullRef",
- "group": "navigation",
+ "command": "git.fetchAll",
+ "group": "navigation@999",
"when": "scmProvider == git"
}
],
- "scm/incomingChanges/context": [
+ "scm/historyItem/context": [
{
- "command": "git.fetchRef",
- "group": "1_modification@1",
- "when": "scmProvider == git"
+ "command": "git.createTag",
+ "when": "scmProvider == git",
+ "group": "1_create@1"
},
{
- "command": "git.pullRef",
- "group": "1_modification@2",
- "when": "scmProvider == git"
- }
- ],
- "scm/incomingChanges/allChanges/context": [
- {
- "command": "git.viewAllChanges",
- "when": "scmProvider == git && scmHistoryItemFileCount != 0 && config.multiDiffEditor.experimental.enabled",
- "group": "inline@1"
+ "command": "git.branch",
+ "when": "scmProvider == git",
+ "group": "1_create@2"
},
{
- "command": "git.viewAllChanges",
- "when": "scmProvider == git && scmHistoryItemFileCount != 0 && config.multiDiffEditor.experimental.enabled",
- "group": "1_view@1"
- }
- ],
- "scm/incomingChanges/historyItem/context": [
- {
- "command": "git.viewCommit",
- "when": "scmProvider == git && scmHistoryItemFileCount != 0 && config.multiDiffEditor.experimental.enabled",
- "group": "inline@1"
+ "command": "git.cherryPickRef",
+ "when": "scmProvider == git",
+ "group": "2_modify@1"
},
{
- "command": "git.viewCommit",
- "when": "scmProvider == git && scmHistoryItemFileCount != 0 && config.multiDiffEditor.experimental.enabled",
- "group": "1_view@1"
- }
- ],
- "scm/outgoingChanges": [
- {
- "command": "git.pushRef",
- "group": "navigation",
- "when": "scmProvider == git && scmHistoryItemGroupHasUpstream"
+ "command": "git.checkoutRefDetached",
+ "when": "scmProvider == git",
+ "group": "2_modify@2"
},
{
- "command": "git.publish",
- "group": "navigation",
- "when": "scmProvider == git && !scmHistoryItemGroupHasUpstream"
- }
- ],
- "scm/outgoingChanges/context": [
- {
- "command": "git.pushRef",
- "when": "scmProvider == git && scmHistoryItemGroupHasUpstream",
- "group": "1_modification@1"
+ "command": "git.copyCommitId",
+ "when": "scmProvider == git && !listMultiSelection",
+ "group": "9_copy@1"
},
{
- "command": "git.publish",
- "when": "scmProvider == git && !scmHistoryItemGroupHasUpstream",
- "group": "1_modification@1"
- }
- ],
- "scm/outgoingChanges/allChanges/context": [
- {
- "command": "git.viewAllChanges",
- "when": "scmProvider == git && scmHistoryItemFileCount != 0 && config.multiDiffEditor.experimental.enabled",
- "group": "inline@1"
- },
- {
- "command": "git.viewAllChanges",
- "when": "scmProvider == git && scmHistoryItemFileCount != 0 && config.multiDiffEditor.experimental.enabled",
- "group": "1_view@1"
- }
- ],
- "scm/outgoingChanges/historyItem/context": [
- {
- "command": "git.viewCommit",
- "when": "scmProvider == git && scmHistoryItemFileCount != 0 && config.multiDiffEditor.experimental.enabled",
- "group": "inline@1"
- },
- {
- "command": "git.viewCommit",
- "when": "scmProvider == git && scmHistoryItemFileCount != 0 && config.multiDiffEditor.experimental.enabled",
- "group": "1_view@1"
+ "command": "git.copyCommitMessage",
+ "when": "scmProvider == git && !listMultiSelection",
+ "group": "9_copy@2"
}
],
"editor/title": [
@@ -3401,7 +3384,7 @@
"@vscode/iconv-lite-umd": "0.7.0",
"byline": "^5.0.0",
"file-type": "16.5.4",
- "jschardet": "3.1.2",
+ "jschardet": "3.1.4",
"picomatch": "2.3.1",
"vscode-uri": "^2.0.0",
"which": "4.0.0"
diff --git a/extensions/git/package.nls.json b/extensions/git/package.nls.json
index c2f7c3d6cfb..bad361bcea7 100644
--- a/extensions/git/package.nls.json
+++ b/extensions/git/package.nls.json
@@ -62,15 +62,17 @@
"command.undoCommit": "Undo Last Commit",
"command.checkout": "Checkout to...",
"command.checkoutDetached": "Checkout to (Detached)...",
+ "command.checkoutRefDetached": "Checkout (Detached)",
"command.branch": "Create Branch...",
"command.branchFrom": "Create Branch From...",
"command.deleteBranch": "Delete Branch...",
"command.renameBranch": "Rename Branch...",
"command.cherryPick": "Cherry Pick...",
+ "command.cherryPickRef": "Cherry Pick",
"command.merge": "Merge...",
"command.mergeAbort": "Abort Merge",
"command.rebase": "Rebase Branch...",
- "command.createTag": "Create Tag",
+ "command.createTag": "Create Tag...",
"command.deleteTag": "Delete Tag...",
"command.deleteRemoteTag": "Delete Remote Tag...",
"command.fetch": "Fetch",
diff --git a/extensions/git/src/actionButton.ts b/extensions/git/src/actionButton.ts
index 494972276ac..2fbdaf4f97e 100644
--- a/extensions/git/src/actionButton.ts
+++ b/extensions/git/src/actionButton.ts
@@ -211,12 +211,12 @@ export class ActionButton {
command: {
command: 'git.sync',
title: l10n.t('{0} Sync Changes{1}{2}', icon, behind, ahead),
+ shortTitle: `${icon}${behind}${ahead}`,
tooltip: this.state.isSyncInProgress ?
l10n.t('Synchronizing Changes...')
: this.repository.syncTooltip,
arguments: [this.repository.sourceControl],
},
- description: `${icon}${behind}${ahead}`,
enabled: !this.state.isCheckoutInProgress && !this.state.isSyncInProgress
};
}
diff --git a/extensions/git/src/api/api1.ts b/extensions/git/src/api/api1.ts
index f049939c137..63139af2447 100644
--- a/extensions/git/src/api/api1.ts
+++ b/extensions/git/src/api/api1.ts
@@ -44,6 +44,7 @@ export class ApiRepositoryState implements RepositoryState {
get mergeChanges(): Change[] { return this._repository.mergeGroup.resourceStates.map(r => new ApiChange(r)); }
get indexChanges(): Change[] { return this._repository.indexGroup.resourceStates.map(r => new ApiChange(r)); }
get workingTreeChanges(): Change[] { return this._repository.workingTreeGroup.resourceStates.map(r => new ApiChange(r)); }
+ get untrackedChanges(): Change[] { return this._repository.untrackedGroup.resourceStates.map(r => new ApiChange(r)); }
readonly onDidChange: Event = this._repository.onDidRunGitStatus;
@@ -200,8 +201,8 @@ export class ApiRepository implements Repository {
return this.repository.getMergeBase(ref1, ref2);
}
- tag(name: string, upstream: string): Promise {
- return this.repository.tag(name, upstream);
+ tag(name: string, message: string, ref?: string | undefined): Promise {
+ return this.repository.tag({ name, message, ref });
}
deleteTag(name: string): Promise {
@@ -321,6 +322,10 @@ export class ApiImpl implements API {
}
async openRepository(root: Uri): Promise {
+ if (root.scheme !== 'file') {
+ return null;
+ }
+
await this._model.openRepository(root.fsPath);
return this.getRepository(root) || null;
}
diff --git a/extensions/git/src/api/git.d.ts b/extensions/git/src/api/git.d.ts
index 685b5413947..2a54c52f20c 100644
--- a/extensions/git/src/api/git.d.ts
+++ b/extensions/git/src/api/git.d.ts
@@ -122,6 +122,7 @@ export interface RepositoryState {
readonly mergeChanges: Change[];
readonly indexChanges: Change[];
readonly workingTreeChanges: Change[];
+ readonly untrackedChanges: Change[];
readonly onDidChange: Event;
}
@@ -144,6 +145,9 @@ export interface LogOptions {
readonly sortByAuthorDate?: boolean;
readonly shortStats?: boolean;
readonly author?: string;
+ readonly refNames?: string[];
+ readonly maxParents?: number;
+ readonly skip?: number;
}
export interface CommitOptions {
@@ -180,7 +184,7 @@ export interface InitOptions {
export interface RefQuery {
readonly contains?: string;
readonly count?: number;
- readonly pattern?: string;
+ readonly pattern?: string | string[];
readonly sort?: 'alphabetically' | 'committerdate';
}
@@ -405,5 +409,6 @@ export const enum GitErrorCodes {
EmptyCommitMessage = 'EmptyCommitMessage',
BranchFastForwardRejected = 'BranchFastForwardRejected',
BranchNotYetBorn = 'BranchNotYetBorn',
- TagConflict = 'TagConflict'
+ TagConflict = 'TagConflict',
+ CherryPickEmpty = 'CherryPickEmpty'
}
diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts
index 00045c14ea3..3b1a848adcf 100644
--- a/extensions/git/src/commands.ts
+++ b/extensions/git/src/commands.ts
@@ -5,7 +5,7 @@
import * as os from 'os';
import * as path from 'path';
-import { Command, commands, Disposable, LineChange, MessageOptions, Position, ProgressLocation, QuickPickItem, Range, SourceControlResourceState, TextDocumentShowOptions, TextEditor, Uri, ViewColumn, window, workspace, WorkspaceEdit, WorkspaceFolder, TimelineItem, env, Selection, TextDocumentContentProvider, InputBoxValidationSeverity, TabInputText, TabInputTextMerge, QuickPickItemKind, TextDocument, LogOutputChannel, l10n, Memento, UIKind, QuickInputButton, ThemeIcon, SourceControlHistoryItem, SourceControl, InputBoxValidationMessage, Tab, TabInputNotebook } from 'vscode';
+import { Command, commands, Disposable, LineChange, MessageOptions, Position, ProgressLocation, QuickPickItem, Range, SourceControlResourceState, TextDocumentShowOptions, TextEditor, Uri, ViewColumn, window, workspace, WorkspaceEdit, WorkspaceFolder, TimelineItem, env, Selection, TextDocumentContentProvider, InputBoxValidationSeverity, TabInputText, TabInputTextMerge, QuickPickItemKind, TextDocument, LogOutputChannel, l10n, Memento, UIKind, QuickInputButton, ThemeIcon, SourceControlHistoryItem, SourceControl, InputBoxValidationMessage, Tab, TabInputNotebook, QuickInputButtonLocation, SourceControlHistoryItemRef } from 'vscode';
import TelemetryReporter from '@vscode/extension-telemetry';
import { uniqueNamesGenerator, adjectives, animals, colors, NumberDictionary } from '@joaomoreno/unique-names-generator';
import { ForcePushMode, GitErrorCodes, Ref, RefType, Status, CommitOptions, RemoteSourcePublisher, Remote } from './api/git';
@@ -525,9 +525,15 @@ class CheckoutItemsProcessor extends RefItemsProcessor {
// Button(s)
if (item.refRemote) {
const matchingRemote = this.repository.remotes.find((remote) => remote.name === item.refRemote);
- const remoteUrl = matchingRemote?.pushUrl ?? matchingRemote?.fetchUrl;
- if (remoteUrl) {
- item.buttons = this.buttons.get(item.refRemote);
+ const buttons = [];
+ if (matchingRemote?.pushUrl) {
+ buttons.push(...this.buttons.get(matchingRemote.pushUrl) ?? []);
+ }
+ if (matchingRemote?.fetchUrl && matchingRemote.fetchUrl !== matchingRemote.pushUrl) {
+ buttons.push(...this.buttons.get(matchingRemote.fetchUrl) ?? []);
+ }
+ if (buttons.length) {
+ item.buttons = buttons;
}
} else {
item.buttons = this.defaultButtons;
@@ -1339,14 +1345,14 @@ export class CommandCenter {
@command('git.stage')
async stage(...resourceStates: SourceControlResourceState[]): Promise {
- this.logger.debug(`git.stage ${resourceStates.length} `);
+ this.logger.debug(`[CommandCenter][stage] git.stage ${resourceStates.length} `);
resourceStates = resourceStates.filter(s => !!s);
if (resourceStates.length === 0 || (resourceStates[0] && !(resourceStates[0].resourceUri instanceof Uri))) {
const resource = this.getSCMResource();
- this.logger.debug(`git.stage.getSCMResource ${resource ? resource.resourceUri.toString() : null} `);
+ this.logger.debug(`[CommandCenter][stage] git.stage.getSCMResource ${resource ? resource.resourceUri.toString() : null} `);
if (!resource) {
return;
@@ -1389,7 +1395,7 @@ export class CommandCenter {
const untracked = selection.filter(s => s.resourceGroupType === ResourceGroupType.Untracked);
const scmResources = [...workingTree, ...untracked, ...resolved, ...unresolved];
- this.logger.debug(`git.stage.scmResources ${scmResources.length} `);
+ this.logger.debug(`[CommandCenter][stage] git.stage.scmResources ${scmResources.length} `);
if (!scmResources.length) {
return;
}
@@ -2063,7 +2069,7 @@ export class CommandCenter {
promptToSaveFilesBeforeCommit = 'never';
}
- const enableSmartCommit = config.get('enableSmartCommit') === true;
+ let enableSmartCommit = config.get('enableSmartCommit') === true;
const enableCommitSigning = config.get('enableCommitSigning') === true;
let noStagedChanges = repository.indexGroup.resourceStates.length === 0;
let noUnstagedChanges = repository.workingTreeGroup.resourceStates.length === 0;
@@ -2103,38 +2109,39 @@ export class CommandCenter {
}
}
- if (!opts.amend) {
- // no changes, and the user has not configured to commit all in this case
- if (!noUnstagedChanges && noStagedChanges && !enableSmartCommit && !opts.all) {
- const suggestSmartCommit = config.get('suggestSmartCommit') === true;
+ // no changes, and the user has not configured to commit all in this case
+ if (!noUnstagedChanges && noStagedChanges && !enableSmartCommit && !opts.all && !opts.amend) {
+ const suggestSmartCommit = config.get('suggestSmartCommit') === true;
- if (!suggestSmartCommit) {
- return;
- }
-
- // prompt the user if we want to commit all or not
- const message = l10n.t('There are no staged changes to commit.\n\nWould you like to stage all your changes and commit them directly?');
- const yes = l10n.t('Yes');
- const always = l10n.t('Always');
- const never = l10n.t('Never');
- const pick = await window.showWarningMessage(message, { modal: true }, yes, always, never);
-
- if (pick === always) {
- config.update('enableSmartCommit', true, true);
- } else if (pick === never) {
- config.update('suggestSmartCommit', false, true);
- return;
- } else if (pick !== yes) {
- return; // do not commit on cancel
- }
+ if (!suggestSmartCommit) {
+ return;
}
- if (opts.all === undefined) {
- opts = { ...opts, all: noStagedChanges };
- } else if (!opts.all && noStagedChanges) {
- opts = { ...opts, all: true };
+ // prompt the user if we want to commit all or not
+ const message = l10n.t('There are no staged changes to commit.\n\nWould you like to stage all your changes and commit them directly?');
+ const yes = l10n.t('Yes');
+ const always = l10n.t('Always');
+ const never = l10n.t('Never');
+ const pick = await window.showWarningMessage(message, { modal: true }, yes, always, never);
+
+ if (pick === always) {
+ enableSmartCommit = true;
+ config.update('enableSmartCommit', true, true);
+ } else if (pick === never) {
+ config.update('suggestSmartCommit', false, true);
+ return;
+ } else if (pick === yes) {
+ enableSmartCommit = true;
+ } else {
+ // Cancel
+ return;
}
}
+
+ // smart commit
+ if (enableSmartCommit && !opts.all) {
+ opts = { ...opts, all: noStagedChanges };
+ }
}
// enable signing of commits if configured
@@ -2494,6 +2501,14 @@ export class CommandCenter {
return this._checkout(repository, { detached: true, treeish });
}
+ @command('git.checkoutRefDetached', { repository: true })
+ async checkoutRefDetached(repository: Repository, historyItem?: SourceControlHistoryItemRef): Promise {
+ if (!historyItem) {
+ return false;
+ }
+ return this._checkout(repository, { detached: true, treeish: historyItem.id });
+ }
+
private async _checkout(repository: Repository, opts?: { detached?: boolean; treeish?: string }): Promise {
if (typeof opts?.treeish === 'string') {
await repository.checkout(opts?.treeish, opts);
@@ -2519,9 +2534,26 @@ export class CommandCenter {
: l10n.t('Select a branch or tag to checkout');
quickPick.show();
-
picks.push(... await createCheckoutItems(repository, opts?.detached));
- quickPick.items = [...commands, ...picks];
+
+ const setQuickPickItems = () => {
+ switch (true) {
+ case quickPick.value === '':
+ quickPick.items = [...commands, ...picks];
+ break;
+ case commands.length === 0:
+ quickPick.items = picks;
+ break;
+ case picks.length === 0:
+ quickPick.items = commands;
+ break;
+ default:
+ quickPick.items = [...picks, { label: '', kind: QuickPickItemKind.Separator }, ...commands];
+ break;
+ }
+ };
+
+ setQuickPickItems();
quickPick.busy = false;
const choice = await new Promise(c => {
@@ -2536,22 +2568,7 @@ export class CommandCenter {
c(undefined);
})));
- disposables.push(quickPick.onDidChangeValue(value => {
- switch (true) {
- case value === '':
- quickPick.items = [...commands, ...picks];
- break;
- case commands.length === 0:
- quickPick.items = picks;
- break;
- case picks.length === 0:
- quickPick.items = commands;
- break;
- default:
- quickPick.items = [...picks, { label: '', kind: QuickPickItemKind.Separator }, ...commands];
- break;
- }
- }));
+ disposables.push(quickPick.onDidChangeValue(() => setQuickPickItems()));
});
dispose(disposables);
@@ -2601,8 +2618,8 @@ export class CommandCenter {
}
@command('git.branch', { repository: true })
- async branch(repository: Repository): Promise {
- await this._branch(repository);
+ async branch(repository: Repository, historyItem?: SourceControlHistoryItem): Promise {
+ await this._branch(repository, undefined, false, historyItem?.id);
}
@command('git.branchFrom', { repository: true })
@@ -2700,6 +2717,7 @@ export class CommandCenter {
{
iconPath: new ThemeIcon('refresh'),
tooltip: l10n.t('Regenerate Branch Name'),
+ location: QuickInputButtonLocation.Inline
}
] : [];
@@ -2728,8 +2746,8 @@ export class CommandCenter {
return sanitizeBranchName(branchName || '', branchWhitespaceChar);
}
- private async _branch(repository: Repository, defaultName?: string, from = false): Promise {
- let target = 'HEAD';
+ private async _branch(repository: Repository, defaultName?: string, from = false, target?: string): Promise {
+ target = target ?? 'HEAD';
if (from) {
const getRefPicks = async () => {
@@ -2897,7 +2915,7 @@ export class CommandCenter {
}
@command('git.createTag', { repository: true })
- async createTag(repository: Repository): Promise {
+ async createTag(repository: Repository, historyItem?: SourceControlHistoryItem): Promise {
const inputTagName = await window.showInputBox({
placeHolder: l10n.t('Tag name'),
prompt: l10n.t('Please provide a tag name'),
@@ -2915,7 +2933,7 @@ export class CommandCenter {
});
const name = inputTagName.replace(/^\.|\/\.|\.\.|~|\^|:|\/$|\.lock$|\.lock\/|\\|\*|\s|^\s*$|\.$/g, '-');
- await repository.tag(name, inputMessage);
+ await repository.tag({ name, message: inputMessage, ref: historyItem?.id });
}
@command('git.deleteTag', { repository: true })
@@ -3048,7 +3066,8 @@ export class CommandCenter {
}
@command('git.fetchRef', { repository: true })
- async fetchRef(repository: Repository, ref: string): Promise {
+ async fetchRef(repository: Repository, ref?: string): Promise {
+ ref = ref ?? repository?.historyProvider.currentHistoryItemRemoteRef?.id;
if (!repository || !ref) {
return;
}
@@ -3120,7 +3139,8 @@ export class CommandCenter {
}
@command('git.pullRef', { repository: true })
- async pullRef(repository: Repository, ref: string): Promise {
+ async pullRef(repository: Repository, ref?: string): Promise {
+ ref = ref ?? repository?.historyProvider.currentHistoryItemRemoteRef?.id;
if (!repository || !ref) {
return;
}
@@ -3267,8 +3287,8 @@ export class CommandCenter {
}
@command('git.pushRef', { repository: true })
- async pushRef(repository: Repository, ref: string): Promise {
- if (!repository || !ref) {
+ async pushRef(repository: Repository): Promise {
+ if (!repository) {
return;
}
@@ -3290,6 +3310,14 @@ export class CommandCenter {
await repository.cherryPick(hash);
}
+ @command('git.cherryPickRef', { repository: true })
+ async cherryPickRef(repository: Repository, historyItem?: SourceControlHistoryItem): Promise {
+ if (!historyItem) {
+ return;
+ }
+ await repository.cherryPick(historyItem.id);
+ }
+
@command('git.pushTo', { repository: true })
async pushTo(repository: Repository, remote?: string, refspec?: string, setUpstream?: boolean): Promise {
await this._push(repository, { pushType: PushType.PushTo, pushTo: { remote: remote, refspec: refspec, setUpstream: setUpstream } });
@@ -4186,17 +4214,36 @@ export class CommandCenter {
}
@command('git.viewCommit', { repository: true })
- async viewCommit(repository: Repository, historyItem: SourceControlHistoryItem): Promise {
- if (!repository || !historyItem) {
+ async viewCommit(repository: Repository, historyItem1: SourceControlHistoryItem, historyItem2?: SourceControlHistoryItem): Promise {
+ if (!repository || !historyItem1) {
return;
}
- const commit = await repository.getCommit(historyItem.id);
- const title = `${historyItem.id.substring(0, 8)} - ${commit.message}`;
+ if (historyItem2) {
+ const mergeBase = await repository.getMergeBase(historyItem1.id, historyItem2.id);
+ if (!mergeBase || (mergeBase !== historyItem1.id && mergeBase !== historyItem2.id)) {
+ return;
+ }
+ }
- const multiDiffSourceUri = toGitUri(Uri.file(repository.root), historyItem.id, { scheme: 'git-commit' });
+ let title: string | undefined;
+ let historyItemParentId: string | undefined;
- await this._viewChanges(repository, historyItem, multiDiffSourceUri, title);
+ // If historyItem2 is not provided, we are viewing a single commit. If historyItem2 is
+ // provided, we are viewing a range and we have to include both start and end commits.
+ // TODO@lszomoru - handle the case when historyItem2 is the first commit in the repository
+ if (!historyItem2) {
+ const commit = await repository.getCommit(historyItem1.id);
+ title = `${historyItem1.id.substring(0, 8)} - ${commit.message}`;
+ historyItemParentId = historyItem1.parentIds.length > 0 ? historyItem1.parentIds[0] : `${historyItem1.id}^`;
+ } else {
+ title = l10n.t('All Changes ({0} ↔ {1})', historyItem2.id.substring(0, 8), historyItem1.id.substring(0, 8));
+ historyItemParentId = historyItem2.parentIds.length > 0 ? historyItem2.parentIds[0] : `${historyItem2.id}^`;
+ }
+
+ const multiDiffSourceUri = toGitUri(Uri.file(repository.root), `${historyItemParentId}..${historyItem1.id}`, { scheme: 'git-commit', });
+
+ await this._viewChanges(repository, historyItem1.id, historyItemParentId, multiDiffSourceUri, title);
}
@command('git.viewAllChanges', { repository: true })
@@ -4211,20 +4258,32 @@ export class CommandCenter {
const multiDiffSourceUri = toGitUri(Uri.file(repository.root), historyItem.id, { scheme: 'git-changes' });
- await this._viewChanges(repository, historyItem, multiDiffSourceUri, title);
+ await this._viewChanges(repository, modifiedShortRef, originalShortRef, multiDiffSourceUri, title);
}
- async _viewChanges(repository: Repository, historyItem: SourceControlHistoryItem, multiDiffSourceUri: Uri, title: string): Promise {
- const historyItemParentId = historyItem.parentIds.length > 0 ? historyItem.parentIds[0] : `${historyItem.id}^`;
- const changes = await repository.diffBetween(historyItemParentId, historyItem.id);
+ async _viewChanges(repository: Repository, historyItemId: string, historyItemParentId: string, multiDiffSourceUri: Uri, title: string): Promise {
+ const changes = await repository.diffBetween(historyItemParentId, historyItemId);
+ const resources = changes.map(c => toMultiFileDiffEditorUris(c, historyItemParentId, historyItemId));
- if (changes.length === 0) {
+ await commands.executeCommand('_workbench.openMultiDiffEditor', { multiDiffSourceUri, title, resources });
+ }
+
+ @command('git.copyCommitId', { repository: true })
+ async copyCommitId(repository: Repository, historyItem: SourceControlHistoryItem): Promise {
+ if (!repository || !historyItem) {
return;
}
- const resources = changes.map(c => toMultiFileDiffEditorUris(c, historyItemParentId, historyItem.id));
+ env.clipboard.writeText(historyItem.id);
+ }
- await commands.executeCommand('_workbench.openMultiDiffEditor', { multiDiffSourceUri, title, resources });
+ @command('git.copyCommitMessage', { repository: true })
+ async copyCommitMessage(repository: Repository, historyItem: SourceControlHistoryItem): Promise {
+ if (!repository || !historyItem) {
+ return;
+ }
+
+ env.clipboard.writeText(historyItem.message);
}
private createCommand(id: string, key: string, method: Function, options: ScmCommandOptions): (...args: any[]) => any {
@@ -4344,6 +4403,12 @@ export class CommandCenter {
type = 'information';
options.modal = false;
break;
+ case GitErrorCodes.CherryPickEmpty:
+ message = l10n.t('The changes are already present in the current branch.');
+ choices.clear();
+ type = 'information';
+ options.modal = false;
+ break;
default: {
const hint = (err.stderr || err.message || String(err))
.replace(/^error: /mi, '')
@@ -4404,10 +4469,10 @@ export class CommandCenter {
private getSCMResource(uri?: Uri): Resource | undefined {
uri = uri ? uri : (window.activeTextEditor && window.activeTextEditor.document.uri);
- this.logger.debug(`git.getSCMResource.uri ${uri && uri.toString()}`);
+ this.logger.debug(`[CommandCenter][getSCMResource] git.getSCMResource.uri: ${uri && uri.toString()}`);
for (const r of this.model.repositories.map(r => r.root)) {
- this.logger.debug(`repo root ${r}`);
+ this.logger.debug(`[CommandCenter][getSCMResource] repo root: ${r}`);
}
if (!uri) {
diff --git a/extensions/git/src/decorationProvider.ts b/extensions/git/src/decorationProvider.ts
index 3f8553260e9..548f3aa2a1c 100644
--- a/extensions/git/src/decorationProvider.ts
+++ b/extensions/git/src/decorationProvider.ts
@@ -3,7 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
-import { window, workspace, Uri, Disposable, Event, EventEmitter, FileDecoration, FileDecorationProvider, ThemeColor, l10n } from 'vscode';
+import { window, workspace, Uri, Disposable, Event, EventEmitter, FileDecoration, FileDecorationProvider, ThemeColor, l10n, SourceControlHistoryItemRef } from 'vscode';
import * as path from 'path';
import { Repository, GitResourceGroup } from './repository';
import { Model } from './model';
@@ -11,6 +11,16 @@ import { debounce } from './decorators';
import { filterEvent, dispose, anyEvent, fireEvent, PromiseSource, combinedDisposable, runAndSubscribeEvent } from './util';
import { Change, GitErrorCodes, Status } from './api/git';
+function equalSourceControlHistoryItemRefs(ref1?: SourceControlHistoryItemRef, ref2?: SourceControlHistoryItemRef): boolean {
+ if (ref1 === ref2) {
+ return true;
+ }
+
+ return ref1?.id === ref2?.id &&
+ ref1?.name === ref2?.name &&
+ ref1?.revision === ref2?.revision;
+}
+
class GitIgnoreDecorationProvider implements FileDecorationProvider {
private static Decoration: FileDecoration = { color: new ThemeColor('gitDecoration.ignoredResourceForeground') };
@@ -158,22 +168,37 @@ class GitIncomingChangesFileDecorationProvider implements FileDecorationProvider
private readonly _onDidChangeDecorations = new EventEmitter();
readonly onDidChangeFileDecorations: Event = this._onDidChangeDecorations.event;
- private decorations = new Map();
+ private _currentHistoryItemRef: SourceControlHistoryItemRef | undefined;
+ private _currentHistoryItemRemoteRef: SourceControlHistoryItemRef | undefined;
+
+ private _decorations = new Map();
private readonly disposables: Disposable[] = [];
constructor(private readonly repository: Repository) {
this.disposables.push(
window.registerFileDecorationProvider(this),
- runAndSubscribeEvent(repository.historyProvider.onDidChangeCurrentHistoryItemGroup, () => this.onDidChangeCurrentHistoryItemGroup())
+ runAndSubscribeEvent(repository.historyProvider.onDidChangeCurrentHistoryItemRefs, () => this.onDidChangeCurrentHistoryItemRefs())
);
}
- private async onDidChangeCurrentHistoryItemGroup(): Promise {
- const newDecorations = new Map();
- await this.collectIncomingChangesFileDecorations(newDecorations);
- const uris = new Set([...this.decorations.keys()].concat([...newDecorations.keys()]));
+ private async onDidChangeCurrentHistoryItemRefs(): Promise {
+ const historyProvider = this.repository.historyProvider;
+ const currentHistoryItemRef = historyProvider.currentHistoryItemRef;
+ const currentHistoryItemRemoteRef = historyProvider.currentHistoryItemRemoteRef;
+
+ if (equalSourceControlHistoryItemRefs(this._currentHistoryItemRef, currentHistoryItemRef) &&
+ equalSourceControlHistoryItemRefs(this._currentHistoryItemRemoteRef, currentHistoryItemRemoteRef)) {
+ return;
+ }
+
+ const decorations = new Map();
+ await this.collectIncomingChangesFileDecorations(decorations);
+ const uris = new Set([...this._decorations.keys()].concat([...decorations.keys()]));
+
+ this._decorations = decorations;
+ this._currentHistoryItemRef = currentHistoryItemRef;
+ this._currentHistoryItemRemoteRef = currentHistoryItemRemoteRef;
- this.decorations = newDecorations;
this._onDidChangeDecorations.fire([...uris.values()].map(value => Uri.parse(value, true)));
}
@@ -218,18 +243,19 @@ class GitIncomingChangesFileDecorationProvider implements FileDecorationProvider
private async getIncomingChanges(): Promise {
try {
const historyProvider = this.repository.historyProvider;
- const currentHistoryItemGroup = historyProvider.currentHistoryItemGroup;
+ const currentHistoryItemRef = historyProvider.currentHistoryItemRef;
+ const currentHistoryItemRemoteRef = historyProvider.currentHistoryItemRemoteRef;
- if (!currentHistoryItemGroup?.base) {
+ if (!currentHistoryItemRef || !currentHistoryItemRemoteRef) {
return [];
}
- const ancestor = await historyProvider.resolveHistoryItemGroupCommonAncestor(currentHistoryItemGroup.id, currentHistoryItemGroup.base.id);
+ const ancestor = await historyProvider.resolveHistoryItemRefsCommonAncestor([currentHistoryItemRef.id, currentHistoryItemRemoteRef.id]);
if (!ancestor) {
return [];
}
- const changes = await this.repository.diffBetween(ancestor.id, currentHistoryItemGroup.base.id);
+ const changes = await this.repository.diffBetween(ancestor, currentHistoryItemRemoteRef.id);
return changes;
} catch (err) {
return [];
@@ -237,7 +263,7 @@ class GitIncomingChangesFileDecorationProvider implements FileDecorationProvider
}
provideFileDecoration(uri: Uri): FileDecoration | undefined {
- return this.decorations.get(uri.toString());
+ return this._decorations.get(uri.toString());
}
dispose(): void {
diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts
index 46fcd6069a6..2a729ae08fb 100644
--- a/extensions/git/src/git.ts
+++ b/extensions/git/src/git.ts
@@ -484,6 +484,17 @@ export class Git {
// Keep trailing spaces which are part of the directory name
const repositoryRootPath = path.normalize(result.stdout.trimStart().replace(/[\r\n]+$/, ''));
+ // Handle symbolic links and UNC paths
+ // Git 2.31 added the `--path-format` flag to rev-parse which
+ // allows us to get the relative path of the repository root
+ if (!pathEquals(pathInsidePossibleRepository, repositoryRootPath) &&
+ !isDescendant(repositoryRootPath, pathInsidePossibleRepository) &&
+ !isDescendant(pathInsidePossibleRepository, repositoryRootPath) &&
+ this.compareGitVersionTo('2.31.0') !== -1) {
+ const relativePathResult = await this.exec(pathInsidePossibleRepository, ['rev-parse', '--path-format=relative', '--show-toplevel',]);
+ return path.resolve(pathInsidePossibleRepository, relativePathResult.stdout.trimStart().replace(/[\r\n]+$/, ''));
+ }
+
if (isWindows) {
// On Git 2.25+ if you call `rev-parse --show-toplevel` on a mapped drive, instead of getting the mapped
// drive path back, you get the UNC path for the mapped drive. So we will try to normalize it back to the
@@ -491,7 +502,6 @@ export class Git {
const repoUri = Uri.file(repositoryRootPath);
const pathUri = Uri.file(pathInsidePossibleRepository);
if (repoUri.authority.length !== 0 && pathUri.authority.length === 0) {
- // eslint-disable-next-line local/code-no-look-behind-regex
const match = /(?<=^\/?)([a-zA-Z])(?=:\/)/.exec(pathUri.path);
if (match !== null) {
const [, letter] = match;
@@ -521,17 +531,6 @@ export class Git {
}
}
- // Handle symbolic links
- // Git 2.31 added the `--path-format` flag to rev-parse which
- // allows us to get the relative path of the repository root
- if (!pathEquals(pathInsidePossibleRepository, repositoryRootPath) &&
- !isDescendant(repositoryRootPath, pathInsidePossibleRepository) &&
- !isDescendant(pathInsidePossibleRepository, repositoryRootPath) &&
- this.compareGitVersionTo('2.31.0') !== -1) {
- const relativePathResult = await this.exec(pathInsidePossibleRepository, ['rev-parse', '--path-format=relative', '--show-toplevel',]);
- return path.resolve(pathInsidePossibleRepository, relativePathResult.stdout.trimStart().replace(/[\r\n]+$/, ''));
- }
-
return repositoryRootPath;
}
@@ -1062,6 +1061,7 @@ export interface PullOptions {
}
export class Repository {
+ private _isUsingRefTable = false;
constructor(
private _git: Git,
@@ -1113,7 +1113,7 @@ export class Repository {
return result.stdout.trim();
}
catch (err) {
- this.logger.warn(`git config failed: ${err.message}`);
+ this.logger.warn(`[Git][config] git config failed: ${err.message}`);
return '';
}
}
@@ -1137,6 +1137,7 @@ export class Repository {
}
async log(options?: LogOptions): Promise {
+ const spawnOptions: SpawnOptions = {};
const args = ['log', `--format=${COMMIT_FORMAT}`, '-z'];
if (options?.shortStats) {
@@ -1165,11 +1166,30 @@ export class Repository {
args.push(`--author="${options.author}"`);
}
+ if (typeof options?.maxParents === 'number') {
+ args.push(`--max-parents=${options.maxParents}`);
+ }
+
+ if (typeof options?.skip === 'number') {
+ args.push(`--skip=${options.skip}`);
+ }
+
+ if (options?.refNames) {
+ args.push('--topo-order');
+ args.push('--decorate=full');
+
+ // In order to avoid hitting the command line limit due to large number of reference
+ // names (can happen when the `all` filter is used in the Source Control Graph view),
+ // we are passing the reference names via stdin.
+ spawnOptions.input = options.refNames.join('\n');
+ args.push('--stdin');
+ }
+
if (options?.path) {
args.push('--', options.path);
}
- const result = await this.exec(args);
+ const result = await this.exec(args, spawnOptions);
if (result.exitCode) {
// An empty repo
return [];
@@ -1496,9 +1516,31 @@ export class Repository {
return parseGitChanges(this.repositoryRoot, gitResult.stdout);
}
- async getMergeBase(ref1: string, ref2: string): Promise {
+ async diffTrees(treeish1: string, treeish2?: string): Promise {
+ const args = ['diff-tree', '-r', '--name-status', '-z', '--diff-filter=ADMR', treeish1];
+
+ if (treeish2) {
+ args.push(treeish2);
+ }
+
+ const gitResult = await this.exec(args);
+ if (gitResult.exitCode) {
+ return [];
+ }
+
+ return parseGitChanges(this.repositoryRoot, gitResult.stdout);
+ }
+
+ async getMergeBase(ref1: string, ref2: string, ...refs: string[]): Promise {
try {
- const args = ['merge-base', ref1, ref2];
+ const args = ['merge-base'];
+ if (refs.length !== 0) {
+ args.push('--octopus');
+ args.push(...refs);
+ }
+
+ args.push(ref1, ref2);
+
const result = await this.exec(args);
return result.stdout.trim();
@@ -1768,13 +1810,17 @@ export class Repository {
await this.exec(['merge', '--abort']);
}
- async tag(name: string, message?: string): Promise {
+ async tag(options: { name: string; message?: string; ref?: string }): Promise {
let args = ['tag'];
- if (message) {
- args = [...args, '-a', name, '-m', message];
+ if (options.message) {
+ args = [...args, '-a', options.name, '-m', options.message];
} else {
- args = [...args, name];
+ args = [...args, options.name];
+ }
+
+ if (options.ref) {
+ args.push(options.ref);
}
await this.exec(args);
@@ -2056,8 +2102,18 @@ export class Repository {
}
async cherryPick(commitHash: string): Promise {
- const args = ['cherry-pick', commitHash];
- await this.exec(args);
+ try {
+ await this.exec(['cherry-pick', commitHash]);
+ } catch (err) {
+ if (/The previous cherry-pick is now empty, possibly due to conflict resolution./.test(err.stderr ?? '')) {
+ // Abort the cherry-pick operation
+ await this.exec(['cherry-pick', '--abort']);
+
+ err.gitErrorCode = GitErrorCodes.CherryPickEmpty;
+ }
+
+ throw err;
+ }
}
async blame(path: string): Promise {
@@ -2298,13 +2354,25 @@ export class Repository {
}
async getHEAD(): Promise[ {
- try {
- // Attempt to parse the HEAD file
- const result = await this.getHEADFS();
- return result;
- }
- catch (err) {
- this.logger.warn(err.message);
+ if (!this._isUsingRefTable) {
+ try {
+ // Attempt to parse the HEAD file
+ const result = await this.getHEADFS();
+
+ // Git 2.45 adds support for a new reference storage backend called "reftable", promising
+ // faster lookups, reads, and writes for repositories with any number of references. For
+ // backwards compatibility the `.git/HEAD` file contains `ref: refs/heads/.invalid`. More
+ // details are available at https://git-scm.com/docs/reftable
+ if (result.name === '.invalid') {
+ this._isUsingRefTable = true;
+ this.logger.warn(`[Git][getHEAD] Failed to parse HEAD file: Repository is using reftable format.`);
+ } else {
+ return result;
+ }
+ }
+ catch (err) {
+ this.logger.warn(`[Git][getHEAD] Failed to parse HEAD file: ${err.message}`);
+ }
}
try {
@@ -2352,7 +2420,7 @@ export class Repository {
return result.stdout.trim().split('\n')
.map(line => line.trim().split('\0'))
.filter(([_, upstream]) => upstream === upstreamBranch)
- .map(([ref]) => ({ name: ref, type: RefType.Head } as Branch));
+ .map(([ref]): Branch => ({ name: ref, type: RefType.Head }));
}
async getRefs(query: RefQuery, cancellationToken?: CancellationToken): Promise][ {
@@ -2373,7 +2441,10 @@ export class Repository {
args.push('--format', '%(refname) %(objectname) %(*objectname)');
if (query.pattern) {
- args.push(query.pattern.startsWith('refs/') ? query.pattern : `refs/${query.pattern}`);
+ const patterns = Array.isArray(query.pattern) ? query.pattern : [query.pattern];
+ for (const pattern of patterns) {
+ args.push(pattern.startsWith('refs/') ? pattern : `refs/${pattern}`);
+ }
}
if (query.contains) {
@@ -2452,11 +2523,11 @@ export class Repository {
remotes.push(...await this.getRemotesFS());
if (remotes.length === 0) {
- this.logger.info('No remotes found in the git config file.');
+ this.logger.info('[Git][getRemotes] No remotes found in the git config file');
}
}
catch (err) {
- this.logger.warn(`getRemotes() - ${err.message}`);
+ this.logger.warn(`[Git][getRemotes] Error: ${err.message}`);
// Fallback to using git to get the remotes
remotes.push(...await this.getRemotesGit());
@@ -2592,13 +2663,13 @@ export class Repository {
return branch;
}
- this.logger.warn(`No such branch: ${name}.`);
+ this.logger.warn(`[Git][getBranch] No such branch: ${name}`);
return Promise.reject(new Error(`No such branch: ${name}.`));
}
async getDefaultBranch(): Promise {
const result = await this.exec(['symbolic-ref', '--short', 'refs/remotes/origin/HEAD']);
- if (!result.stdout) {
+ if (!result.stdout || result.stderr) {
throw new Error('No default branch');
}
@@ -2657,7 +2728,7 @@ export class Repository {
}
async getCommit(ref: string): Promise {
- const result = await this.exec(['show', '-s', `--format=${COMMIT_FORMAT}`, '-z', ref]);
+ const result = await this.exec(['show', '-s', '--decorate=full', '--shortstat', `--format=${COMMIT_FORMAT}`, '-z', ref]);
const commits = parseGitCommits(result.stdout);
if (commits.length === 0) {
return Promise.reject('bad commit format');
@@ -2665,30 +2736,12 @@ export class Repository {
return commits[0];
}
- async getCommitFiles(ref: string): Promise {
- const result = await this.exec(['diff-tree', '--no-commit-id', '--name-only', '-r', ref]);
- return result.stdout.split('\n').filter(l => !!l);
- }
-
- async getCommitCount(range: string): Promise<{ ahead: number; behind: number }> {
- const args = ['rev-list', '--count', '--left-right', range];
-
- if (isWindows) {
- args.splice(0, 0, '-c', 'core.longpaths=true');
- }
-
- const result = await this.exec(args);
- const [ahead, behind] = result.stdout.trim().split('\t');
-
- return { ahead: Number(ahead) || 0, behind: Number(behind) || 0 };
- }
-
async revParse(ref: string): Promise {
try {
const result = await fs.readFile(path.join(this.dotGit.path, ref), 'utf8');
return result.trim();
} catch (err) {
- this.logger.warn(err.message);
+ this.logger.warn(`[Git][revParse] Unable to read file: ${err.message}`);
}
try {
diff --git a/extensions/git/src/historyProvider.ts b/extensions/git/src/historyProvider.ts
index f238010e14c..896c46851c4 100644
--- a/extensions/git/src/historyProvider.ts
+++ b/extensions/git/src/historyProvider.ts
@@ -4,133 +4,279 @@
*--------------------------------------------------------------------------------------------*/
-import { Disposable, Event, EventEmitter, FileDecoration, FileDecorationProvider, SourceControlHistoryItem, SourceControlHistoryItemChange, SourceControlHistoryItemGroup, SourceControlHistoryOptions, SourceControlHistoryProvider, ThemeIcon, Uri, window, LogOutputChannel } from 'vscode';
+import { Disposable, Event, EventEmitter, FileDecoration, FileDecorationProvider, SourceControlHistoryItem, SourceControlHistoryItemChange, SourceControlHistoryOptions, SourceControlHistoryProvider, ThemeIcon, Uri, window, LogOutputChannel, SourceControlHistoryItemRef, l10n, SourceControlHistoryItemRefsChangeEvent } from 'vscode';
import { Repository, Resource } from './repository';
-import { IDisposable, dispose, filterEvent } from './util';
+import { IDisposable, deltaHistoryItemRefs, dispose, filterEvent } from './util';
import { toGitUri } from './uri';
-import { Branch, RefType, UpstreamRef } from './api/git';
+import { Branch, LogOptions, Ref, RefType } from './api/git';
import { emojify, ensureEmojis } from './emoji';
-import { Operation } from './operation';
+import { Commit } from './git';
+import { OperationKind, OperationResult } from './operation';
+
+function toSourceControlHistoryItemRef(ref: Ref): SourceControlHistoryItemRef {
+ switch (ref.type) {
+ case RefType.RemoteHead:
+ return {
+ id: `refs/remotes/${ref.name}`,
+ name: ref.name ?? '',
+ description: ref.commit ? l10n.t('Remote branch at {0}', ref.commit.substring(0, 8)) : undefined,
+ revision: ref.commit,
+ icon: new ThemeIcon('cloud'),
+ category: l10n.t('remote branches')
+ };
+ case RefType.Tag:
+ return {
+ id: `refs/tags/${ref.name}`,
+ name: ref.name ?? '',
+ description: ref.commit ? l10n.t('Tag at {0}', ref.commit.substring(0, 8)) : undefined,
+ revision: ref.commit,
+ icon: new ThemeIcon('tag'),
+ category: l10n.t('tags')
+ };
+ default:
+ return {
+ id: `refs/heads/${ref.name}`,
+ name: ref.name ?? '',
+ description: ref.commit ? ref.commit.substring(0, 8) : undefined,
+ revision: ref.commit,
+ icon: new ThemeIcon('git-branch'),
+ category: l10n.t('branches')
+ };
+ }
+}
+
+function compareSourceControlHistoryItemRef(ref1: SourceControlHistoryItemRef, ref2: SourceControlHistoryItemRef): number {
+ const getOrder = (ref: SourceControlHistoryItemRef): number => {
+ if (ref.id.startsWith('refs/heads/')) {
+ return 1;
+ } else if (ref.id.startsWith('refs/remotes/')) {
+ return 2;
+ } else if (ref.id.startsWith('refs/tags/')) {
+ return 3;
+ }
+
+ return 99;
+ };
+
+ const ref1Order = getOrder(ref1);
+ const ref2Order = getOrder(ref2);
+
+ if (ref1Order !== ref2Order) {
+ return ref1Order - ref2Order;
+ }
+
+ return ref1.name.localeCompare(ref2.name);
+}
export class GitHistoryProvider implements SourceControlHistoryProvider, FileDecorationProvider, IDisposable {
-
- private readonly _onDidChangeCurrentHistoryItemGroup = new EventEmitter();
- readonly onDidChangeCurrentHistoryItemGroup: Event = this._onDidChangeCurrentHistoryItemGroup.event;
-
private readonly _onDidChangeDecorations = new EventEmitter();
readonly onDidChangeFileDecorations: Event = this._onDidChangeDecorations.event;
+ private _currentHistoryItemRef: SourceControlHistoryItemRef | undefined;
+ get currentHistoryItemRef(): SourceControlHistoryItemRef | undefined { return this._currentHistoryItemRef; }
+
+ private _currentHistoryItemRemoteRef: SourceControlHistoryItemRef | undefined;
+ get currentHistoryItemRemoteRef(): SourceControlHistoryItemRef | undefined { return this._currentHistoryItemRemoteRef; }
+
+ private _currentHistoryItemBaseRef: SourceControlHistoryItemRef | undefined;
+ get currentHistoryItemBaseRef(): SourceControlHistoryItemRef | undefined { return this._currentHistoryItemBaseRef; }
+
+ private readonly _onDidChangeCurrentHistoryItemRefs = new EventEmitter();
+ readonly onDidChangeCurrentHistoryItemRefs: Event = this._onDidChangeCurrentHistoryItemRefs.event;
+
+ private readonly _onDidChangeHistoryItemRefs = new EventEmitter();
+ readonly onDidChangeHistoryItemRefs: Event = this._onDidChangeHistoryItemRefs.event;
+
private _HEAD: Branch | undefined;
- private _currentHistoryItemGroup: SourceControlHistoryItemGroup | undefined;
- get currentHistoryItemGroup(): SourceControlHistoryItemGroup | undefined { return this._currentHistoryItemGroup; }
- set currentHistoryItemGroup(value: SourceControlHistoryItemGroup | undefined) {
- this._currentHistoryItemGroup = value;
- this._onDidChangeCurrentHistoryItemGroup.fire();
- }
+ private historyItemRefs: SourceControlHistoryItemRef[] = [];
private historyItemDecorations = new Map();
private disposables: Disposable[] = [];
constructor(protected readonly repository: Repository, private readonly logger: LogOutputChannel) {
- this.disposables.push(repository.onDidRunGitStatus(() => this.onDidRunGitStatus(), this));
- this.disposables.push(filterEvent(repository.onDidRunOperation, e => e.operation === Operation.Refresh)(() => this.onDidRunGitStatus(true), this));
+ const onDidRunWriteOperation = filterEvent(repository.onDidRunOperation, e => !e.operation.readOnly);
+ this.disposables.push(onDidRunWriteOperation(this.onDidRunWriteOperation, this));
this.disposables.push(window.registerFileDecorationProvider(this));
}
- private async onDidRunGitStatus(force = false): Promise {
- this.logger.trace('GitHistoryProvider:onDidRunGitStatus - HEAD:', JSON.stringify(this._HEAD));
- this.logger.trace('GitHistoryProvider:onDidRunGitStatus - repository.HEAD:', JSON.stringify(this.repository.HEAD));
+ private async onDidRunWriteOperation(result: OperationResult): Promise {
+ if (!this.repository.HEAD) {
+ this.logger.trace('[GitHistoryProvider][onDidRunWriteOperation] repository.HEAD is undefined');
+ this._currentHistoryItemRef = this._currentHistoryItemRemoteRef = this._currentHistoryItemBaseRef = undefined;
+ this._onDidChangeCurrentHistoryItemRefs.fire();
- // Check if HEAD has changed
- if (!force &&
- this._HEAD?.name === this.repository.HEAD?.name &&
- this._HEAD?.commit === this.repository.HEAD?.commit &&
- this._HEAD?.upstream?.name === this.repository.HEAD?.upstream?.name &&
- this._HEAD?.upstream?.remote === this.repository.HEAD?.upstream?.remote &&
- this._HEAD?.upstream?.commit === this.repository.HEAD?.upstream?.commit) {
- this.logger.trace('GitHistoryProvider:onDidRunGitStatus - HEAD has not changed');
return;
}
+ let historyItemRefId = '';
+ let historyItemRefName = '';
+
+ switch (this.repository.HEAD.type) {
+ case RefType.Head: {
+ if (this.repository.HEAD.name !== undefined) {
+ // Branch
+ historyItemRefId = `refs/heads/${this.repository.HEAD.name}`;
+ historyItemRefName = this.repository.HEAD.name;
+
+ // Remote
+ this._currentHistoryItemRemoteRef = this.repository.HEAD.upstream ? {
+ id: `refs/remotes/${this.repository.HEAD.upstream.remote}/${this.repository.HEAD.upstream.name}`,
+ name: `${this.repository.HEAD.upstream.remote}/${this.repository.HEAD.upstream.name}`,
+ revision: this.repository.HEAD.upstream.commit,
+ icon: new ThemeIcon('cloud')
+ } : undefined;
+
+ // Base - compute only if the branch has changed
+ if (this._HEAD?.name !== this.repository.HEAD.name) {
+ const mergeBase = await this.resolveHEADMergeBase();
+
+ this._currentHistoryItemBaseRef = mergeBase &&
+ (mergeBase.remote !== this.repository.HEAD.upstream?.remote ||
+ mergeBase.name !== this.repository.HEAD.upstream?.name) ? {
+ id: `refs/remotes/${mergeBase.remote}/${mergeBase.name}`,
+ name: `${mergeBase.remote}/${mergeBase.name}`,
+ revision: mergeBase.commit,
+ icon: new ThemeIcon('cloud')
+ } : undefined;
+ }
+ } else {
+ // Detached commit
+ historyItemRefId = this.repository.HEAD.commit ?? '';
+ historyItemRefName = this.repository.HEAD.commit ?? '';
+
+ this._currentHistoryItemRemoteRef = undefined;
+ this._currentHistoryItemBaseRef = undefined;
+ }
+ break;
+ }
+ case RefType.Tag: {
+ // Tag
+ historyItemRefId = `refs/tags/${this.repository.HEAD.name}`;
+ historyItemRefName = this.repository.HEAD.name ?? this.repository.HEAD.commit ?? '';
+
+ this._currentHistoryItemRemoteRef = undefined;
+ this._currentHistoryItemBaseRef = undefined;
+ break;
+ }
+ }
+
this._HEAD = this.repository.HEAD;
- // Check if HEAD does not support incoming/outgoing (detached commit, tag)
- if (!this.repository.HEAD?.name || !this.repository.HEAD?.commit || this.repository.HEAD.type === RefType.Tag) {
- this.logger.trace('GitHistoryProvider:onDidRunGitStatus - HEAD does not support incoming/outgoing');
-
- this.currentHistoryItemGroup = undefined;
- return;
- }
-
- this.currentHistoryItemGroup = {
- id: `refs/heads/${this.repository.HEAD.name ?? ''}`,
- name: this.repository.HEAD.name ?? '',
- base: this.repository.HEAD.upstream ?
- {
- id: `refs/remotes/${this.repository.HEAD.upstream.remote}/${this.repository.HEAD.upstream.name}`,
- name: `${this.repository.HEAD.upstream.remote}/${this.repository.HEAD.upstream.name}`,
- } : undefined
+ this._currentHistoryItemRef = {
+ id: historyItemRefId,
+ name: historyItemRefName,
+ revision: this.repository.HEAD.commit,
+ icon: new ThemeIcon('target'),
};
- this.logger.trace(`GitHistoryProvider:onDidRunGitStatus - currentHistoryItemGroup (${force}): ${JSON.stringify(this.currentHistoryItemGroup)}`);
+ this._onDidChangeCurrentHistoryItemRefs.fire();
+ this.logger.trace(`[GitHistoryProvider][onDidRunWriteOperation] currentHistoryItemRef: ${JSON.stringify(this._currentHistoryItemRef)}`);
+ this.logger.trace(`[GitHistoryProvider][onDidRunWriteOperation] currentHistoryItemRemoteRef: ${JSON.stringify(this._currentHistoryItemRemoteRef)}`);
+ this.logger.trace(`[GitHistoryProvider][onDidRunWriteOperation] currentHistoryItemBaseRef: ${JSON.stringify(this._currentHistoryItemBaseRef)}`);
+
+ // Refs (alphabetically)
+ const historyItemRefs = this.repository.refs
+ .map(ref => toSourceControlHistoryItemRef(ref))
+ .sort((a, b) => a.id.localeCompare(b.id));
+
+ // Auto-fetch
+ const silent = result.operation.kind === OperationKind.Fetch && result.operation.showProgress === false;
+ const delta = deltaHistoryItemRefs(this.historyItemRefs, historyItemRefs);
+ this._onDidChangeHistoryItemRefs.fire({ ...delta, silent });
+
+ this.historyItemRefs = historyItemRefs;
+
+ const deltaLog = {
+ added: delta.added.map(ref => ref.id),
+ modified: delta.modified.map(ref => ref.id),
+ removed: delta.removed.map(ref => ref.id),
+ silent
+ };
+ this.logger.trace(`[GitHistoryProvider][onDidRunWriteOperation] historyItemRefs: ${JSON.stringify(deltaLog)}`);
}
- async provideHistoryItems(historyItemGroupId: string, options: SourceControlHistoryOptions): Promise {
- //TODO@lszomoru - support limit and cursor
- if (typeof options.limit === 'number') {
- throw new Error('Unsupported options.');
- }
- if (typeof options.limit?.id !== 'string') {
- throw new Error('Unsupported options.');
+ async provideHistoryItemRefs(historyItemRefs: string[] | undefined): Promise {
+ const refs = await this.repository.getRefs({ pattern: historyItemRefs });
+
+ const branches: SourceControlHistoryItemRef[] = [];
+ const remoteBranches: SourceControlHistoryItemRef[] = [];
+ const tags: SourceControlHistoryItemRef[] = [];
+
+ for (const ref of refs) {
+ switch (ref.type) {
+ case RefType.RemoteHead:
+ remoteBranches.push(toSourceControlHistoryItemRef(ref));
+ break;
+ case RefType.Tag:
+ tags.push(toSourceControlHistoryItemRef(ref));
+ break;
+ default:
+ branches.push(toSourceControlHistoryItemRef(ref));
+ break;
+ }
}
- const refParentId = options.limit.id;
- const refId = await this.repository.revParse(historyItemGroupId) ?? '';
-
- const historyItems: SourceControlHistoryItem[] = [];
- const commits = await this.repository.log({ range: `${refParentId}..${refId}`, shortStats: true, sortByAuthorDate: true });
-
- await ensureEmojis();
-
- historyItems.push(...commits.map(commit => {
- const newLineIndex = commit.message.indexOf('\n');
- const subject = newLineIndex !== -1 ? commit.message.substring(0, newLineIndex) : commit.message;
-
- return {
- id: commit.hash,
- parentIds: commit.parents,
- message: emojify(subject),
- author: commit.authorName,
- icon: new ThemeIcon('git-commit'),
- timestamp: commit.authorDate?.getTime(),
- statistics: commit.shortStat ?? { files: 0, insertions: 0, deletions: 0 },
- };
- }));
-
- return historyItems;
+ return [...branches, ...remoteBranches, ...tags];
}
- async provideHistoryItemSummary(historyItemId: string, historyItemParentId: string | undefined): Promise {
- if (!historyItemParentId) {
- const commit = await this.repository.getCommit(historyItemId);
- historyItemParentId = commit.parents.length > 0 ? commit.parents[0] : `${historyItemId}^`;
+ async provideHistoryItems(options: SourceControlHistoryOptions): Promise {
+ if (!this.currentHistoryItemRef || !options.historyItemRefs) {
+ return [];
}
- const allChanges = await this.repository.diffBetweenShortStat(historyItemParentId, historyItemId);
- return { id: historyItemId, parentIds: [historyItemParentId], message: '', statistics: allChanges };
+ // Deduplicate refNames
+ const refNames = Array.from(new Set(options.historyItemRefs));
+
+ let logOptions: LogOptions = { refNames, shortStats: true };
+
+ try {
+ if (options.limit === undefined || typeof options.limit === 'number') {
+ logOptions = { ...logOptions, maxEntries: options.limit ?? 50 };
+ } else if (typeof options.limit.id === 'string') {
+ // Get the common ancestor commit, and commits
+ const commit = await this.repository.getCommit(options.limit.id);
+ const commitParentId = commit.parents.length > 0 ? commit.parents[0] : await this.repository.getEmptyTree();
+
+ logOptions = { ...logOptions, range: `${commitParentId}..` };
+ }
+
+ if (typeof options.skip === 'number') {
+ logOptions = { ...logOptions, skip: options.skip };
+ }
+
+ const commits = await this.repository.log({ ...logOptions, silent: true });
+
+ await ensureEmojis();
+
+ return commits.map(commit => {
+ const references = this._resolveHistoryItemRefs(commit);
+
+ return {
+ id: commit.hash,
+ parentIds: commit.parents,
+ message: emojify(commit.message),
+ author: commit.authorName,
+ icon: new ThemeIcon('git-commit'),
+ displayId: commit.hash.substring(0, 8),
+ timestamp: commit.authorDate?.getTime(),
+ statistics: commit.shortStat ?? { files: 0, insertions: 0, deletions: 0 },
+ references: references.length !== 0 ? references : undefined
+ };
+ });
+ } catch (err) {
+ this.logger.error(`[GitHistoryProvider][provideHistoryItems] Failed to get history items with options '${JSON.stringify(options)}': ${err}`);
+ return [];
+ }
}
async provideHistoryItemChanges(historyItemId: string, historyItemParentId: string | undefined): Promise {
- if (!historyItemParentId) {
- const commit = await this.repository.getCommit(historyItemId);
- historyItemParentId = commit.parents.length > 0 ? commit.parents[0] : `${historyItemId}^`;
- }
+ historyItemParentId = historyItemParentId ?? await this.repository.getEmptyTree();
const historyItemChangesUri: Uri[] = [];
const historyItemChanges: SourceControlHistoryItemChange[] = [];
- const changes = await this.repository.diffBetween(historyItemParentId, historyItemId);
+ const changes = await this.repository.diffTrees(historyItemParentId, historyItemId);
for (const change of changes) {
const historyItemUri = change.uri.with({
@@ -159,29 +305,36 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec
return historyItemChanges;
}
- async resolveHistoryItemGroupCommonAncestor(historyItemId1: string, historyItemId2: string | undefined): Promise<{ id: string; ahead: number; behind: number } | undefined> {
- if (!historyItemId2) {
- const upstreamRef = await this.resolveHistoryItemGroupBase(historyItemId1);
- if (!upstreamRef) {
- this.logger.info(`GitHistoryProvider:resolveHistoryItemGroupCommonAncestor - Failed to resolve history item group base for '${historyItemId1}'`);
- return undefined;
- }
-
- historyItemId2 = `refs/remotes/${upstreamRef.remote}/${upstreamRef.name}`;
- }
-
- const ancestor = await this.repository.getMergeBase(historyItemId1, historyItemId2);
- if (!ancestor) {
- this.logger.info(`GitHistoryProvider:resolveHistoryItemGroupCommonAncestor - Failed to resolve common ancestor for '${historyItemId1}' and '${historyItemId2}'`);
- return undefined;
- }
-
+ async resolveHistoryItemRefsCommonAncestor(historyItemRefs: string[]): Promise {
try {
- const commitCount = await this.repository.getCommitCount(`${historyItemId1}...${historyItemId2}`);
- this.logger.trace(`GitHistoryProvider:resolveHistoryItemGroupCommonAncestor - Resolved common ancestor for '${historyItemId1}' and '${historyItemId2}': ${JSON.stringify({ id: ancestor, ahead: commitCount.ahead, behind: commitCount.behind })}`);
- return { id: ancestor, ahead: commitCount.ahead, behind: commitCount.behind };
- } catch (err) {
- this.logger.error(`GitHistoryProvider:resolveHistoryItemGroupCommonAncestor - Failed to get ahead/behind for '${historyItemId1}...${historyItemId2}': ${err.message}`);
+ if (historyItemRefs.length === 0) {
+ // TODO@lszomoru - log
+ return undefined;
+ } else if (historyItemRefs.length === 1 && historyItemRefs[0] === this.currentHistoryItemRef?.id) {
+ // Remote
+ if (this.currentHistoryItemRemoteRef) {
+ const ancestor = await this.repository.getMergeBase(historyItemRefs[0], this.currentHistoryItemRemoteRef.id);
+ return ancestor;
+ }
+
+ // Base
+ if (this.currentHistoryItemBaseRef) {
+ const ancestor = await this.repository.getMergeBase(historyItemRefs[0], this.currentHistoryItemBaseRef.id);
+ return ancestor;
+ }
+
+ // First commit
+ const commits = await this.repository.log({ maxParents: 0, refNames: ['HEAD'] });
+ if (commits.length > 0) {
+ return commits[0].hash;
+ }
+ } else if (historyItemRefs.length > 1) {
+ const ancestor = await this.repository.getMergeBase(historyItemRefs[0], historyItemRefs[1], ...historyItemRefs.slice(2));
+ return ancestor;
+ }
+ }
+ catch (err) {
+ this.logger.error(`[GitHistoryProvider][resolveHistoryItemRefsCommonAncestor] Failed to resolve common ancestor for ${historyItemRefs.join(',')}: ${err}`);
}
return undefined;
@@ -191,32 +344,61 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec
return this.historyItemDecorations.get(uri.toString());
}
- private async resolveHistoryItemGroupBase(historyItemId: string): Promise {
- try {
- // Upstream
- const branch = await this.repository.getBranch(historyItemId);
- if (branch.upstream) {
- return branch.upstream;
- }
+ private _resolveHistoryItemRefs(commit: Commit): SourceControlHistoryItemRef[] {
+ const references: SourceControlHistoryItemRef[] = [];
- // Base (config -> reflog -> default)
- const remoteBranch = await this.repository.getBranchBase(historyItemId);
- if (!remoteBranch?.remote || !remoteBranch?.name || !remoteBranch?.commit || remoteBranch?.type !== RefType.RemoteHead) {
- this.logger.info(`GitHistoryProvider:resolveHistoryItemGroupBase - Failed to resolve history item group base for '${historyItemId}'`);
+ for (const ref of commit.refNames) {
+ switch (true) {
+ case ref.startsWith('HEAD -> refs/heads/'):
+ references.push({
+ id: ref.substring('HEAD -> '.length),
+ name: ref.substring('HEAD -> refs/heads/'.length),
+ revision: commit.hash,
+ icon: new ThemeIcon('target')
+ });
+ break;
+ case ref.startsWith('refs/heads/'):
+ references.push({
+ id: ref,
+ name: ref.substring('refs/heads/'.length),
+ revision: commit.hash,
+ icon: new ThemeIcon('git-branch')
+ });
+ break;
+ case ref.startsWith('refs/remotes/'):
+ references.push({
+ id: ref,
+ name: ref.substring('refs/remotes/'.length),
+ revision: commit.hash,
+ icon: new ThemeIcon('cloud')
+ });
+ break;
+ case ref.startsWith('tag: refs/tags/'):
+ references.push({
+ id: ref.substring('tag: '.length),
+ name: ref.substring('tag: refs/tags/'.length),
+ revision: commit.hash,
+ icon: new ThemeIcon('tag')
+ });
+ break;
+ }
+ }
+
+ return references.sort(compareSourceControlHistoryItemRef);
+ }
+
+ private async resolveHEADMergeBase(): Promise {
+ try {
+ if (this.repository.HEAD?.type !== RefType.Head || !this.repository.HEAD?.name) {
return undefined;
}
- return {
- name: remoteBranch.name,
- remote: remoteBranch.remote,
- commit: remoteBranch.commit
- };
+ const mergeBase = await this.repository.getBranchBase(this.repository.HEAD.name);
+ return mergeBase;
+ } catch (err) {
+ this.logger.error(`[GitHistoryProvider][resolveHEADMergeBase] Failed to resolve merge base for ${this.repository.HEAD?.name}: ${err}`);
+ return undefined;
}
- catch (err) {
- this.logger.error(`GitHistoryProvider:resolveHistoryItemGroupBase - Failed to get branch base for '${historyItemId}': ${err.message}`);
- }
-
- return undefined;
}
dispose(): void {
diff --git a/extensions/git/src/main.ts b/extensions/git/src/main.ts
index c2d9b974be7..aa4d98adc8b 100644
--- a/extensions/git/src/main.ts
+++ b/extensions/git/src/main.ts
@@ -20,7 +20,7 @@ import * as fs from 'fs';
import * as os from 'os';
import { GitTimelineProvider } from './timelineProvider';
import { registerAPICommands } from './api/api1';
-import { TerminalEnvironmentManager } from './terminal';
+import { TerminalEnvironmentManager, TerminalShellExecutionManager } from './terminal';
import { createIPCServer, IPCServer } from './ipc/ipcServer';
import { GitEditor } from './gitEditor';
import { GitPostCommitCommandsProvider } from './postCommitCommands';
@@ -48,7 +48,7 @@ async function createModel(context: ExtensionContext, logger: LogOutputChannel,
}
const info = await findGit(pathHints, gitPath => {
- logger.info(l10n.t('Validating found git in: "{0}"', gitPath));
+ logger.info(l10n.t('[main] Validating found git in: "{0}"', gitPath));
if (excludes.length === 0) {
return true;
}
@@ -56,7 +56,7 @@ async function createModel(context: ExtensionContext, logger: LogOutputChannel,
const normalized = path.normalize(gitPath).replace(/[\r\n]+$/, '');
const skip = excludes.some(e => normalized.startsWith(e));
if (skip) {
- logger.info(l10n.t('Skipped found git in: "{0}"', gitPath));
+ logger.info(l10n.t('[main] Skipped found git in: "{0}"', gitPath));
}
return !skip;
}, logger);
@@ -66,7 +66,7 @@ async function createModel(context: ExtensionContext, logger: LogOutputChannel,
try {
ipcServer = await createIPCServer(context.storagePath);
} catch (err) {
- logger.error(`Failed to create git IPC: ${err}`);
+ logger.error(`[main] Failed to create git IPC: ${err}`);
}
const askpass = new Askpass(ipcServer);
@@ -79,7 +79,7 @@ async function createModel(context: ExtensionContext, logger: LogOutputChannel,
const terminalEnvironmentManager = new TerminalEnvironmentManager(context, [askpass, gitEditor, ipcServer]);
disposables.push(terminalEnvironmentManager);
- logger.info(l10n.t('Using git "{0}" from "{1}"', info.version, info.path));
+ logger.info(l10n.t('[main] Using git "{0}" from "{1}"', info.version, info.path));
const git = new Git({
gitPath: info.path,
@@ -113,7 +113,8 @@ async function createModel(context: ExtensionContext, logger: LogOutputChannel,
new GitFileSystemProvider(model),
new GitDecorations(model),
new GitTimelineProvider(model, cc),
- new GitEditSessionIdentityProvider(model)
+ new GitEditSessionIdentityProvider(model),
+ new TerminalShellExecutionManager(model, logger)
);
const postCommitCommandsProvider = new GitPostCommitCommandsProvider();
@@ -187,7 +188,7 @@ export async function _activate(context: ExtensionContext): Promise {
- logger.appendLine(l10n.t('Log level: {0}', LogLevel[logLevel]));
+ logger.appendLine(l10n.t('[main] Log level: {0}', LogLevel[logLevel]));
};
disposables.push(logger.onDidChangeLogLevel(onDidChangeLogLevel));
onDidChangeLogLevel(logger.logLevel);
@@ -212,13 +213,13 @@ export async function _activate(context: ExtensionContext): Promise {
+ this.logger.info('[Model][doInitialScan] Initial repository scan started');
+
const config = workspace.getConfiguration('git');
const autoRepositoryDetection = config.get('autoRepositoryDetection');
const parentRepositoryConfig = config.get<'always' | 'never' | 'prompt'>('openRepositoryInParentFolders', 'prompt');
+ this.logger.trace(`[Model][doInitialScan] Settings: autoRepositoryDetection=${autoRepositoryDetection}, openRepositoryInParentFolders=${parentRepositoryConfig}`);
+
// Initial repository scan function
const initialScanFn = () => Promise.all([
this.onDidChangeWorkspaceFolders({ added: workspace.workspaceFolders || [], removed: [] }),
@@ -321,6 +325,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi
}
*/
this.telemetryReporter.sendTelemetryEvent('git.repositoryInitialScan', { autoRepositoryDetection: String(autoRepositoryDetection) }, { repositoryCount: this.openRepositories.length });
+ this.logger.info(`[Model][doInitialScan] Initial repository scan completed - repositories (${this.repositories.length}), closed repositories (${this.closedRepositories.length}), parent repositories (${this.parentRepositories.length}), unsafe repositories (${this.unsafeRepositories.length})`);
}
/**
@@ -329,47 +334,51 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi
* the git.repositoryScanMaxDepth setting.
*/
private async scanWorkspaceFolders(): Promise {
- const config = workspace.getConfiguration('git');
- const autoRepositoryDetection = config.get('autoRepositoryDetection');
- this.logger.trace(`[swsf] Scan workspace sub folders. autoRepositoryDetection=${autoRepositoryDetection}`);
+ try {
+ const config = workspace.getConfiguration('git');
+ const autoRepositoryDetection = config.get('autoRepositoryDetection');
- if (autoRepositoryDetection !== true && autoRepositoryDetection !== 'subFolders') {
- return;
- }
-
- await Promise.all((workspace.workspaceFolders || []).map(async folder => {
- const root = folder.uri.fsPath;
- this.logger.trace(`[swsf] Workspace folder: ${root}`);
-
- // Workspace folder children
- const repositoryScanMaxDepth = (workspace.isTrusted ? workspace.getConfiguration('git', folder.uri) : config).get('repositoryScanMaxDepth', 1);
- const repositoryScanIgnoredFolders = (workspace.isTrusted ? workspace.getConfiguration('git', folder.uri) : config).get('repositoryScanIgnoredFolders', []);
-
- const subfolders = new Set(await this.traverseWorkspaceFolder(root, repositoryScanMaxDepth, repositoryScanIgnoredFolders));
-
- // Repository scan folders
- const scanPaths = (workspace.isTrusted ? workspace.getConfiguration('git', folder.uri) : config).get('scanRepositories') || [];
- this.logger.trace(`[swsf] Workspace scan settings: repositoryScanMaxDepth=${repositoryScanMaxDepth}; repositoryScanIgnoredFolders=[${repositoryScanIgnoredFolders.join(', ')}]; scanRepositories=[${scanPaths.join(', ')}]`);
-
- for (const scanPath of scanPaths) {
- if (scanPath === '.git') {
- this.logger.trace('[swsf] \'.git\' not supported in \'git.scanRepositories\' setting.');
- continue;
- }
-
- if (path.isAbsolute(scanPath)) {
- const notSupportedMessage = l10n.t('Absolute paths not supported in "git.scanRepositories" setting.');
- this.logger.warn(notSupportedMessage);
- console.warn(notSupportedMessage);
- continue;
- }
-
- subfolders.add(path.join(root, scanPath));
+ if (autoRepositoryDetection !== true && autoRepositoryDetection !== 'subFolders') {
+ return;
}
- this.logger.trace(`[swsf] Workspace scan sub folders: [${[...subfolders].join(', ')}]`);
- await Promise.all([...subfolders].map(f => this.openRepository(f)));
- }));
+ await Promise.all((workspace.workspaceFolders || []).map(async folder => {
+ const root = folder.uri.fsPath;
+ this.logger.trace(`[Model][scanWorkspaceFolders] Workspace folder: ${root}`);
+
+ // Workspace folder children
+ const repositoryScanMaxDepth = (workspace.isTrusted ? workspace.getConfiguration('git', folder.uri) : config).get('repositoryScanMaxDepth', 1);
+ const repositoryScanIgnoredFolders = (workspace.isTrusted ? workspace.getConfiguration('git', folder.uri) : config).get('repositoryScanIgnoredFolders', []);
+
+ const subfolders = new Set(await this.traverseWorkspaceFolder(root, repositoryScanMaxDepth, repositoryScanIgnoredFolders));
+
+ // Repository scan folders
+ const scanPaths = (workspace.isTrusted ? workspace.getConfiguration('git', folder.uri) : config).get('scanRepositories') || [];
+ this.logger.trace(`[Model][scanWorkspaceFolders] Workspace scan settings: repositoryScanMaxDepth=${repositoryScanMaxDepth}; repositoryScanIgnoredFolders=[${repositoryScanIgnoredFolders.join(', ')}]; scanRepositories=[${scanPaths.join(', ')}]`);
+
+ for (const scanPath of scanPaths) {
+ if (scanPath === '.git') {
+ this.logger.trace('[Model][scanWorkspaceFolders] \'.git\' not supported in \'git.scanRepositories\' setting.');
+ continue;
+ }
+
+ if (path.isAbsolute(scanPath)) {
+ const notSupportedMessage = l10n.t('Absolute paths not supported in "git.scanRepositories" setting.');
+ this.logger.warn(`[Model][scanWorkspaceFolders] ${notSupportedMessage}`);
+ console.warn(notSupportedMessage);
+ continue;
+ }
+
+ subfolders.add(path.join(root, scanPath));
+ }
+
+ this.logger.trace(`[Model][scanWorkspaceFolders] Workspace scan sub folders: [${[...subfolders].join(', ')}]`);
+ await Promise.all([...subfolders].map(f => this.openRepository(f)));
+ }));
+ }
+ catch (err) {
+ this.logger.warn(`[Model][scanWorkspaceFolders] Error: ${err}`);
+ }
}
private async traverseWorkspaceFolder(workspaceFolder: string, maxDepth: number, repositoryScanIgnoredFolders: string[]): Promise {
@@ -388,7 +397,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi
}
}
catch (err) {
- this.logger.warn(`[swsf] Unable to read folder '${currentFolder.path}': ${err}`);
+ this.logger.warn(`[Model][traverseWorkspaceFolder] Unable to read workspace folder '${currentFolder.path}': ${err}`);
continue;
}
@@ -434,23 +443,28 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi
}
private async onDidChangeWorkspaceFolders({ added, removed }: WorkspaceFoldersChangeEvent): Promise {
- const possibleRepositoryFolders = added
- .filter(folder => !this.getOpenRepository(folder.uri));
+ try {
+ const possibleRepositoryFolders = added
+ .filter(folder => !this.getOpenRepository(folder.uri));
- const activeRepositoriesList = window.visibleTextEditors
- .map(editor => this.getRepository(editor.document.uri))
- .filter(repository => !!repository) as Repository[];
+ const activeRepositoriesList = window.visibleTextEditors
+ .map(editor => this.getRepository(editor.document.uri))
+ .filter(repository => !!repository) as Repository[];
- const activeRepositories = new Set(activeRepositoriesList);
- const openRepositoriesToDispose = removed
- .map(folder => this.getOpenRepository(folder.uri))
- .filter(r => !!r)
- .filter(r => !activeRepositories.has(r!.repository))
- .filter(r => !(workspace.workspaceFolders || []).some(f => isDescendant(f.uri.fsPath, r!.repository.root))) as OpenRepository[];
+ const activeRepositories = new Set(activeRepositoriesList);
+ const openRepositoriesToDispose = removed
+ .map(folder => this.getOpenRepository(folder.uri))
+ .filter(r => !!r)
+ .filter(r => !activeRepositories.has(r!.repository))
+ .filter(r => !(workspace.workspaceFolders || []).some(f => isDescendant(f.uri.fsPath, r!.repository.root))) as OpenRepository[];
- openRepositoriesToDispose.forEach(r => r.dispose());
- this.logger.trace(`[swf] Scan workspace folders: [${possibleRepositoryFolders.map(p => p.uri.fsPath).join(', ')}]`);
- await Promise.all(possibleRepositoryFolders.map(p => this.openRepository(p.uri.fsPath)));
+ openRepositoriesToDispose.forEach(r => r.dispose());
+ this.logger.trace(`[Model][onDidChangeWorkspaceFolders] Workspace folders: [${possibleRepositoryFolders.map(p => p.uri.fsPath).join(', ')}]`);
+ await Promise.all(possibleRepositoryFolders.map(p => this.openRepository(p.uri.fsPath)));
+ }
+ catch (err) {
+ this.logger.warn(`[Model][onDidChangeWorkspaceFolders] Error: ${err}`);
+ }
}
private onDidChangeConfiguration(): void {
@@ -463,50 +477,54 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi
.filter(({ root }) => workspace.getConfiguration('git', root).get('enabled') !== true)
.map(({ repository }) => repository);
- this.logger.trace(`[swf] Scan workspace folders: [${possibleRepositoryFolders.map(p => p.uri.fsPath).join(', ')}]`);
+ this.logger.trace(`[Model][onDidChangeConfiguration] Workspace folders: [${possibleRepositoryFolders.map(p => p.uri.fsPath).join(', ')}]`);
possibleRepositoryFolders.forEach(p => this.openRepository(p.uri.fsPath));
openRepositoriesToDispose.forEach(r => r.dispose());
}
private async onDidChangeVisibleTextEditors(editors: readonly TextEditor[]): Promise {
- if (!workspace.isTrusted) {
- this.logger.trace('[svte] Workspace is not trusted.');
- return;
- }
-
- const config = workspace.getConfiguration('git');
- const autoRepositoryDetection = config.get('autoRepositoryDetection');
- this.logger.trace(`[svte] Scan visible text editors. autoRepositoryDetection=${autoRepositoryDetection}`);
-
- if (autoRepositoryDetection !== true && autoRepositoryDetection !== 'openEditors') {
- return;
- }
-
- await Promise.all(editors.map(async editor => {
- const uri = editor.document.uri;
-
- if (uri.scheme !== 'file') {
+ try {
+ if (!workspace.isTrusted) {
+ this.logger.trace('[Model][onDidChangeVisibleTextEditors] Workspace is not trusted.');
return;
}
- const repository = this.getRepository(uri);
+ const config = workspace.getConfiguration('git');
+ const autoRepositoryDetection = config.get('autoRepositoryDetection');
- if (repository) {
- this.logger.trace(`[svte] Repository for editor resource ${uri.fsPath} already exists: ${repository.root}`);
+ if (autoRepositoryDetection !== true && autoRepositoryDetection !== 'openEditors') {
return;
}
- this.logger.trace(`[svte] Open repository for editor resource ${uri.fsPath}`);
- await this.openRepository(path.dirname(uri.fsPath));
- }));
+ await Promise.all(editors.map(async editor => {
+ const uri = editor.document.uri;
+
+ if (uri.scheme !== 'file') {
+ return;
+ }
+
+ const repository = this.getRepository(uri);
+
+ if (repository) {
+ this.logger.trace(`[Model][onDidChangeVisibleTextEditors] Repository for editor resource ${uri.fsPath} already exists: ${repository.root}`);
+ return;
+ }
+
+ this.logger.trace(`[Model][onDidChangeVisibleTextEditors] Open repository for editor resource ${uri.fsPath}`);
+ await this.openRepository(path.dirname(uri.fsPath));
+ }));
+ }
+ catch (err) {
+ this.logger.warn(`[Model][onDidChangeVisibleTextEditors] Error: ${err}`);
+ }
}
@sequentialize
async openRepository(repoPath: string, openIfClosed = false): Promise {
- this.logger.trace(`Opening repository: ${repoPath}`);
+ this.logger.trace(`[Model][openRepository] Repository: ${repoPath}`);
const existingRepository = await this.getRepositoryExact(repoPath);
if (existingRepository) {
- this.logger.trace(`Repository for path ${repoPath} already exists: ${existingRepository.root}`);
+ this.logger.trace(`[Model][openRepository] Repository for path ${repoPath} already exists: ${existingRepository.root}`);
return;
}
@@ -514,7 +532,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi
const enabled = config.get('enabled') === true;
if (!enabled) {
- this.logger.trace('Git is not enabled');
+ this.logger.trace('[Model][openRepository] Git is not enabled');
return;
}
@@ -524,7 +542,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi
fs.accessSync(path.join(repoPath, 'HEAD'), fs.constants.F_OK);
const result = await this.git.exec(repoPath, ['-C', repoPath, 'rev-parse', '--show-cdup']);
if (result.stderr.trim() === '' && result.stdout.trim() === '') {
- this.logger.trace(`Bare repository: ${repoPath}`);
+ this.logger.trace(`[Model][openRepository] Bare repository: ${repoPath}`);
return;
}
} catch {
@@ -534,16 +552,16 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi
try {
const { repositoryRoot, unsafeRepositoryMatch } = await this.getRepositoryRoot(repoPath);
- this.logger.trace(`Repository root for path ${repoPath} is: ${repositoryRoot}`);
+ this.logger.trace(`[Model][openRepository] Repository root for path ${repoPath} is: ${repositoryRoot}`);
const existingRepository = await this.getRepositoryExact(repositoryRoot);
if (existingRepository) {
- this.logger.trace(`Repository for path ${repositoryRoot} already exists: ${existingRepository.root}`);
+ this.logger.trace(`[Model][openRepository] Repository for path ${repositoryRoot} already exists: ${existingRepository.root}`);
return;
}
if (this.shouldRepositoryBeIgnored(repositoryRoot)) {
- this.logger.trace(`Repository for path ${repositoryRoot} is ignored`);
+ this.logger.trace(`[Model][openRepository] Repository for path ${repositoryRoot} is ignored`);
return;
}
@@ -552,7 +570,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi
if (parentRepositoryConfig !== 'always' && this.globalState.get(`parentRepository:${repositoryRoot}`) !== true) {
const isRepositoryOutsideWorkspace = await this.isRepositoryOutsideWorkspace(repositoryRoot);
if (isRepositoryOutsideWorkspace) {
- this.logger.trace(`Repository in parent folder: ${repositoryRoot}`);
+ this.logger.trace(`[Model][openRepository] Repository in parent folder: ${repositoryRoot}`);
if (!this._parentRepositoriesManager.hasRepository(repositoryRoot)) {
// Show a notification if the parent repository is opened after the initial scan
@@ -569,7 +587,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi
// Handle unsafe repositories
if (unsafeRepositoryMatch && unsafeRepositoryMatch.length === 3) {
- this.logger.trace(`Unsafe repository: ${repositoryRoot}`);
+ this.logger.trace(`[Model][openRepository] Unsafe repository: ${repositoryRoot}`);
// Show a notification if the unsafe repository is opened after the initial scan
if (this._state === 'initialized' && !this._unsafeRepositoriesManager.hasRepository(repositoryRoot)) {
@@ -583,7 +601,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi
// Handle repositories that were closed by the user
if (!openIfClosed && this._closedRepositoriesManager.isRepositoryClosed(repositoryRoot)) {
- this.logger.trace(`Repository for path ${repositoryRoot} is closed`);
+ this.logger.trace(`[Model][openRepository] Repository for path ${repositoryRoot} is closed`);
return;
}
@@ -594,12 +612,14 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi
this.open(repository);
this._closedRepositoriesManager.deleteRepository(repository.root);
+ this.logger.info(`[Model][openRepository] Opened repository: ${repository.root}`);
+
// Do not await this, we want SCM
// to know about the repo asap
repository.status();
} catch (err) {
// noop
- this.logger.trace(`Opening repository for path='${repoPath}' failed; ex=${err}`);
+ this.logger.trace(`[Model][openRepository] Opening repository for path='${repoPath}' failed. Error:${err}`);
}
}
@@ -631,7 +651,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi
const repositoryRootRealPath = await fs.promises.realpath(repositoryRoot);
return !pathEquals(repositoryRoot, repositoryRootRealPath) ? repositoryRootRealPath : undefined;
} catch (err) {
- this.logger.warn(`Failed to get repository realpath for: "${repositoryRoot}". ${err}`);
+ this.logger.warn(`[Model][getRepositoryRootRealPath] Failed to get repository realpath for "${repositoryRoot}": ${err}`);
return undefined;
}
}
@@ -658,7 +678,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi
}
private open(repository: Repository): void {
- this.logger.info(`Open repository: ${repository.root}`);
+ this.logger.trace(`[Model][open] Repository: ${repository.root}`);
const onDidDisappearRepository = filterEvent(repository.onDidChangeState, state => state === RepositoryState.Disposed);
const disappearListener = onDidDisappearRepository(() => dispose());
@@ -675,7 +695,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi
const checkForSubmodules = () => {
if (!shouldDetectSubmodules) {
- this.logger.trace('Automatic detection of git submodules is not enabled.');
+ this.logger.trace('[Model][open] Automatic detection of git submodules is not enabled.');
return;
}
@@ -688,7 +708,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi
.slice(0, submodulesLimit)
.map(r => path.join(repository.root, r.path))
.forEach(p => {
- this.logger.trace(`Opening submodule: '${p}'`);
+ this.logger.trace(`[Model][open] Opening submodule: '${p}'`);
this.eventuallyScanPossibleGitRepository(p);
});
};
@@ -750,7 +770,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi
return;
}
- this.logger.info(`Close repository: ${repository.root}`);
+ this.logger.info(`[Model][close] Repository: ${repository.root}`);
this._closedRepositoriesManager.addRepository(openRepository.repository.root);
openRepository.dispose();
@@ -803,7 +823,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi
return openRepositoryRealPath?.repository;
} catch (err) {
- this.logger.warn(`Failed to get repository realpath for: "${repoPath}". ${err}`);
+ this.logger.warn(`[Model][getRepositoryExact] Failed to get repository realpath for: "${repoPath}". Error:${err}`);
return undefined;
}
}
@@ -989,7 +1009,7 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi
this._workspaceFolders.set(workspaceFolder.uri.fsPath, result);
} catch (err) {
// noop - Workspace folder does not exist
- this.logger.trace(`Failed to resolve workspace folder: "${workspaceFolder.uri.fsPath}". ${err}`);
+ this.logger.trace(`[Model][getWorkspaceFolderRealPath] Failed to resolve workspace folder "${workspaceFolder.uri.fsPath}". Error:${err}`);
}
}
diff --git a/extensions/git/src/operation.ts b/extensions/git/src/operation.ts
index 223f1945b02..294c72f3206 100644
--- a/extensions/git/src/operation.ts
+++ b/extensions/git/src/operation.ts
@@ -2,6 +2,7 @@
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
+/* eslint-disable local/code-no-dangerous-type-assertions */
import { LogOutputChannel } from 'vscode';
@@ -131,7 +132,7 @@ export type SyncOperation = BaseOperation & { kind: OperationKind.Sync };
export type TagOperation = BaseOperation & { kind: OperationKind.Tag };
export const Operation = {
- Add: (showProgress: boolean) => ({ kind: OperationKind.Add, blocking: false, readOnly: false, remote: false, retry: false, showProgress } as AddOperation),
+ Add: (showProgress: boolean): AddOperation => ({ kind: OperationKind.Add, blocking: false, readOnly: false, remote: false, retry: false, showProgress }),
Apply: { kind: OperationKind.Apply, blocking: false, readOnly: false, remote: false, retry: false, showProgress: true } as ApplyOperation,
Blame: { kind: OperationKind.Blame, blocking: false, readOnly: true, remote: false, retry: false, showProgress: true } as BlameOperation,
Branch: { kind: OperationKind.Branch, blocking: false, readOnly: false, remote: false, retry: false, showProgress: true } as BranchOperation,
@@ -141,7 +142,7 @@ export const Operation = {
CheckoutTracking: (refLabel: string) => ({ kind: OperationKind.CheckoutTracking, blocking: true, readOnly: false, remote: false, retry: false, showProgress: true, refLabel } as CheckoutTrackingOperation),
Clean: (showProgress: boolean) => ({ kind: OperationKind.Clean, blocking: false, readOnly: false, remote: false, retry: false, showProgress } as CleanOperation),
Commit: { kind: OperationKind.Commit, blocking: true, readOnly: false, remote: false, retry: false, showProgress: true } as CommitOperation,
- Config: (readOnly: boolean) => ({ kind: OperationKind.Config, blocking: false, readOnly, remote: false, retry: false, showProgress: true } as ConfigOperation),
+ Config: (readOnly: boolean) => ({ kind: OperationKind.Config, blocking: false, readOnly, remote: false, retry: false, showProgress: false } as ConfigOperation),
DeleteBranch: { kind: OperationKind.DeleteBranch, blocking: false, readOnly: false, remote: false, retry: false, showProgress: true } as DeleteBranchOperation,
DeleteRef: { kind: OperationKind.DeleteRef, blocking: false, readOnly: false, remote: false, retry: false, showProgress: true } as DeleteRefOperation,
DeleteRemoteTag: { kind: OperationKind.DeleteRemoteTag, blocking: false, readOnly: false, remote: true, retry: false, showProgress: true } as DeleteRemoteTagOperation,
@@ -149,7 +150,7 @@ export const Operation = {
Diff: { kind: OperationKind.Diff, blocking: false, readOnly: true, remote: false, retry: false, showProgress: false } as DiffOperation,
Fetch: (showProgress: boolean) => ({ kind: OperationKind.Fetch, blocking: false, readOnly: false, remote: true, retry: true, showProgress } as FetchOperation),
FindTrackingBranches: { kind: OperationKind.FindTrackingBranches, blocking: false, readOnly: true, remote: false, retry: false, showProgress: true } as FindTrackingBranchesOperation,
- GetBranch: { kind: OperationKind.GetBranch, blocking: false, readOnly: true, remote: false, retry: false, showProgress: true } as GetBranchOperation,
+ GetBranch: { kind: OperationKind.GetBranch, blocking: false, readOnly: true, remote: false, retry: false, showProgress: false } as GetBranchOperation,
GetBranches: { kind: OperationKind.GetBranches, blocking: false, readOnly: true, remote: false, retry: false, showProgress: true } as GetBranchesOperation,
GetCommitTemplate: { kind: OperationKind.GetCommitTemplate, blocking: false, readOnly: true, remote: false, retry: false, showProgress: true } as GetCommitTemplateOperation,
GetObjectDetails: { kind: OperationKind.GetObjectDetails, blocking: false, readOnly: true, remote: false, retry: false, showProgress: false } as GetObjectDetailsOperation,
@@ -158,7 +159,7 @@ export const Operation = {
GetRemoteRefs: { kind: OperationKind.GetRemoteRefs, blocking: false, readOnly: true, remote: true, retry: false, showProgress: false } as GetRemoteRefsOperation,
HashObject: { kind: OperationKind.HashObject, blocking: false, readOnly: false, remote: false, retry: false, showProgress: true } as HashObjectOperation,
Ignore: { kind: OperationKind.Ignore, blocking: false, readOnly: false, remote: false, retry: false, showProgress: true } as IgnoreOperation,
- Log: { kind: OperationKind.Log, blocking: false, readOnly: true, remote: false, retry: false, showProgress: true } as LogOperation,
+ Log: (showProgress: boolean) => ({ kind: OperationKind.Log, blocking: false, readOnly: true, remote: false, retry: false, showProgress }) as LogOperation,
LogFile: { kind: OperationKind.LogFile, blocking: false, readOnly: true, remote: false, retry: false, showProgress: false } as LogFileOperation,
Merge: { kind: OperationKind.Merge, blocking: false, readOnly: false, remote: false, retry: false, showProgress: true } as MergeOperation,
MergeAbort: { kind: OperationKind.MergeAbort, blocking: false, readOnly: false, remote: false, retry: false, showProgress: true } as MergeAbortOperation,
@@ -214,7 +215,7 @@ export class OperationManager implements IOperationManager {
this.operations.set(operation.kind, new Set([operation]));
}
- this.logger.trace(`Operation start: ${operation.kind} (blocking: ${operation.blocking}, readOnly: ${operation.readOnly}; retry: ${operation.retry}; showProgress: ${operation.showProgress})`);
+ this.logger.trace(`[OperationManager][start] ${operation.kind} (blocking: ${operation.blocking}, readOnly: ${operation.readOnly}; retry: ${operation.retry}; showProgress: ${operation.showProgress})`);
}
end(operation: Operation): void {
@@ -226,7 +227,7 @@ export class OperationManager implements IOperationManager {
}
}
- this.logger.trace(`Operation end: ${operation.kind} (blocking: ${operation.blocking}, readOnly: ${operation.readOnly}; retry: ${operation.retry}; showProgress: ${operation.showProgress})`);
+ this.logger.trace(`[OperationManager][end] ${operation.kind} (blocking: ${operation.blocking}, readOnly: ${operation.readOnly}; retry: ${operation.retry}; showProgress: ${operation.showProgress})`);
}
getOperations(operationKind: OperationKind): Operation[] {
diff --git a/extensions/git/src/protocolHandler.ts b/extensions/git/src/protocolHandler.ts
index dc73fe39965..90491fecd50 100644
--- a/extensions/git/src/protocolHandler.ts
+++ b/extensions/git/src/protocolHandler.ts
@@ -22,7 +22,7 @@ export class GitProtocolHandler implements UriHandler {
}
handleUri(uri: Uri): void {
- this.logger.info(`GitProtocolHandler.handleUri(${uri.toString()})`);
+ this.logger.info(`[GitProtocolHandler][handleUri] URI:(${uri.toString()})`);
switch (uri.path) {
case '/clone': this.clone(uri);
@@ -34,17 +34,17 @@ export class GitProtocolHandler implements UriHandler {
const ref = data.ref;
if (!data.url) {
- this.logger.warn('Failed to open URI:' + uri.toString());
+ this.logger.warn('[GitProtocolHandler][clone] Failed to open URI:' + uri.toString());
return;
}
if (Array.isArray(data.url) && data.url.length === 0) {
- this.logger.warn('Failed to open URI:' + uri.toString());
+ this.logger.warn('[GitProtocolHandler][clone] Failed to open URI:' + uri.toString());
return;
}
if (ref !== undefined && typeof ref !== 'string') {
- this.logger.warn('Failed to open URI due to multiple references:' + uri.toString());
+ this.logger.warn('[GitProtocolHandler][clone] Failed to open URI due to multiple references:' + uri.toString());
return;
}
@@ -69,12 +69,12 @@ export class GitProtocolHandler implements UriHandler {
}
}
catch (ex) {
- this.logger.warn('Invalid URI:' + uri.toString());
+ this.logger.warn('[GitProtocolHandler][clone] Invalid URI:' + uri.toString());
return;
}
if (!(await commands.getCommands(true)).includes('git.clone')) {
- this.logger.error('Could not complete git clone operation as git installation was not found.');
+ this.logger.error('[GitProtocolHandler][clone] Could not complete git clone operation as git installation was not found.');
const errorMessage = l10n.t('Could not clone your repository as Git is not installed.');
const downloadGit = l10n.t('Download Git');
@@ -86,7 +86,7 @@ export class GitProtocolHandler implements UriHandler {
return;
} else {
const cloneTarget = cloneUri.toString(true);
- this.logger.info(`Executing git.clone for ${cloneTarget}`);
+ this.logger.info(`[GitProtocolHandler][clone] Executing git.clone for ${cloneTarget}`);
commands.executeCommand('git.clone', cloneTarget, undefined, { ref: ref });
}
}
diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts
index 3863e748726..5788d7ee2a7 100644
--- a/extensions/git/src/repository.ts
+++ b/extensions/git/src/repository.ts
@@ -426,8 +426,8 @@ class FileEventLogger {
}
this.eventDisposable = combinedDisposable([
- this.onWorkspaceWorkingTreeFileChange(uri => this.logger.debug(`[wt] Change: ${uri.fsPath}`)),
- this.onDotGitFileChange(uri => this.logger.debug(`[.git] Change: ${uri.fsPath}`))
+ this.onWorkspaceWorkingTreeFileChange(uri => this.logger.debug(`[FileEventLogger][onWorkspaceWorkingTreeFileChange] ${uri.fsPath}`)),
+ this.onDotGitFileChange(uri => this.logger.debug(`[FileEventLogger][onDotGitFileChange] ${uri.fsPath}`))
]);
}
@@ -478,7 +478,7 @@ class DotGitWatcher implements IFileWatcher {
this.transientDisposables.push(upstreamWatcher);
upstreamWatcher.event(this.emitter.fire, this.emitter, this.transientDisposables);
} catch (err) {
- this.logger.warn(`Failed to watch ref '${upstreamPath}', is most likely packed.`);
+ this.logger.warn(`[DotGitWatcher][updateTransientWatchers] Failed to watch ref '${upstreamPath}', is most likely packed.`);
}
}
@@ -718,11 +718,18 @@ export class Repository implements Disposable {
private _untrackedGroup: SourceControlResourceGroup;
get untrackedGroup(): GitResourceGroup { return this._untrackedGroup as GitResourceGroup; }
+ private _EMPTY_TREE: string | undefined;
+
private _HEAD: Branch | undefined;
get HEAD(): Branch | undefined {
return this._HEAD;
}
+ private _refs: Ref[] = [];
+ get refs(): Ref[] {
+ return this._refs;
+ }
+
get headShortName(): string | undefined {
if (!this.HEAD) {
return;
@@ -1046,8 +1053,9 @@ export class Repository implements Disposable {
return this.run(Operation.Config(false), () => this.repository.config('local', key, value));
}
- log(options?: LogOptions): Promise {
- return this.run(Operation.Log, () => this.repository.log(options));
+ log(options?: LogOptions & { silent?: boolean }): Promise {
+ const showProgress = !options || options.silent !== true;
+ return this.run(Operation.Log(showProgress), () => this.repository.log(options));
}
logFile(uri: Uri, options?: LogFileOptions): Promise {
@@ -1112,8 +1120,12 @@ export class Repository implements Disposable {
return this.run(Operation.Diff, () => this.repository.diffBetweenShortStat(ref1, ref2));
}
- getMergeBase(ref1: string, ref2: string): Promise {
- return this.run(Operation.MergeBase, () => this.repository.getMergeBase(ref1, ref2));
+ diffTrees(treeish1: string, treeish2?: string): Promise {
+ return this.run(Operation.Diff, () => this.repository.diffTrees(treeish1, treeish2));
+ }
+
+ getMergeBase(ref1: string, ref2: string, ...refs: string[]): Promise {
+ return this.run(Operation.MergeBase, () => this.repository.getMergeBase(ref1, ref2, ...refs));
}
async hashObject(data: string): Promise {
@@ -1453,7 +1465,15 @@ export class Repository implements Disposable {
// Reflog
const branchFromReflog = await this.getBranchBaseFromReflog(ref);
- const branchFromReflogUpstream = branchFromReflog ? await this.getUpstreamBranch(branchFromReflog) : undefined;
+
+ let branchFromReflogUpstream: Branch | undefined = undefined;
+
+ if (branchFromReflog?.type === RefType.RemoteHead) {
+ branchFromReflogUpstream = branchFromReflog;
+ } else if (branchFromReflog?.type === RefType.Head) {
+ branchFromReflogUpstream = await this.getUpstreamBranch(branchFromReflog);
+ }
+
if (branchFromReflogUpstream) {
await this.setConfig(mergeBaseConfigKey, `${branchFromReflogUpstream.remote}/${branchFromReflogUpstream.name}`);
return branchFromReflogUpstream;
@@ -1501,16 +1521,13 @@ export class Repository implements Disposable {
private async getDefaultBranch(): Promise {
try {
- const defaultBranchResult = await this.repository.exec(['symbolic-ref', '--short', 'refs/remotes/origin/HEAD']);
- if (defaultBranchResult.stdout.trim() === '' || defaultBranchResult.stderr) {
- return undefined;
- }
-
- return this.getBranch(defaultBranchResult.stdout.trim());
+ const defaultBranch = await this.repository.getDefaultBranch();
+ return defaultBranch;
+ }
+ catch (err) {
+ this.logger.warn(`[Repository][getDefaultBranch] Failed to get default branch details: ${err.message}.`);
+ return undefined;
}
- catch (err) { }
-
- return undefined;
}
private async getUpstreamBranch(branch: Branch): Promise {
@@ -1523,7 +1540,7 @@ export class Repository implements Disposable {
return upstreamBranch;
}
catch (err) {
- this.logger.warn(`Failed to get branch details for 'refs/remotes/${branch.upstream.remote}/${branch.upstream.name}': ${err.message}.`);
+ this.logger.warn(`[Repository][getUpstreamBranch] Failed to get branch details for 'refs/remotes/${branch.upstream.remote}/${branch.upstream.name}': ${err.message}.`);
return undefined;
}
}
@@ -1559,8 +1576,8 @@ export class Repository implements Disposable {
await this.run(Operation.Rebase, () => this.repository.rebase(branch));
}
- async tag(name: string, message?: string): Promise {
- await this.run(Operation.Tag, () => this.repository.tag(name, message));
+ async tag(options: { name: string; message?: string; ref?: string }): Promise {
+ await this.run(Operation.Tag, () => this.repository.tag(options));
}
async deleteTag(name: string): Promise {
@@ -1602,12 +1619,13 @@ export class Repository implements Disposable {
return await this.repository.getCommit(ref);
}
- async getCommitCount(range: string): Promise<{ ahead: number; behind: number }> {
- return await this.run(Operation.RevList, () => this.repository.getCommitCount(range));
- }
+ async getEmptyTree(): Promise {
+ if (!this._EMPTY_TREE) {
+ const result = await this.repository.exec(['hash-object', '-t', 'tree', '/dev/null']);
+ this._EMPTY_TREE = result.stdout.trim();
+ }
- async revParse(ref: string): Promise {
- return await this.run(Operation.RevParse, () => this.repository.revParse(ref));
+ return this._EMPTY_TREE;
}
async reset(treeish: string, hard?: boolean): Promise {
@@ -1819,7 +1837,7 @@ export class Repository implements Disposable {
return true;
}
- const maybeRebased = await this.run(Operation.Log, async () => {
+ const maybeRebased = await this.run(Operation.Log(true), async () => {
try {
const result = await this.repository.exec(['log', '--oneline', '--cherry', `${currentBranch ?? ''}...${currentBranch ?? ''}@{upstream}`, '--']);
if (result.exitCode) {
@@ -1943,7 +1961,8 @@ export class Repository implements Disposable {
return await this.run(Operation.Ignore, async () => {
const ignoreFile = `${this.repository.root}${path.sep}.gitignore`;
const textToAppend = files
- .map(uri => relativePath(this.repository.root, uri.fsPath).replace(/\\/g, '/'))
+ .map(uri => relativePath(this.repository.root, uri.fsPath)
+ .replace(/\\|\[/g, match => match === '\\' ? '/' : `\\${match}`))
.join('\n');
const document = await new Promise(c => fs.exists(ignoreFile, c))
@@ -2170,7 +2189,12 @@ export class Repository implements Disposable {
this._sourceControl.commitTemplate = commitTemplate;
// Execute cancellable long-running operation
- const resourceGroups = await this.getStatus(cancellationToken);
+ const [resourceGroups, refs] =
+ await Promise.all([
+ this.getStatus(cancellationToken),
+ this.getRefs({}, cancellationToken)]);
+
+ this._refs = refs;
this._updateResourceGroupsState(resourceGroups);
this._onDidChangeStatus.fire();
@@ -2409,17 +2433,17 @@ export class Repository implements Disposable {
const autorefresh = config.get('autorefresh');
if (!autorefresh) {
- this.logger.trace('Skip running git status because autorefresh setting is disabled.');
+ this.logger.trace('[Repository][onFileChange] Skip running git status because autorefresh setting is disabled.');
return;
}
if (this.isRepositoryHuge) {
- this.logger.trace('Skip running git status because repository is huge.');
+ this.logger.trace('[Repository][onFileChange] Skip running git status because repository is huge.');
return;
}
if (!this.operations.isIdle()) {
- this.logger.trace('Skip running git status because an operation is running.');
+ this.logger.trace('[Repository][onFileChange] Skip running git status because an operation is running.');
return;
}
diff --git a/extensions/git/src/terminal.ts b/extensions/git/src/terminal.ts
index 4f6d95488bb..edf02693ccd 100644
--- a/extensions/git/src/terminal.ts
+++ b/extensions/git/src/terminal.ts
@@ -3,8 +3,9 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
-import { ExtensionContext, l10n, workspace } from 'vscode';
-import { filterEvent, IDisposable } from './util';
+import { ExtensionContext, l10n, LogOutputChannel, TerminalShellExecutionEndEvent, window, workspace } from 'vscode';
+import { dispose, filterEvent, IDisposable } from './util';
+import { Model } from './model';
export interface ITerminalEnvironmentProvider {
featureDescription?: string;
@@ -50,3 +51,42 @@ export class TerminalEnvironmentManager {
this.disposable.dispose();
}
}
+
+export class TerminalShellExecutionManager {
+ private readonly subcommands = new Set([
+ 'add', 'branch', 'checkout', 'cherry-pick', 'clean', 'commit', 'fetch', 'merge',
+ 'mv', 'rebase', 'reset', 'restore', 'revert', 'rm', 'pull', 'push', 'stash', 'switch']);
+
+ private readonly disposables: IDisposable[] = [];
+
+ constructor(
+ private readonly model: Model,
+ private readonly logger: LogOutputChannel
+ ) {
+ window.onDidEndTerminalShellExecution(this.onDidEndTerminalShellExecution, this, this.disposables);
+ }
+
+ private onDidEndTerminalShellExecution(e: TerminalShellExecutionEndEvent): void {
+ const { execution, exitCode, shellIntegration } = e;
+ const [executable, subcommand] = execution.commandLine.value.split(/\s+/);
+ const cwd = execution.cwd ?? shellIntegration.cwd;
+
+ if (executable.toLowerCase() !== 'git' || !this.subcommands.has(subcommand?.toLowerCase()) || !cwd || exitCode !== 0) {
+ return;
+ }
+
+ this.logger.trace(`[TerminalShellExecutionManager][onDidEndTerminalShellExecution] Matched git subcommand: ${subcommand}`);
+
+ const repository = this.model.getRepository(cwd);
+ if (!repository) {
+ this.logger.trace(`[TerminalShellExecutionManager][onDidEndTerminalShellExecution] Unable to find repository for current working directory: ${cwd.toString()}`);
+ return;
+ }
+
+ repository.status();
+ }
+
+ dispose(): void {
+ dispose(this.disposables);
+ }
+}
diff --git a/extensions/git/src/test/smoke.test.ts b/extensions/git/src/test/smoke.test.ts
index 789086e90a4..173364c7f09 100644
--- a/extensions/git/src/test/smoke.test.ts
+++ b/extensions/git/src/test/smoke.test.ts
@@ -5,7 +5,7 @@
import 'mocha';
import * as assert from 'assert';
-import { workspace, commands, window, Uri, WorkspaceEdit, Range, TextDocument, extensions } from 'vscode';
+import { workspace, commands, window, Uri, WorkspaceEdit, Range, TextDocument, extensions, TabInputTextDiff } from 'vscode';
import * as cp from 'child_process';
import * as fs from 'fs';
import * as path from 'path';
@@ -73,17 +73,22 @@ suite('git smoke test', function () {
await type(appjs, ' world');
await appjs.save();
await repository.status();
+
assert.strictEqual(repository.state.workingTreeChanges.length, 1);
- repository.state.workingTreeChanges.some(r => r.uri.path === appjs.uri.path && r.status === Status.MODIFIED);
+ assert.strictEqual(repository.state.workingTreeChanges[0].uri.path, appjs.uri.path);
+ assert.strictEqual(repository.state.workingTreeChanges[0].status, Status.MODIFIED);
fs.writeFileSync(file('newfile.txt'), '');
const newfile = await open('newfile.txt');
await type(newfile, 'hey there');
await newfile.save();
await repository.status();
+
assert.strictEqual(repository.state.workingTreeChanges.length, 2);
- repository.state.workingTreeChanges.some(r => r.uri.path === appjs.uri.path && r.status === Status.MODIFIED);
- repository.state.workingTreeChanges.some(r => r.uri.path === newfile.uri.path && r.status === Status.UNTRACKED);
+ assert.strictEqual(repository.state.workingTreeChanges[0].uri.path, appjs.uri.path);
+ assert.strictEqual(repository.state.workingTreeChanges[0].status, Status.MODIFIED);
+ assert.strictEqual(repository.state.workingTreeChanges[1].uri.path, newfile.uri.path);
+ assert.strictEqual(repository.state.workingTreeChanges[1].status, Status.UNTRACKED);
});
test('opens diff editor', async function () {
@@ -93,65 +98,80 @@ suite('git smoke test', function () {
assert(window.activeTextEditor);
assert.strictEqual(window.activeTextEditor!.document.uri.path, appjs.path);
- // TODO: how do we really know this is a diff editor?
+ assert(window.tabGroups.activeTabGroup.activeTab);
+ assert(window.tabGroups.activeTabGroup.activeTab!.input instanceof TabInputTextDiff);
});
test('stages correctly', async function () {
const appjs = uri('app.js');
const newfile = uri('newfile.txt');
- await commands.executeCommand('git.stage', appjs);
- assert.strictEqual(repository.state.workingTreeChanges.length, 1);
- repository.state.workingTreeChanges.some(r => r.uri.path === newfile.path && r.status === Status.UNTRACKED);
- assert.strictEqual(repository.state.indexChanges.length, 1);
- repository.state.indexChanges.some(r => r.uri.path === appjs.path && r.status === Status.INDEX_MODIFIED);
+ await repository.add([appjs.fsPath]);
+
+ assert.strictEqual(repository.state.indexChanges.length, 1);
+ assert.strictEqual(repository.state.indexChanges[0].uri.path, appjs.path);
+ assert.strictEqual(repository.state.indexChanges[0].status, Status.INDEX_MODIFIED);
+
+ assert.strictEqual(repository.state.workingTreeChanges.length, 1);
+ assert.strictEqual(repository.state.workingTreeChanges[0].uri.path, newfile.path);
+ assert.strictEqual(repository.state.workingTreeChanges[0].status, Status.UNTRACKED);
+
+ await repository.revert([appjs.fsPath]);
+
+ assert.strictEqual(repository.state.indexChanges.length, 0);
- await commands.executeCommand('git.unstage', appjs);
assert.strictEqual(repository.state.workingTreeChanges.length, 2);
- repository.state.workingTreeChanges.some(r => r.uri.path === appjs.path && r.status === Status.MODIFIED);
- repository.state.workingTreeChanges.some(r => r.uri.path === newfile.path && r.status === Status.UNTRACKED);
+ assert.strictEqual(repository.state.workingTreeChanges[0].uri.path, appjs.path);
+ assert.strictEqual(repository.state.workingTreeChanges[0].status, Status.MODIFIED);
+ assert.strictEqual(repository.state.workingTreeChanges[1].uri.path, newfile.path);
+ assert.strictEqual(repository.state.workingTreeChanges[1].status, Status.UNTRACKED);
});
test('stages, commits changes and verifies outgoing change', async function () {
const appjs = uri('app.js');
const newfile = uri('newfile.txt');
- await commands.executeCommand('git.stage', appjs);
+ await repository.add([appjs.fsPath]);
await repository.commit('second commit');
+
assert.strictEqual(repository.state.workingTreeChanges.length, 1);
- repository.state.workingTreeChanges.some(r => r.uri.path === newfile.path && r.status === Status.UNTRACKED);
+ assert.strictEqual(repository.state.workingTreeChanges[0].uri.path, newfile.path);
+ assert.strictEqual(repository.state.workingTreeChanges[0].status, Status.UNTRACKED);
+
assert.strictEqual(repository.state.indexChanges.length, 0);
- await commands.executeCommand('git.stageAll', appjs);
- await repository.commit('third commit');
+ await repository.commit('third commit', { all: true });
+
assert.strictEqual(repository.state.workingTreeChanges.length, 0);
assert.strictEqual(repository.state.indexChanges.length, 0);
});
test('rename/delete conflict', async function () {
- cp.execSync('git branch test', { cwd });
- cp.execSync('git checkout test', { cwd });
+ await commands.executeCommand('workbench.view.scm');
- fs.unlinkSync(file('app.js'));
- cp.execSync('git add .', { cwd });
+ const appjs = file('app.js');
+ const renamejs = file('rename.js');
- await repository.commit('commit on test');
- cp.execSync('git checkout main', { cwd });
+ await repository.createBranch('test', true);
- fs.renameSync(file('app.js'), file('rename.js'));
- cp.execSync('git add .', { cwd });
- await repository.commit('commit on main');
+ // Delete file (test branch)
+ fs.unlinkSync(appjs);
+ await repository.commit('commit on test', { all: true });
+
+ await repository.checkout('main');
+
+ // Rename file (main branch)
+ fs.renameSync(appjs, renamejs);
+ await repository.commit('commit on main', { all: true });
try {
- cp.execSync('git merge test', { cwd });
+ await repository.merge('test');
} catch (e) { }
- setTimeout(() => {
- commands.executeCommand('workbench.scm.focus');
- }, 2e3);
+ assert.strictEqual(repository.state.mergeChanges.length, 1);
+ assert.strictEqual(repository.state.mergeChanges[0].status, Status.DELETED_BY_THEM);
- await new Promise(resolve => {
- setTimeout(resolve, 5e3);
- });
+ assert.strictEqual(repository.state.workingTreeChanges.length, 0);
+ assert.strictEqual(repository.state.indexChanges.length, 0);
});
});
diff --git a/extensions/git/src/util.ts b/extensions/git/src/util.ts
index eac6f0384b9..bf33411c3b3 100644
--- a/extensions/git/src/util.ts
+++ b/extensions/git/src/util.ts
@@ -3,7 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
-import { Event, Disposable, EventEmitter } from 'vscode';
+import { Event, Disposable, EventEmitter, SourceControlHistoryItemRef } from 'vscode';
import { dirname, sep, relative } from 'path';
import { Readable } from 'stream';
import { promises as fs, createReadStream } from 'fs';
@@ -513,3 +513,58 @@ export namespace Versions {
return from(major, minor, patch, pre);
}
}
+
+export function deltaHistoryItemRefs(before: SourceControlHistoryItemRef[], after: SourceControlHistoryItemRef[]): {
+ added: SourceControlHistoryItemRef[];
+ modified: SourceControlHistoryItemRef[];
+ removed: SourceControlHistoryItemRef[];
+} {
+ if (before.length === 0) {
+ return { added: after, modified: [], removed: [] };
+ }
+
+ const added: SourceControlHistoryItemRef[] = [];
+ const modified: SourceControlHistoryItemRef[] = [];
+ const removed: SourceControlHistoryItemRef[] = [];
+
+ let beforeIdx = 0;
+ let afterIdx = 0;
+
+ while (true) {
+ if (beforeIdx === before.length) {
+ added.push(...after.slice(afterIdx));
+ break;
+ }
+ if (afterIdx === after.length) {
+ removed.push(...before.slice(beforeIdx));
+ break;
+ }
+
+ const beforeElement = before[beforeIdx];
+ const afterElement = after[afterIdx];
+
+ const result = beforeElement.id.localeCompare(afterElement.id);
+
+ if (result === 0) {
+ if (beforeElement.revision !== afterElement.revision) {
+ // modified
+ modified.push(afterElement);
+ }
+
+ beforeIdx += 1;
+ afterIdx += 1;
+ } else if (result < 0) {
+ // beforeElement is smaller -> before element removed
+ removed.push(beforeElement);
+
+ beforeIdx += 1;
+ } else if (result > 0) {
+ // beforeElement is greater -> after element added
+ added.push(afterElement);
+
+ afterIdx += 1;
+ }
+ }
+
+ return { added, modified, removed };
+}
diff --git a/extensions/git/tsconfig.json b/extensions/git/tsconfig.json
index 6ca99fecf1b..75fb8217df7 100644
--- a/extensions/git/tsconfig.json
+++ b/extensions/git/tsconfig.json
@@ -21,6 +21,7 @@
"../../src/vscode-dts/vscode.proposed.tabInputMultiDiff.d.ts",
"../../src/vscode-dts/vscode.proposed.tabInputTextMerge.d.ts",
"../../src/vscode-dts/vscode.proposed.timeline.d.ts",
+ "../../src/vscode-dts/vscode.proposed.quickInputButtonLocation.d.ts",
"../types/lib.textEncoder.d.ts"
]
}
diff --git a/extensions/git/yarn.lock b/extensions/git/yarn.lock
deleted file mode 100644
index 06023a61227..00000000000
--- a/extensions/git/yarn.lock
+++ /dev/null
@@ -1,264 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"@joaomoreno/unique-names-generator@^5.1.0":
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/@joaomoreno/unique-names-generator/-/unique-names-generator-5.1.0.tgz#d577d425aed794c44c0e8863cddd5dea349f74f3"
- integrity sha512-KEVThTpUIKPb7dBKJ9mJ3WYnD1mJZZsEinCSp9CVEPlWbDagurFv1RKRjvvujrLfJzsGc0HkBHS9W8Bughao4A==
-
-"@microsoft/1ds-core-js@4.0.3", "@microsoft/1ds-core-js@^4.0.3":
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/@microsoft/1ds-core-js/-/1ds-core-js-4.0.3.tgz#c8a92c623745a9595e06558a866658480c33bdf9"
- integrity sha512-FrxNLVAPsAvD7+l63TlNS/Kodvpct2WulpDSn1dI4Xuy0kF4E2H867kHdwL/iY1Bj3zA3FSy/jvE4+OcDws7ug==
- dependencies:
- "@microsoft/applicationinsights-core-js" "3.0.4"
- "@microsoft/applicationinsights-shims" "3.0.1"
- "@microsoft/dynamicproto-js" "^2.0.2"
- "@nevware21/ts-async" ">= 0.3.0 < 2.x"
- "@nevware21/ts-utils" ">= 0.10.1 < 2.x"
-
-"@microsoft/1ds-post-js@^4.0.3":
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/@microsoft/1ds-post-js/-/1ds-post-js-4.0.3.tgz#cfcb20bb23fb6215d3f0732f60f5b7df3e624f86"
- integrity sha512-uewvmUtXKd7ttypiKQGdYI6i7UUpPkOznLayzIFrJ4r2xnG6jhPjpKRncHFXPQcM4XSWO3yf5PQ3xAbPq9t7ZQ==
- dependencies:
- "@microsoft/1ds-core-js" "4.0.3"
- "@microsoft/applicationinsights-shims" "3.0.1"
- "@microsoft/dynamicproto-js" "^2.0.2"
- "@nevware21/ts-async" ">= 0.3.0 < 2.x"
- "@nevware21/ts-utils" ">= 0.10.1 < 2.x"
-
-"@microsoft/applicationinsights-channel-js@3.0.4":
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/@microsoft/applicationinsights-channel-js/-/applicationinsights-channel-js-3.0.4.tgz#247b6fe2158fad9826cbcdf7304f885766b36624"
- integrity sha512-6TlfExmErQ8Y+/ChbkyWl+jyt4wg3T6p7lwXDsUCB0LgZmlEWMaCUS0YlT73JCWmE8j7vxW8yUm0lgsgmHns3A==
- dependencies:
- "@microsoft/applicationinsights-common" "3.0.4"
- "@microsoft/applicationinsights-core-js" "3.0.4"
- "@microsoft/applicationinsights-shims" "3.0.1"
- "@microsoft/dynamicproto-js" "^2.0.2"
- "@nevware21/ts-async" ">= 0.3.0 < 2.x"
- "@nevware21/ts-utils" ">= 0.10.1 < 2.x"
-
-"@microsoft/applicationinsights-common@3.0.4":
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/@microsoft/applicationinsights-common/-/applicationinsights-common-3.0.4.tgz#c4aa53ba343f5b3c7fbf54cddd3c86a5bdcd95dc"
- integrity sha512-r5gWaw/K9+tKfuo2GtDiDiKASgOkPOCrKW+wZzFvuR06uuwvWjbVQ6yW/YbnfuhRF5M65ksUiMi0eCMwEOGq7Q==
- dependencies:
- "@microsoft/applicationinsights-core-js" "3.0.4"
- "@microsoft/applicationinsights-shims" "3.0.1"
- "@microsoft/dynamicproto-js" "^2.0.2"
- "@nevware21/ts-utils" ">= 0.10.1 < 2.x"
-
-"@microsoft/applicationinsights-core-js@3.0.4":
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-3.0.4.tgz#008308b786930d94a1de8a1fbb4af0351b74653e"
- integrity sha512-anxy5kEkqBmVoEqJiJzaaXXA0wzqZi9U4zGd05xFJ04lWckP8dG3zyT3+GGdg7rDelqLTNGxndeYoFmDv63u1g==
- dependencies:
- "@microsoft/applicationinsights-shims" "3.0.1"
- "@microsoft/dynamicproto-js" "^2.0.2"
- "@nevware21/ts-async" ">= 0.3.0 < 2.x"
- "@nevware21/ts-utils" ">= 0.10.1 < 2.x"
-
-"@microsoft/applicationinsights-shims@3.0.1":
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/@microsoft/applicationinsights-shims/-/applicationinsights-shims-3.0.1.tgz#3865b73ace8405b9c4618cc5c571f2fe3876f06f"
- integrity sha512-DKwboF47H1nb33rSUfjqI6ryX29v+2QWcTrRvcQDA32AZr5Ilkr7whOOSsD1aBzwqX0RJEIP1Z81jfE3NBm/Lg==
- dependencies:
- "@nevware21/ts-utils" ">= 0.9.4 < 2.x"
-
-"@microsoft/applicationinsights-web-basic@^3.0.4":
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/@microsoft/applicationinsights-web-basic/-/applicationinsights-web-basic-3.0.4.tgz#9a23323276b4a5a0dc6a352e2de5d75e3c16b534"
- integrity sha512-KfoxPlLlf0JT12ADb23C5iGye/yFouoMgHEKULxkSQcYY9SsW/8rVrqqvoYKAL+u215CZU2A8Kc8sR3ehEaPCQ==
- dependencies:
- "@microsoft/applicationinsights-channel-js" "3.0.4"
- "@microsoft/applicationinsights-common" "3.0.4"
- "@microsoft/applicationinsights-core-js" "3.0.4"
- "@microsoft/applicationinsights-shims" "3.0.1"
- "@microsoft/dynamicproto-js" "^2.0.2"
- "@nevware21/ts-async" ">= 0.3.0 < 2.x"
- "@nevware21/ts-utils" ">= 0.10.1 < 2.x"
-
-"@microsoft/dynamicproto-js@^2.0.2":
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/@microsoft/dynamicproto-js/-/dynamicproto-js-2.0.2.tgz#e57fbec2e7067d48b7e8e1e1c1d354028ef718a6"
- integrity sha512-MB8trWaFREpmb037k/d0bB7T2BP7Ai24w1e1tbz3ASLB0/lwphsq3Nq8S9I5AsI5vs4zAQT+SB5nC5/dLYTiOg==
- dependencies:
- "@nevware21/ts-utils" ">= 0.9.4 < 2.x"
-
-"@nevware21/ts-async@>= 0.3.0 < 2.x":
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/@nevware21/ts-async/-/ts-async-0.3.0.tgz#a8b97ba01065fc930de9a3f4dd4a05e862becc6c"
- integrity sha512-ZUcgUH12LN/F6nzN0cYd0F/rJaMLmXr0EHVTyYfaYmK55bdwE4338uue4UiVoRqHVqNW4KDUrJc49iGogHKeWA==
- dependencies:
- "@nevware21/ts-utils" ">= 0.10.0 < 2.x"
-
-"@nevware21/ts-utils@>= 0.10.0 < 2.x", "@nevware21/ts-utils@>= 0.10.1 < 2.x", "@nevware21/ts-utils@>= 0.9.4 < 2.x":
- version "0.10.1"
- resolved "https://registry.yarnpkg.com/@nevware21/ts-utils/-/ts-utils-0.10.1.tgz#aa65abc71eba06749a396598f22263d26f796ac7"
- integrity sha512-pMny25NnF2/MJwdqC3Iyjm2pGIXNxni4AROpcqDeWa+td9JMUY4bUS9uU9XW+BoBRqTLUL+WURF9SOd/6OQzRg==
-
-"@tokenizer/token@^0.3.0":
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.3.0.tgz#fe98a93fe789247e998c75e74e9c7c63217aa276"
- integrity sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==
-
-"@types/byline@4.2.31":
- version "4.2.31"
- resolved "https://registry.yarnpkg.com/@types/byline/-/byline-4.2.31.tgz#0e61fcb9c03e047d21c4496554c7116297ab60cd"
- integrity sha1-DmH8ucA+BH0hxEllVMcRYperYM0=
- dependencies:
- "@types/node" "*"
-
-"@types/mocha@^9.1.1":
- version "9.1.1"
- resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4"
- integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==
-
-"@types/node@*":
- version "8.0.51"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.51.tgz#b31d716fb8d58eeb95c068a039b9b6292817d5fb"
- integrity sha512-El3+WJk2D/ppWNd2X05aiP5l2k4EwF7KwheknQZls+I26eSICoWRhRIJ56jGgw2dqNGQ5LtNajmBU2ajS28EvQ==
-
-"@types/node@20.x":
- version "20.11.24"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.24.tgz#cc207511104694e84e9fb17f9a0c4c42d4517792"
- integrity sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==
- dependencies:
- undici-types "~5.26.4"
-
-"@types/picomatch@2.3.0":
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/@types/picomatch/-/picomatch-2.3.0.tgz#75db5e75a713c5a83d5b76780c3da84a82806003"
- integrity sha512-O397rnSS9iQI4OirieAtsDqvCj4+3eY1J+EPdNTKuHuRWIfUoGyzX294o8C4KJYaLqgSrd2o60c5EqCU8Zv02g==
-
-"@types/which@3.0.0":
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/@types/which/-/which-3.0.0.tgz#849afdd9fdcb0b67339b9cfc80fa6ea4e0253fc5"
- integrity sha512-ASCxdbsrwNfSMXALlC3Decif9rwDMu+80KGp5zI2RLRotfMsTv7fHL8W8VDp24wymzDyIFudhUeSCugrgRFfHQ==
-
-"@vscode/extension-telemetry@^0.9.0":
- version "0.9.0"
- resolved "https://registry.yarnpkg.com/@vscode/extension-telemetry/-/extension-telemetry-0.9.0.tgz#8c6c61e253ff304f46045f04edd60059b144417a"
- integrity sha512-37RxGHXrs3GoXPgCUKQhghEu0gxs8j27RLjQwwtSf4WhPdJKz8UrqMYzpsXlliQ05zURYmtdGZst9C6+hfWXaQ==
- dependencies:
- "@microsoft/1ds-core-js" "^4.0.3"
- "@microsoft/1ds-post-js" "^4.0.3"
- "@microsoft/applicationinsights-web-basic" "^3.0.4"
-
-"@vscode/iconv-lite-umd@0.7.0":
- version "0.7.0"
- resolved "https://registry.yarnpkg.com/@vscode/iconv-lite-umd/-/iconv-lite-umd-0.7.0.tgz#d2f1e0664ee6036408f9743fee264ea0699b0e48"
- integrity sha512-bRRFxLfg5dtAyl5XyiVWz/ZBPahpOpPrNYnnHpOpUZvam4tKH35wdhP4Kj6PbM0+KdliOsPzbGWpkxcdpNB/sg==
-
-byline@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1"
- integrity sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=
-
-file-type@16.5.4:
- version "16.5.4"
- resolved "https://registry.yarnpkg.com/file-type/-/file-type-16.5.4.tgz#474fb4f704bee427681f98dd390058a172a6c2fd"
- integrity sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==
- dependencies:
- readable-web-to-node-stream "^3.0.0"
- strtok3 "^6.2.4"
- token-types "^4.1.1"
-
-ieee754@^1.2.1:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
- integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
-
-inherits@^2.0.3:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
- integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
-
-isexe@^3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d"
- integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==
-
-jschardet@3.1.2:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-3.1.2.tgz#9bf4364deba0677fe9e3bd9e29eda57febf2e9db"
- integrity sha512-mw3CBZGzW8nUBPYhFU2ztZ/kJ6NClQUQVpyzvFMfznZsoC///ZQ30J2RCUanNsr5yF22LqhgYr/lj807/ZleWA==
-
-peek-readable@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-4.1.0.tgz#4ece1111bf5c2ad8867c314c81356847e8a62e72"
- integrity sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==
-
-picomatch@2.3.1:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
- integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
-
-readable-stream@^3.6.0:
- version "3.6.0"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
- integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
- dependencies:
- inherits "^2.0.3"
- string_decoder "^1.1.1"
- util-deprecate "^1.0.1"
-
-readable-web-to-node-stream@^3.0.0:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz#5d52bb5df7b54861fd48d015e93a2cb87b3ee0bb"
- integrity sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==
- dependencies:
- readable-stream "^3.6.0"
-
-safe-buffer@~5.2.0:
- version "5.2.1"
- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
- integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
-
-string_decoder@^1.1.1:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
- integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
- dependencies:
- safe-buffer "~5.2.0"
-
-strtok3@^6.2.4:
- version "6.3.0"
- resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-6.3.0.tgz#358b80ffe6d5d5620e19a073aa78ce947a90f9a0"
- integrity sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==
- dependencies:
- "@tokenizer/token" "^0.3.0"
- peek-readable "^4.1.0"
-
-token-types@^4.1.1:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/token-types/-/token-types-4.2.0.tgz#b66bc3d67420c6873222a424eee64a744f4c2f13"
- integrity sha512-P0rrp4wUpefLncNamWIef62J0v0kQR/GfDVji9WKY7GDCWy5YbVSrKUTam07iWPZQGy0zWNOfstYTykMmPNR7w==
- dependencies:
- "@tokenizer/token" "^0.3.0"
- ieee754 "^1.2.1"
-
-undici-types@~5.26.4:
- version "5.26.5"
- resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
- integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
-
-util-deprecate@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
- integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
-
-vscode-uri@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-2.0.0.tgz#2df704222f72b8a71ff266ba0830ed6c51ac1542"
- integrity sha512-lWXWofDSYD8r/TIyu64MdwB4FaSirQ608PP/TzUyslyOeHGwQ0eTHUZeJrK1ILOmwUHaJtV693m2JoUYroUDpw==
-
-which@4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/which/-/which-4.0.0.tgz#cd60b5e74503a3fbcfbf6cd6b4138a8bae644c1a"
- integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==
- dependencies:
- isexe "^3.1.1"
diff --git a/extensions/github-authentication/.npmrc b/extensions/github-authentication/.npmrc
new file mode 100644
index 00000000000..a9c57709666
--- /dev/null
+++ b/extensions/github-authentication/.npmrc
@@ -0,0 +1,2 @@
+legacy-peer-deps="true"
+timeout=180000
diff --git a/extensions/github-authentication/.vscodeignore b/extensions/github-authentication/.vscodeignore
index f65bc15d839..0d0ea746e79 100644
--- a/extensions/github-authentication/.vscodeignore
+++ b/extensions/github-authentication/.vscodeignore
@@ -6,4 +6,4 @@ build/**
extension.webpack.config.js
extension-browser.webpack.config.js
tsconfig.json
-yarn.lock
+package-lock.json
diff --git a/extensions/github-authentication/package-lock.json b/extensions/github-authentication/package-lock.json
new file mode 100644
index 00000000000..c150fa7acc3
--- /dev/null
+++ b/extensions/github-authentication/package-lock.json
@@ -0,0 +1,300 @@
+{
+ "name": "github-authentication",
+ "version": "0.0.2",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "github-authentication",
+ "version": "0.0.2",
+ "license": "MIT",
+ "dependencies": {
+ "@vscode/extension-telemetry": "^0.9.0",
+ "node-fetch": "2.6.7",
+ "vscode-tas-client": "^0.1.84"
+ },
+ "devDependencies": {
+ "@types/mocha": "^9.1.1",
+ "@types/node": "20.x",
+ "@types/node-fetch": "^2.5.7"
+ },
+ "engines": {
+ "vscode": "^1.41.0"
+ }
+ },
+ "node_modules/@microsoft/1ds-core-js": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@microsoft/1ds-core-js/-/1ds-core-js-4.0.3.tgz",
+ "integrity": "sha512-FrxNLVAPsAvD7+l63TlNS/Kodvpct2WulpDSn1dI4Xuy0kF4E2H867kHdwL/iY1Bj3zA3FSy/jvE4+OcDws7ug==",
+ "dependencies": {
+ "@microsoft/applicationinsights-core-js": "3.0.4",
+ "@microsoft/applicationinsights-shims": "3.0.1",
+ "@microsoft/dynamicproto-js": "^2.0.2",
+ "@nevware21/ts-async": ">= 0.3.0 < 2.x",
+ "@nevware21/ts-utils": ">= 0.10.1 < 2.x"
+ }
+ },
+ "node_modules/@microsoft/1ds-post-js": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@microsoft/1ds-post-js/-/1ds-post-js-4.0.3.tgz",
+ "integrity": "sha512-uewvmUtXKd7ttypiKQGdYI6i7UUpPkOznLayzIFrJ4r2xnG6jhPjpKRncHFXPQcM4XSWO3yf5PQ3xAbPq9t7ZQ==",
+ "dependencies": {
+ "@microsoft/1ds-core-js": "4.0.3",
+ "@microsoft/applicationinsights-shims": "3.0.1",
+ "@microsoft/dynamicproto-js": "^2.0.2",
+ "@nevware21/ts-async": ">= 0.3.0 < 2.x",
+ "@nevware21/ts-utils": ">= 0.10.1 < 2.x"
+ }
+ },
+ "node_modules/@microsoft/applicationinsights-channel-js": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-channel-js/-/applicationinsights-channel-js-3.0.4.tgz",
+ "integrity": "sha512-6TlfExmErQ8Y+/ChbkyWl+jyt4wg3T6p7lwXDsUCB0LgZmlEWMaCUS0YlT73JCWmE8j7vxW8yUm0lgsgmHns3A==",
+ "dependencies": {
+ "@microsoft/applicationinsights-common": "3.0.4",
+ "@microsoft/applicationinsights-core-js": "3.0.4",
+ "@microsoft/applicationinsights-shims": "3.0.1",
+ "@microsoft/dynamicproto-js": "^2.0.2",
+ "@nevware21/ts-async": ">= 0.3.0 < 2.x",
+ "@nevware21/ts-utils": ">= 0.10.1 < 2.x"
+ },
+ "peerDependencies": {
+ "tslib": "*"
+ }
+ },
+ "node_modules/@microsoft/applicationinsights-common": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-common/-/applicationinsights-common-3.0.4.tgz",
+ "integrity": "sha512-r5gWaw/K9+tKfuo2GtDiDiKASgOkPOCrKW+wZzFvuR06uuwvWjbVQ6yW/YbnfuhRF5M65ksUiMi0eCMwEOGq7Q==",
+ "dependencies": {
+ "@microsoft/applicationinsights-core-js": "3.0.4",
+ "@microsoft/applicationinsights-shims": "3.0.1",
+ "@microsoft/dynamicproto-js": "^2.0.2",
+ "@nevware21/ts-utils": ">= 0.10.1 < 2.x"
+ },
+ "peerDependencies": {
+ "tslib": "*"
+ }
+ },
+ "node_modules/@microsoft/applicationinsights-core-js": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-3.0.4.tgz",
+ "integrity": "sha512-anxy5kEkqBmVoEqJiJzaaXXA0wzqZi9U4zGd05xFJ04lWckP8dG3zyT3+GGdg7rDelqLTNGxndeYoFmDv63u1g==",
+ "dependencies": {
+ "@microsoft/applicationinsights-shims": "3.0.1",
+ "@microsoft/dynamicproto-js": "^2.0.2",
+ "@nevware21/ts-async": ">= 0.3.0 < 2.x",
+ "@nevware21/ts-utils": ">= 0.10.1 < 2.x"
+ },
+ "peerDependencies": {
+ "tslib": "*"
+ }
+ },
+ "node_modules/@microsoft/applicationinsights-shims": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-shims/-/applicationinsights-shims-3.0.1.tgz",
+ "integrity": "sha512-DKwboF47H1nb33rSUfjqI6ryX29v+2QWcTrRvcQDA32AZr5Ilkr7whOOSsD1aBzwqX0RJEIP1Z81jfE3NBm/Lg==",
+ "dependencies": {
+ "@nevware21/ts-utils": ">= 0.9.4 < 2.x"
+ }
+ },
+ "node_modules/@microsoft/applicationinsights-web-basic": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-web-basic/-/applicationinsights-web-basic-3.0.4.tgz",
+ "integrity": "sha512-KfoxPlLlf0JT12ADb23C5iGye/yFouoMgHEKULxkSQcYY9SsW/8rVrqqvoYKAL+u215CZU2A8Kc8sR3ehEaPCQ==",
+ "dependencies": {
+ "@microsoft/applicationinsights-channel-js": "3.0.4",
+ "@microsoft/applicationinsights-common": "3.0.4",
+ "@microsoft/applicationinsights-core-js": "3.0.4",
+ "@microsoft/applicationinsights-shims": "3.0.1",
+ "@microsoft/dynamicproto-js": "^2.0.2",
+ "@nevware21/ts-async": ">= 0.3.0 < 2.x",
+ "@nevware21/ts-utils": ">= 0.10.1 < 2.x"
+ },
+ "peerDependencies": {
+ "tslib": "*"
+ }
+ },
+ "node_modules/@microsoft/dynamicproto-js": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-2.0.2.tgz",
+ "integrity": "sha512-MB8trWaFREpmb037k/d0bB7T2BP7Ai24w1e1tbz3ASLB0/lwphsq3Nq8S9I5AsI5vs4zAQT+SB5nC5/dLYTiOg==",
+ "dependencies": {
+ "@nevware21/ts-utils": ">= 0.9.4 < 2.x"
+ }
+ },
+ "node_modules/@nevware21/ts-async": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@nevware21/ts-async/-/ts-async-0.3.0.tgz",
+ "integrity": "sha512-ZUcgUH12LN/F6nzN0cYd0F/rJaMLmXr0EHVTyYfaYmK55bdwE4338uue4UiVoRqHVqNW4KDUrJc49iGogHKeWA==",
+ "dependencies": {
+ "@nevware21/ts-utils": ">= 0.10.0 < 2.x"
+ }
+ },
+ "node_modules/@nevware21/ts-utils": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/@nevware21/ts-utils/-/ts-utils-0.10.1.tgz",
+ "integrity": "sha512-pMny25NnF2/MJwdqC3Iyjm2pGIXNxni4AROpcqDeWa+td9JMUY4bUS9uU9XW+BoBRqTLUL+WURF9SOd/6OQzRg=="
+ },
+ "node_modules/@types/mocha": {
+ "version": "9.1.1",
+ "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz",
+ "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==",
+ "dev": true
+ },
+ "node_modules/@types/node": {
+ "version": "20.11.24",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz",
+ "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==",
+ "dev": true,
+ "dependencies": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "node_modules/@types/node-fetch": {
+ "version": "2.5.7",
+ "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.7.tgz",
+ "integrity": "sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "form-data": "^3.0.0"
+ }
+ },
+ "node_modules/@vscode/extension-telemetry": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/@vscode/extension-telemetry/-/extension-telemetry-0.9.0.tgz",
+ "integrity": "sha512-37RxGHXrs3GoXPgCUKQhghEu0gxs8j27RLjQwwtSf4WhPdJKz8UrqMYzpsXlliQ05zURYmtdGZst9C6+hfWXaQ==",
+ "dependencies": {
+ "@microsoft/1ds-core-js": "^4.0.3",
+ "@microsoft/1ds-post-js": "^4.0.3",
+ "@microsoft/applicationinsights-web-basic": "^3.0.4"
+ },
+ "engines": {
+ "vscode": "^1.75.0"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k= sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "dev": true
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk= sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz",
+ "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==",
+ "dev": true,
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.44.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
+ "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.27",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
+ "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
+ "dev": true,
+ "dependencies": {
+ "mime-db": "1.44.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/node-fetch": {
+ "version": "2.6.7",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
+ "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tas-client": {
+ "version": "0.2.33",
+ "resolved": "https://registry.npmjs.org/tas-client/-/tas-client-0.2.33.tgz",
+ "integrity": "sha512-V+uqV66BOQnWxvI6HjDnE4VkInmYZUQ4dgB7gzaDyFyFSK1i1nF/j7DpS9UbQAgV9NaF1XpcyuavnM1qOeiEIg=="
+ },
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+ },
+ "node_modules/undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+ "dev": true
+ },
+ "node_modules/vscode-tas-client": {
+ "version": "0.1.84",
+ "resolved": "https://registry.npmjs.org/vscode-tas-client/-/vscode-tas-client-0.1.84.tgz",
+ "integrity": "sha512-rUTrUopV+70hvx1hW5ebdw1nd6djxubkLvVxjGdyD/r5v/wcVF41LIfiAtbm5qLZDtQdsMH1IaCuDoluoIa88w==",
+ "dependencies": {
+ "tas-client": "0.2.33"
+ },
+ "engines": {
+ "vscode": "^1.85.0"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0= sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ }
+ }
+}
diff --git a/extensions/github-authentication/package.json b/extensions/github-authentication/package.json
index 2d2bea56277..7fcbc7f151c 100644
--- a/extensions/github-authentication/package.json
+++ b/extensions/github-authentication/package.json
@@ -38,7 +38,7 @@
"id": "github-enterprise"
}
],
- "configuration": {
+ "configuration": [{
"title": "GitHub Enterprise Server Authentication Provider",
"properties": {
"github-enterprise.uri": {
@@ -46,7 +46,17 @@
"description": "GitHub Enterprise Server URI"
}
}
+ },
+ {
+ "title": "GitHub Authentication",
+ "properties": {
+ "github.experimental.multipleAccounts": {
+ "type": "boolean",
+ "description": "Experimental support for multiple GitHub accounts"
+ }
+ }
}
+ ]
},
"aiKey": "0c6ae279ed8443289764825290e4f9e2-1a736e7c-1324-4338-be46-fc2a58ae4d14-7255",
"main": "./out/extension.js",
diff --git a/extensions/github-authentication/src/flows.ts b/extensions/github-authentication/src/flows.ts
index 7498a2b2202..a2497b2b0b2 100644
--- a/extensions/github-authentication/src/flows.ts
+++ b/extensions/github-authentication/src/flows.ts
@@ -173,6 +173,8 @@ const allFlows: IFlow[] = [
]);
if (existingLogin) {
searchParams.append('login', existingLogin);
+ } else {
+ searchParams.append('prompt', 'select_account');
}
// The extra toString, parse is apparently needed for env.openExternal
@@ -240,6 +242,8 @@ const allFlows: IFlow[] = [
]);
if (existingLogin) {
searchParams.append('login', existingLogin);
+ } else {
+ searchParams.append('prompt', 'select_account');
}
const loginUrl = baseUri.with({
diff --git a/extensions/github-authentication/src/github.ts b/extensions/github-authentication/src/github.ts
index 15fe2ef04f8..d4ae337427c 100644
--- a/extensions/github-authentication/src/github.ts
+++ b/extensions/github-authentication/src/github.ts
@@ -18,7 +18,9 @@ interface SessionData {
account?: {
label?: string;
displayName?: string;
- id: string;
+ // Unfortunately, for some time the id was a number, so we need to support both.
+ // This can be removed once we are confident that all users have migrated to the new id.
+ id: string | number;
};
scopes: string[];
accessToken: string;
@@ -97,6 +99,7 @@ export class GitHubAuthenticationProvider implements vscode.AuthenticationProvid
private readonly _keychain: Keychain;
private readonly _accountsSeen = new Set();
private readonly _disposable: vscode.Disposable | undefined;
+ private _supportsMultipleAccounts = false;
private _sessionsPromise: Promise;
@@ -133,10 +136,24 @@ export class GitHubAuthenticationProvider implements vscode.AuthenticationProvid
return sessions;
});
+ this._supportsMultipleAccounts = this._shouldSupportMultipleAccounts();
+
this._disposable = vscode.Disposable.from(
this._telemetryReporter,
- vscode.authentication.registerAuthenticationProvider(type, this._githubServer.friendlyName, this, { supportsMultipleAccounts: false }),
- this.context.secrets.onDidChange(() => this.checkForUpdates())
+ vscode.authentication.registerAuthenticationProvider(type, this._githubServer.friendlyName, this, { supportsMultipleAccounts: this._supportsMultipleAccounts }),
+ this.context.secrets.onDidChange(() => this.checkForUpdates()),
+ vscode.workspace.onDidChangeConfiguration(async e => {
+ if (e.affectsConfiguration('github.experimental.multipleAccounts')) {
+ const newValue = this._shouldSupportMultipleAccounts();
+ if (newValue === this._supportsMultipleAccounts) {
+ return;
+ }
+ const result = await vscode.window.showInformationMessage(vscode.l10n.t('Please reload the window to apply the new setting.'), { modal: true }, vscode.l10n.t('Reload Window'));
+ if (result) {
+ vscode.commands.executeCommand('workbench.action.reloadWindow');
+ }
+ }
+ })
);
}
@@ -148,14 +165,17 @@ export class GitHubAuthenticationProvider implements vscode.AuthenticationProvid
return this._sessionChangeEmitter.event;
}
- async getSessions(scopes?: string[]): Promise {
+ async getSessions(scopes: string[] | undefined, options?: vscode.AuthenticationProviderSessionOptions): Promise {
// For GitHub scope list, order doesn't matter so we immediately sort the scopes
const sortedScopes = scopes?.sort() || [];
this._logger.info(`Getting sessions for ${sortedScopes.length ? sortedScopes.join(',') : 'all scopes'}...`);
const sessions = await this._sessionsPromise;
- const finalSessions = sortedScopes.length
- ? sessions.filter(session => arrayEquals([...session.scopes].sort(), sortedScopes))
+ const accountFilteredSessions = options?.account
+ ? sessions.filter(session => session.account.label === options.account?.label)
: sessions;
+ const finalSessions = sortedScopes.length
+ ? accountFilteredSessions.filter(session => arrayEquals([...session.scopes].sort(), sortedScopes))
+ : accountFilteredSessions;
this._logger.info(`Got ${finalSessions.length} sessions for ${sortedScopes?.join(',') ?? 'all scopes'}...`);
return finalSessions;
@@ -221,12 +241,17 @@ export class GitHubAuthenticationProvider implements vscode.AuthenticationProvid
return [];
}
+ // Unfortunately, we were using a number secretly for the account id for some time... this is due to a bad `any`.
+ // AuthenticationSession's account id is a string, so we need to detect when there is a number accountId and re-store
+ // the sessions to migrate away from the bad number usage.
+ // TODO@TylerLeonhardt: Remove this after we are confident that all users have migrated to the new id.
+ let seenNumberAccountId: boolean = false;
// TODO: eventually remove this Set because we should only have one session per set of scopes.
const scopesSeen = new Set();
- const sessionPromises = sessionData.map(async (session: SessionData) => {
+ const sessionPromises = sessionData.map(async (session: SessionData): Promise => {
// For GitHub scope list, order doesn't matter so we immediately sort the scopes
const scopesStr = [...session.scopes].sort().join(' ');
- if (scopesSeen.has(scopesStr)) {
+ if (!this._supportsMultipleAccounts && scopesSeen.has(scopesStr)) {
return undefined;
}
let userInfo: { id: string; accountName: string } | undefined;
@@ -244,13 +269,23 @@ export class GitHubAuthenticationProvider implements vscode.AuthenticationProvid
this._logger.trace(`Read the following session from the keychain with the following scopes: ${scopesStr}`);
scopesSeen.add(scopesStr);
+
+ let accountId: string;
+ if (session.account?.id) {
+ if (typeof session.account.id === 'number') {
+ seenNumberAccountId = true;
+ }
+ accountId = `${session.account.id}`;
+ } else {
+ accountId = userInfo?.id ?? ']