diff --git a/.changeset/esbuild-dependency-82f9a43d.md b/.changeset/esbuild-dependency-82f9a43d.md new file mode 100644 index 000000000..2872ece74 --- /dev/null +++ b/.changeset/esbuild-dependency-82f9a43d.md @@ -0,0 +1,7 @@ +--- +"@opennextjs/cloudflare": patch +--- + +fix: declare esbuild as runtime dependency + +esbuild is imported at build time by the Cloudflare adapter but was only in devDependencies, so consumers relied on hoisting from @opennextjs/aws. Add it to dependencies so builds work under npm ci and with hoist conflicts. diff --git a/packages/cloudflare/package.json b/packages/cloudflare/package.json index b65c774c8..6a1049f21 100644 --- a/packages/cloudflare/package.json +++ b/packages/cloudflare/package.json @@ -59,6 +59,7 @@ "cloudflare": "^4.4.1", "comment-json": "^4.5.1", "enquirer": "^2.4.1", + "esbuild": "catalog:", "glob": "catalog:", "ts-tqdm": "^0.8.6", "yargs": "catalog:" @@ -73,7 +74,6 @@ "@types/rclone.js": "^0.6.1", "@types/yargs": "catalog:", "diff": "^8.0.2", - "esbuild": "catalog:", "eslint": "catalog:", "eslint-plugin-import": "catalog:", "eslint-plugin-simple-import-sort": "catalog:", diff --git a/packages/cloudflare/src/cli/build/build-deps.spec.ts b/packages/cloudflare/src/cli/build/build-deps.spec.ts new file mode 100644 index 000000000..1b256e7b7 --- /dev/null +++ b/packages/cloudflare/src/cli/build/build-deps.spec.ts @@ -0,0 +1,26 @@ +import { readFileSync } from "node:fs"; +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +import { describe, expect, it } from "vitest"; + +/** + * Regression test for https://github.com/opennextjs/opennextjs-cloudflare/issues/1339 + * + * `esbuild` is imported at build time (see src/cli/build/bundle-server.ts and + * src/cli/build/open-next/*.ts) but used to be declared only in devDependencies, + * so consumers only got it by npm hoisting accident. It must be a real runtime + * `dependency` of the published package. + */ +const packageJsonPath = resolve(dirname(fileURLToPath(import.meta.url)), "../../../package.json"); + +describe("build-time dependencies", () => { + it("declares esbuild as a runtime dependency", () => { + const { dependencies } = JSON.parse(readFileSync(packageJsonPath, "utf8")) as { + dependencies?: Record; + }; + + expect(dependencies).toBeDefined(); + expect(dependencies?.["esbuild"]).toBeDefined(); + }); +});