From f28d5bd45a616a0961b59b8a1bdf1d0c8b11305b Mon Sep 17 00:00:00 2001 From: Chris Ren Date: Sun, 13 Aug 2023 00:05:48 -0700 Subject: [PATCH 1/9] feat: next cookie handler --- src/core.ts | 62 ++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 50 insertions(+), 12 deletions(-) diff --git a/src/core.ts b/src/core.ts index ec619713..49db84d3 100644 --- a/src/core.ts +++ b/src/core.ts @@ -106,17 +106,49 @@ function computeCookieMaxAge(ttl: number): number { return ttl - timestampSkewSec } -function getCookie(req: RequestType, cookieName: string): string { - return ( - parse( - ('headers' in req && typeof req.headers.get === 'function' - ? req.headers.get('cookie') - : (req as IncomingMessage).headers.cookie) ?? '' - )[cookieName] ?? '' - ) +function getCookie(req: RequestType, cookieName: string, cookieHandler?: CookieHandler): string { + if (cookieHandler) { + const cookie = cookieHandler.get(cookieName) + if (typeof cookie === 'string') { + return cookie + } + } + + if ('headers' in req && typeof req.headers.get === 'function') { + const cookieValue = req.headers.get('cookie') + if (typeof cookieValue === 'string') { + return parse(cookieValue)[cookieName] ?? '' + } + } + + return '' } -function setCookie(res: ResponseType, cookieValue: string): void { +function extractCookieComponents( + cookieValue: string +): { cookieName: string; cookieData: string } | null { + const components = cookieValue.split(';') + if (components.length > 0) { + const firstPart = components[0] + if (typeof firstPart === 'string') { + const parts = firstPart.trim().split('=') + if (parts.length === 2 && typeof parts[0] === 'string' && typeof parts[1] === 'string') { + return { cookieName: parts[0], cookieData: parts[1] } + } + } + } + return null +} + +function setCookie(res: ResponseType, cookieValue: string, cookieHandler?: CookieHandler): void { + if (cookieHandler) { + const extracted = extractCookieComponents(cookieValue) + if (extracted !== null) { + const { cookieName, cookieData } = extracted + cookieHandler.set(cookieName, cookieData) + return + } + } if ('headers' in res && typeof res.headers.append === 'function') { res.headers.append('set-cookie', cookieValue) return @@ -220,9 +252,15 @@ function mergeOptions( return options } +interface CookieHandler { + get: (name: string) => { name: string; value: string } | undefined + set: (name: string, value: string) => void +} + export function createGetIronSession( sealData: ReturnType, - unsealData: ReturnType + unsealData: ReturnType, + cookieHandler?: CookieHandler ) { // eslint-disable-next-line @typescript-eslint/ban-types return async function getIronSession( @@ -284,7 +322,7 @@ export function createGetIronSession( ) } - setCookie(res, cookieValue) + setCookie(res, cookieValue, cookieHandler) }, }, @@ -302,7 +340,7 @@ export function createGetIronSession( maxAge: 0, }) - setCookie(res, cookieValue) + setCookie(res, cookieValue, cookieHandler) }, }, }) From 0bdfdbf663fa183394ca9441453b010db3fecd93 Mon Sep 17 00:00:00 2001 From: Chris Ren Date: Sun, 13 Aug 2023 00:48:54 -0700 Subject: [PATCH 2/9] fix: cookieHandler param in getIronSession --- src/core.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core.ts b/src/core.ts index 49db84d3..670370c0 100644 --- a/src/core.ts +++ b/src/core.ts @@ -259,14 +259,14 @@ interface CookieHandler { export function createGetIronSession( sealData: ReturnType, - unsealData: ReturnType, - cookieHandler?: CookieHandler + unsealData: ReturnType ) { // eslint-disable-next-line @typescript-eslint/ban-types return async function getIronSession( req: RequestType, res: ResponseType, - userSessionOptions: IronSessionOptions + userSessionOptions: IronSessionOptions, + cookieHandler?: CookieHandler ): Promise> { // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, @typescript-eslint/strict-boolean-expressions if (!req) { From c22ab8c195d29934f221942a6f0d8803932789d0 Mon Sep 17 00:00:00 2001 From: Chris Ren Date: Sun, 20 Aug 2023 22:10:46 -0700 Subject: [PATCH 3/9] feat: server action functions --- src/core.ts | 134 +++++++++++++++++++++++++++++++++++++++++---------- src/index.ts | 8 ++- 2 files changed, 115 insertions(+), 27 deletions(-) diff --git a/src/core.ts b/src/core.ts index 670370c0..9e1d1b8a 100644 --- a/src/core.ts +++ b/src/core.ts @@ -8,6 +8,15 @@ type Password = PasswordsMap | string type RequestType = IncomingMessage | Request type ResponseType = Response | ServerResponse +/** + * The high-level type definition of the .get() and .set() methods + * of { cookies() } from "next/headers" + */ +export interface ICookieHandler { + get: (name: string) => { name: string; value: string } | undefined + set: (name: string, value: string) => void +} + export interface IronSessionOptions { /** * The cookie name that will be used inside the browser. Make sure it's unique @@ -106,14 +115,7 @@ function computeCookieMaxAge(ttl: number): number { return ttl - timestampSkewSec } -function getCookie(req: RequestType, cookieName: string, cookieHandler?: CookieHandler): string { - if (cookieHandler) { - const cookie = cookieHandler.get(cookieName) - if (typeof cookie === 'string') { - return cookie - } - } - +function getCookie(req: RequestType, cookieName: string): string { if ('headers' in req && typeof req.headers.get === 'function') { const cookieValue = req.headers.get('cookie') if (typeof cookieValue === 'string') { @@ -124,6 +126,14 @@ function getCookie(req: RequestType, cookieName: string, cookieHandler?: CookieH return '' } +function getServerActionCookie(cookieName: string, cookieHandler: ICookieHandler): string { + const cookie = cookieHandler.get(cookieName) + if (typeof cookie === 'string') { + return cookie + } + return '' +} + function extractCookieComponents( cookieValue: string ): { cookieName: string; cookieData: string } | null { @@ -140,15 +150,7 @@ function extractCookieComponents( return null } -function setCookie(res: ResponseType, cookieValue: string, cookieHandler?: CookieHandler): void { - if (cookieHandler) { - const extracted = extractCookieComponents(cookieValue) - if (extracted !== null) { - const { cookieName, cookieData } = extracted - cookieHandler.set(cookieName, cookieData) - return - } - } +function setCookie(res: ResponseType, cookieValue: string): void { if ('headers' in res && typeof res.headers.append === 'function') { res.headers.append('set-cookie', cookieValue) return @@ -160,6 +162,14 @@ function setCookie(res: ResponseType, cookieValue: string, cookieHandler?: Cooki ;(res as ServerResponse).setHeader('set-cookie', [...existingSetCookie, cookieValue]) } +function setServerActionCookie(cookieValue: string, cookieHandler: ICookieHandler): void { + const extracted = extractCookieComponents(cookieValue) + if (extracted !== null) { + const { cookieName, cookieData } = extracted + cookieHandler.set(cookieName, cookieData) + } +} + export function createSealData(_crypto: Crypto = globalThis.crypto) { return async function sealData( data: unknown, @@ -252,11 +262,6 @@ function mergeOptions( return options } -interface CookieHandler { - get: (name: string) => { name: string; value: string } | undefined - set: (name: string, value: string) => void -} - export function createGetIronSession( sealData: ReturnType, unsealData: ReturnType @@ -265,8 +270,7 @@ export function createGetIronSession( return async function getIronSession( req: RequestType, res: ResponseType, - userSessionOptions: IronSessionOptions, - cookieHandler?: CookieHandler + userSessionOptions: IronSessionOptions ): Promise> { // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, @typescript-eslint/strict-boolean-expressions if (!req) { @@ -322,7 +326,7 @@ export function createGetIronSession( ) } - setCookie(res, cookieValue, cookieHandler) + setCookie(res, cookieValue) }, }, @@ -340,7 +344,85 @@ export function createGetIronSession( maxAge: 0, }) - setCookie(res, cookieValue, cookieHandler) + setCookie(res, cookieValue) + }, + }, + }) + + return session as IronSession + } +} + +export function createGetServerActionIronSession( + sealData: ReturnType, + unsealData: ReturnType +) { + // eslint-disable-next-line @typescript-eslint/ban-types + return async function getServerActionIronSession( + userSessionOptions: IronSessionOptions, + cookieHandler: ICookieHandler + ): Promise> { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, @typescript-eslint/strict-boolean-expressions + if (!userSessionOptions) { + throw new Error('iron-session: Bad usage. Missing options.') + } + + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, @typescript-eslint/strict-boolean-expressions + if (!cookieHandler) { + throw new Error('iron-session: Bad usage. Missing NextJS cookies() handler.') + } + + if (!userSessionOptions.cookieName) { + throw new Error('iron-session: Bad usage. Missing cookie name.') + } + + // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions + if (!userSessionOptions.password) { + throw new Error('iron-session: Bad usage. Missing password.') + } + + const passwordsMap = normalizeStringPasswordToMap(userSessionOptions.password) + if (Object.values(passwordsMap).some((password) => password.length < 32)) { + throw new Error('iron-session: Bad usage. Password must be at least 32 characters long.') + } + + const options = mergeOptions(userSessionOptions) + const sealFromCookies = getServerActionCookie(options.cookieName, cookieHandler) // is cookieHandler globally accessible?? + const session = sealFromCookies + ? await unsealData(sealFromCookies, { password: passwordsMap, ttl: options.ttl }) + : ({} as T) + + Object.defineProperties(session, { + save: { + value: async function save(saveOptions?: OverridableOptions) { + const mergedOptions = mergeOptions(userSessionOptions, saveOptions) + const seal = await sealData(session, { password: passwordsMap, ttl: mergedOptions.ttl }) + const cookieValue = serialize(mergedOptions.cookieName, seal, mergedOptions.cookieOptions) + + if (cookieValue.length > 4096) { + throw new Error( + `iron-session: Cookie length is too big (${cookieValue.length} bytes), browsers will refuse it. Try to remove some data.` + ) + } + + setServerActionCookie(cookieValue, cookieHandler) + }, + }, + + destroy: { + value: async function destroy(destroyOptions: OverridableOptions) { + Object.keys(session).forEach((key) => { + // @ts-expect-error ... + // eslint-disable-next-line @typescript-eslint/no-dynamic-delete + delete session[key] + }) + const mergedOptions = mergeOptions(userSessionOptions, destroyOptions) + const cookieValue = serialize(mergedOptions.cookieName, '', { + ...mergedOptions.cookieOptions, + maxAge: 0, + }) + + setServerActionCookie(cookieValue, cookieHandler) }, }, }) diff --git a/src/index.ts b/src/index.ts index 9e52ac6e..7ea43e53 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,12 @@ -import { createGetIronSession, createSealData, createUnsealData } from './core.js' +import { + createGetIronSession, + createGetServerActionIronSession, + createSealData, + createUnsealData, +} from './core.js' export * from './core.js' export const sealData = createSealData() export const unsealData = createUnsealData() export const getIronSession = createGetIronSession(sealData, unsealData) +export const getServerActionIronSession = createGetServerActionIronSession(sealData, unsealData) From f26ab7c7f3ff79da10eb47b1bff4d8cf2be913c5 Mon Sep 17 00:00:00 2001 From: Chris Ren Date: Thu, 24 Aug 2023 01:07:33 -0700 Subject: [PATCH 4/9] fix: get server action cookie value --- src/core.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/core.ts b/src/core.ts index 9e1d1b8a..b672d875 100644 --- a/src/core.ts +++ b/src/core.ts @@ -127,7 +127,8 @@ function getCookie(req: RequestType, cookieName: string): string { } function getServerActionCookie(cookieName: string, cookieHandler: ICookieHandler): string { - const cookie = cookieHandler.get(cookieName) + const cookieObject = cookieHandler.get(cookieName) + const cookie = cookieObject?.value if (typeof cookie === 'string') { return cookie } @@ -387,7 +388,7 @@ export function createGetServerActionIronSession( } const options = mergeOptions(userSessionOptions) - const sealFromCookies = getServerActionCookie(options.cookieName, cookieHandler) // is cookieHandler globally accessible?? + const sealFromCookies = getServerActionCookie(options.cookieName, cookieHandler) const session = sealFromCookies ? await unsealData(sealFromCookies, { password: passwordsMap, ttl: options.ttl }) : ({} as T) From 27aec87457ce10132159b12bdc17025f666fd3f6 Mon Sep 17 00:00:00 2001 From: Chris Ren Date: Thu, 24 Aug 2023 01:08:08 -0700 Subject: [PATCH 5/9] feat: export getServerActionIronSession function --- src/index.node.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/index.node.ts b/src/index.node.ts index 887938dc..6cfdbcf5 100644 --- a/src/index.node.ts +++ b/src/index.node.ts @@ -1,7 +1,13 @@ import crypto from 'crypto' -import { createGetIronSession, createSealData, createUnsealData } from './core.js' +import { + createGetIronSession, + createGetServerActionIronSession, + createSealData, + createUnsealData, +} from './core.js' export * from './core.js' export const sealData = createSealData(crypto.webcrypto as Crypto) export const unsealData = createUnsealData(crypto.webcrypto as Crypto) export const getIronSession = createGetIronSession(sealData, unsealData) +export const getServerActionIronSession = createGetServerActionIronSession(sealData, unsealData) From 4e7d7f9ef72559822a38c9f40116567190b4c1e5 Mon Sep 17 00:00:00 2001 From: Chris Ren Date: Thu, 24 Aug 2023 01:51:04 -0700 Subject: [PATCH 6/9] refactor: getCookie to previous parse method --- src/core.ts | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/core.ts b/src/core.ts index b672d875..aeaf0a12 100644 --- a/src/core.ts +++ b/src/core.ts @@ -116,14 +116,13 @@ function computeCookieMaxAge(ttl: number): number { } function getCookie(req: RequestType, cookieName: string): string { - if ('headers' in req && typeof req.headers.get === 'function') { - const cookieValue = req.headers.get('cookie') - if (typeof cookieValue === 'string') { - return parse(cookieValue)[cookieName] ?? '' - } - } - - return '' + return ( + parse( + ('headers' in req && typeof req.headers.get === 'function' + ? req.headers.get('cookie') + : (req as IncomingMessage).headers.cookie) ?? '' + )[cookieName] ?? '' + ) } function getServerActionCookie(cookieName: string, cookieHandler: ICookieHandler): string { From 7ed5e8a72cd738b8424fc4f4c2a7f7bdb7025e87 Mon Sep 17 00:00:00 2001 From: Chris Ren Date: Wed, 30 Aug 2023 18:22:58 -0700 Subject: [PATCH 7/9] docs(README): nextJS usage, API, and FAQ --- README.md | 386 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 381 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 2c1f4de8..c66a614a 100644 --- a/README.md +++ b/README.md @@ -16,8 +16,10 @@ is the same technique used by frameworks like - [Installation](#installation) - [Usage](#usage) - [API](#api) - - + - [Options](#iron-session-options) + - [Iron Session Object](#iron-session-object) + - [Functions](#iron-session-functions) + - [Example](#nextjs-example) - [FAQ](#faq) @@ -39,15 +41,389 @@ import { getIronSession } from 'https://esm.sh/iron-session@latest' ## Usage -Refer [examples](examples). +Refer to the [examples](examples). + +1. Define your session options +1. Initialize your session with: + - sessionOptions and the respective parameters + - the type definition of your session data +1. Set the session data variables +1. Set the data to or read the data from the browser cookie storage + - session.save(): Set the session variables as an encrypted string to the browser cookie storage + - session.destroy(): Set cookie value in the browser cookie storage as an empty value to clear the cookie data + - Read the session variables by decrypting the encrypted string from the cookie browser storage ## API -WIP +### Iron Session Options + +Only two options are required: `password` and `cookieName`. Everything else is automatically computed and usually doesn't need to be changed. + +- `password`, **required**: Private key used to encrypt the cookie. It has to be at least 32 characters long. Use to generate strong passwords. `password` can be either a `string` or an `array` of objects like this: `[{id: 2, password: "..."}, {id: 1, password: "..."}]` to allow for password rotation. +- `cookieName`, **required**: Name of the cookie to be stored +- `ttl`, _optional_: In seconds. Default to the equivalent of 14 days. You can set this to `0` and iron-session will compute the maximum allowed value by cookies (~70 years). +- [`cookieOptions`](https://github.com/jshttp/cookie#cookieserializename-value-options), _optional_: Any option available from [jshttp/cookie#serialize](https://github.com/jshttp/cookie#cookieserializename-value-options). Default to: + +```js +{ + httpOnly: true, + secure: true, // true when using https, false otherwise + sameSite: "lax", // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite#lax + // The next line makes sure browser will expire cookies before seals are considered expired by the server. It also allows for clock difference of 60 seconds maximum between servers and clients. + maxAge: (ttl === 0 ? 2147483647 : ttl) - 60, + path: "/", + // other options: + // domain, if you want the cookie to be valid for the whole domain and subdomains, use domain: example.com + // encode, there should be no need to use this option, encoding is done by iron-session already + // expires, there should be no need to use this option, maxAge takes precedence +} +``` + +#### Type Definitions from iron-session/dist/index.node.d.cts + +##### IronSessionOptions + +```ts +interface IronSessionOptions { + /** + * The cookie name that will be used inside the browser. Make sure it's unique + * given your application. + * + * @example 'vercel-session' + */ + cookieName: string; + /** + * The password(s) that will be used to encrypt the cookie. Can either be a string + * or an object. + * + * When you provide multiple passwords then all of them will be used to decrypt + * the cookie. But only the most recent (`= highest key`, `2` in the example) + * password will be used to encrypt the cookie. This allows password rotation. + * + * @example { 1: 'password-1', 2: 'password-2' } + */ + password: Password; + /** + * The time (in seconds) that the session will be valid for. Also sets the + * `max-age` attribute of the cookie automatically (`= ttl - 60s`, so that the + * cookie always expire before the session). + * + * `ttl = 0` means no expiration. + * + * @default 1209600 + */ + ttl?: number; + /** + * The options that will be passed to the cookie library. + * + * If you want to use "session cookies" (cookies that are deleted when the browser + * is closed) then you need to pass `cookieOptions: { maxAge: undefined }` + * + * @see https://github.com/jshttp/cookie#options-1 + */ + cookieOptions?: CookieSerializeOptions; +} + +``` + +##### CookieSerializeOptions + +```ts +interface CookieSerializeOptions { + /** + * Specifies the value for the {@link https://tools.ietf.org/html/rfc6265#section-5.2.3|Domain Set-Cookie attribute}. By default, no + * domain is set, and most clients will consider the cookie to apply to only + * the current domain. + */ + domain?: string | undefined; + + /** + * Specifies a function that will be used to encode a cookie's value. Since + * value of a cookie has a limited character set (and must be a simple + * string), this function can be used to encode a value into a string suited + * for a cookie's value. + * + * The default function is the global `encodeURIComponent`, which will + * encode a JavaScript string into UTF-8 byte sequences and then URL-encode + * any that fall outside of the cookie range. + */ + encode?(value: string): string; + + /** + * Specifies the `Date` object to be the value for the {@link https://tools.ietf.org/html/rfc6265#section-5.2.1|`Expires` `Set-Cookie` attribute}. By default, + * no expiration is set, and most clients will consider this a "non-persistent cookie" and will delete + * it on a condition like exiting a web browser application. + * + * *Note* the {@link https://tools.ietf.org/html/rfc6265#section-5.3|cookie storage model specification} + * states that if both `expires` and `maxAge` are set, then `maxAge` takes precedence, but it is + * possible not all clients by obey this, so if both are set, they should + * point to the same date and time. + */ + expires?: Date | undefined; + /** + * Specifies the boolean value for the {@link https://tools.ietf.org/html/rfc6265#section-5.2.6|`HttpOnly` `Set-Cookie` attribute}. + * When truthy, the `HttpOnly` attribute is set, otherwise it is not. By + * default, the `HttpOnly` attribute is not set. + * + * *Note* be careful when setting this to true, as compliant clients will + * not allow client-side JavaScript to see the cookie in `document.cookie`. + */ + httpOnly?: boolean | undefined; + /** + * Specifies the number (in seconds) to be the value for the `Max-Age` + * `Set-Cookie` attribute. The given number will be converted to an integer + * by rounding down. By default, no maximum age is set. + * + * *Note* the {@link https://tools.ietf.org/html/rfc6265#section-5.3|cookie storage model specification} + * states that if both `expires` and `maxAge` are set, then `maxAge` takes precedence, but it is + * possible not all clients by obey this, so if both are set, they should + * point to the same date and time. + */ + maxAge?: number | undefined; + /** + * Specifies the value for the {@link https://tools.ietf.org/html/rfc6265#section-5.2.4|`Path` `Set-Cookie` attribute}. + * By default, the path is considered the "default path". + */ + path?: string | undefined; + /** + * Specifies the `string` to be the value for the [`Priority` `Set-Cookie` attribute][rfc-west-cookie-priority-00-4.1]. + * + * - `'low'` will set the `Priority` attribute to `Low`. + * - `'medium'` will set the `Priority` attribute to `Medium`, the default priority when not set. + * - `'high'` will set the `Priority` attribute to `High`. + * + * More information about the different priority levels can be found in + * [the specification][rfc-west-cookie-priority-00-4.1]. + * + * **note** This is an attribute that has not yet been fully standardized, and may change in the future. + * This also means many clients may ignore this attribute until they understand it. + */ + priority?: 'low' | 'medium' | 'high' | undefined; + /** + * Specifies the boolean or string to be the value for the {@link https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-03#section-4.1.2.7|`SameSite` `Set-Cookie` attribute}. + * + * - `true` will set the `SameSite` attribute to `Strict` for strict same + * site enforcement. + * - `false` will not set the `SameSite` attribute. + * - `'lax'` will set the `SameSite` attribute to Lax for lax same site + * enforcement. + * - `'strict'` will set the `SameSite` attribute to Strict for strict same + * site enforcement. + * - `'none'` will set the SameSite attribute to None for an explicit + * cross-site cookie. + * + * More information about the different enforcement levels can be found in {@link https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-03#section-4.1.2.7|the specification}. + * + * *note* This is an attribute that has not yet been fully standardized, and may change in the future. This also means many clients may ignore this attribute until they understand it. + */ + sameSite?: true | false | 'lax' | 'strict' | 'none' | undefined; + /** + * Specifies the boolean value for the {@link https://tools.ietf.org/html/rfc6265#section-5.2.5|`Secure` `Set-Cookie` attribute}. When truthy, the + * `Secure` attribute is set, otherwise it is not. By default, the `Secure` attribute is not set. + * + * *Note* be careful when setting this to `true`, as compliant clients will + * not send the cookie back to the server in the future if the browser does + * not have an HTTPS connection. + */ + secure?: boolean | undefined; +} + +``` + +## Iron Session Object + +### getIronSession(req: Request | IncomingMessage, res: Response | ServerResponse, userSessionOptions: IronSessionOptions): Promise> + +```ts +const session = getIronSession(req, res, sessionOptions) +``` + +The API Route Handler that uses `getIronSession` and returns the Response needs to be called from a client-side environment (ie. a 'use client' file). + +### getServerActionIronSession(userSessionOptions: IronSessionOptions, cookieHandler: ICookieHandler): Promise> + +```ts +const session = getServerActionIronSession(sessionOptions, cookies()) +``` + +The `getServerActionIronSession` implementation uses the `cookies()` function from next/headers to set the cookies so that Iron Session can be used in NextJS Server Actions and React Server Components in a server-side environment (ie. a 'use server' file). + +## Iron Session Functions + +### session.save() + +Saves the session and sets the cookie header to be sent once the response is sent. + +```ts +await session.save() +``` + +### session.destroy() + +Empties the session object and sets the cookie header to be sent once the response is sent. The browser will then set the cookie value as an empty value. + +```ts +await session.destroy() +``` + +Upon calling either `session.save()` or `session.destroy()` the session values are saved to the browser cookie storage. + +## NextJS Example + +#### lib/session.ts + +```ts +import { + IronSessionOptions, getIronSession, IronSessionData, getServerActionIronSession +} from 'iron-session' + +import { cookies } from 'next/headers'; + +getIronSessionexport const sessionOptions: IronSessionOptions = { + password: 'change-this-this-is-not-a-secure-password', + cookieName: 'cookieNameInBrowser', + cookieOptions: { + secure: process.env.NODE_ENV === 'production', + }, +} + +declare module 'iron-session' { + interface IronSessionData { + cookieVariable?: string; + } +} + +const getSession = async (req: Request, res: Response) => { + const session = getIronSession(req, res, sessionOptions) + return session +} + +const getServerActionSession = async () => { + const session = getServerActionIronSession(sessionOptions, cookies()) + return session +} + +export { + getSession, + getServerActionSession +} +``` + +### getIronSession + +#### src/app/clientActions.ts + +```ts +'use client' + +export const submitCookieToStorageRouteHandler = async (cookie: string) => { + await fetch('http://localhost:3000/api/submitIronSessionCookie', { + method: 'POST', + body: JSON.stringify({ + cookie, + }), + headers: { + 'Content-Type': 'application/json', + }, + }) +} + +export const readCookieFromStorageRouteHandler = async (): Promise => { + const responseWithCookieFromStorage = await fetch('http://localhost:3000/api/readIronSessionCookie', { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }) + const data = await responseWithCookieFromStorage.json(); + const cookieValue = data?.cookieInStorage || 'No Cookie In Storage' + return cookieValue +} +``` + +#### src/api/submitIronSessionCookie/route.ts + +```ts +import { getSession } from '../../../../lib/session' + +export async function POST(request: Request) { + try { + const requestBody = await request.json() + const { cookie }: { cookie: string } = requestBody + const response = new Response() + const session = await getSession(request, response) + session.cookieVariable = cookie + await session.save() + return response + } catch (error: unknown) { + console.error((error as Error).message) + return new Response(JSON.stringify({ message: (error as Error).message }), { status: 500 }) + } +} +``` + +#### src/api/readIronSessionCookie/route.ts + +```ts +import { NextResponse } from 'next/server' +import { getSession } from '../../../../lib/session' + +export async function GET(request: Request, response: Response) { + try { + const session = await getSession(request, response) + const cookeValue = session.cookieVariable || 'No Cookie Stored!' + return NextResponse.json({ cookieInStorage: cookeValue }) + } catch (error: unknown) { + console.error((error as Error).message) + return new Response(JSON.stringify({ message: (error as Error).message }), { status: 500 }) + } +} +``` + +### getServerActionIronSession + +#### src/app/serverActions.ts + +```ts +'use server' + +import { getServerActionSession } from '../../lib/session' + +export const submitCookieToStorageServerAction = async (cookie: string) => { + const session = await getServerActionSession() + session.cookieVariable = cookie + await session.save() +} + +export const readCookieFromStorageServerAction = async (): Promise => { + const session = await getServerActionSession() + return session.cookieVariable || 'No Cookie Stored!' +} +``` + +#### next.config.js + +```ts +/** @type {import('next').NextConfig} */ +const nextConfig = { + experimental: { + serverActions: true, + }, + } + +module.exports = nextConfig +``` ## FAQ -WIP +### When should I use getIronSession or getServerActionIronSession? + +Use `getIronSession` when you wish to use Iron Session in a client-side environment with API Route Handlers and use `getServerActionIronSession` when you wish to use Iron Session in a server-side environment with Server Components. + +For NextJS projects using App Router with Server Actions enabled in their `next.config.js` file, using `getServerActionIronSession` is preferable for two reasons: + +- allows Iron Session to be called and used from a server-side environment +- allows for more concise code. Server Actions can be called directly from your components without the need for a manually created API route. You can see the smaller amount of code used for `getServerActionIronSession` compared to `getIronSession` in the example. ## Credits From a9932d781ad2a2531f37033dd5effbeda7d3d235 Mon Sep 17 00:00:00 2001 From: Chris Ren Date: Wed, 30 Aug 2023 19:14:42 -0700 Subject: [PATCH 8/9] chore: add nextjs example --- examples/next/.eslintrc.json | 3 + examples/next/.gitignore | 35 + examples/next/README.md | 82 + examples/next/lib/session.ts | 34 + examples/next/next.config.js | 8 + examples/next/package.json | 23 + examples/next/pnpm-lock.yaml | 2331 +++++++++++++++++ .../app-router-and-iron-session-icons.png | Bin 0 -> 27898 bytes examples/next/public/next.svg | 1 + examples/next/public/vercel.svg | 1 + .../app/api/readIronSessionCookie/route.ts | 13 + .../app/api/submitIronSessionCookie/route.ts | 16 + examples/next/src/app/clientActions.ts | 25 + examples/next/src/app/favicon.ico | Bin 0 -> 25931 bytes examples/next/src/app/globals.css | 107 + examples/next/src/app/layout.tsx | 22 + examples/next/src/app/page.module.css | 229 ++ examples/next/src/app/page.tsx | 125 + examples/next/src/app/serverActions.ts | 14 + examples/next/tsconfig.json | 28 + 20 files changed, 3097 insertions(+) create mode 100644 examples/next/.eslintrc.json create mode 100644 examples/next/.gitignore create mode 100644 examples/next/README.md create mode 100644 examples/next/lib/session.ts create mode 100644 examples/next/next.config.js create mode 100644 examples/next/package.json create mode 100644 examples/next/pnpm-lock.yaml create mode 100644 examples/next/public/app-router-and-iron-session-icons.png create mode 100644 examples/next/public/next.svg create mode 100644 examples/next/public/vercel.svg create mode 100644 examples/next/src/app/api/readIronSessionCookie/route.ts create mode 100644 examples/next/src/app/api/submitIronSessionCookie/route.ts create mode 100644 examples/next/src/app/clientActions.ts create mode 100644 examples/next/src/app/favicon.ico create mode 100644 examples/next/src/app/globals.css create mode 100644 examples/next/src/app/layout.tsx create mode 100644 examples/next/src/app/page.module.css create mode 100644 examples/next/src/app/page.tsx create mode 100644 examples/next/src/app/serverActions.ts create mode 100644 examples/next/tsconfig.json diff --git a/examples/next/.eslintrc.json b/examples/next/.eslintrc.json new file mode 100644 index 00000000..bffb357a --- /dev/null +++ b/examples/next/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/examples/next/.gitignore b/examples/next/.gitignore new file mode 100644 index 00000000..8f322f0d --- /dev/null +++ b/examples/next/.gitignore @@ -0,0 +1,35 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/examples/next/README.md b/examples/next/README.md new file mode 100644 index 00000000..e46724dc --- /dev/null +++ b/examples/next/README.md @@ -0,0 +1,82 @@ +

+ + + NextJS App Router Logo + + +

+ +

+ App Router With Iron Session +

+ +A web application that demonstrates a NextJS App Router project writing and reading encrypted cookies to and from the browser's cookie storage using [Iron Session](https://github.com/vvo/iron-session) and App Router's [cookie function](https://nextjs.org/docs/app/api-reference/functions/cookies). This application uses both access methods of [API Route Handlers](https://nextjs.org/docs/app/building-your-application/routing/route-handlers) and [Server Actions](https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions). + +## 🀝 Iron Session and NextJS + +The [Iron Session V8 branch](https://github.com/vvo/iron-session/issues/586) allows Iron Session to be used with the NextJS App Router and (soon) React Server Components. + +[renchris' fork of the V8 branch](https://github.com/renchris/iron-session/tree/v8-as-dependency) now allows Iron Session to be used with React Server Components and NextJS Server Actions. + +Both the fork of the V8 branch and this project are written for developers to now be able use Iron Session in their NextJS App Router production applications, and additionally, for this to be included in the V8 branch via Pull Request to complete and push V8 into the Iron Session main branch for all developers to use. + +## πŸš€ Usage + +1. **First, run the development server:** + + ```bash + pnpm dev + ``` + +1. **Open the App Router with Iron Session web application.** + + Open [http://localhost:3000](http://localhost:3000) with your browser to see demo application. + +1. **Open the cookie storage in your Developer Tools.** + + Right click the page and click "Inspect". From the top menu items, click "Application". On the left panel, under Storage, and under Cookies, click the page URL . Here you can observe the encrypted cookie being set and read from storage. + +1. **Write an encrypted cookie to storage.** + + In the top left 'Current Cookie' text field, type in the string text value of the cookie you wish to set. Then you can click Set Cookie Via Server Action or Set Cookie Via API Route Handler button. You can now see an encrypted string value set in the cookie storage browser in your Developer Tools. + +1. **Read the encrypted cookie from storage.** + + Click the Read Cookie Via Server Action or Read Cookie Via API Route Handler button. The encrypted cookie in storage will be decrypted back into the readable string text value you initially set and displayed in the button subtext. + +## 🧐 What's inside? + +A quick look at the top-level files and directories where we made our feature changes in the project. + + lib + └── session.ts + src + └── app + β”œβ”€β”€ api + | β”œβ”€β”€ readIronSessionCookie + | | └── route.ts + | └── submitIronSessionCookie + | └── route.ts + β”œβ”€β”€ clientActions.ts + β”œβ”€β”€ page.tsx + └── serverActions.ts + +1. **`/lib/session.ts`**: This file contains the custom session options and session data interface the application will be using Iron Session with. The file then exports the Iron Session session and Iron Session Server Action session to be imported and used by other files. + +1. **`/src/app`**: This directory will contain all of the code related to what you will see on the front-end of the site. `src` is a convention for β€œsource code” and `app` is the convention for β€œapp router”. + +1. **`/api`**: This directory will contain all of the API Route Handlers: custom request handlers for a given route using the Web Request and Response. Route Handlers are defined in a `route.ts` file + +1. **`readIronSessionCookie/route.ts`**: This file contains the API Route Handler that uses Iron Session to read the cookie value from cookie storage. + +1. **`submitIronSessionCookie/route.ts`**: This file contains the API Route Handler that uses Iron Session to encrypt and write the current cookie string text value to cookie storage. + +1. **`clientActions.ts`**: API Route Handlers need to be called from a client-side environment to be able to interact with client-side data. This "use client" file calls the readIronSessionCookie and submitIronSessionCookie API Route Handlers that write and read data from and to cookie storage in the client-side browser. + +1. **`page.tsx`**: This file contains the code for the front-end page. It imports the Server Action functions from the `serverActions.ts` file and the API Route Handler functions from the `clientActions.ts` file which gets invoked on click of the respective button. + +1. **`serverActions.ts`**: This file contains the Server Action functions of submitting and reading cookies from using the Iron Session Server Action session. + +## πŸ“£ Recognition + +Thank you to [@vvo](https://github.com/vvo) and [@brc-dd](https://github.com/brc-dd) for the creation and maintenance of the Iron Session library. Thank you to the NextJS community on Discord, especially [joulev](https://github.com/joulev), and the participants in the Iron Session discussion threads on GitHub for the development support that made creating this project possible. diff --git a/examples/next/lib/session.ts b/examples/next/lib/session.ts new file mode 100644 index 00000000..d72da7c7 --- /dev/null +++ b/examples/next/lib/session.ts @@ -0,0 +1,34 @@ +import { + IronSessionOptions, getIronSession, IronSessionData, getServerActionIronSession +} from 'iron-session' + +import { cookies } from 'next/headers'; + +export const sessionOptions: IronSessionOptions = { + password: 'change-this-this-is-not-a-secure-password', + cookieName: 'cookieNameInBrowser', + cookieOptions: { + secure: process.env.NODE_ENV === 'production', + }, +} + +declare module 'iron-session' { + interface IronSessionData { + cookieVariable?: string; + } +} + +const getSession = async (req: Request, res: Response) => { + const session = getIronSession(req, res, sessionOptions) + return session +} + +const getServerActionSession = async () => { + const session = getServerActionIronSession(sessionOptions, cookies()) + return session +} + +export { + getSession, + getServerActionSession +} diff --git a/examples/next/next.config.js b/examples/next/next.config.js new file mode 100644 index 00000000..8970a1d4 --- /dev/null +++ b/examples/next/next.config.js @@ -0,0 +1,8 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + experimental: { + serverActions: true, //set to false and remove 'use server' in actions.ts to disable server actions + }, + } + +module.exports = nextConfig diff --git a/examples/next/package.json b/examples/next/package.json new file mode 100644 index 00000000..a179920e --- /dev/null +++ b/examples/next/package.json @@ -0,0 +1,23 @@ +{ + "name": "app-router-with-iron-session", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "@types/node": "20.4.2", + "@types/react": "18.2.15", + "@types/react-dom": "18.2.7", + "eslint": "8.45.0", + "eslint-config-next": "13.4.10", + "iron-session": "workspace:*", + "next": "13.4.10", + "react": "18.2.0", + "react-dom": "18.2.0", + "typescript": "5.1.6" + } +} \ No newline at end of file diff --git a/examples/next/pnpm-lock.yaml b/examples/next/pnpm-lock.yaml new file mode 100644 index 00000000..53ca70f3 --- /dev/null +++ b/examples/next/pnpm-lock.yaml @@ -0,0 +1,2331 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@types/node': + specifier: 20.4.2 + version: 20.4.2 + '@types/react': + specifier: 18.2.15 + version: 18.2.15 + '@types/react-dom': + specifier: 18.2.7 + version: 18.2.7 + eslint: + specifier: 8.45.0 + version: 8.45.0 + eslint-config-next: + specifier: 13.4.10 + version: 13.4.10(eslint@8.45.0)(typescript@5.1.6) + iron-session: + specifier: github:renchris/iron-session#v8-as-dependency + version: github.com/renchris/iron-session/e97de8bee59e975aa0f392b42cd27e090c337aad + next: + specifier: 13.4.10 + version: 13.4.10(react-dom@18.2.0)(react@18.2.0) + react: + specifier: 18.2.0 + version: 18.2.0 + react-dom: + specifier: 18.2.0 + version: 18.2.0(react@18.2.0) + typescript: + specifier: 5.1.6 + version: 5.1.6 + +packages: + + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: false + + /@babel/runtime@7.22.6: + resolution: {integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.11 + dev: false + + /@eslint-community/eslint-utils@4.4.0(eslint@8.45.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.45.0 + eslint-visitor-keys: 3.4.1 + dev: false + + /@eslint-community/regexpp@4.5.1: + resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: false + + /@eslint/eslintrc@2.1.0: + resolution: {integrity: sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.20.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@eslint/js@8.44.0: + resolution: {integrity: sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: false + + /@humanwhocodes/config-array@0.11.10: + resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: false + + /@humanwhocodes/object-schema@1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: false + + /@next/env@13.4.10: + resolution: {integrity: sha512-3G1yD/XKTSLdihyDSa8JEsaWOELY+OWe08o0LUYzfuHp1zHDA8SObQlzKt+v+wrkkPcnPweoLH1ImZeUa0A1NQ==} + dev: false + + /@next/eslint-plugin-next@13.4.10: + resolution: {integrity: sha512-YJqyq6vk39JQfvaNtN83t/p5Jy45+bazRL+V4QI8FPd3FBqFYMEsULiwRLgSJMgFqkk4t4JbeZurz+gILEAFpA==} + dependencies: + glob: 7.1.7 + dev: false + + /@next/swc-darwin-arm64@13.4.10: + resolution: {integrity: sha512-4bsdfKmmg7mgFGph0UorD1xWfZ5jZEw4kKRHYEeTK9bT1QnMbPVPlVXQRIiFPrhoDQnZUoa6duuPUJIEGLV1Jg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-darwin-x64@13.4.10: + resolution: {integrity: sha512-ngXhUBbcZIWZWqNbQSNxQrB9T1V+wgfCzAor2olYuo/YpaL6mUYNUEgeBMhr8qwV0ARSgKaOp35lRvB7EmCRBg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-gnu@13.4.10: + resolution: {integrity: sha512-SjCZZCOmHD4uyM75MVArSAmF5Y+IJSGroPRj2v9/jnBT36SYFTORN8Ag/lhw81W9EeexKY/CUg2e9mdebZOwsg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-musl@13.4.10: + resolution: {integrity: sha512-F+VlcWijX5qteoYIOxNiBbNE8ruaWuRlcYyIRK10CugqI/BIeCDzEDyrHIHY8AWwbkTwe6GRHabMdE688Rqq4Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-gnu@13.4.10: + resolution: {integrity: sha512-WDv1YtAV07nhfy3i1visr5p/tjiH6CeXp4wX78lzP1jI07t4PnHHG1WEDFOduXh3WT4hG6yN82EQBQHDi7hBrQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-musl@13.4.10: + resolution: {integrity: sha512-zFkzqc737xr6qoBgDa3AwC7jPQzGLjDlkNmt/ljvQJ/Veri5ECdHjZCUuiTUfVjshNIIpki6FuP0RaQYK9iCRg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-arm64-msvc@13.4.10: + resolution: {integrity: sha512-IboRS8IWz5mWfnjAdCekkl8s0B7ijpWeDwK2O8CdgZkoCDY0ZQHBSGiJ2KViAG6+BJVfLvcP+a2fh6cdyBr9QQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-ia32-msvc@13.4.10: + resolution: {integrity: sha512-bSA+4j8jY4EEiwD/M2bol4uVEu1lBlgsGdvM+mmBm/BbqofNBfaZ2qwSbwE2OwbAmzNdVJRFRXQZ0dkjopTRaQ==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-x64-msvc@13.4.10: + resolution: {integrity: sha512-g2+tU63yTWmcVQKDGY0MV1PjjqgZtwM4rB1oVVi/v0brdZAcrcTV+04agKzWtvWroyFz6IqtT0MoZJA7PNyLVw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: false + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: false + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: false + + /@pkgr/utils@2.4.2: + resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dependencies: + cross-spawn: 7.0.3 + fast-glob: 3.3.0 + is-glob: 4.0.3 + open: 9.1.0 + picocolors: 1.0.0 + tslib: 2.6.0 + dev: false + + /@rushstack/eslint-patch@1.3.2: + resolution: {integrity: sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw==} + dev: false + + /@swc/helpers@0.5.1: + resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} + dependencies: + tslib: 2.6.0 + dev: false + + /@types/json5@0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: false + + /@types/node@20.4.2: + resolution: {integrity: sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==} + dev: false + + /@types/prop-types@15.7.5: + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + dev: false + + /@types/react-dom@18.2.7: + resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==} + dependencies: + '@types/react': 18.2.15 + dev: false + + /@types/react@18.2.15: + resolution: {integrity: sha512-oEjE7TQt1fFTFSbf8kkNuc798ahTUzn3Le67/PWjE8MAfYAD/qB7O8hSTcromLFqHCt9bcdOg5GXMokzTjJ5SA==} + dependencies: + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.3 + csstype: 3.1.2 + dev: false + + /@types/scheduler@0.16.3: + resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} + dev: false + + /@typescript-eslint/parser@5.62.0(eslint@8.45.0)(typescript@5.1.6): + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.1.6) + debug: 4.3.4 + eslint: 8.45.0 + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/scope-manager@5.62.0: + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + dev: false + + /@typescript-eslint/types@5.62.0: + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: false + + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.1.6): + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + tsutils: 3.21.0(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/visitor-keys@5.62.0: + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.1 + dev: false + + /acorn-jsx@5.3.2(acorn@8.10.0): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.10.0 + dev: false + + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: false + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: false + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: false + + /aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + dependencies: + dequal: 2.0.3 + dev: false + + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.2 + is-array-buffer: 3.0.2 + dev: false + + /array-includes@3.1.6: + resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 + is-string: 1.0.7 + dev: false + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: false + + /array.prototype.flat@1.3.1: + resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 + dev: false + + /array.prototype.flatmap@1.3.1: + resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 + dev: false + + /array.prototype.tosorted@1.1.1: + resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 + get-intrinsic: 1.2.1 + dev: false + + /arraybuffer.prototype.slice@1.0.1: + resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.2 + define-properties: 1.2.0 + get-intrinsic: 1.2.1 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 + dev: false + + /ast-types-flow@0.0.7: + resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} + dev: false + + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + dev: false + + /axe-core@4.7.2: + resolution: {integrity: sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==} + engines: {node: '>=4'} + dev: false + + /axobject-query@3.2.1: + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + dependencies: + dequal: 2.0.3 + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: false + + /big-integer@1.6.51: + resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} + engines: {node: '>=0.6'} + dev: false + + /bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + dependencies: + big-integer: 1.6.51 + dev: false + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: false + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: false + + /bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + dependencies: + run-applescript: 5.0.0 + dev: false + + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + dependencies: + streamsearch: 1.1.0 + dev: false + + /call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + dev: false + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: false + + /caniuse-lite@1.0.30001516: + resolution: {integrity: sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g==} + dev: false + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: false + + /client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + dev: false + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: false + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: false + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: false + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: false + + /csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + dev: false + + /damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + dev: false + + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: false + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: false + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: false + + /default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + dependencies: + bplist-parser: 0.2.0 + untildify: 4.0.0 + dev: false + + /default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + dependencies: + bundle-name: 3.0.0 + default-browser-id: 3.0.0 + execa: 7.1.1 + titleize: 3.0.0 + dev: false + + /define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + dev: false + + /define-properties@1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + dev: false + + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: false + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: false + + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: false + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: false + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: false + + /enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: false + + /es-abstract@1.22.1: + resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.1 + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + es-set-tostringtag: 2.0.1 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.5 + get-intrinsic: 1.2.1 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has: 1.0.3 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.12 + is-weakref: 1.0.2 + object-inspect: 1.12.3 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.5.0 + safe-array-concat: 1.0.0 + safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.7 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 + typed-array-buffer: 1.0.0 + typed-array-byte-length: 1.0.0 + typed-array-byte-offset: 1.0.0 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.11 + dev: false + + /es-set-tostringtag@2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.3 + has-tostringtag: 1.0.0 + dev: false + + /es-shim-unscopables@1.0.0: + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + dependencies: + has: 1.0.3 + dev: false + + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: false + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: false + + /eslint-config-next@13.4.10(eslint@8.45.0)(typescript@5.1.6): + resolution: {integrity: sha512-+JjcM6lQmFR5Mw0ORm9o1CR29+z/uajgSfYAPEGIBxOhTHBgCMs7ysuwi72o7LkMmA8E3N7/h09pSGZxs0s85g==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@next/eslint-plugin-next': 13.4.10 + '@rushstack/eslint-patch': 1.3.2 + '@typescript-eslint/parser': 5.62.0(eslint@8.45.0)(typescript@5.1.6) + eslint: 8.45.0 + eslint-import-resolver-node: 0.3.7 + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.45.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.45.0) + eslint-plugin-jsx-a11y: 6.7.1(eslint@8.45.0) + eslint-plugin-react: 7.32.2(eslint@8.45.0) + eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@8.45.0) + typescript: 5.1.6 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - supports-color + dev: false + + /eslint-import-resolver-node@0.3.7: + resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} + dependencies: + debug: 3.2.7 + is-core-module: 2.12.1 + resolve: 1.22.2 + transitivePeerDependencies: + - supports-color + dev: false + + /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.45.0): + resolution: {integrity: sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + dependencies: + debug: 4.3.4 + enhanced-resolve: 5.15.0 + eslint: 8.45.0 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.45.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.45.0) + get-tsconfig: 4.6.2 + globby: 13.2.2 + is-core-module: 2.12.1 + is-glob: 4.0.3 + synckit: 0.8.5 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + dev: false + + /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.45.0): + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.45.0)(typescript@5.1.6) + debug: 3.2.7 + eslint: 8.45.0 + eslint-import-resolver-node: 0.3.7 + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.45.0) + transitivePeerDependencies: + - supports-color + dev: false + + /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.45.0): + resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.45.0)(typescript@5.1.6) + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 + array.prototype.flatmap: 1.3.1 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.45.0 + eslint-import-resolver-node: 0.3.7 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.45.0) + has: 1.0.3 + is-core-module: 2.12.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.values: 1.1.6 + resolve: 1.22.2 + semver: 6.3.1 + tsconfig-paths: 3.14.2 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: false + + /eslint-plugin-jsx-a11y@6.7.1(eslint@8.45.0): + resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + '@babel/runtime': 7.22.6 + aria-query: 5.3.0 + array-includes: 3.1.6 + array.prototype.flatmap: 1.3.1 + ast-types-flow: 0.0.7 + axe-core: 4.7.2 + axobject-query: 3.2.1 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 8.45.0 + has: 1.0.3 + jsx-ast-utils: 3.3.4 + language-tags: 1.0.5 + minimatch: 3.1.2 + object.entries: 1.1.6 + object.fromentries: 2.0.6 + semver: 6.3.1 + dev: false + + /eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705(eslint@8.45.0): + resolution: {integrity: sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 8.45.0 + dev: false + + /eslint-plugin-react@7.32.2(eslint@8.45.0): + resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.6 + array.prototype.flatmap: 1.3.1 + array.prototype.tosorted: 1.1.1 + doctrine: 2.1.0 + eslint: 8.45.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.4 + minimatch: 3.1.2 + object.entries: 1.1.6 + object.fromentries: 2.0.6 + object.hasown: 1.1.2 + object.values: 1.1.6 + prop-types: 15.8.1 + resolve: 2.0.0-next.4 + semver: 6.3.1 + string.prototype.matchall: 4.0.8 + dev: false + + /eslint-scope@7.2.1: + resolution: {integrity: sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: false + + /eslint-visitor-keys@3.4.1: + resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: false + + /eslint@8.45.0: + resolution: {integrity: sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.45.0) + '@eslint-community/regexpp': 4.5.1 + '@eslint/eslintrc': 2.1.0 + '@eslint/js': 8.44.0 + '@humanwhocodes/config-array': 0.11.10 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.1 + eslint-visitor-keys: 3.4.1 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.20.0 + graphemer: 1.4.0 + ignore: 5.2.4 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: false + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) + eslint-visitor-keys: 3.4.1 + dev: false + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: false + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: false + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: false + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: false + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: false + + /execa@7.1.1: + resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: false + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: false + + /fast-glob@3.3.0: + resolution: {integrity: sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: false + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: false + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: false + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.0.4 + dev: false + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: false + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: false + + /flat-cache@3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.7 + rimraf: 3.0.2 + dev: false + + /flatted@3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + dev: false + + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: false + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: false + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: false + + /function.prototype.name@1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + functions-have-names: 1.2.3 + dev: false + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: false + + /get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-proto: 1.0.1 + has-symbols: 1.0.3 + dev: false + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: false + + /get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + dev: false + + /get-tsconfig@4.6.2: + resolution: {integrity: sha512-E5XrT4CbbXcXWy+1jChlZmrmCwd5KGx502kDCXJJ7y898TtWW9FwoG5HfOLVRKmlmDGkWN2HM9Ho+/Y8F0sJDg==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: false + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: false + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: false + + /glob@7.1.7: + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: false + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: false + + /globals@13.20.0: + resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: false + + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.0 + dev: false + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.0 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: false + + /globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.0 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 4.0.0 + dev: false + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.1 + dev: false + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: false + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: false + + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: false + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: false + + /has-property-descriptors@1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + dependencies: + get-intrinsic: 1.2.1 + dev: false + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: false + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: false + + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: false + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: false + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: false + + /human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + dev: false + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: false + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: false + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: false + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: false + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: false + + /internal-slot@1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.3 + side-channel: 1.0.4 + dev: false + + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.12 + dev: false + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: false + + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: false + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: false + + /is-core-module@2.12.1: + resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} + dependencies: + has: 1.0.3 + dev: false + + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: false + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: false + + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: false + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: false + + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 + dev: false + + /is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: false + + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: false + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: false + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: false + + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: false + + /is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.2 + dev: false + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: false + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: false + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: false + + /is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.11 + dev: false + + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.2 + dev: false + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: false + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: false + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: false + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: false + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: false + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: false + + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: false + + /jsx-ast-utils@3.3.4: + resolution: {integrity: sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw==} + engines: {node: '>=4.0'} + dependencies: + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 + object.assign: 4.1.4 + object.values: 1.1.6 + dev: false + + /language-subtag-registry@0.3.22: + resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} + dev: false + + /language-tags@1.0.5: + resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} + dependencies: + language-subtag-registry: 0.3.22 + dev: false + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: false + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: false + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: false + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: false + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: false + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: false + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: false + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: false + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: false + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: false + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: false + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: false + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: false + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: false + + /next@13.4.10(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-4ep6aKxVTQ7rkUW2fBLhpBr/5oceCuf4KmlUpvG/aXuDTIf9mexNSpabUD6RWPspu6wiJJvozZREhXhueYO36A==} + engines: {node: '>=16.8.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + fibers: '>= 3.1.0' + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + fibers: + optional: true + sass: + optional: true + dependencies: + '@next/env': 13.4.10 + '@swc/helpers': 0.5.1 + busboy: 1.6.0 + caniuse-lite: 1.0.30001516 + postcss: 8.4.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + styled-jsx: 5.1.1(react@18.2.0) + watchpack: 2.4.0 + zod: 3.21.4 + optionalDependencies: + '@next/swc-darwin-arm64': 13.4.10 + '@next/swc-darwin-x64': 13.4.10 + '@next/swc-linux-arm64-gnu': 13.4.10 + '@next/swc-linux-arm64-musl': 13.4.10 + '@next/swc-linux-x64-gnu': 13.4.10 + '@next/swc-linux-x64-musl': 13.4.10 + '@next/swc-win32-arm64-msvc': 13.4.10 + '@next/swc-win32-ia32-msvc': 13.4.10 + '@next/swc-win32-x64-msvc': 13.4.10 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: false + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: false + + /npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: false + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: false + + /object-inspect@1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + dev: false + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: false + + /object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: false + + /object.entries@1.1.6: + resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: false + + /object.fromentries@2.0.6: + resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: false + + /object.hasown@1.1.2: + resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} + dependencies: + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: false + + /object.values@1.1.6: + resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: false + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: false + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: false + + /open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + dependencies: + default-browser: 4.0.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 2.2.0 + dev: false + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: false + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: false + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: false + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: false + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: false + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: false + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: false + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: false + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: false + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: false + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: false + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: false + + /postcss@8.4.14: + resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: false + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: false + + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + dev: false + + /punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: false + + /react-dom@18.2.0(react@18.2.0): + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: false + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + dev: false + + /react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: false + + /regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + dev: false + + /regexp.prototype.flags@1.5.0: + resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + functions-have-names: 1.2.3 + dev: false + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: false + + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: false + + /resolve@1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + hasBin: true + dependencies: + is-core-module: 2.12.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: false + + /resolve@2.0.0-next.4: + resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} + hasBin: true + dependencies: + is-core-module: 2.12.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: false + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: false + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: false + + /run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + dependencies: + execa: 5.1.1 + dev: false + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: false + + /safe-array-concat@1.0.0: + resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: false + + /safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-regex: 1.1.4 + dev: false + + /scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: false + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: false + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: false + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: false + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + object-inspect: 1.12.3 + dev: false + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: false + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: false + + /slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + dev: false + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: false + + /streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + dev: false + + /string.prototype.matchall@4.0.8: + resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + regexp.prototype.flags: 1.5.0 + side-channel: 1.0.4 + dev: false + + /string.prototype.trim@1.2.7: + resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: false + + /string.prototype.trimend@1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: false + + /string.prototype.trimstart@1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: false + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: false + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: false + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: false + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: false + + /styled-jsx@5.1.1(react@18.2.0): + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + dependencies: + client-only: 0.0.1 + react: 18.2.0 + dev: false + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: false + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: false + + /synckit@0.8.5: + resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} + engines: {node: ^14.18.0 || >=16.0.0} + dependencies: + '@pkgr/utils': 2.4.2 + tslib: 2.6.0 + dev: false + + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: false + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: false + + /titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + dev: false + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: false + + /tsconfig-paths@3.14.2: + resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: false + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: false + + /tslib@2.6.0: + resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} + dev: false + + /tsutils@3.21.0(typescript@5.1.6): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 5.1.6 + dev: false + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: false + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: false + + /typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.12 + dev: false + + /typed-array-byte-length@1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: false + + /typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: false + + /typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + is-typed-array: 1.1.12 + dev: false + + /typescript@5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + dev: false + + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.2 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: false + + /untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + dev: false + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.0 + dev: false + + /watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + dev: false + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: false + + /which-typed-array@1.1.11: + resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + dev: false + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: false + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: false + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: false + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: false + + /zod@3.21.4: + resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} + dev: false + + github.com/renchris/iron-session/e97de8bee59e975aa0f392b42cd27e090c337aad: + resolution: {tarball: https://codeload.github.com/renchris/iron-session/tar.gz/e97de8bee59e975aa0f392b42cd27e090c337aad} + name: iron-session + version: 8.0.0-alpha.0 + dev: false diff --git a/examples/next/public/app-router-and-iron-session-icons.png b/examples/next/public/app-router-and-iron-session-icons.png new file mode 100644 index 0000000000000000000000000000000000000000..0c5613d39fcc392d2229b2f155aec75aca2fa8f1 GIT binary patch literal 27898 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 \ No newline at end of file diff --git a/examples/next/public/vercel.svg b/examples/next/public/vercel.svg new file mode 100644 index 00000000..d2f84222 --- /dev/null +++ b/examples/next/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/next/src/app/api/readIronSessionCookie/route.ts b/examples/next/src/app/api/readIronSessionCookie/route.ts new file mode 100644 index 00000000..418b8333 --- /dev/null +++ b/examples/next/src/app/api/readIronSessionCookie/route.ts @@ -0,0 +1,13 @@ +import { NextResponse } from 'next/server' +import { getSession } from '../../../../lib/session' + +export async function GET(request: Request, response: Response) { + try { + const session = await getSession(request, response) + const cookeValue = session.cookieVariable || 'No Cookie Stored!' + return NextResponse.json({ cookieInStorage: cookeValue }) + } catch (error: unknown) { + console.error((error as Error).message) + return new Response(JSON.stringify({ message: (error as Error).message }), { status: 500 }) + } +} diff --git a/examples/next/src/app/api/submitIronSessionCookie/route.ts b/examples/next/src/app/api/submitIronSessionCookie/route.ts new file mode 100644 index 00000000..d51aae91 --- /dev/null +++ b/examples/next/src/app/api/submitIronSessionCookie/route.ts @@ -0,0 +1,16 @@ +import { getSession } from '../../../../lib/session' + +export async function POST(request: Request) { + try { + const requestBody = await request.json() + const { cookie }: { cookie: string } = requestBody + const response = new Response() + const session = await getSession(request, response) + session.cookieVariable = cookie + await session.save() + return response + } catch (error: unknown) { + console.error((error as Error).message) + return new Response(JSON.stringify({ message: (error as Error).message }), { status: 500 }) + } +} diff --git a/examples/next/src/app/clientActions.ts b/examples/next/src/app/clientActions.ts new file mode 100644 index 00000000..f6e0fbc4 --- /dev/null +++ b/examples/next/src/app/clientActions.ts @@ -0,0 +1,25 @@ +'use client' + +export const submitCookieToStorageRouteHandler = async (cookie: string) => { + await fetch('http://localhost:3000/api/submitIronSessionCookie', { + method: 'POST', + body: JSON.stringify({ + cookie, + }), + headers: { + 'Content-Type': 'application/json', + }, + }) +} + +export const readCookieFromStorageRouteHandler = async (): Promise => { + const responseWithCookieFromStorage = await fetch('http://localhost:3000/api/readIronSessionCookie', { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }) + const data = await responseWithCookieFromStorage.json(); + const cookieValue = data?.cookieInStorage || 'No Cookie In Storage' + return cookieValue +} \ No newline at end of file diff --git a/examples/next/src/app/favicon.ico b/examples/next/src/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 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 LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/examples/next/src/app/globals.css b/examples/next/src/app/globals.css new file mode 100644 index 00000000..d4f491e1 --- /dev/null +++ b/examples/next/src/app/globals.css @@ -0,0 +1,107 @@ +:root { + --max-width: 1100px; + --border-radius: 12px; + --font-mono: ui-monospace, Menlo, Monaco, 'Cascadia Mono', 'Segoe UI Mono', + 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro', + 'Fira Mono', 'Droid Sans Mono', 'Courier New', monospace; + + --foreground-rgb: 0, 0, 0; + --background-start-rgb: 214, 219, 220; + --background-end-rgb: 255, 255, 255; + + --primary-glow: conic-gradient( + from 180deg at 50% 50%, + #16abff33 0deg, + #0885ff33 55deg, + #54d6ff33 120deg, + #0071ff33 160deg, + transparent 360deg + ); + --secondary-glow: radial-gradient( + rgba(255, 255, 255, 1), + rgba(255, 255, 255, 0) + ); + + --tile-start-rgb: 239, 245, 249; + --tile-end-rgb: 228, 232, 233; + --tile-border: conic-gradient( + #00000080, + #00000040, + #00000030, + #00000020, + #00000010, + #00000010, + #00000080 + ); + + --callout-rgb: 238, 240, 241; + --callout-border-rgb: 172, 175, 176; + --card-rgb: 180, 185, 188; + --card-border-rgb: 131, 134, 135; +} + +@media (prefers-color-scheme: dark) { + :root { + --foreground-rgb: 255, 255, 255; + --background-start-rgb: 0, 0, 0; + --background-end-rgb: 0, 0, 0; + + --primary-glow: radial-gradient(rgba(1, 65, 255, 0.4), rgba(1, 65, 255, 0)); + --secondary-glow: linear-gradient( + to bottom right, + rgba(1, 65, 255, 0), + rgba(1, 65, 255, 0), + rgba(1, 65, 255, 0.3) + ); + + --tile-start-rgb: 2, 13, 46; + --tile-end-rgb: 2, 5, 19; + --tile-border: conic-gradient( + #ffffff80, + #ffffff40, + #ffffff30, + #ffffff20, + #ffffff10, + #ffffff10, + #ffffff80 + ); + + --callout-rgb: 20, 20, 20; + --callout-border-rgb: 108, 108, 108; + --card-rgb: 100, 100, 100; + --card-border-rgb: 200, 200, 200; + } +} + +* { + box-sizing: border-box; + padding: 0; + margin: 0; +} + +html, +body { + max-width: 100vw; + overflow-x: hidden; +} + +body { + color: rgb(var(--foreground-rgb)); + background: linear-gradient( + to bottom, + transparent, + rgb(var(--background-end-rgb)) + ) + rgb(var(--background-start-rgb)); +} + +a { + color: inherit; + text-decoration: none; +} + +@media (prefers-color-scheme: dark) { + html { + color-scheme: dark; + } +} diff --git a/examples/next/src/app/layout.tsx b/examples/next/src/app/layout.tsx new file mode 100644 index 00000000..ae845621 --- /dev/null +++ b/examples/next/src/app/layout.tsx @@ -0,0 +1,22 @@ +import './globals.css' +import type { Metadata } from 'next' +import { Inter } from 'next/font/google' + +const inter = Inter({ subsets: ['latin'] }) + +export const metadata: Metadata = { + title: 'Create Next App', + description: 'Generated by create next app', +} + +export default function RootLayout({ + children, +}: { + children: React.ReactNode +}) { + return ( + + {children} + + ) +} diff --git a/examples/next/src/app/page.module.css b/examples/next/src/app/page.module.css new file mode 100644 index 00000000..9411a5e6 --- /dev/null +++ b/examples/next/src/app/page.module.css @@ -0,0 +1,229 @@ +.main { + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; + padding: 6rem; + min-height: 100vh; +} + +.description { + display: inherit; + justify-content: inherit; + align-items: inherit; + font-size: 0.85rem; + max-width: var(--max-width); + width: 100%; + z-index: 2; + font-family: var(--font-mono); +} + +.description a { + display: flex; + justify-content: center; + align-items: center; + gap: 0.5rem; +} + +.description p { + position: relative; + margin: 0; + padding: 1rem; + background-color: rgba(var(--callout-rgb), 0.5); + border: 1px solid rgba(var(--callout-border-rgb), 0.3); + border-radius: var(--border-radius); +} + +.code { + font-weight: 700; + font-family: var(--font-mono); +} + +.grid { + display: grid; + grid-template-columns: repeat(4, minmax(25%, auto)); + width: var(--max-width); + max-width: 100%; +} + +.card { + padding: 1rem 1.2rem; + border-radius: var(--border-radius); + background: rgba(var(--card-rgb), 0); + border: 1px solid rgba(var(--card-border-rgb), 0); + transition: background 200ms, border 200ms; +} + +.card span { + display: inline-block; + transition: transform 200ms; +} + +.card h2 { + font-weight: 600; + margin-bottom: 0.7rem; +} + +.card p { + margin: 0; + opacity: 0.6; + font-size: 0.9rem; + line-height: 1.5; + max-width: 30ch; +} + +.center { + display: flex; + justify-content: center; + align-items: center; + position: relative; + padding: 4rem 0; +} + +.center::before { + background: var(--secondary-glow); + border-radius: 50%; + width: 480px; + height: 360px; + margin-left: -400px; +} + +.center::after { + background: var(--primary-glow); + width: 240px; + height: 180px; + z-index: -1; +} + +.center::before, +.center::after { + content: ''; + left: 50%; + position: absolute; + filter: blur(45px); + transform: translateZ(0); +} + +.logo { + position: relative; +} +/* Enable hover only on non-touch devices */ +@media (hover: hover) and (pointer: fine) { + .card:hover { + background: rgba(var(--card-rgb), 0.1); + border: 1px solid rgba(var(--card-border-rgb), 0.15); + } + + .card:hover span { + transform: translateX(4px); + } +} + +@media (prefers-reduced-motion) { + .card:hover span { + transform: none; + } +} + +/* Mobile */ +@media (max-width: 700px) { + .content { + padding: 4rem; + } + + .grid { + grid-template-columns: 1fr; + margin-bottom: 120px; + max-width: 320px; + text-align: center; + } + + .card { + padding: 1rem 2.5rem; + } + + .card h2 { + margin-bottom: 0.5rem; + } + + .center { + padding: 8rem 0 6rem; + } + + .center::before { + transform: none; + height: 300px; + } + + .description { + font-size: 0.8rem; + } + + .description a { + padding: 1rem; + } + + .description p, + .description div { + display: flex; + justify-content: center; + position: fixed; + width: 100%; + } + + .description p { + align-items: center; + inset: 0 0 auto; + padding: 2rem 1rem 1.4rem; + border-radius: 0; + border: none; + border-bottom: 1px solid rgba(var(--callout-border-rgb), 0.25); + background: linear-gradient( + to bottom, + rgba(var(--background-start-rgb), 1), + rgba(var(--callout-rgb), 0.5) + ); + background-clip: padding-box; + backdrop-filter: blur(24px); + } + + .description div { + align-items: flex-end; + pointer-events: none; + inset: auto 0 0; + padding: 2rem; + height: 200px; + background: linear-gradient( + to bottom, + transparent 0%, + rgb(var(--background-end-rgb)) 40% + ); + z-index: 1; + } +} + +/* Tablet and Smaller Desktop */ +@media (min-width: 701px) and (max-width: 1120px) { + .grid { + grid-template-columns: repeat(2, 50%); + } +} + +@media (prefers-color-scheme: dark) { + .vercelLogo { + filter: invert(1); + } + + .logo { + filter: invert(1) drop-shadow(0 0 0.3rem #ffffff70); + } +} + +@keyframes rotate { + from { + transform: rotate(360deg); + } + to { + transform: rotate(0deg); + } +} diff --git a/examples/next/src/app/page.tsx b/examples/next/src/app/page.tsx new file mode 100644 index 00000000..8e13eaf3 --- /dev/null +++ b/examples/next/src/app/page.tsx @@ -0,0 +1,125 @@ +'use client' + +import Image from 'next/image' +import styles from './page.module.css' +import { useState } from 'react' +import { + submitCookieToStorageServerAction, + readCookieFromStorageServerAction, +} from './serverActions' +import { + submitCookieToStorageRouteHandler, + readCookieFromStorageRouteHandler +} from './clientActions' + +export default function Home() { + const [currentCookie, setCurrentCookie] = useState('') + const [readCookieFromStorage, setReadCookieFromStorage] = useState('') + const handleSubmitCookieViaServerAction = async () => { + submitCookieToStorageServerAction(currentCookie) + } + const handleReadCookieViaServerAction = async () => { + const cookieFromStorage = await readCookieFromStorageServerAction() + setReadCookieFromStorage(cookieFromStorage) + } + const handleSubmitCookieViaRouteHandler = async () => { + submitCookieToStorageRouteHandler(currentCookie) + } + const handleReadCookieViaRouteHandler = async () => { + const cookieFromStorage = await readCookieFromStorageRouteHandler() + setReadCookieFromStorage(cookieFromStorage) + } + return ( +
+
+

+ Current Cookie:   + setCurrentCookie(event.target.value)} + /> +

+ +
+
+ Next.js Logo +
+ +
+
+

+ Set Cookie via Server Action -> +

+

Set Current Cookie:  + {currentCookie || "Not Set Yet"} + to storage

+
+ +
+

+ Read Cookie via Server Action -> +

+

Read Cookie From Storage:  + {readCookieFromStorage || "Not Read Yet"} +

+
+
+

+ Set Cookie via API Route Handler -> +

+

Set Current Cookie:  + {currentCookie || "Not Set Yet"} + to storage

+
+ +
+

+ Read Cookie via API Route Handler -> +

+

Read Cookie From Storage:  + {readCookieFromStorage || "Not Read Yet"} +

+
+
+
+ ) +} diff --git a/examples/next/src/app/serverActions.ts b/examples/next/src/app/serverActions.ts new file mode 100644 index 00000000..9493653c --- /dev/null +++ b/examples/next/src/app/serverActions.ts @@ -0,0 +1,14 @@ +'use server' //remove and set serverActions to false in next.config.js to disable server actions + +import { getServerActionSession } from '../../lib/session' + +export const submitCookieToStorageServerAction = async (cookie: string) => { + const session = await getServerActionSession() + session.cookieVariable = cookie + await session.save() +} + +export const readCookieFromStorageServerAction = async (): Promise => { + const session = await getServerActionSession() + return session.cookieVariable || 'No Cookie Stored!' +} diff --git a/examples/next/tsconfig.json b/examples/next/tsconfig.json new file mode 100644 index 00000000..0c7555fa --- /dev/null +++ b/examples/next/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} From baf5f0d2f113879887ca4b3b2cbe3c12f94b85d2 Mon Sep 17 00:00:00 2001 From: Devin Metivier Date: Mon, 2 Oct 2023 15:00:17 -0400 Subject: [PATCH 9/9] fix: set cookie options when setting cookies in server actions --- src/core.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/core.ts b/src/core.ts index aeaf0a12..6a946817 100644 --- a/src/core.ts +++ b/src/core.ts @@ -14,7 +14,7 @@ type ResponseType = Response | ServerResponse */ export interface ICookieHandler { get: (name: string) => { name: string; value: string } | undefined - set: (name: string, value: string) => void + set: (name: string, value: string, cookieOptions?: CookieSerializeOptions) => void } export interface IronSessionOptions { @@ -162,11 +162,15 @@ function setCookie(res: ResponseType, cookieValue: string): void { ;(res as ServerResponse).setHeader('set-cookie', [...existingSetCookie, cookieValue]) } -function setServerActionCookie(cookieValue: string, cookieHandler: ICookieHandler): void { +function setServerActionCookie( + cookieValue: string, + cookieHandler: ICookieHandler, + cookieOptions?: CookieSerializeOptions +): void { const extracted = extractCookieComponents(cookieValue) if (extracted !== null) { const { cookieName, cookieData } = extracted - cookieHandler.set(cookieName, cookieData) + cookieHandler.set(cookieName, cookieData, cookieOptions) } } @@ -405,7 +409,7 @@ export function createGetServerActionIronSession( ) } - setServerActionCookie(cookieValue, cookieHandler) + setServerActionCookie(cookieValue, cookieHandler, mergedOptions.cookieOptions) }, },