Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/build/gulpfile.vscode.web.ts
4770 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import gulp from 'gulp';
7
import * as path from 'path';
8
import es from 'event-stream';
9
import * as util from './lib/util.ts';
10
import { getVersion } from './lib/getVersion.ts';
11
import * as task from './lib/task.ts';
12
import * as optimize from './lib/optimize.ts';
13
import { readISODate } from './lib/date.ts';
14
import product from '../product.json' with { type: 'json' };
15
import rename from 'gulp-rename';
16
import filter from 'gulp-filter';
17
import { getProductionDependencies } from './lib/dependencies.ts';
18
import vfs from 'vinyl-fs';
19
import packageJson from '../package.json' with { type: 'json' };
20
import { compileBuildWithManglingTask } from './gulpfile.compile.ts';
21
import * as extensions from './lib/extensions.ts';
22
import jsonEditor from 'gulp-json-editor';
23
import buildfile from './buildfile.ts';
24
25
const REPO_ROOT = path.dirname(import.meta.dirname);
26
const BUILD_ROOT = path.dirname(REPO_ROOT);
27
const WEB_FOLDER = path.join(REPO_ROOT, 'remote', 'web');
28
29
const commit = getVersion(REPO_ROOT);
30
const quality = (product as { quality?: string }).quality;
31
const version = (quality && quality !== 'stable') ? `${packageJson.version}-${quality}` : packageJson.version;
32
33
export const vscodeWebResourceIncludes = [
34
35
// NLS
36
'out-build/nls.messages.js',
37
38
// Accessibility Signals
39
'out-build/vs/platform/accessibilitySignal/browser/media/*.mp3',
40
41
// Welcome
42
'out-build/vs/workbench/contrib/welcomeGettingStarted/common/media/**/*.{svg,png}',
43
44
// Extensions
45
'out-build/vs/workbench/contrib/extensions/browser/media/{theme-icon.png,language-icon.svg}',
46
'out-build/vs/workbench/services/extensionManagement/common/media/*.{svg,png}',
47
48
// Webview
49
'out-build/vs/workbench/contrib/webview/browser/pre/*.{js,html}',
50
51
// Tree Sitter highlights
52
'out-build/vs/editor/common/languages/highlights/*.scm',
53
54
// Tree Sitter injections
55
'out-build/vs/editor/common/languages/injections/*.scm',
56
57
// Extension Host Worker
58
'out-build/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html'
59
];
60
61
const vscodeWebResources = [
62
63
// Includes
64
...vscodeWebResourceIncludes,
65
66
// Excludes
67
'!out-build/vs/**/{node,electron-browser,electron-main,electron-utility}/**',
68
'!out-build/vs/editor/standalone/**',
69
'!out-build/vs/workbench/**/*-tb.png',
70
'!out-build/vs/code/**/*-dev.html',
71
'!**/test/**'
72
];
73
74
const vscodeWebEntryPoints = [
75
buildfile.workerEditor,
76
buildfile.workerExtensionHost,
77
buildfile.workerNotebook,
78
buildfile.workerLanguageDetection,
79
buildfile.workerLocalFileSearch,
80
buildfile.workerOutputLinks,
81
buildfile.workerBackgroundTokenization,
82
buildfile.keyboardMaps,
83
buildfile.workbenchWeb,
84
].flat();
85
86
/**
87
* @param extensionsRoot The location where extension will be read from
88
* @param product The parsed product.json file contents
89
*/
90
export const createVSCodeWebFileContentMapper = (extensionsRoot: string, product: typeof import('../product.json')) => {
91
return (path: string): ((content: string) => string) | undefined => {
92
if (path.endsWith('vs/platform/product/common/product.js')) {
93
return content => {
94
const productConfiguration = JSON.stringify({
95
...product,
96
version,
97
commit,
98
date: readISODate('out-build')
99
});
100
return content.replace('/*BUILD->INSERT_PRODUCT_CONFIGURATION*/', () => productConfiguration.substr(1, productConfiguration.length - 2) /* without { and }*/);
101
};
102
} else if (path.endsWith('vs/workbench/services/extensionManagement/browser/builtinExtensionsScannerService.js')) {
103
return content => {
104
const builtinExtensions = JSON.stringify(extensions.scanBuiltinExtensions(extensionsRoot));
105
return content.replace('/*BUILD->INSERT_BUILTIN_EXTENSIONS*/', () => builtinExtensions.substr(1, builtinExtensions.length - 2) /* without [ and ]*/);
106
};
107
}
108
109
return undefined;
110
};
111
};
112
113
const bundleVSCodeWebTask = task.define('bundle-vscode-web', task.series(
114
util.rimraf('out-vscode-web'),
115
optimize.bundleTask(
116
{
117
out: 'out-vscode-web',
118
esm: {
119
src: 'out-build',
120
entryPoints: vscodeWebEntryPoints,
121
resources: vscodeWebResources,
122
fileContentMapper: createVSCodeWebFileContentMapper('.build/web/extensions', product)
123
}
124
}
125
)
126
));
127
128
const minifyVSCodeWebTask = task.define('minify-vscode-web', task.series(
129
bundleVSCodeWebTask,
130
util.rimraf('out-vscode-web-min'),
131
optimize.minifyTask('out-vscode-web', `https://main.vscode-cdn.net/sourcemaps/${commit}/core`)
132
));
133
gulp.task(minifyVSCodeWebTask);
134
135
function packageTask(sourceFolderName: string, destinationFolderName: string) {
136
const destination = path.join(BUILD_ROOT, destinationFolderName);
137
138
return () => {
139
const src = gulp.src(sourceFolderName + '/**', { base: '.' })
140
.pipe(rename(function (path) { path.dirname = path.dirname!.replace(new RegExp('^' + sourceFolderName), 'out'); }));
141
142
const extensions = gulp.src('.build/web/extensions/**', { base: '.build/web', dot: true });
143
144
const sources = es.merge(src, extensions)
145
.pipe(filter(['**', '!**/*.{js,css}.map'], { dot: true }));
146
147
const name = product.nameShort;
148
const packageJsonStream = gulp.src(['remote/web/package.json'], { base: 'remote/web' })
149
.pipe(jsonEditor({ name, version, type: 'module' }));
150
151
const license = gulp.src(['remote/LICENSE'], { base: 'remote', allowEmpty: true });
152
153
const productionDependencies = getProductionDependencies(WEB_FOLDER);
154
const dependenciesSrc = productionDependencies.map(d => path.relative(REPO_ROOT, d)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`, `!${d}/.bin/**`]).flat();
155
156
const deps = gulp.src(dependenciesSrc, { base: 'remote/web', dot: true })
157
.pipe(filter(['**', '!**/package-lock.json']))
158
.pipe(util.cleanNodeModules(path.join(import.meta.dirname, '.webignore')));
159
160
const favicon = gulp.src('resources/server/favicon.ico', { base: 'resources/server' });
161
const manifest = gulp.src('resources/server/manifest.json', { base: 'resources/server' });
162
const pwaicons = es.merge(
163
gulp.src('resources/server/code-192.png', { base: 'resources/server' }),
164
gulp.src('resources/server/code-512.png', { base: 'resources/server' })
165
);
166
167
const all = es.merge(
168
packageJsonStream,
169
license,
170
sources,
171
deps,
172
favicon,
173
manifest,
174
pwaicons
175
);
176
177
const result = all
178
.pipe(util.skipDirectories())
179
.pipe(util.fixWin32DirectoryPermissions());
180
181
return result.pipe(vfs.dest(destination));
182
};
183
}
184
185
const compileWebExtensionsBuildTask = task.define('compile-web-extensions-build', task.series(
186
task.define('clean-web-extensions-build', util.rimraf('.build/web/extensions')),
187
task.define('bundle-web-extensions-build', () => extensions.packageAllLocalExtensionsStream(true, false).pipe(gulp.dest('.build/web'))),
188
task.define('bundle-marketplace-web-extensions-build', () => extensions.packageMarketplaceExtensionsStream(true).pipe(gulp.dest('.build/web'))),
189
task.define('bundle-web-extension-media-build', () => extensions.buildExtensionMedia(false, '.build/web/extensions')),
190
));
191
gulp.task(compileWebExtensionsBuildTask);
192
193
const dashed = (str: string) => (str ? `-${str}` : ``);
194
195
['', 'min'].forEach(minified => {
196
const sourceFolderName = `out-vscode-web${dashed(minified)}`;
197
const destinationFolderName = `vscode-web`;
198
199
const vscodeWebTaskCI = task.define(`vscode-web${dashed(minified)}-ci`, task.series(
200
compileWebExtensionsBuildTask,
201
minified ? minifyVSCodeWebTask : bundleVSCodeWebTask,
202
util.rimraf(path.join(BUILD_ROOT, destinationFolderName)),
203
packageTask(sourceFolderName, destinationFolderName)
204
));
205
gulp.task(vscodeWebTaskCI);
206
207
const vscodeWebTask = task.define(`vscode-web${dashed(minified)}`, task.series(
208
compileBuildWithManglingTask,
209
vscodeWebTaskCI
210
));
211
gulp.task(vscodeWebTask);
212
});
213
214