- Delete old Vite+Svelte frontend - Initialize new SvelteKit project with TypeScript - Configure Tailwind CSS v4 + DaisyUI - Implement JWT authentication with auto-refresh - Create login page with form validation (Zod) - Add protected route guards - Update Docker configuration for single-stage build - Add E2E tests with Playwright (6/11 passing) - Fix Svelte 5 reactivity with $state() runes Known issues: - 5 E2E tests failing (timing/async issues) - Token refresh implementation needs debugging - Validation error display timing
170 lines
5.8 KiB
Markdown
170 lines
5.8 KiB
Markdown
# set-cookie-parser
|
|
|
|
[](https://github.com/nfriedly/set-cookie-parser/actions/workflows/node.js.yml)
|
|
[![NPM version][npm-image]][npm-url]
|
|
[][npm-url]
|
|
|
|
---
|
|
|
|
Parses set-cookie headers into JavaScript objects
|
|
|
|
Accepts a single `set-cookie` header value, an array of `set-cookie` header values, a Node.js response object, or a `fetch()` `Response` object that may have 0 or more `set-cookie` headers.
|
|
|
|
Returns either an array of cookie objects or a map of name => cookie object with options set `{map: true}`. Each cookie object will have, at a minimum `name` and `value` properties, and may have additional properties depending on the set-cookie header:
|
|
|
|
* `name` - cookie name (string)
|
|
* `value` - cookie value (string)
|
|
* `path` - URL path to limit the scope to (string or undefined)
|
|
* `domain` - domain to expand the scope to (string or undefined, may begin with "." to indicate the named domain or any subdomain of it)
|
|
* `expires` - absolute expiration date for the cookie (Date object or undefined)
|
|
* `maxAge` - relative expiration time of the cookie in seconds from when the client receives it (integer or undefined)
|
|
* Note: when using with [express's res.cookie() method](http://expressjs.com/en/4x/api.html#res.cookie), multiply `maxAge` by 1000 to convert to milliseconds.
|
|
* `secure` - indicates cookie should only be sent over HTTPs (true or undefined)
|
|
* `httpOnly` - indicates cookie should *not* be accessible to client-side JavaScript (true or undefined)
|
|
* `sameSite` - indicates if cookie should be included in cross-site requests ([more info](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value)) (string or undefined)
|
|
* Note: valid values are `"Strict"`, `"Lax"`, and `"None"`, but set-cookie-parser copies the value verbatim and does *not* perform any validation.
|
|
* `partitioned` - indicates cookie should be scoped to the combination of 3rd party domain + top page domain ([more info](https://developer.mozilla.org/en-US/docs/Web/Privacy/Privacy_sandbox/Partitioned_cookies)) (true or undefined)
|
|
|
|
(The output format is loosely based on the input format of https://www.npmjs.com/package/cookie)
|
|
|
|
## Install
|
|
|
|
```sh
|
|
$ npm install --save set-cookie-parser
|
|
```
|
|
|
|
|
|
## Usage
|
|
|
|
### Get array of cookie objects
|
|
|
|
```js
|
|
import * as http from 'node:http';
|
|
import { parseSetCookie } from 'set-cookie-parser';
|
|
// or const { parseSetCookie } = require('set-cookie-parser');
|
|
|
|
http.get('http://example.com', function(res) {
|
|
const cookies = parseSetCookie(res, {
|
|
decodeValues: true // default: true
|
|
});
|
|
|
|
cookies.forEach(console.log);
|
|
}
|
|
```
|
|
|
|
Example output:
|
|
|
|
```js
|
|
[
|
|
{
|
|
name: 'bam',
|
|
value: 'baz'
|
|
},
|
|
{
|
|
name: 'foo',
|
|
value: 'bar',
|
|
path: '/',
|
|
expires: new Date('Tue Jul 01 2025 06:01:11 GMT-0400 (EDT)'),
|
|
maxAge: 1000,
|
|
domain: '.example.com',
|
|
secure: true,
|
|
httpOnly: true,
|
|
sameSite: 'lax'
|
|
}
|
|
]
|
|
```
|
|
|
|
### Get map of cookie objects
|
|
|
|
```js
|
|
import * as http from 'node:http';
|
|
import { parseSetCookie } from 'set-cookie-parser';
|
|
// or const { parseSetCookie } = require('set-cookie-parser');
|
|
|
|
http.get('http://example.com', function(res) {
|
|
const cookies = parseSetCookie(res, {
|
|
decodeValues: true, // default: true
|
|
map: true // default: false
|
|
});
|
|
|
|
const desiredCookie = cookies['session'];
|
|
console.log(desiredCookie);
|
|
});
|
|
```
|
|
Example output:
|
|
```js
|
|
{
|
|
bam: {
|
|
name: 'bam',
|
|
value: 'baz'
|
|
},
|
|
foo: {
|
|
name: 'foo',
|
|
value: 'bar',
|
|
path: '/',
|
|
expires: new Date('Tue Jul 01 2025 06:01:11 GMT-0400 (EDT)'),
|
|
maxAge: 1000,
|
|
domain: '.example.com',
|
|
secure: true,
|
|
httpOnly: true,
|
|
sameSite: 'lax'
|
|
}
|
|
}
|
|
```
|
|
|
|
### Creating a new, modified set-cookie header
|
|
|
|
This library can be used in conjunction with the [cookie](https://www.npmjs.com/package/cookie) library to modify and replace set-cookie headers:
|
|
|
|
```js
|
|
import * as libCookie from 'cookie';
|
|
import { parseSetCookie } from 'set-cookie-parser';
|
|
// or const { parseSetCookie } = require('set-cookie-parser');
|
|
|
|
function modifySetCookie(res){
|
|
// parse the set-cookie headers with this library
|
|
const cookies = parseSetCookie(res);
|
|
|
|
// modify the cookies here
|
|
// ...
|
|
|
|
// create new set-cookie headers using the cookie library
|
|
res.headers['set-cookie'] = cookies.map(function(cookie) {
|
|
return libCookie.serialize(cookie.name, cookie.value, cookie);
|
|
});
|
|
}
|
|
```
|
|
|
|
See a real-world example of this in [unblocker](https://github.com/nfriedly/node-unblocker/blob/08a89ec27274b46dcd80d0a324a59406f2bdad3d/lib/cookies.js#L67-L85)
|
|
|
|
## API
|
|
|
|
### parseSetCookie(input, [options])
|
|
|
|
Parses cookies from a string, array of strings, or a http response object.
|
|
Always returns an array, regardless of input format. (Unless the `map` option is set, in which case it always returns an object.)
|
|
|
|
Also accepts an optional options object. Defaults:
|
|
|
|
```js
|
|
{
|
|
decodeValues: true, // Calls decodeURIComponent on each value - default: true
|
|
map: false, // Return an object instead of an array - default: false
|
|
silent: false, // Suppress the warning that is logged when called on a request instead of a response - default: false
|
|
split: 'auto', // Separate combined cookie headers. Valid options are true/false/'auto'. 'auto' splits strings but not arrays.
|
|
}
|
|
```
|
|
|
|
## References
|
|
|
|
* [RFC 6265: HTTP State Management Mechanism](https://tools.ietf.org/html/rfc6265)
|
|
* [draft-ietf-httpbis-rfc6265bis-10](https://httpwg.org/http-extensions/draft-ietf-httpbis-rfc6265bis.html)
|
|
|
|
## License
|
|
|
|
MIT © [Nathan Friedly](http://www.nfriedly.com/)
|
|
|
|
|
|
[npm-image]: https://badge.fury.io/js/set-cookie-parser.svg
|
|
[npm-url]: https://npmjs.org/package/set-cookie-parser
|