diff --git a/examples/e2e/app-router/next.config.ts b/examples/e2e/app-router/next.config.ts index 6b6ae2af..c5d52ff6 100644 --- a/examples/e2e/app-router/next.config.ts +++ b/examples/e2e/app-router/next.config.ts @@ -1,4 +1,6 @@ import type { NextConfig } from "next"; +const { initOpenNextCloudflareForDev } = require("@opennextjs/cloudflare"); +initOpenNextCloudflareForDev(); const nextConfig: NextConfig = { poweredByHeader: false, diff --git a/packages/cloudflare/src/api/cloudflare-context.ts b/packages/cloudflare/src/api/cloudflare-context.ts index 279b74f5..6e868a28 100644 --- a/packages/cloudflare/src/api/cloudflare-context.ts +++ b/packages/cloudflare/src/api/cloudflare-context.ts @@ -282,6 +282,44 @@ async function monkeyPatchVmModuleEdgeContext(cloudflareContext: CloudflareConte }; } +async function patchWranglerConfig() { + //First thing here, we try to load the `wrangler.jsonc` file + let existingWranglerConfig: Record | null = null; + const originalWranglerConfigPath = `${process.cwd()}/wrangler.jsonc`; + const patchedWranglerConfigPath = `${process.cwd()}/.open-next/dev-wrangler.jsonc`; + try { + // We can't use `node:fs/promises` here in next 14 it seems + // eslint-disable-next-line unicorn/prefer-node-protocol + const fs = await import("fs/promises"); + //@ts-ignore + existingWranglerConfig = JSON.parse(await fs.readFile(originalWranglerConfigPath, "utf-8")); + if (!existingWranglerConfig) { + console.error("If you use one of the DO overrides, you need to have a wrangler.jsonc file"); + return undefined; + } + if ("durable_objects" in existingWranglerConfig) { + delete existingWranglerConfig["durable_objects"]; + } else { + // If the durable_objects key is not present, we don't need to patch the wrangler config + return undefined; + } + + // We need to create the .open-next folder if it doesn't exist + await fs.mkdir(`${process.cwd()}/.open-next`, { recursive: true }); + // We copy the .dev.vars file to .open-next/.dev.vars + try { + await fs.cp(`${process.cwd()}/.dev.vars`, `${process.cwd()}/.open-next/.dev.vars`); + } catch { + // There is no .dev.vars file + } + await fs.writeFile(patchedWranglerConfigPath, JSON.stringify(existingWranglerConfig)); + } catch { + console.error("If you use one of the DO overrides, you need to have a wrangler.jsonc file"); + return undefined; + } + return existingWranglerConfig ? patchedWranglerConfigPath : undefined; +} + /** * Gets a cloudflare context object from wrangler * @@ -291,11 +329,13 @@ async function getCloudflareContextFromWrangler< CfProperties extends Record = IncomingRequestCfProperties, Context = ExecutionContext, >(): Promise> { + const configPath = await patchWranglerConfig(); // Note: we never want wrangler to be bundled in the Next.js app, that's why the import below looks like it does const { getPlatformProxy } = await import(/* webpackIgnore: true */ `${"__wrangler".replaceAll("_", "")}`); const { env, cf, ctx } = await getPlatformProxy({ // This allows the selection of a wrangler environment while running in next dev mode environment: process.env.NEXT_DEV_WRANGLER_ENV, + configPath, }); return { env,