From 25f82b67bc226b96b122ab0738fb3d2c8e1953a1 Mon Sep 17 00:00:00 2001 From: Severin Ibarluzea Date: Thu, 25 Sep 2025 16:05:15 -0700 Subject: [PATCH] Revert "Ensure dev server rebuilds without persistent esbuild context (#43)" This reverts commit e100b4751950e1c70c0d2c0c26c5d7914ff43e7b. --- src/dev/dev-server2.ts | 64 +++++++++++++++++------------------------- tsconfig.json | 3 +- 2 files changed, 26 insertions(+), 41 deletions(-) diff --git a/src/dev/dev-server2.ts b/src/dev/dev-server2.ts index 48f45c8..acdeb55 100644 --- a/src/dev/dev-server2.ts +++ b/src/dev/dev-server2.ts @@ -32,6 +32,7 @@ export const startDevServer2 = async (options: StartDevServerOptions) => { const devBundlePath = path.join(tempDir, "dev-bundle.js") let server: http.Server | null = null + let buildContext: esbuild.BuildContext | null = null const mutableHttpHandler = { current: (_req, res) => { // This handler is used before the first build or if a build fails to produce a handler. @@ -42,10 +43,6 @@ export const startDevServer2 = async (options: StartDevServerOptions) => { const ignore = await isGitIgnored({ cwd: rootDirectory }) - let isBuilding = false - let rebuildScheduled = false - let manifestNeedsUpdate = true - const updateManifest = async () => { const manifestContent = await constructManifest({ routesDirectory: config.routesDirectory, @@ -55,25 +52,28 @@ export const startDevServer2 = async (options: StartDevServerOptions) => { await fs.writeFile(manifestPath, manifestContent, "utf-8") } - const runSingleBuild = async () => { + const build = async () => { options.onBuildStart?.() + const buildStartedAt = performance.now() + try { - if (manifestNeedsUpdate) { + if (!buildContext) { await updateManifest() - manifestNeedsUpdate = false + buildContext = await esbuild.context({ + entryPoints: [manifestPath], + bundle: true, + platform: config.platform === "wintercg-minimal" ? "browser" : "node", + packages: config.platform === "node" ? "external" : undefined, + format: config.platform === "wintercg-minimal" ? "cjs" : "esm", + outfile: devBundlePath, + write: true, + sourcemap: "inline", + logLevel: "silent", + }) } - const result = await esbuild.build({ - entryPoints: [manifestPath], - bundle: true, - platform: config.platform === "wintercg-minimal" ? "browser" : "node", - packages: config.platform === "node" ? "external" : undefined, - format: config.platform === "wintercg-minimal" ? "cjs" : "esm", - outfile: devBundlePath, - write: true, - sourcemap: "inline", - logLevel: "silent", - }) + const result = await buildContext.rebuild() + const durationMs = performance.now() - buildStartedAt if (result.errors.length === 0) { options.onBuildEnd?.({ @@ -190,27 +190,9 @@ export const startDevServer2 = async (options: StartDevServerOptions) => { errorMessage: err.message, buildUpdatedAtMs: Date.now(), }) - // If the manifest update failed, try again on the next build. - manifestNeedsUpdate = true } } - const build = async () => { - if (isBuilding) { - rebuildScheduled = true - return - } - - isBuilding = true - - do { - rebuildScheduled = false - await runSingleBuild() - } while (rebuildScheduled) - - isBuilding = false - } - const watcher = new Watcher(rootDirectory, { recursive: true, ignoreInitial: false, // Build on initial scan @@ -228,7 +210,7 @@ export const startDevServer2 = async (options: StartDevServerOptions) => { const handleFileChange = async (isManifestChange: boolean = false) => { if (isManifestChange) { - manifestNeedsUpdate = true + await updateManifest() } await build() } @@ -247,7 +229,9 @@ export const startDevServer2 = async (options: StartDevServerOptions) => { await handleFileChange(true) }) - // Initial build is triggered immediately. + // Initial build is triggered by watcher's ignoreInitial: false + // If ignoreInitial were true, you'd call: + await updateManifest() await build() const stop = async () => { @@ -255,7 +239,9 @@ export const startDevServer2 = async (options: StartDevServerOptions) => { if (server) { await new Promise((resolve) => server!.close(() => resolve())) } - esbuild.stop() + if (buildContext) { + await buildContext.dispose() + } } process.on("SIGINT", async () => { diff --git a/tsconfig.json b/tsconfig.json index c97f9a9..9458185 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,8 +9,7 @@ "strict": true /* Enable all strict type-checking options. */, "skipLibCheck": true /* Skip type checking all .d.ts files. */, "paths": { - "src/*": ["./src/*"], - "winterspec": ["./src/index.ts"] + "src/*": ["./src/*"] }, "resolveJsonModule": true, "rootDir": "./"