cookies-next
Advanced tools
Comparing version 3.0.0 to 4.0.0
@@ -1,2 +0,2 @@ | ||
import { OptionsType, TmpCookiesObj, CookieValueTypes } from './types'; | ||
import type { OptionsType, TmpCookiesObj, CookieValueTypes } from './types'; | ||
export { CookieValueTypes } from './types'; | ||
@@ -3,0 +3,0 @@ export declare const getCookies: (options?: OptionsType) => TmpCookiesObj; |
@@ -28,2 +28,22 @@ "use strict"; | ||
var isClientSide = function () { return typeof window !== 'undefined'; }; | ||
var isCookiesFromAppRouterMiddleware = function (cookieStore) { | ||
if (!cookieStore) | ||
return false; | ||
return ('getAll' && | ||
'set' in cookieStore && | ||
typeof cookieStore.getAll === 'function' && | ||
typeof cookieStore.set === 'function'); | ||
}; | ||
var isContextFromAppRouterMiddleware = function (context) { | ||
return ((!!(context === null || context === void 0 ? void 0 : context.req) && 'cookies' in context.req && isCookiesFromAppRouterMiddleware(context === null || context === void 0 ? void 0 : context.req.cookies)) || | ||
(!!(context === null || context === void 0 ? void 0 : context.res) && 'cookies' in context.res && isCookiesFromAppRouterMiddleware(context === null || context === void 0 ? void 0 : context.res.cookies))); | ||
}; | ||
var transformAppRouterMiddlewareCookies = function (cookies) { | ||
var _cookies = {}; | ||
cookies.getAll().forEach(function (_a) { | ||
var name = _a.name, value = _a.value; | ||
_cookies[name] = value; | ||
}); | ||
return _cookies; | ||
}; | ||
var stringify = function (value) { | ||
@@ -33,3 +53,3 @@ if (value === void 0) { value = ''; } | ||
var result = JSON.stringify(value); | ||
return (/^[\{\[]/.test(result)) ? result : value; | ||
return /^[\{\[]/.test(result) ? result : value; | ||
} | ||
@@ -46,3 +66,6 @@ catch (e) { | ||
var getCookies = function (options) { | ||
if (isContextFromAppRouterMiddleware(options) && (options === null || options === void 0 ? void 0 : options.req)) | ||
return transformAppRouterMiddlewareCookies(options.req.cookies); | ||
var req; | ||
// DefaultOptions['req] can be casted here because is narrowed by using the fn: isContextFromAppRouterMiddleware | ||
if (options) | ||
@@ -55,3 +78,3 @@ req = options.req; | ||
return req.cookies; | ||
if (req && req.headers && req.headers.cookie) | ||
if (req && req.headers.cookie) | ||
return (0, cookie_1.parse)(req.headers.cookie); | ||
@@ -80,2 +103,13 @@ return {}; | ||
var setCookie = function (key, data, options) { | ||
if (isContextFromAppRouterMiddleware(options)) { | ||
var req = options.req, res = options.res, restOptions = __rest(options, ["req", "res"]); | ||
var payload = __assign({ name: key, value: data }, restOptions); | ||
if (req) { | ||
req.cookies.set(payload); | ||
} | ||
if (res) { | ||
res.cookies.set(payload); | ||
} | ||
return; | ||
} | ||
var _cookieOptions; | ||
@@ -85,3 +119,4 @@ var _req; | ||
if (options) { | ||
var req = options.req, res = options.res, _options = __rest(options, ["req", "res"]); | ||
// DefaultOptions can be casted here because the AppRouterMiddlewareOptions is narrowed using the fn: isContextFromAppRouterMiddleware | ||
var _a = options, req = _a.req, res = _a.res, _options = __rest(_a, ["req", "res"]); | ||
_req = req; | ||
@@ -101,7 +136,7 @@ _res = res; | ||
var _cookies = _req.cookies; | ||
data === '' ? delete _cookies[key] : _cookies[key] = stringify(data); | ||
data === '' ? delete _cookies[key] : (_cookies[key] = stringify(data)); | ||
} | ||
if (_req && _req.headers && _req.headers.cookie) { | ||
var _cookies = (0, cookie_1.parse)(_req.headers.cookie); | ||
data === '' ? delete _cookies[key] : _cookies[key] = stringify(data); | ||
data === '' ? delete _cookies[key] : (_cookies[key] = stringify(data)); | ||
_req.headers.cookie = Object.entries(_cookies).reduce(function (accum, item) { | ||
@@ -108,0 +143,0 @@ return accum.concat("".concat(item[0], "=").concat(item[1], ";")); |
/// <reference types="node" /> | ||
import { CookieSerializeOptions } from 'cookie'; | ||
import { IncomingMessage, ServerResponse } from "http"; | ||
export interface OptionsType extends CookieSerializeOptions { | ||
import { IncomingMessage, ServerResponse } from 'http'; | ||
import type { NextRequest, NextResponse } from 'next/server'; | ||
export type OptionsType = DefaultOptions | AppRouterMiddlewareOptions; | ||
export interface DefaultOptions extends CookieSerializeOptions { | ||
res?: ServerResponse; | ||
req?: IncomingMessage & { | ||
cookies?: { | ||
[key: string]: string; | ||
} | Partial<{ | ||
[key: string]: string; | ||
}>; | ||
cookies?: TmpCookiesObj; | ||
}; | ||
} | ||
export declare type TmpCookiesObj = { | ||
export type AppRouterMiddlewareOptions = { | ||
res?: Response | NextResponse; | ||
req?: Request | NextRequest; | ||
}; | ||
export type AppRouterMiddlewareCookies = NextResponse['cookies'] | NextRequest['cookies']; | ||
export type TmpCookiesObj = { | ||
[key: string]: string; | ||
@@ -19,2 +22,2 @@ } | Partial<{ | ||
}>; | ||
export declare type CookieValueTypes = string | undefined; | ||
export type CookieValueTypes = string | undefined; |
{ | ||
"name": "cookies-next", | ||
"version": "3.0.0", | ||
"version": "4.0.0", | ||
"description": "Getting, setting and removing cookies on both client and server with next.js", | ||
@@ -8,3 +8,4 @@ "main": "lib/index.js", | ||
"scripts": { | ||
"build": "tsc" | ||
"build": "tsc", | ||
"pretty": "npx prettier . --write" | ||
}, | ||
@@ -38,9 +39,11 @@ "repository": { | ||
"dependencies": { | ||
"cookie": "^0.4.0", | ||
"@types/cookie": "^0.4.1", | ||
"@types/node": "^16.10.2" | ||
"@types/node": "^16.10.2", | ||
"cookie": "^0.4.0" | ||
}, | ||
"devDependencies": { | ||
"next": "^13.4.19", | ||
"prettier": "^3.0.2", | ||
"typescript": "^4.4.3" | ||
} | ||
} |
@@ -11,2 +11,4 @@ # cookies-next | ||
- can be used in API handlers | ||
- can be used in appDir middleware | ||
- can be used in appDir route handlers | ||
@@ -13,0 +15,0 @@ ## Installation |
180
src/index.ts
import { serialize, parse } from 'cookie'; | ||
import { OptionsType, TmpCookiesObj, CookieValueTypes } from './types'; | ||
import type { OptionsType, TmpCookiesObj, CookieValueTypes, AppRouterMiddlewareCookies, DefaultOptions } from './types'; | ||
import type { NextRequest, NextResponse } from 'next/server'; | ||
export { CookieValueTypes } from './types'; | ||
@@ -7,100 +8,147 @@ | ||
const isCookiesFromAppRouterMiddleware = ( | ||
cookieStore: TmpCookiesObj | AppRouterMiddlewareCookies | undefined, | ||
): cookieStore is AppRouterMiddlewareCookies => { | ||
if (!cookieStore) return false; | ||
return ( | ||
'getAll' && | ||
'set' in cookieStore && | ||
typeof cookieStore.getAll === 'function' && | ||
typeof cookieStore.set === 'function' | ||
); | ||
}; | ||
const isContextFromAppRouterMiddleware = ( | ||
context?: OptionsType, | ||
): context is { res?: NextResponse; req?: NextRequest } => { | ||
return ( | ||
(!!context?.req && 'cookies' in context.req && isCookiesFromAppRouterMiddleware(context?.req.cookies)) || | ||
(!!context?.res && 'cookies' in context.res && isCookiesFromAppRouterMiddleware(context?.res.cookies)) | ||
); | ||
}; | ||
const transformAppRouterMiddlewareCookies = (cookies: AppRouterMiddlewareCookies): TmpCookiesObj => { | ||
let _cookies: Partial<TmpCookiesObj> = {}; | ||
cookies.getAll().forEach(({ name, value }) => { | ||
_cookies[name] = value; | ||
}); | ||
return _cookies; | ||
}; | ||
const stringify = (value: string = '') => { | ||
try { | ||
const result = JSON.stringify(value); | ||
return (/^[\{\[]/.test(result)) ? result : value; | ||
} catch (e) { | ||
return value; | ||
} | ||
try { | ||
const result = JSON.stringify(value); | ||
return /^[\{\[]/.test(result) ? result : value; | ||
} catch (e) { | ||
return value; | ||
} | ||
}; | ||
const decode = (str: string): string => { | ||
if (!str) return str; | ||
if (!str) return str; | ||
return str.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent); | ||
return str.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent); | ||
}; | ||
export const getCookies = (options?: OptionsType): TmpCookiesObj => { | ||
let req; | ||
if (options) req = options.req; | ||
if (!isClientSide()) { | ||
// if cookie-parser is used in project get cookies from ctx.req.cookies | ||
// if cookie-parser isn't used in project get cookies from ctx.req.headers.cookie | ||
if (req && req.cookies) return req.cookies; | ||
if (req && req.headers && req.headers.cookie) return parse(req.headers.cookie); | ||
return {}; | ||
} | ||
if (isContextFromAppRouterMiddleware(options) && options?.req) | ||
return transformAppRouterMiddlewareCookies(options.req.cookies); | ||
let req; | ||
// DefaultOptions['req] can be casted here because is narrowed by using the fn: isContextFromAppRouterMiddleware | ||
if (options) req = options.req as DefaultOptions['req']; | ||
const _cookies: TmpCookiesObj = {}; | ||
const documentCookies = document.cookie ? document.cookie.split('; ') : []; | ||
if (!isClientSide()) { | ||
// if cookie-parser is used in project get cookies from ctx.req.cookies | ||
// if cookie-parser isn't used in project get cookies from ctx.req.headers.cookie | ||
for (let i = 0, len = documentCookies.length; i < len; i++) { | ||
const cookieParts = documentCookies[i].split('='); | ||
if (req && req.cookies) return req.cookies; | ||
if (req && req.headers.cookie) return parse(req.headers.cookie); | ||
return {}; | ||
} | ||
const _cookie = cookieParts.slice(1).join('='); | ||
const name = cookieParts[0]; | ||
const _cookies: TmpCookiesObj = {}; | ||
const documentCookies = document.cookie ? document.cookie.split('; ') : []; | ||
_cookies[name] = _cookie; | ||
} | ||
for (let i = 0, len = documentCookies.length; i < len; i++) { | ||
const cookieParts = documentCookies[i].split('='); | ||
return _cookies; | ||
const _cookie = cookieParts.slice(1).join('='); | ||
const name = cookieParts[0]; | ||
_cookies[name] = _cookie; | ||
} | ||
return _cookies; | ||
}; | ||
export const getCookie = (key: string, options?: OptionsType): CookieValueTypes => { | ||
const _cookies = getCookies(options); | ||
const _cookies = getCookies(options); | ||
const value = _cookies[key]; | ||
if (value === undefined) return undefined; | ||
return decode(value); | ||
return decode(value); | ||
}; | ||
export const setCookie = (key: string, data: any, options?: OptionsType): void => { | ||
let _cookieOptions: any; | ||
let _req; | ||
let _res; | ||
if (options) { | ||
const { req, res, ..._options } = options; | ||
_req = req; | ||
_res = res; | ||
_cookieOptions = _options; | ||
} | ||
if (isContextFromAppRouterMiddleware(options)) { | ||
const { req, res, ...restOptions } = options; | ||
const payload = { name: key, value: data, ...restOptions }; | ||
if (req) { | ||
req.cookies.set(payload); | ||
} | ||
if (res) { | ||
res.cookies.set(payload); | ||
} | ||
return; | ||
} | ||
let _cookieOptions: any; | ||
let _req; | ||
let _res; | ||
if (options) { | ||
// DefaultOptions can be casted here because the AppRouterMiddlewareOptions is narrowed using the fn: isContextFromAppRouterMiddleware | ||
const { req, res, ..._options } = options as DefaultOptions; | ||
_req = req; | ||
_res = res; | ||
_cookieOptions = _options; | ||
} | ||
const cookieStr = serialize(key, stringify(data), { path: '/', ..._cookieOptions }); | ||
if (!isClientSide()) { | ||
if (_res && _req) { | ||
let currentCookies = _res.getHeader('Set-Cookie'); | ||
const cookieStr = serialize(key, stringify(data), { path: '/', ..._cookieOptions }); | ||
if (!isClientSide()) { | ||
if (_res && _req) { | ||
let currentCookies = _res.getHeader('Set-Cookie'); | ||
if(!Array.isArray(currentCookies)){ | ||
currentCookies = !currentCookies ? [] : [String(currentCookies)]; | ||
} | ||
_res.setHeader('Set-Cookie', currentCookies.concat(cookieStr)); | ||
if (!Array.isArray(currentCookies)) { | ||
currentCookies = !currentCookies ? [] : [String(currentCookies)]; | ||
} | ||
_res.setHeader('Set-Cookie', currentCookies.concat(cookieStr)); | ||
if (_req && _req.cookies) { | ||
const _cookies = _req.cookies; | ||
data === '' ? delete _cookies[key] : _cookies[key] = stringify(data); | ||
} | ||
if (_req && _req.cookies) { | ||
const _cookies = _req.cookies; | ||
data === '' ? delete _cookies[key] : (_cookies[key] = stringify(data)); | ||
} | ||
if (_req && _req.headers &&_req.headers.cookie) { | ||
const _cookies = parse(_req.headers.cookie); | ||
if (_req && _req.headers && _req.headers.cookie) { | ||
const _cookies = parse(_req.headers.cookie); | ||
data === '' ? delete _cookies[key] : _cookies[key] = stringify(data); | ||
data === '' ? delete _cookies[key] : (_cookies[key] = stringify(data)); | ||
_req.headers.cookie = Object.entries(_cookies).reduce((accum, item) => { | ||
return accum.concat(`${item[0]}=${item[1]};`); | ||
}, ''); | ||
} | ||
} | ||
} else { | ||
document.cookie = cookieStr; | ||
} | ||
_req.headers.cookie = Object.entries(_cookies).reduce((accum, item) => { | ||
return accum.concat(`${item[0]}=${item[1]};`); | ||
}, ''); | ||
} | ||
} | ||
} else { | ||
document.cookie = cookieStr; | ||
} | ||
}; | ||
export const deleteCookie = (key: string, options?: OptionsType): void => { | ||
return setCookie(key, '', { ...options, maxAge: -1 }); | ||
return setCookie(key, '', { ...options, maxAge: -1 }); | ||
}; | ||
export const hasCookie = (key: string, options?: OptionsType): boolean => { | ||
if (!key) return false; | ||
export const hasCookie = (key: string, options?: OptionsType): boolean => { | ||
if (!key) return false; | ||
const cookie = getCookies(options); | ||
return cookie.hasOwnProperty(key); | ||
const cookie = getCookies(options); | ||
return cookie.hasOwnProperty(key); | ||
}; |
import { CookieSerializeOptions } from 'cookie'; | ||
import { IncomingMessage, ServerResponse } from "http"; | ||
import { IncomingMessage, ServerResponse } from 'http'; | ||
import type { NextRequest, NextResponse } from 'next/server'; | ||
export interface OptionsType extends CookieSerializeOptions { | ||
res?: ServerResponse; | ||
req?: IncomingMessage & { | ||
cookies?:{ [key: string]: string; } | Partial<{ [key: string]: string}> | ||
} | ||
export type OptionsType = DefaultOptions | AppRouterMiddlewareOptions; | ||
export interface DefaultOptions extends CookieSerializeOptions { | ||
res?: ServerResponse; | ||
req?: IncomingMessage & { | ||
cookies?: TmpCookiesObj; | ||
}; | ||
} | ||
export type TmpCookiesObj = { [key: string]: string } | Partial<{ [key: string]: string}>; | ||
export type CookieValueTypes = string | undefined; | ||
export type AppRouterMiddlewareOptions = { res?: Response | NextResponse; req?: Request | NextRequest }; | ||
export type AppRouterMiddlewareCookies = NextResponse['cookies'] | NextRequest['cookies']; | ||
export type TmpCookiesObj = { [key: string]: string } | Partial<{ [key: string]: string }>; | ||
export type CookieValueTypes = string | undefined; |
@@ -7,6 +7,7 @@ { | ||
"outDir": "./lib", | ||
"strict": true | ||
"strict": true, | ||
"skipLibCheck": true | ||
}, | ||
"include": ["src"], | ||
"exclude": ["node_modules", "tib", "**/__tests__/*"] | ||
} | ||
} |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
24430
11
339
281
3