From cf232fc08d440cc2722a6086d4b94048becfccdb Mon Sep 17 00:00:00 2001 From: netcon Date: Tue, 3 Feb 2026 22:51:48 +0800 Subject: [PATCH 1/4] chore: bump vscode to 1.108.2 (#656) * chore: bump vscode to 1.108.2 * chore: fix workflow --- .github/workflows/codacy-analysis.yaml | 27 +++++----- .github/workflows/test-wtih-vscode-build.yml | 2 +- package-lock.json | 24 ++------- package.json | 2 +- vscode-web/.VERSION | 2 +- vscode-web/package-lock.json | 4 +- vscode-web/package.json | 2 +- vscode-web/scripts/.patch | 16 +++--- vscode-web/src/vs/base/common/network.ts | 23 +++++++-- .../parts/activitybar/activitybarPart.ts | 6 +-- .../parts/titlebar/media/titlebarpart.css | 18 +++++-- .../src/vs/workbench/browser/web.main.ts | 25 +++++++--- .../contrib/webview/browser/pre/index.html | 49 +++++++++++++++++-- .../builtinExtensionsScannerService.ts | 3 +- .../services/label/common/labelService.ts | 19 ++++--- .../textfile/browser/textFileService.ts | 30 ++++++++---- 16 files changed, 168 insertions(+), 84 deletions(-) diff --git a/.github/workflows/codacy-analysis.yaml b/.github/workflows/codacy-analysis.yaml index e755360c4..7abad0aae 100644 --- a/.github/workflows/codacy-analysis.yaml +++ b/.github/workflows/codacy-analysis.yaml @@ -12,23 +12,26 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@master + uses: actions/checkout@v4 - name: Run Codacy Analysis CLI uses: codacy/codacy-analysis-cli-action@master with: - output: results.sarif - format: sarif - # Adjust severity of non-security issues - gh-code-scanning-compat: true - # Force 0 exit code to allow SARIF file generation - # This will handover control about PR rejection to the GitHub side + # Run analysis without SARIF output to avoid GitHub Code Scanning integration issues + # See: https://github.com/codacy/codacy-analysis-cli-action/issues/142 + # The Codacy tool generates multiple SARIF runs which is incompatible with + # GitHub's new policy as of July 2025 + verbose: true + # Force 0 exit code to prevent workflow failures max-allowed-issues: 2147483647 # only scan the github1s directory directory: $GITHUB_WORKSPACE/extensions/github1s - # Upload the SARIF file generated in the previous step - - name: Upload SARIF results file - uses: github/codeql-action/upload-sarif@main - with: - sarif_file: results.sarif + # SARIF upload is temporarily disabled due to incompatibility + # See: https://github.com/codacy/codacy-analysis-cli-action/issues/142 + # TODO: Re-enable when Codacy fixes the multiple runs issue + # - name: Upload SARIF results file + # uses: github/codeql-action/upload-sarif@v4 + # with: + # sarif_file: results.sarif + # category: codacy-security-scan diff --git a/.github/workflows/test-wtih-vscode-build.yml b/.github/workflows/test-wtih-vscode-build.yml index 32d813426..01f991ed0 100644 --- a/.github/workflows/test-wtih-vscode-build.yml +++ b/.github/workflows/test-wtih-vscode-build.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: os: [macos-14] - node-version: [20.x] + node-version: [22.x] runs-on: ${{ matrix.os }} diff --git a/package-lock.json b/package-lock.json index 360f91e78..1e49205e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "license": "ISC", "devDependencies": { "@cloudflare/workers-types": "^4.20250109.0", - "@github1s/vscode-web": "^0.26.0", + "@github1s/vscode-web": "^0.27.0", "chokidar": "^4.0.3", "clean-css": "^5.3.3", "copy-webpack-plugin": "^12.0.2", @@ -248,9 +248,9 @@ } }, "node_modules/@github1s/vscode-web": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@github1s/vscode-web/-/vscode-web-0.26.0.tgz", - "integrity": "sha512-z46VwaF4eRZ+N5c39F5dpMraHPB0dOre4QUZji2Tnkp0cUVrtjT7V/1+XTG+TUvusK4/BvCKOyCLDyyUxBo0aw==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@github1s/vscode-web/-/vscode-web-0.27.0.tgz", + "integrity": "sha512-FC7kPJAqYpNvmBsjSp14OLOSMjKOIxRyRJ8W9FQ5rLBNhQQQ/fVtlhKXBVUKKF64Dl14iEGXdM1+rEDm2XS8Ug==", "dev": true, "license": "MIT" }, @@ -698,7 +698,6 @@ "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -929,7 +928,6 @@ "integrity": "sha512-67gbfv8rAwawjYx3fYArwldTQKoYfezNUT4D5ioWetr/xCrxXxvleo3uuiFuKfejipvq+og7mjz3b0G2bVyUCw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.19.1", "@typescript-eslint/types": "8.19.1", @@ -1355,7 +1353,6 @@ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -1379,7 +1376,6 @@ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1767,7 +1763,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", @@ -2907,7 +2902,6 @@ "integrity": "sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", @@ -2968,7 +2962,6 @@ "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, "license": "MIT", - "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -6498,7 +6491,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -6608,7 +6600,6 @@ "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -7229,7 +7220,6 @@ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -8494,8 +8484,7 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", @@ -8608,7 +8597,6 @@ "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -8869,7 +8857,6 @@ "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", @@ -8917,7 +8904,6 @@ "integrity": "sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@discoveryjs/json-ext": "^0.6.1", "@webpack-cli/configtest": "^3.0.1", diff --git a/package.json b/package.json index fd5e3c367..da2a8c67f 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "license": "ISC", "devDependencies": { "@cloudflare/workers-types": "^4.20250109.0", - "@github1s/vscode-web": "^0.26.0", + "@github1s/vscode-web": "^0.27.0", "chokidar": "^4.0.3", "clean-css": "^5.3.3", "copy-webpack-plugin": "^12.0.2", diff --git a/vscode-web/.VERSION b/vscode-web/.VERSION index cc9152e04..496a2a102 100644 --- a/vscode-web/.VERSION +++ b/vscode-web/.VERSION @@ -1 +1 @@ -1.101.2 \ No newline at end of file +1.108.2 \ No newline at end of file diff --git a/vscode-web/package-lock.json b/vscode-web/package-lock.json index 87230c6ce..d18391b9c 100644 --- a/vscode-web/package-lock.json +++ b/vscode-web/package-lock.json @@ -1,12 +1,12 @@ { "name": "@github1s/vscode-web", - "version": "0.26.0", + "version": "0.27.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@github1s/vscode-web", - "version": "0.26.0", + "version": "0.27.0", "license": "MIT", "devDependencies": { "chokidar": "^4.0.3", diff --git a/vscode-web/package.json b/vscode-web/package.json index 548b6bc10..82fc6404b 100644 --- a/vscode-web/package.json +++ b/vscode-web/package.json @@ -1,6 +1,6 @@ { "name": "@github1s/vscode-web", - "version": "0.26.0", + "version": "0.27.0", "description": "VS Code web for GitHub1s", "author": "github1s", "license": "MIT", diff --git a/vscode-web/scripts/.patch b/vscode-web/scripts/.patch index 696e75346..ece772f3e 100644 --- a/vscode-web/scripts/.patch +++ b/vscode-web/scripts/.patch @@ -1,12 +1,12 @@ { - "src/vs/workbench/browser/parts/activitybar/activitybarPart.ts": "49575327f7d302dad48a46beba42a675c75d6bfd2caa6b3e5e3bb3e7f41a71e0", - "src/vs/workbench/browser/parts/titlebar/media/titlebarpart.css": "6be71e59eeb2e650262bb6d15a05dbd7636928fbbae7f33998f1554b436b4108", - "src/vs/workbench/browser/web.main.ts": "b3276e26f954a434d1b6174eeece432f448fbbd831566d6451aa35208a0d5627", + "src/vs/workbench/browser/parts/activitybar/activitybarPart.ts": "3edda05b7b7cf235bc0d51f066aa8d57c447ea784ccd507316327150a4bb880c", + "src/vs/workbench/browser/parts/titlebar/media/titlebarpart.css": "26cdde234b2811b42166224f3b0f12eb6d78d519d5262cc2b12ec08653b3df39", + "src/vs/workbench/browser/web.main.ts": "a7c43beaa0f873ce0f9edc1aa03db3e9150fb1ac6dc6479a08e0ea5c8a3b2e76", "src/vs/workbench/contrib/files/browser/editors/fileEditorInput.ts": "e986095a30dbea54af56c25fa1b184b55f34f8914129b27e2f20d8c4ea9fd16b", - "src/vs/workbench/contrib/webview/browser/pre/index.html": "7ce2885c633813288123a7dde3981448e387471450cf0d861c1c02b9cbdbf0bc", - "src/vs/workbench/services/extensionManagement/browser/builtinExtensionsScannerService.ts": "c220568141adf6ed560bab754ea7769795465c6fa93ecd461e9b59f05ca56377", - "src/vs/workbench/services/label/common/labelService.ts": "72d72581bd521c2edadd60d4458de4d1c6a9a2cc2cf83820034c82815a2eae6a", - "src/vs/workbench/services/textfile/browser/textFileService.ts": "607da093a8562c6a42e9bdb1b2456fa9eb1065a53a5ac6afbb323f6f8505e03f", - "src/vs/base/common/network.ts": "34fc2461d4b6029e71b60a3bf5d7438585e9d2b66ccdcab0893cc69d77fab5b5", + "src/vs/workbench/contrib/webview/browser/pre/index.html": "8b2e27b411b4fa493fe003c5312378ca0c7164fee99ed288c6e4f47c43dbca1f", + "src/vs/workbench/services/extensionManagement/browser/builtinExtensionsScannerService.ts": "16fc1f8830432097a2de87ba04f9f11e930408df8f672bb7a4bbbe3c1a7c509d", + "src/vs/workbench/services/label/common/labelService.ts": "ac42f60193b50a4668384787468758e4b093f9f2da74a7c9604de5c455886e98", + "src/vs/workbench/services/textfile/browser/textFileService.ts": "c384a6ec5991888fb09cdbf482a6747fa15d486e1cd8967560da3ca1df65944e", + "src/vs/base/common/network.ts": "e8679d4499a7bf7474f31e3dcf61db40be3c0c5c81837cf7adf8e7ea2b656fa1", "src/vs/workbench/contrib/webview/browser/pre/index-no-csp.html": "40d576ad2307d28012b34b86858ba36ba49ae10e5aedb394bd06b14a35b869a5" } \ No newline at end of file diff --git a/vscode-web/src/vs/base/common/network.ts b/vscode-web/src/vs/base/common/network.ts index 7ba2e3d1e..188855dc0 100644 --- a/vscode-web/src/vs/base/common/network.ts +++ b/vscode-web/src/vs/base/common/network.ts @@ -82,7 +82,13 @@ export namespace Schemas { export const vscodeChatCodeCompareBlock = 'vscode-chat-code-compare-block'; /** Scheme used for the chat input editor. */ - export const vscodeChatSesssion = 'vscode-chat-editor'; + export const vscodeChatEditor = 'vscode-chat-editor'; + + /** Scheme used for the chat input part */ + export const vscodeChatInput = 'chatSessionInput'; + + /** Scheme used for local chat session content */ + export const vscodeLocalChatSession = 'vscode-chat-session'; /** * Scheme used internally for webviews that aren't linked to a resource (i.e. not custom editors) @@ -139,6 +145,17 @@ export namespace Schemas { * Scheme used for the accessible view */ export const accessibleView = 'accessible-view'; + + /** + * Used for snapshots of chat edits + */ + export const chatEditingSnapshotScheme = 'chat-editing-snapshot-text-model'; + export const chatEditingModel = 'chat-editing-text-model'; + + /** + * Used for rendering multidiffs in copilot agent sessions + */ + export const copilotPr = 'copilot-pr'; } export function matchesScheme(target: URI | string, scheme: string): boolean { @@ -404,7 +421,7 @@ export namespace COI { * isn't enabled the current context */ export function addSearchParam(urlOrSearch: URLSearchParams | Record, coop: boolean, coep: boolean): void { - if (!(globalThis).crossOriginIsolated) { + if (!(globalThis as typeof globalThis & { crossOriginIsolated?: boolean }).crossOriginIsolated) { // depends on the current context being COI return; } @@ -412,7 +429,7 @@ export namespace COI { if (urlOrSearch instanceof URLSearchParams) { urlOrSearch.set(coiSearchParamName, value); } else { - (>urlOrSearch)[coiSearchParamName] = value; + urlOrSearch[coiSearchParamName] = value; } } } diff --git a/vscode-web/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/vscode-web/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index 464d1d2d5..36b7914e1 100644 --- a/vscode-web/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/vscode-web/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -16,7 +16,7 @@ import { IThemeService, IColorTheme, registerThemingParticipant } from '../../.. import { ACTIVITY_BAR_BACKGROUND, ACTIVITY_BAR_BORDER, ACTIVITY_BAR_FOREGROUND, ACTIVITY_BAR_ACTIVE_BORDER, ACTIVITY_BAR_BADGE_BACKGROUND, ACTIVITY_BAR_BADGE_FOREGROUND, ACTIVITY_BAR_INACTIVE_FOREGROUND, ACTIVITY_BAR_ACTIVE_BACKGROUND, ACTIVITY_BAR_DRAG_AND_DROP_BORDER, ACTIVITY_BAR_ACTIVE_FOCUS_BORDER } from '../../../common/theme.js'; import { activeContrastBorder, contrastBorder, focusBorder } from '../../../../platform/theme/common/colorRegistry.js'; import { addDisposableListener, append, EventType, isAncestor, $, clearNode } from '../../../../base/browser/dom.js'; -import { assertIsDefined } from '../../../../base/common/types.js'; +import { assertReturnsDefined } from '../../../../base/common/types.js'; import { CustomMenubarControl } from '../titlebar/menubarControl.js'; import { IConfigurationService } from '../../../../platform/configuration/common/configuration.js'; import { getMenuBarVisibility, MenuSettings } from '../../../../platform/window/common/window.js'; @@ -129,7 +129,7 @@ export class ActivitybarPart extends Part { override updateStyles(): void { super.updateStyles(); - const container = assertIsDefined(this.getContainer()); + const container = assertReturnsDefined(this.getContainer()); const background = this.getColor(ACTIVITY_BAR_BACKGROUND) || ''; container.style.backgroundColor = background; @@ -281,7 +281,7 @@ export class ActivityBarCompositeBar extends PaneCompositeBar { this.menuBarContainer = $('.menubar'); - const content = assertIsDefined(this.element); + const content = assertReturnsDefined(this.element); /* below codes are changed by github1s */ const homeBarContainer = this.element?.querySelector('.home-bar'); if (homeBarContainer) { diff --git a/vscode-web/src/vs/workbench/browser/parts/titlebar/media/titlebarpart.css b/vscode-web/src/vs/workbench/browser/parts/titlebar/media/titlebarpart.css index 584f32db0..d13c4db0c 100644 --- a/vscode-web/src/vs/workbench/browser/parts/titlebar/media/titlebarpart.css +++ b/vscode-web/src/vs/workbench/browser/parts/titlebar/media/titlebarpart.css @@ -71,14 +71,14 @@ align-items: center; } -.monaco-workbench .part.titlebar > .titlebar-container > .titlebar-left { +.monaco-workbench .part.titlebar > .titlebar-container.has-center > .titlebar-left { order: 0; width: 20%; flex-grow: 2; justify-content: flex-start; } -.monaco-workbench .part.titlebar > .titlebar-container > .titlebar-center { +.monaco-workbench .part.titlebar > .titlebar-container.has-center > .titlebar-center { order: 1; width: 60%; max-width: fit-content; @@ -88,7 +88,7 @@ justify-content: center; } -.monaco-workbench .part.titlebar > .titlebar-container > .titlebar-right { +.monaco-workbench .part.titlebar > .titlebar-container.has-center > .titlebar-right { order: 2; width: 20%; min-width: min-content; @@ -96,7 +96,19 @@ justify-content: flex-end; } +.monaco-workbench .part.titlebar > .titlebar-container:not(.has-center) > .titlebar-left { + flex: 1 1 0%; + min-width: 0; +} + +.monaco-workbench .part.titlebar > .titlebar-container:not(.has-center) > .titlebar-center { + display: none; +} +.monaco-workbench .part.titlebar > .titlebar-container:not(.has-center) > .titlebar-right { + flex: 0 0 auto; + padding-left: 16px; /* ensure there is some space between title and controls */ +} /* Window title text */ .monaco-workbench .part.titlebar > .titlebar-container > .titlebar-center > .window-title { diff --git a/vscode-web/src/vs/workbench/browser/web.main.ts b/vscode-web/src/vs/workbench/browser/web.main.ts index c48d84d97..ec4bd029a 100644 --- a/vscode-web/src/vs/workbench/browser/web.main.ts +++ b/vscode-web/src/vs/workbench/browser/web.main.ts @@ -5,7 +5,7 @@ import { mark } from '../../base/common/performance.js'; import { domContentLoaded, detectFullscreen, getCookieValue, getWindow } from '../../base/browser/dom.js'; -import { assertIsDefined } from '../../base/common/types.js'; +import { assertReturnsDefined } from '../../base/common/types.js'; import { ServiceCollection } from '../../platform/instantiation/common/serviceCollection.js'; import { ILogService, ConsoleLogger, getLogLevel, ILoggerService, ILogger } from '../../platform/log/common/log.js'; import { ConsoleLogInAutomationLogger } from '../../platform/log/browser/log.js'; @@ -68,7 +68,7 @@ import { IProgressService } from '../../platform/progress/common/progress.js'; import { DelayedLogChannel } from '../services/output/common/delayedLogChannel.js'; import { dirname, joinPath } from '../../base/common/resources.js'; import { IUserDataProfile, IUserDataProfilesService } from '../../platform/userDataProfile/common/userDataProfile.js'; -import { NullPolicyService } from '../../platform/policy/common/policy.js'; +import { IPolicyService } from '../../platform/policy/common/policy.js'; import { IRemoteExplorerService } from '../services/remote/common/remoteExplorerService.js'; import { DisposableTunnel, TunnelProtocol } from '../../platform/tunnel/common/tunnel.js'; import { ILabelService } from '../../platform/label/common/label.js'; @@ -95,6 +95,9 @@ import { ISecretStorageService } from '../../platform/secrets/common/secrets.js' import { TunnelSource } from '../services/remote/common/tunnelModel.js'; import { mainWindow } from '../../base/browser/window.js'; import { INotificationService, Severity } from '../../platform/notification/common/notification.js'; +import { IDefaultAccountService } from '../../platform/defaultAccount/common/defaultAccount.js'; +import { DefaultAccountService } from '../services/accounts/common/defaultAccount.js'; +import { AccountPolicyService } from '../services/policies/common/accountPolicyService.js'; export class BrowserMain extends Disposable { @@ -209,7 +212,7 @@ export class BrowserMain extends Disposable { await remoteAuthorityResolverService.resolveAuthority(this.configuration.remoteAuthority); }, openTunnel: async tunnelOptions => { - const tunnel = assertIsDefined(await remoteExplorerService.forward({ + const tunnel = assertReturnsDefined(await remoteExplorerService.forward({ remote: tunnelOptions.remoteAddress, local: tunnelOptions.localAddressPort, name: tunnelOptions.label, @@ -345,9 +348,17 @@ export class BrowserMain extends Disposable { serviceCollection.set(IRemoteAgentService, remoteAgentService); this._register(RemoteFileSystemProviderClient.register(remoteAgentService, fileService, logService)); + // Default Account + const defaultAccountService = this._register(new DefaultAccountService()); + serviceCollection.set(IDefaultAccountService, defaultAccountService); + + // Policies + const policyService = new AccountPolicyService(logService, defaultAccountService); + serviceCollection.set(IPolicyService, policyService); + // Long running services (workspace, config, storage) const [configurationService, storageService] = await Promise.all([ - this.createWorkspaceService(workspace, environmentService, userDataProfileService, userDataProfilesService, fileService, remoteAgentService, uriIdentityService, logService).then(service => { + this.createWorkspaceService(workspace, environmentService, userDataProfileService, userDataProfilesService, fileService, remoteAgentService, uriIdentityService, policyService, logService).then(service => { // Workspace serviceCollection.set(IWorkspaceContextService, service); @@ -478,7 +489,7 @@ export class BrowserMain extends Disposable { if (indexedDB) { userDataProvider = new IndexedDBFileSystemProvider(Schemas.vscodeUserData, indexedDB, userDataStore, true); this.indexedDBFileSystemProviders.push(userDataProvider); - this.registerDeveloperActions(userDataProvider); + this.registerDeveloperActions(userDataProvider); } else { logService.info('Using in-memory user data provider'); userDataProvider = new InMemoryFileSystemProvider(); @@ -551,7 +562,7 @@ export class BrowserMain extends Disposable { } } - private async createWorkspaceService(workspace: IAnyWorkspaceIdentifier, environmentService: IBrowserWorkbenchEnvironmentService, userDataProfileService: IUserDataProfileService, userDataProfilesService: IUserDataProfilesService, fileService: FileService, remoteAgentService: IRemoteAgentService, uriIdentityService: IUriIdentityService, logService: ILogService): Promise { + private async createWorkspaceService(workspace: IAnyWorkspaceIdentifier, environmentService: IBrowserWorkbenchEnvironmentService, userDataProfileService: IUserDataProfileService, userDataProfilesService: IUserDataProfilesService, fileService: FileService, remoteAgentService: IRemoteAgentService, uriIdentityService: IUriIdentityService, policyService: IPolicyService, logService: ILogService): Promise { // Temporary workspaces do not exist on startup because they are // just in memory. As such, detect this case and eagerly create @@ -567,7 +578,7 @@ export class BrowserMain extends Disposable { } const configurationCache = new ConfigurationCache([Schemas.file, Schemas.vscodeUserData, Schemas.tmp] /* Cache all non native resources */, environmentService, fileService); - const workspaceService = new WorkspaceService({ remoteAuthority: this.configuration.remoteAuthority, configurationCache }, environmentService, userDataProfileService, userDataProfilesService, fileService, remoteAgentService, uriIdentityService, logService, new NullPolicyService()); + const workspaceService = new WorkspaceService({ remoteAuthority: this.configuration.remoteAuthority, configurationCache }, environmentService, userDataProfileService, userDataProfilesService, fileService, remoteAgentService, uriIdentityService, logService, policyService); try { await workspaceService.initialize(workspace); diff --git a/vscode-web/src/vs/workbench/contrib/webview/browser/pre/index.html b/vscode-web/src/vs/workbench/contrib/webview/browser/pre/index.html index a2ad9e7d1..10efd81c3 100644 --- a/vscode-web/src/vs/workbench/contrib/webview/browser/pre/index.html +++ b/vscode-web/src/vs/workbench/contrib/webview/browser/pre/index.html @@ -37,6 +37,22 @@ const onElectron = searchParams.get('platform') === 'electron'; const disableServiceWorker = searchParams.has('disableServiceWorker'); const expectedWorkerVersion = parseInt(searchParams.get('swVersion')); + + /** + * @param {string} name + * @param {Record} [options] + */ + const perfMark = (name, options = {}) => { + performance.mark(`webview/index.html/${name}`, { + detail: { + id: ID, + ...options + } + }); + } + + perfMark('scriptStart'); + /** @type {MessageChannel | undefined} */ let outerIframeMessageChannel; @@ -90,6 +106,7 @@ const defaultStyles = document.createElement('style'); defaultStyles.id = '_defaultStyles'; defaultStyles.textContent = ` + @layer vscode-default { html { scrollbar-color: var(--vscode-scrollbarSlider-background) var(--vscode-editor-background); } @@ -183,7 +200,8 @@ } ::highlight(current-find-highlight) { background-color: var(--vscode-editor-findMatchBackground); - }`; + } + }`; /** * @param {boolean} allowMultipleAPIAcquire @@ -223,9 +241,9 @@ }); }; })(); - delete window.parent; - delete window.top; - delete window.frameElement; + window.parent = window; + window.top = window; + window.frameElement = null; `; } @@ -936,9 +954,12 @@ // update iframe-contents let updateId = 0; hostMessaging.onMessage('content', async (_event, /** @type {import('../webviewMessages').UpdateContentEvent} */ data) => { + perfMark('content/started'); + const currentUpdateId = ++updateId; try { await workerReady; + perfMark('content/workerReady'); } catch (e) { console.error(`Webview fatal error: ${e}`); hostMessaging.postMessage('fatal-error', { message: e + '' }); @@ -1002,7 +1023,7 @@ } newFrame.setAttribute('sandbox', Array.from(sandboxRules).join(' ')); - const allowRules = ['cross-origin-isolated;', 'autoplay;']; + const allowRules = ['cross-origin-isolated;', 'autoplay;', 'local-network-access;']; if (!isFirefox && options.allowScripts) { allowRules.push('clipboard-read;', 'clipboard-write;'); } @@ -1027,12 +1048,15 @@ * @param {Document} contentDocument */ function onFrameLoaded(contentDocument) { + perfMark('content/innerFrameLoaded') + // Workaround for https://bugs.chromium.org/p/chromium/issues/detail?id=978325 setTimeout(() => { contentDocument.open(); contentDocument.write(newDocument); contentDocument.close(); hookupOnLoadHandlers(newFrame); + perfMark('content/wroteInnerContent') if (initialStyleVersion !== styleVersion) { applyStyles(contentDocument, contentDocument.body); @@ -1093,6 +1117,21 @@ contentWindow.focus(); } + // Get body size + const docEl = contentDocument.documentElement; + if (docEl) { + const postSize = () => { + hostMessaging.postMessage('updated-intrinsic-content-size', { + width: docEl.offsetWidth, + height: docEl.offsetHeight + }); + }; + + const resizeObserver = new ResizeObserver(postSize); + resizeObserver.observe(docEl); + postSize(); + } + pendingMessages.forEach((message) => { contentWindow.postMessage(message.message, window.origin, message.transfer); }); diff --git a/vscode-web/src/vs/workbench/services/extensionManagement/browser/builtinExtensionsScannerService.ts b/vscode-web/src/vs/workbench/services/extensionManagement/browser/builtinExtensionsScannerService.ts index f6eae4d4c..6d23b3d2d 100644 --- a/vscode-web/src/vs/workbench/services/extensionManagement/browser/builtinExtensionsScannerService.ts +++ b/vscode-web/src/vs/workbench/services/extensionManagement/browser/builtinExtensionsScannerService.ts @@ -20,7 +20,7 @@ import { mainWindow } from '../../../../base/browser/window.js'; interface IBundledExtension { extensionPath: string; packageJSON: IExtensionManifest; - packageNLS?: any; + packageNLS?: ITranslations; readmePath?: string; changelogPath?: string; } @@ -56,6 +56,7 @@ export class BuiltinExtensionsScannerService implements IBuiltinExtensionsScanne bundledExtensions = [/*BUILD->INSERT_BUILTIN_EXTENSIONS*/]; } else { // Find builtin extensions by checking for DOM + // eslint-disable-next-line no-restricted-syntax const builtinExtensionsElement = mainWindow.document.getElementById('vscode-workbench-builtin-extensions'); const builtinExtensionsElementAttribute = builtinExtensionsElement ? builtinExtensionsElement.getAttribute('data-settings') : undefined; if (builtinExtensionsElementAttribute) { diff --git a/vscode-web/src/vs/workbench/services/label/common/labelService.ts b/vscode-web/src/vs/workbench/services/label/common/labelService.ts index 7d0693600..9059d8ff8 100644 --- a/vscode-web/src/vs/workbench/services/label/common/labelService.ts +++ b/vscode-web/src/vs/workbench/services/label/common/labelService.ts @@ -75,7 +75,8 @@ const resourceLabelFormattersExtPoint = ExtensionsRegistry.registerExtensionPoin } }); -const sepRegexp = /\//g; +const posixPathSeparatorRegexp = /\//g; // on Unix, backslash is a valid filename character +const winPathSeparatorRegexp = /[\\\/]/g; // on Windows, neither slash nor backslash are valid filename characters const labelMatchingRegexp = /\$\{(scheme|authoritySuffix|authority|path|(query)\.(.+?))\}/g; function hasDriveLetterIgnorePlatform(path: string): boolean { @@ -137,7 +138,7 @@ export class LabelService extends Disposable implements ILabelService { private readonly _onDidChangeFormatters = this._register(new Emitter({ leakWarningThreshold: 400 })); readonly onDidChangeFormatters = this._onDidChangeFormatters.event; - private readonly storedFormattersMemento: Memento; + private readonly storedFormattersMemento: Memento; private readonly storedFormatters: IStoredFormatters; private os: OperatingSystem; private userHome: URI | undefined; @@ -191,11 +192,9 @@ export class LabelService extends Disposable implements ILabelService { continue; } - if ( - match(formatter.authority.toLowerCase(), resource.authority.toLowerCase()) && + if (match(formatter.authority, resource.authority, { ignoreCase: true }) && ( - !bestResult || - !bestResult.authority || + !bestResult?.authority || formatter.authority.length > bestResult.authority.length || ((formatter.authority.length === bestResult.authority.length) && formatter.priority) ) @@ -220,7 +219,7 @@ export class LabelService extends Disposable implements ILabelService { // Without formatting we still need to support the separator // as provided in options (https://github.com/microsoft/vscode/issues/130019) if (!formatting && options.separator) { - label = label.replace(sepRegexp, options.separator); + label = this.adjustPathSeparators(label, options.separator); } if (options.appendWorkspaceSuffix && formatting?.workspaceSuffix) { @@ -495,7 +494,11 @@ export class LabelService extends Disposable implements ILabelService { label = formatting.authorityPrefix + label; } - return label.replace(sepRegexp, formatting.separator); + return this.adjustPathSeparators(label, formatting.separator); + } + + private adjustPathSeparators(label: string, separator: '/' | '\\' | ''): string { + return label.replace(this.os === OperatingSystem.Windows ? winPathSeparatorRegexp : posixPathSeparatorRegexp, separator); } private appendWorkspaceSuffix(label: string, uri: URI): string { diff --git a/vscode-web/src/vs/workbench/services/textfile/browser/textFileService.ts b/vscode-web/src/vs/workbench/services/textfile/browser/textFileService.ts index 488dbcdac..3d8612143 100644 --- a/vscode-web/src/vs/workbench/services/textfile/browser/textFileService.ts +++ b/vscode-web/src/vs/workbench/services/textfile/browser/textFileService.ts @@ -5,7 +5,7 @@ import { localize } from '../../../../nls.js'; import { URI } from '../../../../base/common/uri.js'; -import { IEncodingSupport, ITextFileService, ITextFileStreamContent, ITextFileContent, IResourceEncodings, IReadTextFileOptions, IWriteTextFileOptions, toBufferOrReadable, TextFileOperationError, TextFileOperationResult, ITextFileSaveOptions, ITextFileEditorModelManager, IResourceEncoding, stringToSnapshot, ITextFileSaveAsOptions, IReadTextFileEncodingOptions, TextFileEditorModelState } from '../common/textfiles.js'; +import { IEncodingSupport, ITextFileService, ITextFileStreamContent, ITextFileContent, IResourceEncodings, IReadTextFileOptions, IWriteTextFileOptions, toBufferOrReadable, TextFileOperationError, TextFileOperationResult, ITextFileSaveOptions, ITextFileEditorModelManager, IResourceEncoding, stringToSnapshot, ITextFileSaveAsOptions, IReadTextFileEncodingOptions, TextFileEditorModelState, IResolvedTextFileEditorModel } from '../common/textfiles.js'; import { IRevertOptions, SaveSourceRegistry } from '../../../common/editor.js'; import { ILifecycleService } from '../../lifecycle/common/lifecycle.js'; import { IFileService, FileOperationError, FileOperationResult, IFileStatWithMetadata, ICreateFileOptions, IFileStreamContent } from '../../../../platform/files/common/files.js'; @@ -13,7 +13,7 @@ import { Disposable } from '../../../../base/common/lifecycle.js'; import { extname as pathExtname } from '../../../../base/common/path.js'; import { IWorkbenchEnvironmentService } from '../../environment/common/environmentService.js'; import { IUntitledTextEditorService, IUntitledTextEditorModelManager } from '../../untitled/common/untitledTextEditorService.js'; -import { UntitledTextEditorModel } from '../../untitled/common/untitledTextEditorModel.js'; +import { IResolvedUntitledTextEditorModel, UntitledTextEditorModel } from '../../untitled/common/untitledTextEditorModel.js'; import { TextFileEditorModelManager } from '../common/textFileEditorModelManager.js'; import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js'; import { Schemas } from '../../../../base/common/network.js'; @@ -440,11 +440,23 @@ export abstract class AbstractTextFileService extends Disposable implements ITex private async doSaveAs(source: URI, target: URI, options?: ITextFileSaveOptions): Promise { let success = false; - // If the source is an existing text file model, we can directly - // use that model to copy the contents to the target destination - const textFileModel = this.files.get(source); - if (textFileModel?.isResolved()) { - success = await this.doSaveAsTextFile(textFileModel, source, target, options); + let resolvedTextModel: IResolvedTextFileEditorModel | IResolvedUntitledTextEditorModel | undefined; + if (source.scheme !== Schemas.untitled) { + const textFileModel = this.files.get(source); + if (textFileModel?.isResolved()) { + resolvedTextModel = textFileModel; + } + } else { + const untitledTextModel = this.untitled.get(source); + if (untitledTextModel?.isResolved()) { + resolvedTextModel = untitledTextModel; + } + } + + // If the source is an existing resolved file or untitled text model, we can + // directly use that model to copy the contents to the target destination + if (resolvedTextModel) { + success = await this.doSaveAsTextFile(resolvedTextModel, source, target, options); } // Otherwise if the source can be handled by the file service @@ -489,7 +501,7 @@ export abstract class AbstractTextFileService extends Disposable implements ITex return target; } - private async doSaveAsTextFile(sourceModel: IResolvedTextEditorModel | ITextModel, source: URI, target: URI, options?: ITextFileSaveOptions): Promise { + private async doSaveAsTextFile(sourceModel: IResolvedTextEditorModel | IResolvedUntitledTextEditorModel | ITextModel, source: URI, target: URI, options?: ITextFileSaveOptions): Promise { // Find source encoding if any let sourceModelEncoding: string | undefined = undefined; @@ -499,7 +511,7 @@ export abstract class AbstractTextFileService extends Disposable implements ITex } // Prefer an existing model if it is already resolved for the given target resource - let targetExists: boolean = false; + let targetExists = false; let targetModel = this.files.get(target); if (targetModel?.isResolved()) { targetExists = true; From e8c897b22e97bc6bdb02949029f5d267ec23bce2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Feb 2026 22:54:50 +0800 Subject: [PATCH 2/4] chore(deps): bump lodash from 4.17.21 to 4.17.23 (#657) Bumps [lodash](https://github.com/lodash/lodash) from 4.17.21 to 4.17.23. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.21...4.17.23) --- updated-dependencies: - dependency-name: lodash dependency-version: 4.17.23 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1e49205e4..16a8ebc36 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5289,9 +5289,9 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", "dev": true, "license": "MIT" }, From 8e0739f4db8e220a81d52adddd1ebbf05a46e688 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Feb 2026 22:55:02 +0800 Subject: [PATCH 3/4] chore(deps): bump lodash from 4.17.21 to 4.17.23 in /tests (#655) Bumps [lodash](https://github.com/lodash/lodash) from 4.17.21 to 4.17.23. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.21...4.17.23) --- updated-dependencies: - dependency-name: lodash dependency-version: 4.17.23 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tests/package-lock.json | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/tests/package-lock.json b/tests/package-lock.json index 0bb668612..e7c9c9d52 100644 --- a/tests/package-lock.json +++ b/tests/package-lock.json @@ -65,7 +65,6 @@ "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.0", @@ -1427,7 +1426,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", @@ -3030,7 +3028,6 @@ "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -3073,7 +3070,6 @@ "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -3232,7 +3228,6 @@ "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -3501,7 +3496,6 @@ "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", @@ -3828,9 +3822,9 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", "dev": true, "license": "MIT" }, @@ -5305,7 +5299,6 @@ "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" From dd1452af5e4046091496dae444ee83250b92cb61 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Feb 2026 22:55:17 +0800 Subject: [PATCH 4/4] chore(deps): bump qs and express (#654) Bumps [qs](https://github.com/ljharb/qs) and [express](https://github.com/expressjs/express). These dependencies needed to be updated together. Updates `qs` from 6.13.0 to 6.14.1 - [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md) - [Commits](https://github.com/ljharb/qs/compare/v6.13.0...v6.14.1) Updates `express` from 4.21.2 to 4.22.1 - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/v4.22.1/History.md) - [Commits](https://github.com/expressjs/express/compare/4.21.2...v4.22.1) --- updated-dependencies: - dependency-name: qs dependency-version: 6.14.1 dependency-type: indirect - dependency-name: express dependency-version: 4.22.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 48 +++++++++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index 16a8ebc36..78eb51857 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3238,40 +3238,40 @@ } }, "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", "dev": true, "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", + "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.13.0", + "qs": "~6.14.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", + "send": "~0.19.0", + "serve-static": "~1.16.2", "setprototypeof": "1.2.0", - "statuses": "2.0.1", + "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -3301,6 +3301,22 @@ "dev": true, "license": "MIT" }, + "node_modules/express/node_modules/qs": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",