From 8e4d7b6412516157116f415a29ffa87be4d17f9e Mon Sep 17 00:00:00 2001 From: Mateusz Bocian Date: Thu, 1 May 2025 08:18:17 -0400 Subject: [PATCH 1/2] fix: ensure internal x-middleware-set-cookie header is not set when setting cookies in middleware --- edge-runtime/lib/middleware.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/edge-runtime/lib/middleware.ts b/edge-runtime/lib/middleware.ts index 28f923a794..f2ed78e861 100644 --- a/edge-runtime/lib/middleware.ts +++ b/edge-runtime/lib/middleware.ts @@ -67,6 +67,10 @@ export function mergeMiddlewareCookies(middlewareResponse: Response, lambdaReque const middlewareCookies = middlewareResponse.headers.get('x-middleware-set-cookie') if (middlewareCookies) { + // Next expects internal headers to be omitted when cookies are set by the middleware + // See: https://github.com/vercel/next.js/blob/005db43079c7b59fd8c2594e8362761dc4cb3211/test/e2e/app-dir/app-middleware/app-middleware.test.ts#L197-L207 + middlewareResponse.headers.delete('x-middleware-set-cookie') + // Targets commas that are not followed by whitespace // See: https://github.com/vercel/next.js/blob/e6145d3a37bb4c7b481fd58e05cdff9046ace8ad/packages/next/src/server/web/spec-extension/response.ts#L58-L66 const regex = new RegExp(/,(?!\s)/) From d2d41fa9f6aaed56d76ebf03744a70528c54844b Mon Sep 17 00:00:00 2001 From: Mateusz Bocian Date: Mon, 5 May 2025 14:49:32 -0400 Subject: [PATCH 2/2] fix: make environment variables for draft mode available at edge --- src/build/functions/edge.ts | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/build/functions/edge.ts b/src/build/functions/edge.ts index d551afda5c..f68be7ca95 100644 --- a/src/build/functions/edge.ts +++ b/src/build/functions/edge.ts @@ -119,7 +119,7 @@ const writeHandlerFile = async (ctx: PluginContext, { matchers, name }: NextDefi const copyHandlerDependencies = async ( ctx: PluginContext, - { name, files, wasm }: NextDefinition, + { name, env, files, wasm }: NextDefinition, ) => { const srcDir = join(ctx.standaloneDir, ctx.nextDistDir) const destDir = join(ctx.edgeFunctionsDir, getHandlerName({ name })) @@ -132,6 +132,11 @@ const copyHandlerDependencies = async ( const outputFile = join(destDir, `server/${name}.js`) + // Prepare environment variables for draft-mode (i.e. __NEXT_PREVIEW_MODE_ID, __NEXT_PREVIEW_MODE_SIGNING_KEY, __NEXT_PREVIEW_MODE_ENCRYPTION_KEY) + for (const [key, value] of Object.entries(env)) { + parts.push(`process.env.${key} = '${value}';`) + } + if (wasm?.length) { for (const wasmChunk of wasm ?? []) { const data = await readFile(join(srcDir, wasmChunk.filePath)) @@ -161,16 +166,16 @@ const buildHandlerDefinition = ( ctx: PluginContext, { name, matchers, page }: NextDefinition, ): Array => { - const fun = getHandlerName({ name }) - const funName = name.endsWith('middleware') + const functionHandlerName = getHandlerName({ name }) + const functionName = name.endsWith('middleware') ? 'Next.js Middleware Handler' : `Next.js Edge Handler: ${page}` const cache = name.endsWith('middleware') ? undefined : ('manual' as const) const generator = `${ctx.pluginName}@${ctx.pluginVersion}` return augmentMatchers(matchers, ctx).map((matcher) => ({ - function: fun, - name: funName, + function: functionHandlerName, + name: functionName, pattern: matcher.regexp, cache, generator, @@ -183,10 +188,7 @@ export const clearStaleEdgeHandlers = async (ctx: PluginContext) => { export const createEdgeHandlers = async (ctx: PluginContext) => { const nextManifest = await ctx.getMiddlewareManifest() - const nextDefinitions = [ - ...Object.values(nextManifest.middleware), - // ...Object.values(nextManifest.functions) - ] + const nextDefinitions = [...Object.values(nextManifest.middleware)] await Promise.all(nextDefinitions.map((def) => createEdgeHandler(ctx, def))) const netlifyDefinitions = nextDefinitions.flatMap((def) => buildHandlerDefinition(ctx, def))