diff --git a/.changeset/cloudflare-debug-alias.md b/.changeset/cloudflare-debug-alias.md new file mode 100644 index 000000000000..8b2f128f30f9 --- /dev/null +++ b/.changeset/cloudflare-debug-alias.md @@ -0,0 +1,5 @@ +--- +'@astrojs/cloudflare': patch +--- + +Fixes `ReferenceError: module is not defined` on every request when running `astro dev` with the Cloudflare adapter. The error was triggered whenever a page's dependency graph pulled in the CJS `debug` package (transitively via `micromark`, `stylus`, and many other common npm packages). The adapter now aliases `debug` to an internal ESM shim backed by `obug` in the `ssr`, `astro`, and `prerender` Vite environments, so the workerd runner used by `@cloudflare/vite-plugin` no longer hits the missing `module` global. diff --git a/packages/integrations/cloudflare/package.json b/packages/integrations/cloudflare/package.json index 2cf090f694f1..663dbcd56cd5 100644 --- a/packages/integrations/cloudflare/package.json +++ b/packages/integrations/cloudflare/package.json @@ -45,6 +45,7 @@ "@astrojs/internal-helpers": "workspace:*", "@astrojs/underscore-redirects": "workspace:*", "@cloudflare/vite-plugin": "^1.32.3", + "obug": "^2.1.1", "piccolore": "^0.1.3", "tinyglobby": "^0.2.15", "vite": "^7.3.2" diff --git a/packages/integrations/cloudflare/src/index.ts b/packages/integrations/cloudflare/src/index.ts index c3d17194ce6d..ffc947bbc7f9 100644 --- a/packages/integrations/cloudflare/src/index.ts +++ b/packages/integrations/cloudflare/src/index.ts @@ -1,6 +1,7 @@ import { createReadStream, existsSync, readFileSync } from 'node:fs'; import { appendFile, rename, stat } from 'node:fs/promises'; import { createInterface } from 'node:readline/promises'; +import { fileURLToPath } from 'node:url'; import { removeLeadingForwardSlash } from '@astrojs/internal-helpers/path'; import { createRedirectsFromAstroRoutes, printAsRedirects } from '@astrojs/underscore-redirects'; import { cloudflare as cfVitePlugin, type PluginConfig } from '@cloudflare/vite-plugin'; @@ -206,12 +207,24 @@ export default function createIntegration({ globalThis.astroCloudflareOptions = cfPluginConfig; } + // Replace the CJS `debug` package (pulled transitively by + // `micromark`, `stylus`, and many other npm packages) with an + // ESM-compatible shim backed by `obug`. The original `debug` + // references `module.exports` at the top level, which fails + // with `ReferenceError: module is not defined` when + // @cloudflare/vite-plugin loads it in the workerd runner used + // for `astro dev`, SSR and prerendering. + const debugShim = fileURLToPath(new URL('./shims/debug.js', import.meta.url)); + updateConfig({ build: { redirects: false, }, session, vite: { + resolve: { + alias: { debug: debugShim }, + }, plugins: [ ...(prerenderEnvironment === 'node' && command === 'dev' ? [createNodePrerenderPlugin()] diff --git a/packages/integrations/cloudflare/src/shims/debug.ts b/packages/integrations/cloudflare/src/shims/debug.ts new file mode 100644 index 000000000000..31943e7f26c7 --- /dev/null +++ b/packages/integrations/cloudflare/src/shims/debug.ts @@ -0,0 +1,16 @@ +// Drop-in ESM replacement for the `debug` package, used via Vite's +// `resolve.alias` in server environments that run under workerd +// (astro dev + @cloudflare/vite-plugin). +// +// The original `debug` package references `module.exports` at the top +// level of its CJS entrypoint, which throws `ReferenceError: module is +// not defined` when @cloudflare/vite-plugin loads it in the Workers +// runner. `obug` (https://www.npmjs.com/package/obug) is an ESM fork +// with the same behavior but exposes only named exports; this shim +// re-exposes a default export so consumers that do +// `import debug from "debug"` or `const debug = require("debug")` +// keep working after the alias is applied. +import { createDebug, disable, enable, enabled, namespaces } from 'obug'; + +export default createDebug; +export { createDebug, disable, enable, enabled, namespaces }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 18342628e9ce..76cd75bce60d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -126,10 +126,10 @@ importers: devDependencies: '@codspeed/vitest-plugin': specifier: 5.2.0 - version: 5.2.0(tinybench@2.9.0)(vite@7.3.2(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.98.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.98.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 5.2.0(tinybench@2.9.0)(vite@7.3.2(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.98.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.2.3)(vite@7.3.2(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.98.0)(tsx@4.21.0)(yaml@2.8.3))) vitest: specifier: ^4.1.0 - version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.98.0)(tsx@4.21.0)(yaml@2.8.3) + version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.2.3)(vite@7.3.2(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.98.0)(tsx@4.21.0)(yaml@2.8.3)) benchmark/packages/adapter: dependencies: @@ -236,7 +236,7 @@ importers: version: 18.3.1(react@18.3.1) vitest: specifier: ^4.1.0 - version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.98.0)(tsx@4.21.0)(yaml@2.8.3) + version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.2.3)(vite@7.3.2(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.98.0)(tsx@4.21.0)(yaml@2.8.3)) devDependencies: '@types/react': specifier: ^18.3.28 @@ -510,7 +510,7 @@ importers: version: link:../../packages/astro vitest: specifier: ^4.1.0 - version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.98.0)(tsx@4.21.0)(yaml@2.8.3) + version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.2.3)(vite@7.3.2(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.98.0)(tsx@4.21.0)(yaml@2.8.3)) packages/astro: dependencies: @@ -772,7 +772,7 @@ importers: version: 11.0.5 vitest: specifier: ^4.1.0 - version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.98.0)(tsx@4.21.0)(yaml@2.8.3) + version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.2.3)(vite@7.3.2(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.98.0)(tsx@4.21.0)(yaml@2.8.3)) optionalDependencies: sharp: specifier: ^0.34.0 @@ -4294,7 +4294,7 @@ importers: version: link:../../.. vitest: specifier: ^4.1.0 - version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.98.0)(tsx@4.21.0)(yaml@2.8.3) + version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.2.3)(vite@7.3.2(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.98.0)(tsx@4.21.0)(yaml@2.8.3)) packages/astro/test/fixtures/vue-component: dependencies: @@ -4608,6 +4608,9 @@ importers: '@cloudflare/vite-plugin': specifier: ^1.32.3 version: 1.32.3(@cloudflare/workers-types@4.20260228.0)(vite@7.3.2(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.98.0)(tsx@4.21.0)(yaml@2.8.3))(workerd@1.20260415.1) + obug: + specifier: ^2.1.1 + version: 2.1.1 piccolore: specifier: ^0.1.3 version: 0.1.3 @@ -15579,6 +15582,7 @@ packages: '@vitest/ui': 4.1.0 happy-dom: '*' jsdom: '*' + vite: ^7.3.2 peerDependenciesMeta: '@edge-runtime/vm': optional: true @@ -16693,12 +16697,12 @@ snapshots: transitivePeerDependencies: - debug - '@codspeed/vitest-plugin@5.2.0(tinybench@2.9.0)(vite@7.3.2(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.98.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.98.0)(tsx@4.21.0)(yaml@2.8.3))': + '@codspeed/vitest-plugin@5.2.0(tinybench@2.9.0)(vite@7.3.2(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.98.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.2.3)(vite@7.3.2(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.98.0)(tsx@4.21.0)(yaml@2.8.3)))': dependencies: '@codspeed/core': 5.2.0 tinybench: 2.9.0 vite: 7.3.2(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.98.0)(tsx@4.21.0)(yaml@2.8.3) - vitest: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.98.0)(tsx@4.21.0)(yaml@2.8.3) + vitest: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.2.3)(vite@7.3.2(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.98.0)(tsx@4.21.0)(yaml@2.8.3)) transitivePeerDependencies: - debug @@ -25473,7 +25477,7 @@ snapshots: optionalDependencies: vite: 7.3.2(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.98.0)(tsx@4.21.0)(yaml@2.8.3) - vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.98.0)(tsx@4.21.0)(yaml@2.8.3): + vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@25.2.3)(vite@7.3.2(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.98.0)(tsx@4.21.0)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.0 '@vitest/mocker': 4.1.0(vite@7.3.2(@types/node@25.2.3)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.98.0)(tsx@4.21.0)(yaml@2.8.3)) @@ -25499,17 +25503,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@types/node': 25.2.3 transitivePeerDependencies: - - jiti - - less - - lightningcss - msw - - sass - - sass-embedded - - stylus - - sugarss - - terser - - tsx - - yaml volar-service-css@0.0.70(@volar/language-service@2.4.28): dependencies: