From b9d1847f9b1c43ef22642c7a4fd914bc02f401ee Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 16 Sep 2022 14:59:58 +0200 Subject: [PATCH 1/7] perf - concatenate windows main files --- .vscode/launch.json | 4 +-- build/gulpfile.vscode.js | 22 +++++++++++++++- build/lib/util.js | 15 ++++++++++- build/lib/util.ts | 26 +++++++++++++++++++ .../sharedProcess/sharedProcess-dev.html | 18 +++++++++++++ .../sharedProcess/sharedProcess.html | 25 +++++++----------- .../issue/issueReporter-dev.html | 22 ++++++++++++++++ .../electron-sandbox/issue/issueReporter.html | 8 ++---- .../processExplorer/processExplorer-dev.html | 18 +++++++++++++ .../processExplorer/processExplorer.html | 8 ++---- .../workbench/workbench-dev.html | 18 +++++++++++++ .../electron-sandbox/workbench/workbench.html | 8 ++---- src/vs/code/node/cli.ts | 2 +- .../issue/electron-main/issueMainService.ts | 4 +-- .../electron-main/protocolMainService.ts | 2 +- .../electron-main/sharedProcess.ts | 2 +- .../windows/electron-main/windowImpl.ts | 2 +- 17 files changed, 160 insertions(+), 44 deletions(-) create mode 100644 src/vs/code/electron-browser/sharedProcess/sharedProcess-dev.html create mode 100644 src/vs/code/electron-sandbox/issue/issueReporter-dev.html create mode 100644 src/vs/code/electron-sandbox/processExplorer/processExplorer-dev.html create mode 100644 src/vs/code/electron-sandbox/workbench/workbench-dev.html diff --git a/.vscode/launch.json b/.vscode/launch.json index b685af9c9be82..ab98af7d3d2c3 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -29,7 +29,7 @@ "name": "Attach to Shared Process", "timeout": 30000, "port": 9222, - "urlFilter": "*sharedProcess.html*", + "urlFilter": "*sharedProcess*.html*", "presentation": { "hidden": true } @@ -236,7 +236,7 @@ "VSCODE_SKIP_PRELAUNCH": "1" }, "cleanUp": "wholeBrowser", - "urlFilter": "*workbench.html*", + "urlFilter": "*workbench*.html*", "runtimeArgs": [ "--inspect-brk=5875", "--no-cached-data", diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index cefb1f2ac9840..810694de5b13b 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -83,8 +83,20 @@ const vscodeResources = [ '!**/test/**' ]; +// Do not change the order of these files! They will +// 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 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. optimize.optimizeTask( { out: 'out-vscode', @@ -112,7 +124,15 @@ const optimizeVSCodeTask = task.define('optimize-vscode', task.series( ] } } - ) + ), + // Concat: bundles source files manually via simple concatenation + // for the entry points of our windows. + util.concatAll([ + { src: [...windowBootstrapFiles, 'out-build/vs/code/electron-sandbox/workbench/workbench.js'], out: 'out-vscode/vs/code/electron-sandbox/workbench/workbench.js' }, + { src: [...windowBootstrapFiles, 'out-build/vs/code/electron-sandbox/issue/issueReporter.js'], out: 'out-vscode/vs/code/electron-sandbox/issue/issueReporter.js' }, + { src: [...windowBootstrapFiles, 'out-build/vs/code/electron-sandbox/processExplorer/processExplorer.js'], out: 'out-vscode/vs/code/electron-sandbox/processExplorer/processExplorer.js' }, + { src: [...windowBootstrapFiles, 'out-build/vs/code/electron-browser/sharedProcess/sharedProcess.js'], out: 'out-vscode/vs/code/electron-browser/sharedProcess/sharedProcess.js' } + ]) )); gulp.task(optimizeVSCodeTask); diff --git a/build/lib/util.js b/build/lib/util.js index 6353637d7c40e..7b8043499fd87 100644 --- a/build/lib/util.js +++ b/build/lib/util.js @@ -4,11 +4,13 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ Object.defineProperty(exports, "__esModule", { value: true }); -exports.buildWebNodePaths = exports.createExternalLoaderConfig = exports.acquireWebNodePaths = exports.getElectronVersion = exports.streamToPromise = exports.versionStringToNumber = exports.filter = exports.rebase = exports.getVersion = exports.ensureDir = exports.rreddir = exports.rimraf = exports.rewriteSourceMappingURL = exports.stripSourceMappingURL = exports.loadSourcemaps = exports.cleanNodeModules = exports.skipDirectories = exports.toFileUri = exports.setExecutableBit = exports.fixWin32DirectoryPermissions = exports.debounce = exports.incremental = void 0; +exports.concatAll = exports.buildWebNodePaths = exports.createExternalLoaderConfig = exports.acquireWebNodePaths = exports.getElectronVersion = exports.streamToPromise = exports.versionStringToNumber = exports.filter = exports.rebase = exports.getVersion = exports.ensureDir = exports.rreddir = exports.rimraf = exports.rewriteSourceMappingURL = exports.stripSourceMappingURL = exports.loadSourcemaps = exports.cleanNodeModules = exports.skipDirectories = exports.toFileUri = exports.setExecutableBit = exports.fixWin32DirectoryPermissions = exports.debounce = exports.incremental = void 0; const es = require("event-stream"); const _debounce = require("debounce"); +const gulp = require("gulp"); const _filter = require("gulp-filter"); const rename = require("gulp-rename"); +const concat = require("gulp-concat"); const path = require("path"); const fs = require("fs"); const _rimraf = require("rimraf"); @@ -384,3 +386,14 @@ function buildWebNodePaths(outDir) { return result; } exports.buildWebNodePaths = buildWebNodePaths; +function concatAll(concatAllOptions) { + return () => { + const concatenations = concatAllOptions.map(concatAllOption => { + return gulp + .src(concatAllOption.src) + .pipe(concat(concatAllOption.out)); + }); + return es.merge(...concatenations).pipe(gulp.dest('.')); + }; +} +exports.concatAll = concatAll; diff --git a/build/lib/util.ts b/build/lib/util.ts index 9716be2290a88..a6284d573bbfe 100644 --- a/build/lib/util.ts +++ b/build/lib/util.ts @@ -5,8 +5,10 @@ import * as es from 'event-stream'; import _debounce = require('debounce'); +import * as gulp from 'gulp'; import * as _filter from 'gulp-filter'; import * as rename from 'gulp-rename'; +import * as concat from 'gulp-concat'; import * as _ from 'underscore'; import * as path from 'path'; import * as fs from 'fs'; @@ -461,3 +463,27 @@ export function buildWebNodePaths(outDir: string) { return result; } + +export interface IConcatAllOpts { + /** + * Sources to concatenate. The entries will be concatenated + * in the order they are provided. + */ + src: string[]; + /** + * Destination file to concatenate to. + */ + out: string; +} + +export function concatAll(concatAllOptions: IConcatAllOpts[]): () => NodeJS.ReadWriteStream { + return () => { + const concatenations = concatAllOptions.map(concatAllOption => { + return gulp + .src(concatAllOption.src) + .pipe(concat(concatAllOption.out)); + }); + + return es.merge(...concatenations).pipe(gulp.dest('.')); + }; +} diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcess-dev.html b/src/vs/code/electron-browser/sharedProcess/sharedProcess-dev.html new file mode 100644 index 0000000000000..4bd9c87665961 --- /dev/null +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcess-dev.html @@ -0,0 +1,18 @@ + + + + + + + + + + Shared Process + + + + + + + + diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcess.html b/src/vs/code/electron-browser/sharedProcess/sharedProcess.html index 07fd9bd04789b..d1b5812fa7615 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcess.html +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcess.html @@ -1,22 +1,15 @@ + + + + - - - - - - - Shared Process - - - - - - - - - + + Shared Process + + + diff --git a/src/vs/code/electron-sandbox/issue/issueReporter-dev.html b/src/vs/code/electron-sandbox/issue/issueReporter-dev.html new file mode 100644 index 0000000000000..847f987ecc8f1 --- /dev/null +++ b/src/vs/code/electron-sandbox/issue/issueReporter-dev.html @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/vs/code/electron-sandbox/issue/issueReporter.html b/src/vs/code/electron-sandbox/issue/issueReporter.html index 3a0cb4be742f5..2f76d13ff860e 100644 --- a/src/vs/code/electron-sandbox/issue/issueReporter.html +++ b/src/vs/code/electron-sandbox/issue/issueReporter.html @@ -10,14 +10,10 @@ } + - - - - - - + diff --git a/src/vs/code/electron-sandbox/processExplorer/processExplorer-dev.html b/src/vs/code/electron-sandbox/processExplorer/processExplorer-dev.html new file mode 100644 index 0000000000000..f6d8aa5160464 --- /dev/null +++ b/src/vs/code/electron-sandbox/processExplorer/processExplorer-dev.html @@ -0,0 +1,18 @@ + + + + + + + + + +
+ + + + + + + + diff --git a/src/vs/code/electron-sandbox/processExplorer/processExplorer.html b/src/vs/code/electron-sandbox/processExplorer/processExplorer.html index 73d89eac31d4e..0eb6357a97661 100644 --- a/src/vs/code/electron-sandbox/processExplorer/processExplorer.html +++ b/src/vs/code/electron-sandbox/processExplorer/processExplorer.html @@ -5,15 +5,11 @@ +
- - - - - - + diff --git a/src/vs/code/electron-sandbox/workbench/workbench-dev.html b/src/vs/code/electron-sandbox/workbench/workbench-dev.html new file mode 100644 index 0000000000000..cccf92b4e6d4e --- /dev/null +++ b/src/vs/code/electron-sandbox/workbench/workbench-dev.html @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/vs/code/electron-sandbox/workbench/workbench.html b/src/vs/code/electron-sandbox/workbench/workbench.html index 16e089df650bc..ffee5aca3fb97 100644 --- a/src/vs/code/electron-sandbox/workbench/workbench.html +++ b/src/vs/code/electron-sandbox/workbench/workbench.html @@ -6,14 +6,10 @@ + - - - - - - + diff --git a/src/vs/code/node/cli.ts b/src/vs/code/node/cli.ts index daae8a10f16cf..e427bd7c6fb43 100644 --- a/src/vs/code/node/cli.ts +++ b/src/vs/code/node/cli.ts @@ -334,7 +334,7 @@ export async function main(argv: string[]): Promise { return false; } if (target.type === 'page') { - return target.url.indexOf('workbench/workbench.html') > 0; + return target.url.indexOf('workbench/workbench.html') > 0 || target.url.indexOf('workbench/workbench-dev.html') > 0; } else { return true; } diff --git a/src/vs/platform/issue/electron-main/issueMainService.ts b/src/vs/platform/issue/electron-main/issueMainService.ts index 0294b6062b6ce..a26823ec79c39 100644 --- a/src/vs/platform/issue/electron-main/issueMainService.ts +++ b/src/vs/platform/issue/electron-main/issueMainService.ts @@ -228,7 +228,7 @@ export class IssueMainService implements IIssueMainService { }); this.issueReporterWindow.loadURL( - FileAccess.asBrowserUri('vs/code/electron-sandbox/issue/issueReporter.html', require).toString(true) + FileAccess.asBrowserUri(`vs/code/electron-sandbox/issue/issueReporter${this.environmentMainService.isBuilt ? '' : '-dev'}.html`, require).toString(true) ); this.issueReporterWindow.on('close', () => { @@ -279,7 +279,7 @@ export class IssueMainService implements IIssueMainService { }); this.processExplorerWindow.loadURL( - FileAccess.asBrowserUri('vs/code/electron-sandbox/processExplorer/processExplorer.html', require).toString(true) + FileAccess.asBrowserUri(`vs/code/electron-sandbox/processExplorer/processExplorer${this.environmentMainService.isBuilt ? '' : '-dev'}.html`, require).toString(true) ); this.processExplorerWindow.on('close', () => { diff --git a/src/vs/platform/protocol/electron-main/protocolMainService.ts b/src/vs/platform/protocol/electron-main/protocolMainService.ts index 4ebb88fe73980..b4b9544fccff0 100644 --- a/src/vs/platform/protocol/electron-main/protocolMainService.ts +++ b/src/vs/platform/protocol/electron-main/protocolMainService.ts @@ -96,7 +96,7 @@ export class ProtocolMainService extends Disposable implements IProtocolMainServ let headers: Record | undefined; if (this.environmentService.crossOriginIsolated) { - if (path.endsWith('/workbench.html')) { + if (path.endsWith('/workbench.html') || path.endsWith('/workbench-dev.html')) { headers = COI.CoopAndCoep; } else { headers = COI.getHeadersFromQuery(request.url); diff --git a/src/vs/platform/sharedProcess/electron-main/sharedProcess.ts b/src/vs/platform/sharedProcess/electron-main/sharedProcess.ts index 4b9dbc3a765c1..5b3e39360114e 100644 --- a/src/vs/platform/sharedProcess/electron-main/sharedProcess.ts +++ b/src/vs/platform/sharedProcess/electron-main/sharedProcess.ts @@ -250,7 +250,7 @@ export class SharedProcess extends Disposable implements ISharedProcess { }); // Load with config - this.window.loadURL(FileAccess.asBrowserUri('vs/code/electron-browser/sharedProcess/sharedProcess.html', require).toString(true)); + this.window.loadURL(FileAccess.asBrowserUri(`vs/code/electron-browser/sharedProcess/sharedProcess${this.environmentMainService.isBuilt ? '' : '-dev'}.html`, require).toString(true)); } private registerWindowListeners(): void { diff --git a/src/vs/platform/windows/electron-main/windowImpl.ts b/src/vs/platform/windows/electron-main/windowImpl.ts index 429b5ae994ce1..6a26389e4eea3 100644 --- a/src/vs/platform/windows/electron-main/windowImpl.ts +++ b/src/vs/platform/windows/electron-main/windowImpl.ts @@ -877,7 +877,7 @@ export class CodeWindow extends Disposable implements ICodeWindow { this.readyState = ReadyState.NAVIGATING; // Load URL - this._win.loadURL(FileAccess.asBrowserUri('vs/code/electron-sandbox/workbench/workbench.html', require).toString(true)); + this._win.loadURL(FileAccess.asBrowserUri(`vs/code/electron-sandbox/workbench/workbench${this.environmentMainService.isBuilt ? '' : '-dev'}.html`, require).toString(true)); // Remember that we did load const wasLoaded = this.wasLoaded; From 18b765f3fe7e00867e45e963d48111b7d5358637 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 16 Sep 2022 18:38:36 +0200 Subject: [PATCH 2/7] Revert "Revert "Use `esbuild` to bundle some CommonJS main files (#160957)" (#161118)" This reverts commit 84c46b71a5d292a0a9c6cae60e850088270db37d. --- build/gulpfile.compile.js | 4 +- build/gulpfile.editor.js | 41 ++--- build/gulpfile.extensions.js | 1 - build/gulpfile.reh.js | 52 +++--- build/gulpfile.vscode.js | 47 ++++-- build/gulpfile.vscode.web.js | 32 ++-- build/lib/optimize.js | 113 ++++++++----- build/lib/optimize.ts | 158 ++++++++++++------ src/bootstrap-amd.js | 7 +- src/buildfile.js | 1 - src/main.js | 2 +- .../environment/node/environmentService.ts | 2 +- .../environment/node/userDataPath.d.ts | 2 +- .../platform/environment/node/userDataPath.js | 26 ++- .../test/node/userDataPath.test.ts | 9 +- src/vs/platform/product/common/product.ts | 14 +- .../electron-browser/workbenchTestServices.ts | 2 +- 17 files changed, 318 insertions(+), 195 deletions(-) diff --git a/build/gulpfile.compile.js b/build/gulpfile.compile.js index c3049784fe42c..5b6ce2d70bed4 100644 --- a/build/gulpfile.compile.js +++ b/build/gulpfile.compile.js @@ -9,13 +9,15 @@ const gulp = require('gulp'); const util = require('./lib/util'); const task = require('./lib/task'); const compilation = require('./lib/compilation'); +const optimize = require('./lib/optimize'); // Full compile, including nls and inline sources in sourcemaps, for build const compileBuildTask = task.define('compile-build', task.series( util.rimraf('out-build'), util.buildWebNodePaths('out-build'), - compilation.compileTask('src', 'out-build', true) + compilation.compileTask('src', 'out-build', true), + optimize.optimizeLoaderTask('out-build', 'out-build', true) ) ); gulp.task(compileBuildTask); diff --git a/build/gulpfile.editor.js b/build/gulpfile.editor.js index 8e7ff5e3af3ad..94724bb410dd8 100644 --- a/build/gulpfile.editor.js +++ b/build/gulpfile.editor.js @@ -7,7 +7,7 @@ const gulp = require('gulp'); const path = require('path'); const util = require('./lib/util'); const task = require('./lib/task'); -const common = require('./lib/optimize'); +const optimize = require('./lib/optimize'); const es = require('event-stream'); const File = require('vinyl'); const i18n = require('./lib/i18n'); @@ -86,26 +86,29 @@ const extractEditorSrcTask = task.define('extract-editor-src', () => { const compileEditorAMDTask = task.define('compile-editor-amd', compilation.compileTask('out-editor-src', 'out-editor-build', true)); -const optimizeEditorAMDTask = task.define('optimize-editor-amd', common.optimizeTask({ - 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:' +const optimizeEditorAMDTask = task.define('optimize-editor-amd', optimize.optimizeTask( + { + out: 'out-editor', + amd: { + 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 } - }, - bundleLoader: false, - header: BUNDLED_FILE_HEADER, - bundleInfo: true, - out: 'out-editor', - languages: languages -})); + } +)); -const minifyEditorAMDTask = task.define('minify-editor-amd', common.minifyTask('out-editor')); +const minifyEditorAMDTask = task.define('minify-editor-amd', optimize.minifyTask('out-editor')); const createESMSourcesAndResourcesTask = task.define('extract-editor-esm', () => { standalone.createESMSourcesAndResources2({ diff --git a/build/gulpfile.extensions.js b/build/gulpfile.extensions.js index 1e3a9e4daa38d..4023b3860e9cb 100644 --- a/build/gulpfile.extensions.js +++ b/build/gulpfile.extensions.js @@ -20,7 +20,6 @@ const root = path.dirname(__dirname); const commit = util.getVersion(root); const plumber = require('gulp-plumber'); const ext = require('./lib/extensions'); -const product = require('../product.json'); const extensionsPath = path.join(path.dirname(__dirname), 'extensions'); diff --git a/build/gulpfile.reh.js b/build/gulpfile.reh.js index a07c55232de59..980f647c854ee 100644 --- a/build/gulpfile.reh.js +++ b/build/gulpfile.reh.js @@ -10,7 +10,7 @@ const path = require('path'); const es = require('event-stream'); const util = require('./lib/util'); const task = require('./lib/task'); -const common = require('./lib/optimize'); +const optimize = require('./lib/optimize'); const product = require('../product.json'); const rename = require('gulp-rename'); const replace = require('gulp-replace'); @@ -58,15 +58,10 @@ const serverResources = [ 'out-build/bootstrap-fork.js', 'out-build/bootstrap-amd.js', 'out-build/bootstrap-node.js', - 'out-build/paths.js', // Performance 'out-build/vs/base/common/performance.js', - // main entry points - 'out-build/server-cli.js', - 'out-build/server-main.js', - // Watcher 'out-build/vs/platform/files/**/*.exe', 'out-build/vs/platform/files/**/*.md', @@ -254,7 +249,7 @@ function packageTask(type, platform, arch, sourceFolderName, destinationFolderNa const date = new Date().toISOString(); const productJsonStream = gulp.src(['product.json'], { base: '.' }) - .pipe(json({ commit, date })); + .pipe(json({ commit, date, version })); const license = gulp.src(['remote/LICENSE'], { base: 'remote', allowEmpty: true }); @@ -357,23 +352,42 @@ function tweakProductForServerWeb(product) { ['reh', 'reh-web'].forEach(type => { const optimizeTask = task.define(`optimize-vscode-${type}`, task.series( util.rimraf(`out-vscode-${type}`), - common.optimizeTask({ - src: 'out-build', - entryPoints: _.flatten(type === 'reh' ? serverEntryPoints : serverWithWebEntryPoints), - otherSources: [], - resources: type === 'reh' ? serverResources : serverWithWebResources, - loaderConfig: common.loaderConfig(), - out: `out-vscode-${type}`, - inlineAmdImages: true, - bundleInfo: undefined, - fileContentMapper: createVSCodeWebFileContentMapper('.build/extensions', type === 'reh-web' ? tweakProductForServerWeb(product) : product) - }) + optimize.optimizeTask( + { + out: `out-vscode-${type}`, + amd: { + src: 'out-build', + entryPoints: _.flatten(type === 'reh' ? serverEntryPoints : serverWithWebEntryPoints), + otherSources: [], + resources: type === 'reh' ? serverResources : serverWithWebResources, + loaderConfig: optimize.loaderConfig(), + inlineAmdImages: true, + bundleInfo: undefined, + fileContentMapper: createVSCodeWebFileContentMapper('.build/extensions', type === 'reh-web' ? tweakProductForServerWeb(product) : product) + }, + commonJS: { + src: 'out-build', + entryPoints: [ + 'out-build/server-main.js', + 'out-build/server-cli.js' + ], + 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' + ] + } + } + ) )); const minifyTask = task.define(`minify-vscode-${type}`, task.series( optimizeTask, util.rimraf(`out-vscode-${type}-min`), - common.minifyTask(`out-vscode-${type}`, `https://ticino.blob.core.windows.net/sourcemaps/${commit}/core`) + optimize.minifyTask(`out-vscode-${type}`, `https://ticino.blob.core.windows.net/sourcemaps/${commit}/core`) )); gulp.task(minifyTask); diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index d371e6f3c254b..cefb1f2ac9840 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -20,7 +20,7 @@ const _ = require('underscore'); const util = require('./lib/util'); const task = require('./lib/task'); const buildfile = require('../src/buildfile'); -const common = require('./lib/optimize'); +const optimize = require('./lib/optimize'); const root = path.dirname(__dirname); const commit = util.getVersion(root); const packageJson = require('../package.json'); @@ -52,8 +52,6 @@ const vscodeEntryPoints = _.flatten([ ]); const vscodeResources = [ - 'out-build/main.js', - 'out-build/cli.js', 'out-build/bootstrap.js', 'out-build/bootstrap-fork.js', 'out-build/bootstrap-amd.js', @@ -63,12 +61,9 @@ const vscodeResources = [ '!out-build/vs/code/browser/**/*.html', '!out-build/vs/editor/standalone/**/*.svg', 'out-build/vs/base/common/performance.js', - 'out-build/vs/base/common/stripComments.js', - 'out-build/vs/base/node/languagePacks.js', 'out-build/vs/base/node/{stdForkStart.js,terminateProcess.sh,cpuUsage.sh,ps.sh}', 'out-build/vs/base/browser/ui/codicons/codicon/**', 'out-build/vs/base/parts/sandbox/electron-browser/preload.js', - 'out-build/vs/platform/environment/node/userDataPath.js', 'out-build/vs/workbench/browser/media/*-theme.css', 'out-build/vs/workbench/contrib/debug/**/*.json', 'out-build/vs/workbench/contrib/externalTerminal/**/*.scpt', @@ -90,14 +85,34 @@ const vscodeResources = [ const optimizeVSCodeTask = task.define('optimize-vscode', task.series( util.rimraf('out-vscode'), - common.optimizeTask({ - src: 'out-build', - entryPoints: vscodeEntryPoints, - resources: vscodeResources, - loaderConfig: common.loaderConfig(), - out: 'out-vscode', - bundleInfo: undefined - }) + optimize.optimizeTask( + { + out: 'out-vscode', + amd: { + src: 'out-build', + entryPoints: vscodeEntryPoints, + resources: vscodeResources, + loaderConfig: optimize.loaderConfig(), + bundleInfo: undefined + }, + commonJS: { + src: 'out-build', + entryPoints: [ + 'out-build/main.js', + 'out-build/cli.js' + ], + 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' + ] + } + } + ) )); gulp.task(optimizeVSCodeTask); @@ -105,7 +120,7 @@ const sourceMappingURLBase = `https://ticino.blob.core.windows.net/sourcemaps/${ const minifyVSCodeTask = task.define('minify-vscode', task.series( optimizeVSCodeTask, util.rimraf('out-vscode-min'), - common.minifyTask('out-vscode', `${sourceMappingURLBase}/core`) + optimize.minifyTask('out-vscode', `${sourceMappingURLBase}/core`) )); gulp.task(minifyVSCodeTask); @@ -211,7 +226,7 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op .pipe(json(packageJsonUpdates)); const date = new Date().toISOString(); - const productJsonUpdate = { commit, date, checksums }; + const productJsonUpdate = { commit, date, checksums, version }; if (shouldSetupSettingsSearch()) { productJsonUpdate.settingsSearchBuildId = getSettingsSearchBuildId(packageJson); diff --git a/build/gulpfile.vscode.web.js b/build/gulpfile.vscode.web.js index 8e92d7717abd5..c5b09393728fe 100644 --- a/build/gulpfile.vscode.web.js +++ b/build/gulpfile.vscode.web.js @@ -10,7 +10,7 @@ const path = require('path'); const es = require('event-stream'); const util = require('./lib/util'); const task = require('./lib/task'); -const common = require('./lib/optimize'); +const optimize = require('./lib/optimize'); const product = require('../product.json'); const rename = require('gulp-rename'); const filter = require('gulp-filter'); @@ -153,24 +153,28 @@ exports.createVSCodeWebFileContentMapper = createVSCodeWebFileContentMapper; const optimizeVSCodeWebTask = task.define('optimize-vscode-web', task.series( util.rimraf('out-vscode-web'), - common.optimizeTask({ - src: 'out-build', - entryPoints: _.flatten(vscodeWebEntryPoints), - otherSources: [], - resources: vscodeWebResources, - loaderConfig: common.loaderConfig(), - externalLoaderInfo: util.createExternalLoaderConfig(product.webEndpointUrl, commit, quality), - out: 'out-vscode-web', - inlineAmdImages: true, - bundleInfo: undefined, - fileContentMapper: createVSCodeWebFileContentMapper('.build/web/extensions', product) - }) + optimize.optimizeTask( + { + out: 'out-vscode-web', + amd: { + src: 'out-build', + entryPoints: _.flatten(vscodeWebEntryPoints), + otherSources: [], + resources: vscodeWebResources, + loaderConfig: optimize.loaderConfig(), + externalLoaderInfo: util.createExternalLoaderConfig(product.webEndpointUrl, commit, quality), + inlineAmdImages: true, + bundleInfo: undefined, + fileContentMapper: createVSCodeWebFileContentMapper('.build/web/extensions', product) + } + } + ) )); const minifyVSCodeWebTask = task.define('minify-vscode-web', task.series( optimizeVSCodeWebTask, util.rimraf('out-vscode-web-min'), - common.minifyTask('out-vscode-web', `https://ticino.blob.core.windows.net/sourcemaps/${commit}/core`) + optimize.minifyTask('out-vscode-web', `https://ticino.blob.core.windows.net/sourcemaps/${commit}/core`) )); gulp.task(minifyVSCodeWebTask); diff --git a/build/lib/optimize.js b/build/lib/optimize.js index 8333afc7184c0..564fa5ef89edf 100644 --- a/build/lib/optimize.js +++ b/build/lib/optimize.js @@ -4,7 +4,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ Object.defineProperty(exports, "__esModule", { value: true }); -exports.minifyTask = exports.optimizeTask = exports.loaderConfig = void 0; +exports.minifyTask = exports.optimizeTask = exports.optimizeLoaderTask = exports.loaderConfig = void 0; const es = require("event-stream"); const gulp = require("gulp"); const concat = require("gulp-concat"); @@ -135,56 +135,83 @@ const DEFAULT_FILE_HEADER = [ ' * Copyright (C) Microsoft Corporation. All rights reserved.', ' *--------------------------------------------------------*/' ].join('\n'); -function optimizeTask(opts) { +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 bundleLoader = (typeof opts.bundleLoader === 'undefined' ? true : opts.bundleLoader); - const out = opts.out; const fileContentMapper = opts.fileContentMapper || ((contents, _path) => contents); - return function () { - const sourcemaps = require('gulp-sourcemaps'); - const bundlesStream = es.through(); // this stream will contain the bundled files - 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)); - } - 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')) - })); + const sourcemaps = require('gulp-sourcemaps'); + const bundlesStream = es.through(); // this stream will contain the bundled files + 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)); + } + 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); } - es.readArray(bundleInfoArray).pipe(bundleInfoStream); + filteredResources.push('!' + resource); }); - const result = es.merge(loader(src, bundledFileHeader, bundleLoader, opts.externalLoaderInfo), bundlesStream, resourcesStream, bundleInfoStream); - 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()) - .pipe(gulp.dest(out)); + 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); + }); + const result = es.merge(loader(src, bundledFileHeader, false, opts.externalLoaderInfo), bundlesStream, resourcesStream, bundleInfoStream); + 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 optimizeLoaderTask(src, out, bundleLoader, bundledFileHeader = '', externalLoaderInfo) { + return () => loader(src, bundledFileHeader, bundleLoader, externalLoaderInfo).pipe(gulp.dest(out)); +} +exports.optimizeLoaderTask = optimizeLoaderTask; +function optimizeTask(opts) { + return function () { + const optimizers = [optimizeAMDTask(opts.amd)]; + if (opts.commonJS) { + optimizers.push(optimizeCommonJSTask(opts.commonJS)); + } + return es.merge(...optimizers).pipe(gulp.dest(opts.out)); }; } exports.optimizeTask = optimizeTask; diff --git a/build/lib/optimize.ts b/build/lib/optimize.ts index c7b1981a58999..f3c7627d3a43c 100644 --- a/build/lib/optimize.ts +++ b/build/lib/optimize.ts @@ -153,7 +153,7 @@ function toBundleStream(src: string, bundledFileHeader: string, bundles: bundle. })); } -export interface IOptimizeTaskOpts { +export interface IOptimizeAMDTaskOpts { /** * The folder to read files from. */ @@ -184,11 +184,7 @@ export interface IOptimizeTaskOpts { */ bundleInfo: boolean; /** - * (out folder name) - */ - out: string; - /** - * (out folder name) + * Language configuration. */ languages?: Language[]; /** @@ -205,67 +201,125 @@ const DEFAULT_FILE_HEADER = [ ' *--------------------------------------------------------*/' ].join('\n'); -export function optimizeTask(opts: IOptimizeTaskOpts): () => NodeJS.ReadWriteStream { +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 bundleLoader = (typeof opts.bundleLoader === 'undefined' ? true : opts.bundleLoader); - const out = opts.out; const fileContentMapper = opts.fileContentMapper || ((contents: string, _path: string) => contents); - return function () { - const sourcemaps = require('gulp-sourcemaps') as typeof import('gulp-sourcemaps'); + const sourcemaps = require('gulp-sourcemaps') as typeof import('gulp-sourcemaps'); - const bundlesStream = es.through(); // this stream will contain the bundled files - 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 + 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)); } + 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); + 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')) - })); + // Remove css inlined resources + const filteredResources = resources.slice(); + result.cssInlinedResources.forEach(function (resource) { + if (process.env['VSCODE_BUILD_VERBOSE']) { + log('optimizer', 'excluding inlined: ' + resource); } - es.readArray(bundleInfoArray).pipe(bundleInfoStream); + 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')) + })); + } + es.readArray(bundleInfoArray).pipe(bundleInfoStream); + }); - const result = es.merge( - loader(src, bundledFileHeader, bundleLoader, opts.externalLoaderInfo), - bundlesStream, - resourcesStream, - bundleInfoStream - ); + const result = es.merge( + loader(src, bundledFileHeader, false, opts.externalLoaderInfo), + bundlesStream, + resourcesStream, + bundleInfoStream + ); - return result - .pipe(sourcemaps.write('./', { - sourceRoot: undefined, - addComment: true, - includeContent: true - })) - .pipe(opts.languages && opts.languages.length ? processNlsFiles({ - fileHeader: bundledFileHeader, - languages: opts.languages - }) : es.through()) - .pipe(gulp.dest(out)); + return result + .pipe(sourcemaps.write('./', { + 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); + }); + })); +} + +export function optimizeLoaderTask(src: string, out: string, bundleLoader: boolean, bundledFileHeader = '', externalLoaderInfo?: any): () => NodeJS.ReadWriteStream { + return () => loader(src, bundledFileHeader, bundleLoader, externalLoaderInfo).pipe(gulp.dest(out)); +} + +export interface IOptimizeTaskOpts { + out: string; + amd: IOptimizeAMDTaskOpts; + commonJS?: IOptimizeCommonJSTaskOpts; +} + +export function optimizeTask(opts: IOptimizeTaskOpts): () => NodeJS.ReadWriteStream { + return function () { + const optimizers = [optimizeAMDTask(opts.amd)]; + if (opts.commonJS) { + optimizers.push(optimizeCommonJSTask(opts.commonJS)); + } + + return es.merge(...optimizers).pipe(gulp.dest(opts.out)); }; } diff --git a/src/bootstrap-amd.js b/src/bootstrap-amd.js index 31e27ea7ed752..88747c29aaf89 100644 --- a/src/bootstrap-amd.js +++ b/src/bootstrap-amd.js @@ -6,6 +6,11 @@ //@ts-check 'use strict'; +// Store the node.js require function in a variable +// before loading our AMD loader to avoid issues +// when this file is bundled with other files. +const nodeRequire = require; + const loader = require('./vs/loader'); const bootstrap = require('./bootstrap'); const performance = require('./vs/base/common/performance'); @@ -17,7 +22,7 @@ const nlsConfig = bootstrap.setupNLS(); loader.config({ baseUrl: bootstrap.fileUriFromPath(__dirname, { isWindows: process.platform === 'win32' }), catchError: true, - nodeRequire: require, + nodeRequire, 'vs/nls': nlsConfig, amdModulesPattern: /^vs\//, recordStats: true diff --git a/src/buildfile.js b/src/buildfile.js index b63d85617c3f0..24654c77abed0 100644 --- a/src/buildfile.js +++ b/src/buildfile.js @@ -35,7 +35,6 @@ exports.base = [ exclude: ['vs/nls'], prepend: [ { path: 'vs/loader.js' }, - { path: 'vs/nls.js', amdModuleId: 'vs/nls' }, { path: 'vs/base/worker/workerMain.js' } ], dest: 'vs/base/worker/workerMain.js' diff --git a/src/main.js b/src/main.js index 884120e01b02f..f7e6e49a9679c 100644 --- a/src/main.js +++ b/src/main.js @@ -34,7 +34,7 @@ bootstrap.enableASARSupport(); // Set userData path before app 'ready' event const args = parseCLIArgs(); -const userDataPath = getUserDataPath(args); +const userDataPath = getUserDataPath(args, product.nameShort ?? 'code-oss-dev'); app.setPath('userData', userDataPath); // Resolve code cache path diff --git a/src/vs/platform/environment/node/environmentService.ts b/src/vs/platform/environment/node/environmentService.ts index 26ef9dad17b14..cf59e2f135abe 100644 --- a/src/vs/platform/environment/node/environmentService.ts +++ b/src/vs/platform/environment/node/environmentService.ts @@ -15,7 +15,7 @@ export class NativeEnvironmentService extends AbstractNativeEnvironmentService { super(args, { homeDir: homedir(), tmpDir: tmpdir(), - userDataDir: getUserDataPath(args) + userDataDir: getUserDataPath(args, productService.nameShort) }, productService); } } diff --git a/src/vs/platform/environment/node/userDataPath.d.ts b/src/vs/platform/environment/node/userDataPath.d.ts index 4c9239fc9535a..c75b432c59c71 100644 --- a/src/vs/platform/environment/node/userDataPath.d.ts +++ b/src/vs/platform/environment/node/userDataPath.d.ts @@ -11,4 +11,4 @@ import { NativeParsedArgs } from 'vs/platform/environment/common/argv'; * - respect VSCODE_APPDATA environment variable * - respect --user-data-dir CLI argument */ -export function getUserDataPath(args: NativeParsedArgs): string; +export function getUserDataPath(args: NativeParsedArgs, productName: string): string; diff --git a/src/vs/platform/environment/node/userDataPath.js b/src/vs/platform/environment/node/userDataPath.js index 96639b2b44e74..92898523ed111 100644 --- a/src/vs/platform/environment/node/userDataPath.js +++ b/src/vs/platform/environment/node/userDataPath.js @@ -14,18 +14,18 @@ * * @param {typeof import('path')} path * @param {typeof import('os')} os - * @param {string} productName * @param {string} cwd */ - function factory(path, os, productName, cwd) { + function factory(path, os, cwd) { /** * @param {NativeParsedArgs} cliArgs + * @param {string} productName * * @returns {string} */ - function getUserDataPath(cliArgs) { - const userDataPath = doGetUserDataPath(cliArgs); + function getUserDataPath(cliArgs, productName) { + const userDataPath = doGetUserDataPath(cliArgs, productName); const pathsToResolve = [userDataPath]; // If the user-data-path is not absolute, make @@ -43,10 +43,11 @@ /** * @param {NativeParsedArgs} cliArgs + * @param {string} productName * * @returns {string} */ - function doGetUserDataPath(cliArgs) { + function doGetUserDataPath(cliArgs, productName) { // 0. Running out of sources has a fixed productName if (process.env['VSCODE_DEV']) { @@ -106,25 +107,18 @@ } if (typeof define === 'function') { - define(['require', 'path', 'os', 'vs/base/common/network', 'vs/base/common/resources', 'vs/base/common/process'], function ( - require, + define(['path', 'os', 'vs/base/common/process'], function ( /** @type {typeof import('path')} */ path, /** @type {typeof import('os')} */ os, - /** @type {typeof import('../../../base/common/network')} */ network, - /** @type {typeof import("../../../base/common/resources")} */ resources, /** @type {typeof import("../../../base/common/process")} */ process ) { - const rootPath = resources.dirname(network.FileAccess.asFileUri('', require)); - const pkg = require.__$__nodeRequire(resources.joinPath(rootPath, 'package.json').fsPath); - - return factory(path, os, pkg.name, process.cwd()); - }); // amd + return factory(path, os, process.cwd()); // amd + }); } else if (typeof module === 'object' && typeof module.exports === 'object') { - const pkg = require('../../../../../package.json'); const path = require('path'); const os = require('os'); - module.exports = factory(path, os, pkg.name, process.env['VSCODE_CWD'] || process.cwd()); // commonjs + module.exports = factory(path, os, process.env['VSCODE_CWD'] || process.cwd()); // commonjs } else { throw new Error('Unknown context'); } diff --git a/src/vs/platform/environment/test/node/userDataPath.test.ts b/src/vs/platform/environment/test/node/userDataPath.test.ts index e0eb596af9f1d..f92f180848144 100644 --- a/src/vs/platform/environment/test/node/userDataPath.test.ts +++ b/src/vs/platform/environment/test/node/userDataPath.test.ts @@ -6,11 +6,12 @@ import * as assert from 'assert'; import { OPTIONS, parseArgs } from 'vs/platform/environment/node/argv'; import { getUserDataPath } from 'vs/platform/environment/node/userDataPath'; +import product from 'vs/platform/product/common/product'; suite('User data path', () => { test('getUserDataPath - default', () => { - const path = getUserDataPath(parseArgs(process.argv, OPTIONS)); + const path = getUserDataPath(parseArgs(process.argv, OPTIONS), product.nameShort); assert.ok(path.length > 0); }); @@ -20,7 +21,7 @@ suite('User data path', () => { const portableDir = 'portable-dir'; process.env['VSCODE_PORTABLE'] = portableDir; - const path = getUserDataPath(parseArgs(process.argv, OPTIONS)); + const path = getUserDataPath(parseArgs(process.argv, OPTIONS), product.nameShort); assert.ok(path.includes(portableDir)); } finally { if (typeof origPortable === 'string') { @@ -36,7 +37,7 @@ suite('User data path', () => { const args = parseArgs(process.argv, OPTIONS); args['user-data-dir'] = cliUserDataDir; - const path = getUserDataPath(args); + const path = getUserDataPath(args, product.nameShort); assert.ok(path.includes(cliUserDataDir)); }); @@ -46,7 +47,7 @@ suite('User data path', () => { const appDataDir = 'appdata-dir'; process.env['VSCODE_APPDATA'] = appDataDir; - const path = getUserDataPath(parseArgs(process.argv, OPTIONS)); + const path = getUserDataPath(parseArgs(process.argv, OPTIONS), product.nameShort); assert.ok(path.includes(appDataDir)); } finally { if (typeof origAppData === 'string') { diff --git a/src/vs/platform/product/common/product.ts b/src/vs/platform/product/common/product.ts index f0808b127836a..bceda016f2038 100644 --- a/src/vs/platform/product/common/product.ts +++ b/src/vs/platform/product/common/product.ts @@ -32,7 +32,6 @@ else if (typeof require?.__$__nodeRequire === 'function') { const rootPath = dirname(FileAccess.asFileUri('', require)); product = require.__$__nodeRequire(joinPath(rootPath, 'product.json').fsPath); - const pkg = require.__$__nodeRequire(joinPath(rootPath, 'package.json').fsPath) as { version: string }; // Running out of sources if (env['VSCODE_DEV']) { @@ -44,9 +43,16 @@ else if (typeof require?.__$__nodeRequire === 'function') { }); } - Object.assign(product, { - version: pkg.version - }); + // Version is added during built time, but we still + // 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 }; + + Object.assign(product, { + version: pkg.version + }); + } } // Web environment or unknown diff --git a/src/vs/workbench/test/electron-browser/workbenchTestServices.ts b/src/vs/workbench/test/electron-browser/workbenchTestServices.ts index 0c6d93f52bf4e..54b3254011d26 100644 --- a/src/vs/workbench/test/electron-browser/workbenchTestServices.ts +++ b/src/vs/workbench/test/electron-browser/workbenchTestServices.ts @@ -84,7 +84,7 @@ export const TestNativeWindowConfiguration: INativeWindowConfiguration = { product, homeDir: homeDir, tmpDir: tmpdir(), - userDataDir: getUserDataPath(args), + userDataDir: getUserDataPath(args, product.nameShort), profiles: { profile: NULL_PROFILE, all: [NULL_PROFILE] }, ...args }; From 736516624ea73fd13a4e2ac5359e5b54ec851553 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Sat, 17 Sep 2022 07:00:58 +0200 Subject: [PATCH 3/7] build - exclude server main files --- build/gulpfile.reh.js | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/build/gulpfile.reh.js b/build/gulpfile.reh.js index 980f647c854ee..6812a7c854d4e 100644 --- a/build/gulpfile.reh.js +++ b/build/gulpfile.reh.js @@ -58,10 +58,15 @@ const serverResources = [ 'out-build/bootstrap-fork.js', 'out-build/bootstrap-amd.js', 'out-build/bootstrap-node.js', + 'out-build/paths.js', // Performance 'out-build/vs/base/common/performance.js', + // main entry points + 'out-build/server-cli.js', + 'out-build/server-main.js', + // Watcher 'out-build/vs/platform/files/**/*.exe', 'out-build/vs/platform/files/**/*.md', @@ -364,21 +369,6 @@ function tweakProductForServerWeb(product) { inlineAmdImages: true, bundleInfo: undefined, fileContentMapper: createVSCodeWebFileContentMapper('.build/extensions', type === 'reh-web' ? tweakProductForServerWeb(product) : product) - }, - commonJS: { - src: 'out-build', - entryPoints: [ - 'out-build/server-main.js', - 'out-build/server-cli.js' - ], - 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' - ] } } ) From ae6423837eefee958a7314b11cf18ac64b8aef6a Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Sun, 18 Sep 2022 08:36:42 +0200 Subject: [PATCH 4/7] build - make concat a task that runs like the others --- build/gulpfile.vscode.js | 25 ++++++++++--------------- build/lib/optimize.js | 11 +++++++++++ build/lib/optimize.ts | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 15 deletions(-) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 1c2fd4f7696e0..f2f11b623862c 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -76,10 +76,6 @@ const vscodeResources = [ 'out-build/vs/workbench/contrib/tasks/**/*.json', 'out-build/vs/platform/files/**/*.exe', 'out-build/vs/platform/files/**/*.md', - 'out-build/vs/code/electron-sandbox/workbench/**', - 'out-build/vs/code/electron-browser/sharedProcess/sharedProcess.js', - 'out-build/vs/code/electron-sandbox/issue/issueReporter.js', - 'out-build/vs/code/electron-sandbox/processExplorer/processExplorer.js', '!**/test/**' ]; @@ -96,7 +92,8 @@ 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 entry points. In addition, concat window related + // bootstrap files into a single file. optimize.optimizeTask( { out: 'out-vscode', @@ -122,17 +119,15 @@ const optimizeVSCodeTask = task.define('optimize-vscode', task.series( // point in time (such as `checksums`) '../product.json' ] - } + }, + concatAll: [ + { entryPoints: [...windowBootstrapFiles, 'out-build/vs/code/electron-sandbox/workbench/workbench.js'], target: 'vs/code/electron-sandbox/workbench/workbench.js' }, + { entryPoints: [...windowBootstrapFiles, 'out-build/vs/code/electron-sandbox/issue/issueReporter.js'], target: 'vs/code/electron-sandbox/issue/issueReporter.js' }, + { entryPoints: [...windowBootstrapFiles, 'out-build/vs/code/electron-sandbox/processExplorer/processExplorer.js'], target: 'vs/code/electron-sandbox/processExplorer/processExplorer.js' }, + { entryPoints: [...windowBootstrapFiles, 'out-build/vs/code/electron-browser/sharedProcess/sharedProcess.js'], target: 'vs/code/electron-browser/sharedProcess/sharedProcess.js' } + ] } - ), - // Concat: bundles source files manually via simple concatenation - // for the entry points of our windows. - util.concatAll([ - { src: [...windowBootstrapFiles, 'out-build/vs/code/electron-sandbox/workbench/workbench.js'], out: 'out-vscode/vs/code/electron-sandbox/workbench/workbench.js' }, - { src: [...windowBootstrapFiles, 'out-build/vs/code/electron-sandbox/issue/issueReporter.js'], out: 'out-vscode/vs/code/electron-sandbox/issue/issueReporter.js' }, - { src: [...windowBootstrapFiles, 'out-build/vs/code/electron-sandbox/processExplorer/processExplorer.js'], out: 'out-vscode/vs/code/electron-sandbox/processExplorer/processExplorer.js' }, - { src: [...windowBootstrapFiles, 'out-build/vs/code/electron-browser/sharedProcess/sharedProcess.js'], out: 'out-vscode/vs/code/electron-browser/sharedProcess/sharedProcess.js' } - ]) + ) )); gulp.task(optimizeVSCodeTask); diff --git a/build/lib/optimize.js b/build/lib/optimize.js index 564fa5ef89edf..35311998f9b10 100644 --- a/build/lib/optimize.js +++ b/build/lib/optimize.js @@ -201,6 +201,14 @@ function optimizeCommonJSTask(opts) { }); })); } +function optimizeConcatAllTask(concatAllOptions) { + const concatenations = concatAllOptions.map(concatAllOption => { + return gulp + .src(concatAllOption.entryPoints) + .pipe(concat(concatAllOption.target)); + }); + return es.merge(...concatenations); +} function optimizeLoaderTask(src, out, bundleLoader, bundledFileHeader = '', externalLoaderInfo) { return () => loader(src, bundledFileHeader, bundleLoader, externalLoaderInfo).pipe(gulp.dest(out)); } @@ -211,6 +219,9 @@ function optimizeTask(opts) { if (opts.commonJS) { optimizers.push(optimizeCommonJSTask(opts.commonJS)); } + if (opts.concatAll) { + optimizers.push(optimizeConcatAllTask(opts.concatAll)); + } return es.merge(...optimizers).pipe(gulp.dest(opts.out)); }; } diff --git a/build/lib/optimize.ts b/build/lib/optimize.ts index f3c7627d3a43c..865418584d052 100644 --- a/build/lib/optimize.ts +++ b/build/lib/optimize.ts @@ -302,14 +302,49 @@ function optimizeCommonJSTask(opts: IOptimizeCommonJSTaskOpts): NodeJS.ReadWrite })); } +export interface IOptimizeConcatAllTaskOpts { + /** + * The paths to consider for concatenation. The entries + * will be concatenated in the order they are provided. + */ + entryPoints: string[]; + /** + * Destination target to concatenate the entryPoints into. + */ + target: string; +} + +function optimizeConcatAllTask(concatAllOptions: IOptimizeConcatAllTaskOpts[]): NodeJS.ReadWriteStream { + const concatenations = concatAllOptions.map(concatAllOption => { + return gulp + .src(concatAllOption.entryPoints) + .pipe(concat(concatAllOption.target)); + }); + + return es.merge(...concatenations); +} + export function optimizeLoaderTask(src: string, out: string, bundleLoader: boolean, bundledFileHeader = '', externalLoaderInfo?: any): () => 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 manually by concatenating files. + */ + concatAll?: IOptimizeConcatAllTaskOpts[]; } export function optimizeTask(opts: IOptimizeTaskOpts): () => NodeJS.ReadWriteStream { @@ -319,6 +354,10 @@ export function optimizeTask(opts: IOptimizeTaskOpts): () => NodeJS.ReadWriteStr optimizers.push(optimizeCommonJSTask(opts.commonJS)); } + if (opts.concatAll) { + optimizers.push(optimizeConcatAllTask(opts.concatAll)); + } + return es.merge(...optimizers).pipe(gulp.dest(opts.out)); }; } From f799c4f03804d4aa670baa52dd92b27112c2ef83 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Sun, 18 Sep 2022 17:04:00 +0200 Subject: [PATCH 5/7] some renames --- build/gulpfile.vscode.js | 10 +++++----- build/lib/optimize.js | 12 ++++++------ build/lib/optimize.ts | 20 ++++++++++---------- build/lib/policies.js | 18 +++++++++--------- build/lib/util.js | 15 +-------------- build/lib/util.ts | 27 --------------------------- 6 files changed, 31 insertions(+), 71 deletions(-) diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index f2f11b623862c..6947d1ee1eda0 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -120,11 +120,11 @@ const optimizeVSCodeTask = task.define('optimize-vscode', task.series( '../product.json' ] }, - concatAll: [ - { entryPoints: [...windowBootstrapFiles, 'out-build/vs/code/electron-sandbox/workbench/workbench.js'], target: 'vs/code/electron-sandbox/workbench/workbench.js' }, - { entryPoints: [...windowBootstrapFiles, 'out-build/vs/code/electron-sandbox/issue/issueReporter.js'], target: 'vs/code/electron-sandbox/issue/issueReporter.js' }, - { entryPoints: [...windowBootstrapFiles, 'out-build/vs/code/electron-sandbox/processExplorer/processExplorer.js'], target: 'vs/code/electron-sandbox/processExplorer/processExplorer.js' }, - { entryPoints: [...windowBootstrapFiles, 'out-build/vs/code/electron-browser/sharedProcess/sharedProcess.js'], target: 'vs/code/electron-browser/sharedProcess/sharedProcess.js' } + manual: [ + { src: [...windowBootstrapFiles, 'out-build/vs/code/electron-sandbox/workbench/workbench.js'], out: 'vs/code/electron-sandbox/workbench/workbench.js' }, + { src: [...windowBootstrapFiles, 'out-build/vs/code/electron-sandbox/issue/issueReporter.js'], out: 'vs/code/electron-sandbox/issue/issueReporter.js' }, + { src: [...windowBootstrapFiles, 'out-build/vs/code/electron-sandbox/processExplorer/processExplorer.js'], out: 'vs/code/electron-sandbox/processExplorer/processExplorer.js' }, + { src: [...windowBootstrapFiles, 'out-build/vs/code/electron-browser/sharedProcess/sharedProcess.js'], out: 'vs/code/electron-browser/sharedProcess/sharedProcess.js' } ] } ) diff --git a/build/lib/optimize.js b/build/lib/optimize.js index 35311998f9b10..92e449a0cea98 100644 --- a/build/lib/optimize.js +++ b/build/lib/optimize.js @@ -201,11 +201,11 @@ function optimizeCommonJSTask(opts) { }); })); } -function optimizeConcatAllTask(concatAllOptions) { - const concatenations = concatAllOptions.map(concatAllOption => { +function optimizeManualTask(options) { + const concatenations = options.map(opt => { return gulp - .src(concatAllOption.entryPoints) - .pipe(concat(concatAllOption.target)); + .src(opt.src) + .pipe(concat(opt.out)); }); return es.merge(...concatenations); } @@ -219,8 +219,8 @@ function optimizeTask(opts) { if (opts.commonJS) { optimizers.push(optimizeCommonJSTask(opts.commonJS)); } - if (opts.concatAll) { - optimizers.push(optimizeConcatAllTask(opts.concatAll)); + if (opts.manual) { + optimizers.push(optimizeManualTask(opts.manual)); } return es.merge(...optimizers).pipe(gulp.dest(opts.out)); }; diff --git a/build/lib/optimize.ts b/build/lib/optimize.ts index 865418584d052..2e3943d79f923 100644 --- a/build/lib/optimize.ts +++ b/build/lib/optimize.ts @@ -302,23 +302,23 @@ function optimizeCommonJSTask(opts: IOptimizeCommonJSTaskOpts): NodeJS.ReadWrite })); } -export interface IOptimizeConcatAllTaskOpts { +export interface IOptimizeManualTaskOpts { /** * The paths to consider for concatenation. The entries * will be concatenated in the order they are provided. */ - entryPoints: string[]; + src: string[]; /** * Destination target to concatenate the entryPoints into. */ - target: string; + out: string; } -function optimizeConcatAllTask(concatAllOptions: IOptimizeConcatAllTaskOpts[]): NodeJS.ReadWriteStream { - const concatenations = concatAllOptions.map(concatAllOption => { +function optimizeManualTask(options: IOptimizeManualTaskOpts[]): NodeJS.ReadWriteStream { + const concatenations = options.map(opt => { return gulp - .src(concatAllOption.entryPoints) - .pipe(concat(concatAllOption.target)); + .src(opt.src) + .pipe(concat(opt.out)); }); return es.merge(...concatenations); @@ -344,7 +344,7 @@ export interface IOptimizeTaskOpts { /** * Optimize manually by concatenating files. */ - concatAll?: IOptimizeConcatAllTaskOpts[]; + manual?: IOptimizeManualTaskOpts[]; } export function optimizeTask(opts: IOptimizeTaskOpts): () => NodeJS.ReadWriteStream { @@ -354,8 +354,8 @@ export function optimizeTask(opts: IOptimizeTaskOpts): () => NodeJS.ReadWriteStr optimizers.push(optimizeCommonJSTask(opts.commonJS)); } - if (opts.concatAll) { - optimizers.push(optimizeConcatAllTask(opts.concatAll)); + if (opts.manual) { + optimizers.push(optimizeManualTask(opts.manual)); } return es.merge(...optimizers).pipe(gulp.dest(opts.out)); diff --git a/build/lib/policies.js b/build/lib/policies.js index 2fe3339ccea13..37bb8e36d0ccc 100644 --- a/build/lib/policies.js +++ b/build/lib/policies.js @@ -96,10 +96,6 @@ class BooleanPolicy extends BasePolicy { } } class IntPolicy extends BasePolicy { - constructor(name, category, minimumVersion, description, moduleName, defaultValue) { - super(PolicyType.StringEnum, name, category, minimumVersion, description, moduleName); - this.defaultValue = defaultValue; - } static from(name, category, minimumVersion, description, moduleName, settingNode) { const type = getStringProperty(settingNode, 'type'); if (type !== 'number') { @@ -111,6 +107,10 @@ class IntPolicy extends BasePolicy { } return new IntPolicy(name, category, minimumVersion, description, moduleName, defaultValue); } + constructor(name, category, minimumVersion, description, moduleName, defaultValue) { + super(PolicyType.StringEnum, name, category, minimumVersion, description, moduleName); + this.defaultValue = defaultValue; + } renderADMXElements() { return [ `` @@ -140,11 +140,6 @@ class StringPolicy extends BasePolicy { } } class StringEnumPolicy extends BasePolicy { - constructor(name, category, minimumVersion, description, moduleName, enum_, enumDescriptions) { - super(PolicyType.StringEnum, name, category, minimumVersion, description, moduleName); - this.enum_ = enum_; - this.enumDescriptions = enumDescriptions; - } static from(name, category, minimumVersion, description, moduleName, settingNode) { const type = getStringProperty(settingNode, 'type'); if (type !== 'string') { @@ -166,6 +161,11 @@ class StringEnumPolicy extends BasePolicy { } return new StringEnumPolicy(name, category, minimumVersion, description, moduleName, enum_, enumDescriptions); } + constructor(name, category, minimumVersion, description, moduleName, enum_, enumDescriptions) { + super(PolicyType.StringEnum, name, category, minimumVersion, description, moduleName); + this.enum_ = enum_; + this.enumDescriptions = enumDescriptions; + } renderADMXElements() { return [ ``, diff --git a/build/lib/util.js b/build/lib/util.js index 7b8043499fd87..6353637d7c40e 100644 --- a/build/lib/util.js +++ b/build/lib/util.js @@ -4,13 +4,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ Object.defineProperty(exports, "__esModule", { value: true }); -exports.concatAll = exports.buildWebNodePaths = exports.createExternalLoaderConfig = exports.acquireWebNodePaths = exports.getElectronVersion = exports.streamToPromise = exports.versionStringToNumber = exports.filter = exports.rebase = exports.getVersion = exports.ensureDir = exports.rreddir = exports.rimraf = exports.rewriteSourceMappingURL = exports.stripSourceMappingURL = exports.loadSourcemaps = exports.cleanNodeModules = exports.skipDirectories = exports.toFileUri = exports.setExecutableBit = exports.fixWin32DirectoryPermissions = exports.debounce = exports.incremental = void 0; +exports.buildWebNodePaths = exports.createExternalLoaderConfig = exports.acquireWebNodePaths = exports.getElectronVersion = exports.streamToPromise = exports.versionStringToNumber = exports.filter = exports.rebase = exports.getVersion = exports.ensureDir = exports.rreddir = exports.rimraf = exports.rewriteSourceMappingURL = exports.stripSourceMappingURL = exports.loadSourcemaps = exports.cleanNodeModules = exports.skipDirectories = exports.toFileUri = exports.setExecutableBit = exports.fixWin32DirectoryPermissions = exports.debounce = exports.incremental = void 0; const es = require("event-stream"); const _debounce = require("debounce"); -const gulp = require("gulp"); const _filter = require("gulp-filter"); const rename = require("gulp-rename"); -const concat = require("gulp-concat"); const path = require("path"); const fs = require("fs"); const _rimraf = require("rimraf"); @@ -386,14 +384,3 @@ function buildWebNodePaths(outDir) { return result; } exports.buildWebNodePaths = buildWebNodePaths; -function concatAll(concatAllOptions) { - return () => { - const concatenations = concatAllOptions.map(concatAllOption => { - return gulp - .src(concatAllOption.src) - .pipe(concat(concatAllOption.out)); - }); - return es.merge(...concatenations).pipe(gulp.dest('.')); - }; -} -exports.concatAll = concatAll; diff --git a/build/lib/util.ts b/build/lib/util.ts index a6284d573bbfe..a9779937bd042 100644 --- a/build/lib/util.ts +++ b/build/lib/util.ts @@ -5,10 +5,8 @@ import * as es from 'event-stream'; import _debounce = require('debounce'); -import * as gulp from 'gulp'; import * as _filter from 'gulp-filter'; import * as rename from 'gulp-rename'; -import * as concat from 'gulp-concat'; import * as _ from 'underscore'; import * as path from 'path'; import * as fs from 'fs'; @@ -462,28 +460,3 @@ export function buildWebNodePaths(outDir: string) { result.taskName = 'build-web-node-paths'; return result; } - - -export interface IConcatAllOpts { - /** - * Sources to concatenate. The entries will be concatenated - * in the order they are provided. - */ - src: string[]; - /** - * Destination file to concatenate to. - */ - out: string; -} - -export function concatAll(concatAllOptions: IConcatAllOpts[]): () => NodeJS.ReadWriteStream { - return () => { - const concatenations = concatAllOptions.map(concatAllOption => { - return gulp - .src(concatAllOption.src) - .pipe(concat(concatAllOption.out)); - }); - - return es.merge(...concatenations).pipe(gulp.dest('.')); - }; -} From bf56f0e10ec83d6d1de49a0e5c96ddd00e2373d3 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 19 Sep 2022 12:09:27 +0200 Subject: [PATCH 6/7] Avoid overwriting the nodejs closure require --- src/vs/loader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vs/loader.js b/src/vs/loader.js index 38eea8a3ca530..37baa395188b4 100644 --- a/src/vs/loader.js +++ b/src/vs/loader.js @@ -1941,7 +1941,7 @@ var AMDLoader; } if (env.isNode && !env.isElectronRenderer && !env.isElectronNodeIntegrationWebWorker) { module.exports = RequireFunc; - require = RequireFunc; + // require = RequireFunc; } else { if (!env.isElectronRenderer) { From ba5aba5495f08cebdd779029087fef0c80dec418 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Wed, 21 Sep 2022 07:15:30 +0200 Subject: [PATCH 7/7] Revert "build - exclude server main files" This reverts commit 736516624ea73fd13a4e2ac5359e5b54ec851553. --- build/gulpfile.reh.js | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/build/gulpfile.reh.js b/build/gulpfile.reh.js index 6812a7c854d4e..980f647c854ee 100644 --- a/build/gulpfile.reh.js +++ b/build/gulpfile.reh.js @@ -58,15 +58,10 @@ const serverResources = [ 'out-build/bootstrap-fork.js', 'out-build/bootstrap-amd.js', 'out-build/bootstrap-node.js', - 'out-build/paths.js', // Performance 'out-build/vs/base/common/performance.js', - // main entry points - 'out-build/server-cli.js', - 'out-build/server-main.js', - // Watcher 'out-build/vs/platform/files/**/*.exe', 'out-build/vs/platform/files/**/*.md', @@ -369,6 +364,21 @@ function tweakProductForServerWeb(product) { inlineAmdImages: true, bundleInfo: undefined, fileContentMapper: createVSCodeWebFileContentMapper('.build/extensions', type === 'reh-web' ? tweakProductForServerWeb(product) : product) + }, + commonJS: { + src: 'out-build', + entryPoints: [ + 'out-build/server-main.js', + 'out-build/server-cli.js' + ], + 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' + ] } } )