From 2d6ad4be88feaf1f768427a9d655247035bb021d Mon Sep 17 00:00:00 2001 From: Johannes Date: Thu, 17 Nov 2022 12:09:14 +0100 Subject: [PATCH 01/11] * add global for node_modules access * remove most usages of require.__$__nodeRequire * stop using require.nodeRequire --- src/bootstrap-fork.js | 11 ++++++++ src/bootstrap-window.js | 10 +++++++ src/main.js | 11 ++++++++ src/typings/vscode-globals.d.ts | 28 +++++++++++++++++++ src/vs/base/common/performance.js | 2 +- src/vs/base/parts/ipc/node/ipc.net.ts | 8 +++--- .../test/node/nativeModules.test.ts | 4 +-- .../node/remoteExtensionHostAgentServer.ts | 2 +- .../api/node/extHostExtensionService.ts | 2 +- .../api/node/extensionHostProcess.ts | 4 +-- src/vs/workbench/api/node/proxyResolver.ts | 2 +- test/unit/electron/renderer.js | 10 +++++++ 12 files changed, 82 insertions(+), 12 deletions(-) create mode 100644 src/typings/vscode-globals.d.ts diff --git a/src/bootstrap-fork.js b/src/bootstrap-fork.js index b9d66d444a818..9d760ddf101d9 100644 --- a/src/bootstrap-fork.js +++ b/src/bootstrap-fork.js @@ -37,6 +37,17 @@ if (process.env['VSCODE_PARENT_PID']) { terminateWhenParentTerminates(); } +// VSCODE_GLOBALS: node_modules +globalThis._VSCODE_NODE_MODULES = new Proxy(Object.create(null), { + get(target, mod) { + if (!target[mod] && typeof mod === 'string') { + target[mod] = require(mod); + } + return target[mod]; + } +}); + + // Load AMD entry point require('./bootstrap-amd').load(process.env['VSCODE_AMD_ENTRYPOINT']); diff --git a/src/bootstrap-window.js b/src/bootstrap-window.js index 8bdd75c63c088..f8b895c2d7763 100644 --- a/src/bootstrap-window.js +++ b/src/bootstrap-window.js @@ -112,6 +112,16 @@ window['MonacoEnvironment'] = {}; + // VSCODE_GLOBALS: node_modules + globalThis._VSCODE_NODE_MODULES = new Proxy(Object.create(null), { + get(target, mod) { + if (!target[mod] && typeof mod === 'string') { + target[mod] = (require.__$__nodeRequire ?? require)(mod); + } + return target[mod]; + } + }); + const loaderConfig = { baseUrl: `${bootstrapLib.fileUriFromPath(configuration.appRoot, { isWindows: safeProcess.platform === 'win32', scheme: 'vscode-file', fallbackAuthority: 'vscode-app' })}/out`, 'vs/nls': nlsConfig, diff --git a/src/main.js b/src/main.js index 63f8c5679f98c..4c43e0923b7bd 100644 --- a/src/main.js +++ b/src/main.js @@ -141,6 +141,16 @@ function startup(codeCachePath, nlsConfig) { process.env['VSCODE_NLS_CONFIG'] = JSON.stringify(nlsConfig); process.env['VSCODE_CODE_CACHE_PATH'] = codeCachePath || ''; + // VSCODE_GLOBALS: node_modules + globalThis._VSCODE_NODE_MODULES = new Proxy(Object.create(null), { + get(target, mod) { + if (!target[mod] && typeof mod === 'string') { + target[mod] = require(mod); + } + return target[mod]; + } + }); + // Load main in AMD perf.mark('code/willLoadMainBundle'); require('./bootstrap-amd').load('vs/code/electron-main/main', () => { @@ -318,6 +328,7 @@ function getArgvConfigPath() { dataFolderName = `${dataFolderName}-dev`; } + // @ts-ignore return path.join(os.homedir(), dataFolderName, 'argv.json'); } diff --git a/src/typings/vscode-globals.d.ts b/src/typings/vscode-globals.d.ts new file mode 100644 index 0000000000000..f8d32c405bfcd --- /dev/null +++ b/src/typings/vscode-globals.d.ts @@ -0,0 +1,28 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +declare global { + + /** + * @deprecated node modules that are in used in a context that + * shouldn't have access to node_modules (node-free renderer or + * shared process) + */ + var _VSCODE_NODE_MODULES: { + crypto: typeof import('crypto'); + zlib: typeof import('zlib'); + net: typeof import('net'); + os: typeof import('os'); + module: typeof import('module'); + ['native-watchdog']: typeof import('native-watchdog') + perf_hooks: typeof import('perf_hooks'); + + ['vsda']: any + ['vscode-encrypt']: any + } +} + +// fake export to make global work +export { } diff --git a/src/vs/base/common/performance.js b/src/vs/base/common/performance.js index 15eab308bf225..92e261d898ab9 100644 --- a/src/vs/base/common/performance.js +++ b/src/vs/base/common/performance.js @@ -78,7 +78,7 @@ } else if (typeof process === 'object') { // node.js: use the normal polyfill but add the timeOrigin // from the node perf_hooks API as very first mark - const timeOrigin = Math.round((require.nodeRequire || require)('perf_hooks').performance.timeOrigin); + const timeOrigin = Math.round((require.__$__nodeRequire || require)('perf_hooks').performance.timeOrigin); return _definePolyfillMarks(timeOrigin); } else { diff --git a/src/vs/base/parts/ipc/node/ipc.net.ts b/src/vs/base/parts/ipc/node/ipc.net.ts index 810ba41d10639..455caa3efeb3c 100644 --- a/src/vs/base/parts/ipc/node/ipc.net.ts +++ b/src/vs/base/parts/ipc/node/ipc.net.ts @@ -20,10 +20,10 @@ import { ChunkStream, Client, ISocket, Protocol, SocketCloseEvent, SocketCloseEv // TODO@bpasero remove me once electron utility process has landed function getNodeDependencies() { return { - crypto: (require.__$__nodeRequire('crypto') as any) as typeof import('crypto'), - zlib: (require.__$__nodeRequire('zlib') as any) as typeof import('zlib'), - net: (require.__$__nodeRequire('net') as any) as typeof import('net'), - os: (require.__$__nodeRequire('os') as any) as typeof import('os') + crypto: globalThis._VSCODE_NODE_MODULES.crypto, + zlib: globalThis._VSCODE_NODE_MODULES.zlib, + net: globalThis._VSCODE_NODE_MODULES.net, + os: globalThis._VSCODE_NODE_MODULES.os, }; } diff --git a/src/vs/platform/environment/test/node/nativeModules.test.ts b/src/vs/platform/environment/test/node/nativeModules.test.ts index 6b7dfad6741d6..c538d8c322084 100644 --- a/src/vs/platform/environment/test/node/nativeModules.test.ts +++ b/src/vs/platform/environment/test/node/nativeModules.test.ts @@ -58,7 +58,7 @@ flakySuite('Native Modules (all platforms)', () => { test('vscode-encrypt', async () => { try { - const vscodeEncrypt: Encryption = require.__$__nodeRequire('vscode-encrypt'); + const vscodeEncrypt: Encryption = globalThis._VSCODE_NODE_MODULES['vscode-encrypt']; const encrypted = await vscodeEncrypt.encrypt('salt', 'value'); const decrypted = await vscodeEncrypt.decrypt('salt', encrypted); @@ -73,7 +73,7 @@ flakySuite('Native Modules (all platforms)', () => { test('vsda', async () => { try { - const vsda: any = require.__$__nodeRequire('vsda'); + const vsda: any = globalThis._VSCODE_NODE_MODULES['vsda']; const signer = new vsda.signer(); const signed = await signer.sign('value'); assert.ok(typeof signed === 'string', testErrorMessage('vsda')); diff --git a/src/vs/server/node/remoteExtensionHostAgentServer.ts b/src/vs/server/node/remoteExtensionHostAgentServer.ts index efc591aab1847..ce679e092012f 100644 --- a/src/vs/server/node/remoteExtensionHostAgentServer.ts +++ b/src/vs/server/node/remoteExtensionHostAgentServer.ts @@ -727,7 +727,7 @@ export async function createServer(address: string | net.AddressInfo | null, arg const hasVSDA = fs.existsSync(join(FileAccess.asFileUri('').fsPath, '../node_modules/vsda')); if (hasVSDA) { try { - return require.__$__nodeRequire('vsda'); + return globalThis._VSCODE_NODE_MODULES['vsda']; } catch (err) { logService.error(err); } diff --git a/src/vs/workbench/api/node/extHostExtensionService.ts b/src/vs/workbench/api/node/extHostExtensionService.ts index 32e4f223aadef..06f91272771e8 100644 --- a/src/vs/workbench/api/node/extHostExtensionService.ts +++ b/src/vs/workbench/api/node/extHostExtensionService.ts @@ -22,7 +22,7 @@ class NodeModuleRequireInterceptor extends RequireInterceptor { protected _installInterceptor(): void { const that = this; - const node_module = require.__$__nodeRequire('module'); + const node_module = globalThis._VSCODE_NODE_MODULES.module; const originalLoad = node_module._load; node_module._load = function load(request: string, parent: { filename: string }, isMain: boolean) { request = applyAlternatives(request); diff --git a/src/vs/workbench/api/node/extensionHostProcess.ts b/src/vs/workbench/api/node/extensionHostProcess.ts index 5b0030167cd9e..072897555558e 100644 --- a/src/vs/workbench/api/node/extensionHostProcess.ts +++ b/src/vs/workbench/api/node/extensionHostProcess.ts @@ -81,7 +81,7 @@ const args = minimist(process.argv.slice(2), { // happening we essentially blocklist this module from getting loaded in any // extension by patching the node require() function. (function () { - const Module = require.__$__nodeRequire('module') as any; + const Module = globalThis._VSCODE_NODE_MODULES.module as any; const originalLoad = Module._load; Module._load = function (request: string) { @@ -325,7 +325,7 @@ function connectToRenderer(protocol: IMessagePassingProtocol): Promise): Promise { return extensionService.getExtensionPathIndex() .then(extensionPaths => { - const node_module = require.__$__nodeRequire('module'); + const node_module = globalThis._VSCODE_NODE_MODULES.module; const original = node_module._load; node_module._load = function load(request: string, parent: { filename: string }, isMain: boolean) { if (request === 'tls') { diff --git a/test/unit/electron/renderer.js b/test/unit/electron/renderer.js index 47f8fb0a53ee0..3a7cc2fb66ecb 100644 --- a/test/unit/electron/renderer.js +++ b/test/unit/electron/renderer.js @@ -72,6 +72,16 @@ if (util.inspect && util.inspect['defaultOptions']) { util.inspect['defaultOptions'].customInspect = false; } +// VSCODE_GLOBALS: node_modules +globalThis._VSCODE_NODE_MODULES = new Proxy(Object.create(null), { + get(target, mod) { + if (!target[mod] && typeof mod === 'string') { + target[mod] = (require.__$__nodeRequire ?? require)(mod); + } + return target[mod]; + } +}); + const _tests_glob = '**/test/**/*.test.js'; let loader; let _out; From 8dd8d214d8c4e9799cd554a09e5a44b059b7a1d4 Mon Sep 17 00:00:00 2001 From: Johannes Date: Thu, 17 Nov 2022 15:41:23 +0100 Subject: [PATCH 02/11] don't use `__$__nodeRequire` to fetch product configuration --- src/bootstrap-fork.js | 4 +++- src/bootstrap-window.js | 4 ++++ src/main.js | 4 ++++ src/typings/vscode-globals.d.ts | 9 +++++++++ src/vs/platform/product/common/product.ts | 16 +++++----------- test/unit/electron/renderer.js | 3 +++ 6 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/bootstrap-fork.js b/src/bootstrap-fork.js index 9d760ddf101d9..6d11c4a57e89b 100644 --- a/src/bootstrap-fork.js +++ b/src/bootstrap-fork.js @@ -47,11 +47,13 @@ globalThis._VSCODE_NODE_MODULES = new Proxy(Object.create(null), { } }); +// VSCODE_GLOBALS: package/product.json +globalThis._VSCODE_PRODUCT_JSON = require('../product.json'); +globalThis._VSCODE_PACKAGE_JSON = require('../package.json'); // Load AMD entry point require('./bootstrap-amd').load(process.env['VSCODE_AMD_ENTRYPOINT']); - //#region Helpers function pipeLoggingToParent() { diff --git a/src/bootstrap-window.js b/src/bootstrap-window.js index f8b895c2d7763..40a2ff21a494b 100644 --- a/src/bootstrap-window.js +++ b/src/bootstrap-window.js @@ -122,6 +122,10 @@ } }); + // VSCODE_GLOBALS: package/product.json + globalThis._VSCODE_PRODUCT_JSON = (require.__$__nodeRequire ?? require)(configuration.appRoot + '/product.json'); + globalThis._VSCODE_PACKAGE_JSON = (require.__$__nodeRequire ?? require)(configuration.appRoot + '/package.json'); + const loaderConfig = { baseUrl: `${bootstrapLib.fileUriFromPath(configuration.appRoot, { isWindows: safeProcess.platform === 'win32', scheme: 'vscode-file', fallbackAuthority: 'vscode-app' })}/out`, 'vs/nls': nlsConfig, diff --git a/src/main.js b/src/main.js index 4c43e0923b7bd..c40595aa75db3 100644 --- a/src/main.js +++ b/src/main.js @@ -151,6 +151,10 @@ function startup(codeCachePath, nlsConfig) { } }); + // VSCODE_GLOBALS: package/product.json + globalThis._VSCODE_PRODUCT_JSON = require('../product.json'); + globalThis._VSCODE_PACKAGE_JSON = require('../package.json'); + // Load main in AMD perf.mark('code/willLoadMainBundle'); require('./bootstrap-amd').load('vs/code/electron-main/main', () => { diff --git a/src/typings/vscode-globals.d.ts b/src/typings/vscode-globals.d.ts index f8d32c405bfcd..35e81033fc11f 100644 --- a/src/typings/vscode-globals.d.ts +++ b/src/typings/vscode-globals.d.ts @@ -5,6 +5,15 @@ declare global { + /** + * @deprecated You MUST use `IProductService` whenever possible. + */ + var _VSCODE_PRODUCT_JSON: Record; + /** + * @deprecated You MUST use `IProductService` whenever possible. + */ + var _VSCODE_PACKAGE_JSON: Record; + /** * @deprecated node modules that are in used in a context that * shouldn't have access to node_modules (node-free renderer or diff --git a/src/vs/platform/product/common/product.ts b/src/vs/platform/product/common/product.ts index 3f50bef5ca23c..ef798fa469904 100644 --- a/src/vs/platform/product/common/product.ts +++ b/src/vs/platform/product/common/product.ts @@ -3,11 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { FileAccess } from 'vs/base/common/network'; import { globals } from 'vs/base/common/platform'; import { env } from 'vs/base/common/process'; import { IProductConfiguration } from 'vs/base/common/product'; -import { dirname, joinPath } from 'vs/base/common/resources'; import { ISandboxConfiguration } from 'vs/base/parts/sandbox/common/sandboxTypes'; /** @@ -24,14 +22,10 @@ if (typeof globals.vscode !== 'undefined' && typeof globals.vscode.context !== ' throw new Error('Sandbox: unable to resolve product configuration from preload script.'); } } - -// Native node.js environment -else if (typeof require?.__$__nodeRequire === 'function') { - - // Obtain values from product.json and package.json - const rootPath = dirname(FileAccess.asFileUri('')); - - product = require.__$__nodeRequire(joinPath(rootPath, 'product.json').fsPath); +// _VSCODE environment +else if (globalThis._VSCODE_PRODUCT_JSON && globalThis._VSCODE_PACKAGE_JSON) { + // Obtain values from product.json and package.json-data + product = globalThis._VSCODE_PRODUCT_JSON as IProductConfiguration; // Running out of sources if (env['VSCODE_DEV']) { @@ -47,7 +41,7 @@ else if (typeof require?.__$__nodeRequire === 'function') { // want to have it running out of sources so we // read it from package.json only when we need it. if (!product.version) { - const pkg = require.__$__nodeRequire(joinPath(rootPath, 'package.json').fsPath) as { version: string }; + const pkg = globalThis._VSCODE_PACKAGE_JSON as { version: string }; Object.assign(product, { version: pkg.version diff --git a/test/unit/electron/renderer.js b/test/unit/electron/renderer.js index 3a7cc2fb66ecb..77a10b3421da5 100644 --- a/test/unit/electron/renderer.js +++ b/test/unit/electron/renderer.js @@ -81,6 +81,9 @@ globalThis._VSCODE_NODE_MODULES = new Proxy(Object.create(null), { return target[mod]; } }); +// VSCODE_GLOBALS: package/product.json +globalThis._VSCODE_PRODUCT_JSON = (require.__$__nodeRequire ?? require)('../../../product.json'); +globalThis._VSCODE_PACKAGE_JSON = (require.__$__nodeRequire ?? require)('../../../package.json'); const _tests_glob = '**/test/**/*.test.js'; let loader; From bcffe19e5ea27f11debc53807c66a790fd6ba2ce Mon Sep 17 00:00:00 2001 From: Johannes Date: Thu, 17 Nov 2022 15:47:18 +0100 Subject: [PATCH 03/11] deprecate and scrary message for `__$__nodeRequire` --- src/typings/require.d.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/typings/require.d.ts b/src/typings/require.d.ts index 671692c88daec..3fda6d6981d25 100644 --- a/src/typings/require.d.ts +++ b/src/typings/require.d.ts @@ -45,10 +45,17 @@ interface NodeRequire { * @deprecated use `FileAccess.asFileUri()` for node.js contexts or `FileAccess.asBrowserUri` for browser contexts. */ toUrl(path: string): string; + + /** + * @deprecated MUST not be used anymore + * + * With the move from AMD to ESM we cannot use this anymore. There will be NO MORE node require like this. + */ + __$__nodeRequire(moduleName: string): T; + (dependencies: string[], callback: (...args: any[]) => any, errorback?: (err: any) => void): any; config(data: any): any; onError: Function; - __$__nodeRequire(moduleName: string): T; getStats?(): ReadonlyArray; hasDependencyCycle?(): boolean; define(amdModuleId: string, dependencies: string[], callback: (...args: any[]) => any): any; From 380ac1ef4807930cff8b4505c298ccff3e253c94 Mon Sep 17 00:00:00 2001 From: Johannes Date: Thu, 17 Nov 2022 16:10:52 +0100 Subject: [PATCH 04/11] have two files to declare globals, allow monaco-edt to see one of them --- src/tsconfig.monaco.json | 1 + ...obals.d.ts => vscode-globals-modules.d.ts} | 11 ++-------- src/typings/vscode-globals-product.d.ts | 22 +++++++++++++++++++ 3 files changed, 25 insertions(+), 9 deletions(-) rename src/typings/{vscode-globals.d.ts => vscode-globals-modules.d.ts} (78%) create mode 100644 src/typings/vscode-globals-product.d.ts diff --git a/src/tsconfig.monaco.json b/src/tsconfig.monaco.json index 057aa8748ae87..256f406fb6c2a 100644 --- a/src/tsconfig.monaco.json +++ b/src/tsconfig.monaco.json @@ -18,6 +18,7 @@ "include": [ "typings/require.d.ts", "typings/thenable.d.ts", + "typings/vscode-globals-product.d.ts", "vs/loader.d.ts", "vs/monaco.d.ts", "vs/editor/*", diff --git a/src/typings/vscode-globals.d.ts b/src/typings/vscode-globals-modules.d.ts similarity index 78% rename from src/typings/vscode-globals.d.ts rename to src/typings/vscode-globals-modules.d.ts index 35e81033fc11f..443c2b687db98 100644 --- a/src/typings/vscode-globals.d.ts +++ b/src/typings/vscode-globals-modules.d.ts @@ -3,16 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -declare global { +// AMD2ESM mirgation relevant - /** - * @deprecated You MUST use `IProductService` whenever possible. - */ - var _VSCODE_PRODUCT_JSON: Record; - /** - * @deprecated You MUST use `IProductService` whenever possible. - */ - var _VSCODE_PACKAGE_JSON: Record; +declare global { /** * @deprecated node modules that are in used in a context that diff --git a/src/typings/vscode-globals-product.d.ts b/src/typings/vscode-globals-product.d.ts new file mode 100644 index 0000000000000..780a6477de86b --- /dev/null +++ b/src/typings/vscode-globals-product.d.ts @@ -0,0 +1,22 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +// AMD2ESM mirgation relevant + +declare global { + + /** + * @deprecated You MUST use `IProductService` whenever possible. + */ + var _VSCODE_PRODUCT_JSON: Record; + /** + * @deprecated You MUST use `IProductService` whenever possible. + */ + var _VSCODE_PACKAGE_JSON: Record; + +} + +// fake export to make global work +export { } From 824c70b2750f2e993e6e14528967de6287b7397b Mon Sep 17 00:00:00 2001 From: Johannes Date: Thu, 17 Nov 2022 17:19:29 +0100 Subject: [PATCH 05/11] fix node tests --- test/unit/node/index.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test/unit/node/index.js b/test/unit/node/index.js index 1fb4fd570202d..cea515286a0f2 100644 --- a/test/unit/node/index.js +++ b/test/unit/node/index.js @@ -56,6 +56,22 @@ if (majorRequiredNodeVersion !== currentMajorNodeVersion) { } function main() { + + // VSCODE_GLOBALS: node_modules + globalThis._VSCODE_NODE_MODULES = new Proxy(Object.create(null), { + get(target, mod) { + if (!target[mod] && typeof mod === 'string') { + target[mod] = require(mod); + } + return target[mod]; + } + }); + + // VSCODE_GLOBALS: package/product.json + globalThis._VSCODE_PRODUCT_JSON = require(`${REPO_ROOT}/product.json`); + globalThis._VSCODE_PACKAGE_JSON = require(`${REPO_ROOT}/package.json`); + + process.on('uncaughtException', function (e) { console.error(e.stack || e); }); From e14d874adbb59c31cf7d155ac65e090e49e4bc1c Mon Sep 17 00:00:00 2001 From: Johannes Date: Thu, 17 Nov 2022 17:49:43 +0100 Subject: [PATCH 06/11] define globals for server-main too --- src/server-main.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/server-main.js b/src/server-main.js index 3dbbeaedf54a6..04a3161c825f6 100644 --- a/src/server-main.js +++ b/src/server-main.js @@ -259,6 +259,19 @@ function loadCode() { return new Promise((resolve, reject) => { const path = require('path'); + // VSCODE_GLOBALS: node_modules + globalThis._VSCODE_NODE_MODULES = new Proxy(Object.create(null), { + get(target, mod) { + if (!target[mod] && typeof mod === 'string') { + target[mod] = require(mod); + } + return target[mod]; + } + }); + // VSCODE_GLOBALS: package/product.json + globalThis._VSCODE_PRODUCT_JSON = require('../product.json'); + globalThis._VSCODE_PACKAGE_JSON = require('../package.json'); + delete process.env['ELECTRON_RUN_AS_NODE']; // Keep bootstrap-amd.js from redefining 'fs'. // See https://github.com/microsoft/vscode-remote-release/issues/6543 From d555777b1a4ce1449bb5e183dac52f851e1c31f5 Mon Sep 17 00:00:00 2001 From: Johannes Date: Thu, 17 Nov 2022 17:58:51 +0100 Subject: [PATCH 07/11] simplify `_VSCODE_NODE_MODULES` util --- src/bootstrap-fork.js | 9 +-------- src/bootstrap-window.js | 9 +-------- src/main.js | 9 +-------- src/server-main.js | 10 ++-------- test/unit/electron/renderer.js | 10 ++-------- test/unit/node/index.js | 9 +-------- 6 files changed, 8 insertions(+), 48 deletions(-) diff --git a/src/bootstrap-fork.js b/src/bootstrap-fork.js index 6d11c4a57e89b..00bf5ed74516d 100644 --- a/src/bootstrap-fork.js +++ b/src/bootstrap-fork.js @@ -38,14 +38,7 @@ if (process.env['VSCODE_PARENT_PID']) { } // VSCODE_GLOBALS: node_modules -globalThis._VSCODE_NODE_MODULES = new Proxy(Object.create(null), { - get(target, mod) { - if (!target[mod] && typeof mod === 'string') { - target[mod] = require(mod); - } - return target[mod]; - } -}); +globalThis._VSCODE_NODE_MODULES = new Proxy(Object.create(null), { get: (_target, mod) => require(String(mod)) }); // VSCODE_GLOBALS: package/product.json globalThis._VSCODE_PRODUCT_JSON = require('../product.json'); diff --git a/src/bootstrap-window.js b/src/bootstrap-window.js index 40a2ff21a494b..e4218117b7d06 100644 --- a/src/bootstrap-window.js +++ b/src/bootstrap-window.js @@ -113,14 +113,7 @@ window['MonacoEnvironment'] = {}; // VSCODE_GLOBALS: node_modules - globalThis._VSCODE_NODE_MODULES = new Proxy(Object.create(null), { - get(target, mod) { - if (!target[mod] && typeof mod === 'string') { - target[mod] = (require.__$__nodeRequire ?? require)(mod); - } - return target[mod]; - } - }); + globalThis._VSCODE_NODE_MODULES = new Proxy(Object.create(null), { get: (_target, mod) => (require.__$__nodeRequire ?? require)(String(mod)) }); // VSCODE_GLOBALS: package/product.json globalThis._VSCODE_PRODUCT_JSON = (require.__$__nodeRequire ?? require)(configuration.appRoot + '/product.json'); diff --git a/src/main.js b/src/main.js index c40595aa75db3..eebc049c6f5bf 100644 --- a/src/main.js +++ b/src/main.js @@ -142,14 +142,7 @@ function startup(codeCachePath, nlsConfig) { process.env['VSCODE_CODE_CACHE_PATH'] = codeCachePath || ''; // VSCODE_GLOBALS: node_modules - globalThis._VSCODE_NODE_MODULES = new Proxy(Object.create(null), { - get(target, mod) { - if (!target[mod] && typeof mod === 'string') { - target[mod] = require(mod); - } - return target[mod]; - } - }); + globalThis._VSCODE_NODE_MODULES = new Proxy(Object.create(null), { get: (_target, mod) => require(String(mod)) }); // VSCODE_GLOBALS: package/product.json globalThis._VSCODE_PRODUCT_JSON = require('../product.json'); diff --git a/src/server-main.js b/src/server-main.js index 04a3161c825f6..156387b1cc31a 100644 --- a/src/server-main.js +++ b/src/server-main.js @@ -260,14 +260,8 @@ function loadCode() { const path = require('path'); // VSCODE_GLOBALS: node_modules - globalThis._VSCODE_NODE_MODULES = new Proxy(Object.create(null), { - get(target, mod) { - if (!target[mod] && typeof mod === 'string') { - target[mod] = require(mod); - } - return target[mod]; - } - }); + globalThis._VSCODE_NODE_MODULES = new Proxy(Object.create(null), { get: (_target, mod) => require(String(mod)) }); + // VSCODE_GLOBALS: package/product.json globalThis._VSCODE_PRODUCT_JSON = require('../product.json'); globalThis._VSCODE_PACKAGE_JSON = require('../package.json'); diff --git a/test/unit/electron/renderer.js b/test/unit/electron/renderer.js index 77a10b3421da5..a91725887a52a 100644 --- a/test/unit/electron/renderer.js +++ b/test/unit/electron/renderer.js @@ -73,14 +73,8 @@ if (util.inspect && util.inspect['defaultOptions']) { } // VSCODE_GLOBALS: node_modules -globalThis._VSCODE_NODE_MODULES = new Proxy(Object.create(null), { - get(target, mod) { - if (!target[mod] && typeof mod === 'string') { - target[mod] = (require.__$__nodeRequire ?? require)(mod); - } - return target[mod]; - } -}); +globalThis._VSCODE_NODE_MODULES = new Proxy(Object.create(null), { get: (_target, mod) => (require.__$__nodeRequire ?? require)(String(mod)) }); + // VSCODE_GLOBALS: package/product.json globalThis._VSCODE_PRODUCT_JSON = (require.__$__nodeRequire ?? require)('../../../product.json'); globalThis._VSCODE_PACKAGE_JSON = (require.__$__nodeRequire ?? require)('../../../package.json'); diff --git a/test/unit/node/index.js b/test/unit/node/index.js index cea515286a0f2..c6474162dfc62 100644 --- a/test/unit/node/index.js +++ b/test/unit/node/index.js @@ -58,14 +58,7 @@ if (majorRequiredNodeVersion !== currentMajorNodeVersion) { function main() { // VSCODE_GLOBALS: node_modules - globalThis._VSCODE_NODE_MODULES = new Proxy(Object.create(null), { - get(target, mod) { - if (!target[mod] && typeof mod === 'string') { - target[mod] = require(mod); - } - return target[mod]; - } - }); + globalThis._VSCODE_NODE_MODULES = new Proxy(Object.create(null), { get: (_target, mod) => require(String(mod)) }); // VSCODE_GLOBALS: package/product.json globalThis._VSCODE_PRODUCT_JSON = require(`${REPO_ROOT}/product.json`); From cd0a2721ed7bd56c4a6037e8a76131c85d1ee63d Mon Sep 17 00:00:00 2001 From: Johannes Date: Fri, 18 Nov 2022 12:03:57 +0100 Subject: [PATCH 08/11] move globals-init into bootstrap-amd (which is used by different parties) --- src/bootstrap-amd.js | 7 +++++++ src/bootstrap-fork.js | 7 ------- src/main.js | 7 ------- src/server-main.js | 7 ------- 4 files changed, 7 insertions(+), 21 deletions(-) diff --git a/src/bootstrap-amd.js b/src/bootstrap-amd.js index 88747c29aaf89..71c67f2dbee81 100644 --- a/src/bootstrap-amd.js +++ b/src/bootstrap-amd.js @@ -11,6 +11,13 @@ // when this file is bundled with other files. const nodeRequire = require; +// VSCODE_GLOBALS: node_modules +globalThis._VSCODE_NODE_MODULES = new Proxy(Object.create(null), { get: (_target, mod) => nodeRequire(String(mod)) }); + +// VSCODE_GLOBALS: package/product.json +globalThis._VSCODE_PRODUCT_JSON = require('../product.json'); +globalThis._VSCODE_PACKAGE_JSON = require('../package.json'); + const loader = require('./vs/loader'); const bootstrap = require('./bootstrap'); const performance = require('./vs/base/common/performance'); diff --git a/src/bootstrap-fork.js b/src/bootstrap-fork.js index 00bf5ed74516d..4acaa44b4c149 100644 --- a/src/bootstrap-fork.js +++ b/src/bootstrap-fork.js @@ -37,13 +37,6 @@ if (process.env['VSCODE_PARENT_PID']) { terminateWhenParentTerminates(); } -// VSCODE_GLOBALS: node_modules -globalThis._VSCODE_NODE_MODULES = new Proxy(Object.create(null), { get: (_target, mod) => require(String(mod)) }); - -// VSCODE_GLOBALS: package/product.json -globalThis._VSCODE_PRODUCT_JSON = require('../product.json'); -globalThis._VSCODE_PACKAGE_JSON = require('../package.json'); - // Load AMD entry point require('./bootstrap-amd').load(process.env['VSCODE_AMD_ENTRYPOINT']); diff --git a/src/main.js b/src/main.js index eebc049c6f5bf..53299affc8391 100644 --- a/src/main.js +++ b/src/main.js @@ -141,13 +141,6 @@ function startup(codeCachePath, nlsConfig) { process.env['VSCODE_NLS_CONFIG'] = JSON.stringify(nlsConfig); process.env['VSCODE_CODE_CACHE_PATH'] = codeCachePath || ''; - // VSCODE_GLOBALS: node_modules - globalThis._VSCODE_NODE_MODULES = new Proxy(Object.create(null), { get: (_target, mod) => require(String(mod)) }); - - // VSCODE_GLOBALS: package/product.json - globalThis._VSCODE_PRODUCT_JSON = require('../product.json'); - globalThis._VSCODE_PACKAGE_JSON = require('../package.json'); - // Load main in AMD perf.mark('code/willLoadMainBundle'); require('./bootstrap-amd').load('vs/code/electron-main/main', () => { diff --git a/src/server-main.js b/src/server-main.js index 156387b1cc31a..3dbbeaedf54a6 100644 --- a/src/server-main.js +++ b/src/server-main.js @@ -259,13 +259,6 @@ function loadCode() { return new Promise((resolve, reject) => { const path = require('path'); - // VSCODE_GLOBALS: node_modules - globalThis._VSCODE_NODE_MODULES = new Proxy(Object.create(null), { get: (_target, mod) => require(String(mod)) }); - - // VSCODE_GLOBALS: package/product.json - globalThis._VSCODE_PRODUCT_JSON = require('../product.json'); - globalThis._VSCODE_PACKAGE_JSON = require('../package.json'); - delete process.env['ELECTRON_RUN_AS_NODE']; // Keep bootstrap-amd.js from redefining 'fs'. // See https://github.com/microsoft/vscode-remote-release/issues/6543 From 34ce6e2f7d7d9aff3ae2f63136a8b92ad04c22e3 Mon Sep 17 00:00:00 2001 From: Johannes Date: Fri, 18 Nov 2022 13:07:29 +0100 Subject: [PATCH 09/11] minimize diff --- src/bootstrap-fork.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/bootstrap-fork.js b/src/bootstrap-fork.js index 4acaa44b4c149..b9d66d444a818 100644 --- a/src/bootstrap-fork.js +++ b/src/bootstrap-fork.js @@ -40,6 +40,7 @@ if (process.env['VSCODE_PARENT_PID']) { // Load AMD entry point require('./bootstrap-amd').load(process.env['VSCODE_AMD_ENTRYPOINT']); + //#region Helpers function pipeLoggingToParent() { From 829551846d4f05022ce6375306c69b8dea4202a1 Mon Sep 17 00:00:00 2001 From: Johannes Date: Fri, 18 Nov 2022 13:30:27 +0100 Subject: [PATCH 10/11] don't require-read product/package.json when running in sandbox mode --- src/bootstrap-window.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/bootstrap-window.js b/src/bootstrap-window.js index e4218117b7d06..d61e432e3b340 100644 --- a/src/bootstrap-window.js +++ b/src/bootstrap-window.js @@ -115,9 +115,11 @@ // VSCODE_GLOBALS: node_modules globalThis._VSCODE_NODE_MODULES = new Proxy(Object.create(null), { get: (_target, mod) => (require.__$__nodeRequire ?? require)(String(mod)) }); - // VSCODE_GLOBALS: package/product.json - globalThis._VSCODE_PRODUCT_JSON = (require.__$__nodeRequire ?? require)(configuration.appRoot + '/product.json'); - globalThis._VSCODE_PACKAGE_JSON = (require.__$__nodeRequire ?? require)(configuration.appRoot + '/package.json'); + if (!safeProcess.sandboxed) { + // VSCODE_GLOBALS: package/product.json + globalThis._VSCODE_PRODUCT_JSON = (require.__$__nodeRequire ?? require)(configuration.appRoot + '/product.json'); + globalThis._VSCODE_PACKAGE_JSON = (require.__$__nodeRequire ?? require)(configuration.appRoot + '/package.json'); + } const loaderConfig = { baseUrl: `${bootstrapLib.fileUriFromPath(configuration.appRoot, { isWindows: safeProcess.platform === 'win32', scheme: 'vscode-file', fallbackAuthority: 'vscode-app' })}/out`, From 0dac468cc06271ad7c729288305b7fb5ed4caf24 Mon Sep 17 00:00:00 2001 From: Johannes Date: Mon, 21 Nov 2022 11:26:17 +0100 Subject: [PATCH 11/11] mark package.json as external module --- build/gulpfile.reh.js | 3 ++- build/gulpfile.vscode.js | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/build/gulpfile.reh.js b/build/gulpfile.reh.js index 7475e04d6e502..f3cdbff4a9e28 100644 --- a/build/gulpfile.reh.js +++ b/build/gulpfile.reh.js @@ -378,7 +378,8 @@ function tweakProductForServerWeb(product) { // 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' + '../product.json', + '../package.json' ] } } diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index d5b4db00073c0..cdc802bdd458f 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -119,7 +119,8 @@ const optimizeVSCodeTask = task.define('optimize-vscode', task.series( // 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' + '../product.json', + '../package.json', ] }, manual: [