From 39af2a0787aeac067955a28691af46bc3a7640b0 Mon Sep 17 00:00:00 2001 From: Kiko Beats Date: Mon, 16 May 2022 11:44:12 +0000 Subject: [PATCH] Edge Cookies: Add getRaw method --- .../next/server/web/spec-extension/cookies.ts | 11 +++++++-- test/unit/web-runtime/cookies.test.ts | 2 +- test/unit/web-runtime/next-cookies.test.ts | 23 +++++++++++-------- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/packages/next/server/web/spec-extension/cookies.ts b/packages/next/server/web/spec-extension/cookies.ts index e1b06f646ddb4..6e9945d8d96d5 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)) @@ -59,10 +59,17 @@ export class NextCookies extends Cookies { super(response.headers.get('cookie')) this.response = response } + get = (...args: Parameters) => { + const value = this.getRaw(...args) + return typeof value === 'string' ? cookie.parse(value) : value + } + getRaw = (...args: Parameters) => { + return super.get(...args) + } set = (...args: Parameters) => { const isAlreadyAdded = super.has(args[0]) const store = super.set(...args) - const currentCookie = store.get(args[0]) + const currentCookie = store.getRaw(args[0]) if (typeof currentCookie !== 'string') { throw new Error( diff --git a/test/unit/web-runtime/cookies.test.ts b/test/unit/web-runtime/cookies.test.ts index 7eca76da0d452..b43213f784d5f 100644 --- a/test/unit/web-runtime/cookies.test.ts +++ b/test/unit/web-runtime/cookies.test.ts @@ -72,7 +72,7 @@ it('.set with options', async () => { }) const [[key, value]] = Array.from(cookies.entries()) - const values = value.split('; ') + const values = (value as string).split('; ') expect(key).toBe('foo') diff --git a/test/unit/web-runtime/next-cookies.test.ts b/test/unit/web-runtime/next-cookies.test.ts index 604819ecd0ce3..27b69b0903880 100644 --- a/test/unit/web-runtime/next-cookies.test.ts +++ b/test/unit/web-runtime/next-cookies.test.ts @@ -34,17 +34,17 @@ it('reflect .set into `set-cookie`', async () => { const response = new NextResponse() - response.cookies.set('foo', 'bar') + response.cookies.set('foo', 'bar', { path: '/test' }) expect(Object.fromEntries(response.headers.entries())['set-cookie']).toBe( - 'foo=bar; Path=/' + 'foo=bar; Path=/test' ) - expect(response.cookies.get('foo')).toBe('foo=bar; Path=/') + expect(response.cookies.getRaw('foo')).toBe('foo=bar; Path=/test') response.cookies.set('foo', 'barz') expect(Object.fromEntries(response.headers.entries())['set-cookie']).toBe( 'foo=barz; Path=/' ) - expect(response.cookies.get('foo')).toBe('foo=barz; Path=/') + expect(response.cookies.getRaw('foo')).toBe('foo=barz; Path=/') response.cookies.set('fooz', 'barz') expect(Object.fromEntries(response.headers.entries())['set-cookie']).toBe( @@ -68,13 +68,15 @@ it('reflect .delete into `set-cookie`', async () => { expect(Object.fromEntries(response.headers.entries())['set-cookie']).toBe( 'foo=bar; Path=/' ) - expect(response.cookies.get('foo')).toBe('foo=bar; Path=/') + expect(response.cookies.get('foo')).toEqual({ Path: '/', foo: 'bar' }) + expect(response.cookies.getRaw('foo')).toBe('foo=bar; Path=/') response.cookies.set('fooz', 'barz') expect(Object.fromEntries(response.headers.entries())['set-cookie']).toBe( 'foo=bar; Path=/, fooz=barz; Path=/' ) - expect(response.cookies.get('fooz')).toBe('fooz=barz; Path=/') + expect(response.cookies.get('fooz')).toEqual({ Path: '/', fooz: 'barz' }) + expect(response.cookies.getRaw('fooz')).toBe('fooz=barz; Path=/') const firstDelete = response.cookies.delete('foo') expect(firstDelete).toBe(true) @@ -82,14 +84,16 @@ it('reflect .delete into `set-cookie`', async () => { 'foo=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT, fooz=barz; Path=/' ) - expect(response.cookies.get('foo')).toBe(undefined) + expect(response.cookies.get('foo')).toEqual(undefined) + expect(response.cookies.getRaw('foo')).toBe(undefined) const secondDelete = response.cookies.delete('fooz') expect(secondDelete).toBe(true) expect(Object.fromEntries(response.headers.entries())['set-cookie']).toBe( 'fooz=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT, foo=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT' ) - expect(response.cookies.get('fooz')).toBe(undefined) + expect(response.cookies.get('fooz')).toEqual(undefined) + expect(response.cookies.getRaw('fooz')).toBe(undefined) expect(response.cookies.size).toBe(0) }) @@ -109,7 +113,8 @@ it('reflect .clear into `set-cookie`', async () => { expect(Object.fromEntries(response.headers.entries())['set-cookie']).toBe( 'foo=bar; Path=/' ) - expect(response.cookies.get('foo')).toBe('foo=bar; Path=/') + expect(response.cookies.get('foo')).toEqual({ Path: '/', foo: 'bar' }) + expect(response.cookies.getRaw('foo')).toBe('foo=bar; Path=/') response.cookies.set('fooz', 'barz') expect(Object.fromEntries(response.headers.entries())['set-cookie']).toBe(