diff --git a/.changeset/fix-unhandled-rejection-esbuild-entry-deleted.md b/.changeset/fix-unhandled-rejection-esbuild-entry-deleted.md new file mode 100644 index 0000000000..a5fba9b8fd --- /dev/null +++ b/.changeset/fix-unhandled-rejection-esbuild-entry-deleted.md @@ -0,0 +1,5 @@ +--- +"wrangler": patch +--- + +Fix unhandled promise rejection when the worker entry point is deleted or moved during `wrangler dev` hot-reload — now logs a warning and skips the update instead of crashing diff --git a/packages/wrangler/src/dev/use-esbuild.ts b/packages/wrangler/src/dev/use-esbuild.ts index 7df6298ed9..174bcb16ac 100644 --- a/packages/wrangler/src/dev/use-esbuild.ts +++ b/packages/wrangler/src/dev/use-esbuild.ts @@ -12,6 +12,7 @@ import { getWrangler1xLegacyModuleReferences, noopModuleCollector, } from "../deployment-bundle/module-collection"; +import { logger } from "../logger"; import type { SourceMapMetadata } from "../deployment-bundle/bundle"; import type { Entry } from "../deployment-bundle/entry"; import type { CfModule, CfModuleType, Config } from "@cloudflare/workers-utils"; @@ -131,13 +132,23 @@ export function runBuild( previousBundle, "Rebuild triggered with no previous build available" ); - previousBundle.modules = dedupeModulesByName([ - ...(moduleCollector?.modules ?? []), - ...newAdditionalModules, - ]); + let entrypointSource: string; + try { + entrypointSource = readFileSync(previousBundle.path, "utf8"); + } catch (e) { + // Entry point was deleted or moved between builds — skip this update. + logger.once.warn( + `Could not read entrypoint "${previousBundle.path}": ${(e as NodeJS.ErrnoException).message}` + ); + return previousBundle; + } return { ...previousBundle, - entrypointSource: readFileSync(previousBundle.path, "utf8"), + modules: dedupeModulesByName([ + ...(moduleCollector?.modules ?? []), + ...newAdditionalModules, + ]), + entrypointSource, id: previousBundle.id + 1, }; });