Socket
Socket
Sign inDemoInstall

cookies-next

Package Overview
Dependencies
Maintainers
1
Versions
26
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

cookies-next - npm Package Compare versions

Comparing version 3.0.0 to 4.0.0

.prettierrc

2

lib/index.d.ts

@@ -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

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__/*"]
}
}
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc