Skip to content

Commit

Permalink
Edge Cookies: Add getRaw method
Browse files Browse the repository at this point in the history
  • Loading branch information
Kikobeats committed May 16, 2022
1 parent 359d03f commit 39af2a0
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 12 deletions.
11 changes: 9 additions & 2 deletions packages/next/server/web/spec-extension/cookies.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ const deserializeCookie = (input: Request | Response): string[] => {

const serializeCookie = (input: string[]) => input.join(', ')

export class Cookies extends Map<string, string> {
export class Cookies extends Map<string, string | object> {
constructor(input?: string | null) {
const parsedInput = typeof input === 'string' ? cookie.parse(input) : {}
super(Object.entries(parsedInput))
Expand All @@ -59,10 +59,17 @@ export class NextCookies extends Cookies {
super(response.headers.get('cookie'))
this.response = response
}
get = (...args: Parameters<Cookies['get']>) => {
const value = this.getRaw(...args)
return typeof value === 'string' ? cookie.parse(value) : value
}
getRaw = (...args: Parameters<Cookies['get']>) => {
return super.get(...args)
}
set = (...args: Parameters<Cookies['set']>) => {
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(
Expand Down
2 changes: 1 addition & 1 deletion test/unit/web-runtime/cookies.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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')

Expand Down
23 changes: 14 additions & 9 deletions test/unit/web-runtime/next-cookies.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -68,28 +68,32 @@ 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)
expect(Object.fromEntries(response.headers.entries())['set-cookie']).toBe(
'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)
})

Expand All @@ -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(
Expand Down

0 comments on commit 39af2a0

Please sign in to comment.