From e4e7b07aa3bb6b39e94dd14e5c2daa2741594469 Mon Sep 17 00:00:00 2001 From: Steven Date: Thu, 12 May 2022 16:30:48 -0400 Subject: [PATCH 1/2] Fix return type of middleware `req.cookies.get()` --- packages/next/server/web/spec-extension/cookies.ts | 2 +- .../middleware-typescript/app/pages/rewrites/_middleware.ts | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/next/server/web/spec-extension/cookies.ts b/packages/next/server/web/spec-extension/cookies.ts index 791d0be5cf4b..8dc6cc15aa70 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)) 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}`) From 53925159f439ec0dc1e21848d281d5cc16b8a9d7 Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Thu, 12 May 2022 16:07:03 -0500 Subject: [PATCH 2/2] fix build --- packages/next/server/web/spec-extension/cookies.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/next/server/web/spec-extension/cookies.ts b/packages/next/server/web/spec-extension/cookies.ts index 8dc6cc15aa70..e1b06f646ddb 100644 --- a/packages/next/server/web/spec-extension/cookies.ts +++ b/packages/next/server/web/spec-extension/cookies.ts @@ -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