diff --git a/packages/next/server/web/spec-extension/cookies.ts b/packages/next/server/web/spec-extension/cookies.ts index 791d0be5cf4b..e1b06f646ddb 100644 --- a/packages/next/server/web/spec-extension/cookies.ts +++ b/packages/next/server/web/spec-extension/cookies.ts @@ -35,7 +35,7 @@ const deserializeCookie = (input: Request | Response): string[] => { const serializeCookie = (input: string[]) => input.join(', ') -export class Cookies extends Map { +export class Cookies extends Map { constructor(input?: string | null) { const parsedInput = typeof input === 'string' ? cookie.parse(input) : {} super(Object.entries(parsedInput)) @@ -62,6 +62,13 @@ export class NextCookies extends Cookies { set = (...args: Parameters) => { const isAlreadyAdded = super.has(args[0]) const store = super.set(...args) + const currentCookie = store.get(args[0]) + + if (typeof currentCookie !== 'string') { + throw new Error( + `Invariant: failed to generate cookie for ${JSON.stringify(args)}` + ) + } if (isAlreadyAdded) { const setCookie = serializeCookie( @@ -73,13 +80,13 @@ export class NextCookies extends Cookies { if (setCookie) { this.response.headers.set( 'set-cookie', - [store.get(args[0]), setCookie].join(', ') + [currentCookie, setCookie].join(', ') ) } else { - this.response.headers.set('set-cookie', store.get(args[0])) + this.response.headers.set('set-cookie', currentCookie) } } else { - this.response.headers.append('set-cookie', store.get(args[0])) + this.response.headers.append('set-cookie', currentCookie) } return store diff --git a/test/production/middleware-typescript/app/pages/rewrites/_middleware.ts b/test/production/middleware-typescript/app/pages/rewrites/_middleware.ts index 402ce456671d..441e171245ab 100644 --- a/test/production/middleware-typescript/app/pages/rewrites/_middleware.ts +++ b/test/production/middleware-typescript/app/pages/rewrites/_middleware.ts @@ -10,6 +10,9 @@ export const middleware: NextMiddleware = async function (request) { const response = NextResponse.rewrite(`/rewrites/${bucket}`) response.cookies.set('bucket', bucket, { maxAge: 10 }) return response + } else { + // check that `bucket` is type "string", not "any" + bucket.toUpperCase() } return NextResponse.rewrite(`/rewrites/${bucket}`)