0
0
mirror of https://github.com/honojs/hono.git synced 2024-12-01 11:51:01 +01:00
hono/deno_dist/utils/cookie.ts
Yusuke Wada 4b2dfb824b
fix(utils/cookie): allow 0 to maxAge (#1196)
* fix(utils/cookie): allow 0 to maxAge

* denoify
2023-06-23 17:33:20 +09:00

59 lines
1.3 KiB
TypeScript

import { decodeURIComponent_ } from './url.ts'
export type Cookie = Record<string, string>
export type CookieOptions = {
domain?: string
expires?: Date
httpOnly?: boolean
maxAge?: number
path?: string
secure?: boolean
signed?: boolean
sameSite?: 'Strict' | 'Lax' | 'None'
}
export const parse = (cookie: string): Cookie => {
const pairs = cookie.split(/;\s*/g)
const parsedCookie: Cookie = {}
for (let i = 0, len = pairs.length; i < len; i++) {
const pair = pairs[i].split(/\s*=\s*([^\s]+)/)
parsedCookie[pair[0]] = decodeURIComponent_(pair[1])
}
return parsedCookie
}
export const serialize = (name: string, value: string, opt: CookieOptions = {}): string => {
value = encodeURIComponent(value)
let cookie = `${name}=${value}`
if (opt && typeof opt.maxAge === 'number' && opt.maxAge >= 0) {
cookie += `; Max-Age=${Math.floor(opt.maxAge)}`
}
if (opt.domain) {
cookie += '; Domain=' + opt.domain
}
if (opt.path) {
cookie += '; Path=' + opt.path
}
if (opt.expires) {
cookie += '; Expires=' + opt.expires.toUTCString()
}
if (opt.httpOnly) {
cookie += '; HttpOnly'
}
if (opt.secure) {
cookie += '; Secure'
}
if (opt.sameSite) {
cookie += `; SameSite=${opt.sameSite}`
}
return cookie
}