Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/esbuild-webview-common.mjs
3285 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
// @ts-check
6
/**
7
* @fileoverview Common build script for extension scripts used in in webviews.
8
*/
9
import path from 'node:path';
10
import esbuild from 'esbuild';
11
12
/**
13
* @typedef {Partial<import('esbuild').BuildOptions> & {
14
* entryPoints: string[] | Record<string, string> | { in: string, out: string }[];
15
* outdir: string;
16
* }} BuildOptions
17
*/
18
19
/**
20
* Build the source code once using esbuild.
21
*
22
* @param {BuildOptions} options
23
* @param {(outDir: string) => unknown} [didBuild]
24
*/
25
async function build(options, didBuild) {
26
await esbuild.build({
27
bundle: true,
28
minify: true,
29
sourcemap: false,
30
format: 'esm',
31
platform: 'browser',
32
target: ['es2024'],
33
...options,
34
});
35
36
await didBuild?.(options.outdir);
37
}
38
39
/**
40
* Build the source code once using esbuild, logging errors instead of throwing.
41
*
42
* @param {BuildOptions} options
43
* @param {(outDir: string) => unknown} [didBuild]
44
*/
45
async function tryBuild(options, didBuild) {
46
try {
47
await build(options, didBuild);
48
} catch (err) {
49
console.error(err);
50
}
51
}
52
53
/**
54
* @param {{
55
* srcDir: string;
56
* outdir: string;
57
* entryPoints: string[] | Record<string, string> | { in: string, out: string }[];
58
* additionalOptions?: Partial<import('esbuild').BuildOptions>
59
* }} config
60
* @param {string[]} args
61
* @param {(outDir: string) => unknown} [didBuild]
62
*/
63
export async function run(config, args, didBuild) {
64
let outdir = config.outdir;
65
const outputRootIndex = args.indexOf('--outputRoot');
66
if (outputRootIndex >= 0) {
67
const outputRoot = args[outputRootIndex + 1];
68
const outputDirName = path.basename(outdir);
69
outdir = path.join(outputRoot, outputDirName);
70
}
71
72
/** @type {BuildOptions} */
73
const resolvedOptions = {
74
entryPoints: config.entryPoints,
75
outdir,
76
logOverride: {
77
'import-is-undefined': 'error',
78
},
79
...(config.additionalOptions || {}),
80
};
81
82
const isWatch = args.indexOf('--watch') >= 0;
83
if (isWatch) {
84
await tryBuild(resolvedOptions, didBuild);
85
const watcher = await import('@parcel/watcher');
86
watcher.subscribe(config.srcDir, () => tryBuild(resolvedOptions, didBuild));
87
} else {
88
return build(resolvedOptions, didBuild).catch(() => process.exit(1));
89
}
90
}
91
92