Skip to content

Commit 452b59f

Browse files
authored
Merge pull request #312283 from mjbvz/dev/mjbvz/vague-dormouse
Switch to esbuild's native watcher for building extensions
2 parents 3146146 + 2471611 commit 452b59f

2 files changed

Lines changed: 64 additions & 57 deletions

File tree

extensions/esbuild-extension-common.mts

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -12,25 +12,6 @@ type BuildOptions = Partial<esbuild.BuildOptions> & {
1212
outdir: string;
1313
};
1414

15-
/**
16-
* Build the source code once using esbuild.
17-
*/
18-
async function build(options: BuildOptions, didBuild?: (outDir: string) => unknown): Promise<void> {
19-
await esbuild.build(options);
20-
await didBuild?.(options.outdir);
21-
}
22-
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-
3415
interface RunConfig {
3516
readonly platform: 'node' | 'browser';
3617
readonly format?: 'cjs' | 'esm';
@@ -88,10 +69,34 @@ export async function run(config: RunConfig, args: string[], didBuild?: (outDir:
8869

8970
const isWatch = args.indexOf('--watch') >= 0;
9071
if (isWatch) {
91-
await tryBuild(resolvedOptions, didBuild);
92-
const watcher = await import('@parcel/watcher');
93-
watcher.subscribe(config.srcDir, () => tryBuild(resolvedOptions, didBuild));
72+
if (didBuild) {
73+
resolvedOptions.plugins = [
74+
...(resolvedOptions.plugins || []),
75+
{
76+
name: 'did-build', setup(pluginBuild) {
77+
pluginBuild.onEnd(async result => {
78+
if (result.errors.length > 0) {
79+
return;
80+
}
81+
82+
try {
83+
await didBuild(outdir);
84+
} catch (error) {
85+
console.error('didBuild failed:', error);
86+
}
87+
});
88+
},
89+
}
90+
];
91+
}
92+
const ctx = await esbuild.context(resolvedOptions);
93+
await ctx.watch();
9494
} else {
95-
return build(resolvedOptions, didBuild).catch(() => process.exit(1));
95+
try {
96+
await esbuild.build(resolvedOptions);
97+
await didBuild?.(outdir);
98+
} catch {
99+
process.exit(1);
100+
}
96101
}
97102
}

extensions/esbuild-webview-common.mts

Lines changed: 36 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -10,38 +10,10 @@ import path from 'node:path';
1010
import esbuild from 'esbuild';
1111

1212
export type BuildOptions = Partial<esbuild.BuildOptions> & {
13-
entryPoints: string[] | Record<string, string> | { in: string; out: string }[];
14-
outdir: string;
13+
readonly entryPoints: esbuild.BuildOptions['entryPoints'];
14+
readonly outdir: string;
1515
};
1616

17-
/**
18-
* Build the source code once using esbuild.
19-
*/
20-
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-
31-
await didBuild?.(options.outdir);
32-
}
33-
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-
4517
export async function run(
4618
config: {
4719
srcDir: string;
@@ -61,6 +33,12 @@ export async function run(
6133
}
6234

6335
const resolvedOptions: BuildOptions = {
36+
bundle: true,
37+
minify: true,
38+
sourcemap: false,
39+
format: 'esm',
40+
platform: 'browser',
41+
target: ['es2024'],
6442
entryPoints: config.entryPoints,
6543
outdir,
6644
logOverride: {
@@ -71,10 +49,34 @@ export async function run(
7149

7250
const isWatch = args.indexOf('--watch') >= 0;
7351
if (isWatch) {
74-
await tryBuild(resolvedOptions, didBuild);
75-
const watcher = await import('@parcel/watcher');
76-
watcher.subscribe(config.srcDir, () => tryBuild(resolvedOptions, didBuild));
52+
if (didBuild) {
53+
resolvedOptions.plugins = [
54+
...(resolvedOptions.plugins || []),
55+
{
56+
name: 'did-build', setup(pluginBuild) {
57+
pluginBuild.onEnd(async result => {
58+
if (result.errors.length > 0) {
59+
return;
60+
}
61+
62+
try {
63+
await didBuild(outdir);
64+
} catch (error) {
65+
console.error('didBuild failed:', error);
66+
}
67+
});
68+
},
69+
}
70+
];
71+
}
72+
const ctx = await esbuild.context(resolvedOptions);
73+
await ctx.watch();
7774
} else {
78-
return build(resolvedOptions, didBuild).catch(() => process.exit(1));
75+
try {
76+
await esbuild.build(resolvedOptions);
77+
await didBuild?.(outdir);
78+
} catch {
79+
process.exit(1);
80+
}
7981
}
8082
}

0 commit comments

Comments
 (0)