Skip to content

Commit b4d2f1d

Browse files
mjbvzCopilot
andcommitted
Switch to esbuild's native watcher for building extensions
This should be good to use now and also lets use benefit from incremental builds Co-authored-by: Copilot <copilot@github.com>
1 parent 1c0b3b8 commit b4d2f1d

2 files changed

Lines changed: 23 additions & 38 deletions

File tree

extensions/esbuild-extension-common.mts

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,6 @@ async function build(options: BuildOptions, didBuild?: (outDir: string) => unkno
2020
await didBuild?.(options.outdir);
2121
}
2222

23-
/**
24-
* Build the source code once using esbuild, logging errors instead of throwing.
25-
*/
26-
async function tryBuild(options: BuildOptions, didBuild?: (outDir: string) => unknown): Promise<void> {
27-
try {
28-
await build(options, didBuild);
29-
} catch (err) {
30-
console.error(err);
31-
}
32-
}
33-
3423
interface RunConfig {
3524
readonly platform: 'node' | 'browser';
3625
readonly format?: 'cjs' | 'esm';
@@ -88,9 +77,14 @@ export async function run(config: RunConfig, args: string[], didBuild?: (outDir:
8877

8978
const isWatch = args.indexOf('--watch') >= 0;
9079
if (isWatch) {
91-
await tryBuild(resolvedOptions, didBuild);
92-
const watcher = await import('@parcel/watcher');
93-
watcher.subscribe(config.srcDir, () => tryBuild(resolvedOptions, didBuild));
80+
if (didBuild) {
81+
resolvedOptions.plugins = [
82+
...(resolvedOptions.plugins || []),
83+
{ name: 'did-build', setup(build) { build.onEnd(() => { didBuild(outdir); }); } },
84+
];
85+
}
86+
const ctx = await esbuild.context(resolvedOptions);
87+
await ctx.watch();
9488
} else {
9589
return build(resolvedOptions, didBuild).catch(() => process.exit(1));
9690
}

extensions/esbuild-webview-common.mts

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -18,30 +18,10 @@ export type BuildOptions = Partial<esbuild.BuildOptions> & {
1818
* Build the source code once using esbuild.
1919
*/
2020
async function build(options: BuildOptions, didBuild?: (outDir: string) => unknown): Promise<void> {
21-
await esbuild.build({
22-
bundle: true,
23-
minify: true,
24-
sourcemap: false,
25-
format: 'esm',
26-
platform: 'browser',
27-
target: ['es2024'],
28-
...options,
29-
});
30-
21+
await esbuild.build(options);
3122
await didBuild?.(options.outdir);
3223
}
3324

34-
/**
35-
* Build the source code once using esbuild, logging errors instead of throwing.
36-
*/
37-
async function tryBuild(options: BuildOptions, didBuild?: (outDir: string) => unknown): Promise<void> {
38-
try {
39-
await build(options, didBuild);
40-
} catch (err) {
41-
console.error(err);
42-
}
43-
}
44-
4525
export async function run(
4626
config: {
4727
srcDir: string;
@@ -61,6 +41,12 @@ export async function run(
6141
}
6242

6343
const resolvedOptions: BuildOptions = {
44+
bundle: true,
45+
minify: true,
46+
sourcemap: false,
47+
format: 'esm',
48+
platform: 'browser',
49+
target: ['es2024'],
6450
entryPoints: config.entryPoints,
6551
outdir,
6652
logOverride: {
@@ -71,9 +57,14 @@ export async function run(
7157

7258
const isWatch = args.indexOf('--watch') >= 0;
7359
if (isWatch) {
74-
await tryBuild(resolvedOptions, didBuild);
75-
const watcher = await import('@parcel/watcher');
76-
watcher.subscribe(config.srcDir, () => tryBuild(resolvedOptions, didBuild));
60+
if (didBuild) {
61+
resolvedOptions.plugins = [
62+
...(resolvedOptions.plugins || []),
63+
{ name: 'did-build', setup(build) { build.onEnd(() => { didBuild(outdir); }); } },
64+
];
65+
}
66+
const ctx = await esbuild.context(resolvedOptions);
67+
await ctx.watch();
7768
} else {
7869
return build(resolvedOptions, didBuild).catch(() => process.exit(1));
7970
}

0 commit comments

Comments
 (0)