diff --git a/.changeset/fair-carpets-beg.md b/.changeset/fair-carpets-beg.md new file mode 100644 index 000000000..f48b1d929 --- /dev/null +++ b/.changeset/fair-carpets-beg.md @@ -0,0 +1,5 @@ +--- +"openapi-fetch": patch +--- + +Separate TS types to be managed manually diff --git a/packages/openapi-fetch/.eslintignore b/packages/openapi-fetch/.eslintignore index 09aaef563..a843dc44a 100644 --- a/packages/openapi-fetch/.eslintignore +++ b/packages/openapi-fetch/.eslintignore @@ -1 +1 @@ -test/openapi-typescript-codegen.min.js +test/fixtures diff --git a/packages/openapi-fetch/CONTRIBUTING.md b/packages/openapi-fetch/CONTRIBUTING.md index 79bfec688..2d6a8a442 100644 --- a/packages/openapi-fetch/CONTRIBUTING.md +++ b/packages/openapi-fetch/CONTRIBUTING.md @@ -10,13 +10,7 @@ Please check out the [the open issues](https://github.com/drwpow/openapi-typescr Contributing doesn’t have to be in code. Simply answering questions in open issues or providing workarounds is as important as making pull requests. -## Opening a Pull Request - -Pull requests are **welcome** for this repo! - -Bugfixes will always be accepted, though in some cases some small changes may be requested. - -However, if adding a feature or breaking change, please **open an issue first to discuss.** This ensures no time or work is wasted writing code that won’t be accepted to the project (see [Project Goals](https://openapi-ts.pages.dev/openapi-fetch/about/#project-goals)). Undiscussed feature work may be rejected at the discretion of the maintainers. +## Writing code ### Setup @@ -24,31 +18,15 @@ However, if adding a feature or breaking change, please **open an issue first to 2. [Fork this repo](https://docs.github.com/en/get-started/quickstart/fork-a-repo) and clone your copy locally 3. Run `pnpm i` to install dependencies -### Writing code - -Create a new branch for your PR with `git checkout -b your-branch-name`. Add the relevant code as well as docs and tests. When you push everything up (`git push`), navigate back to your repo in GitHub and you should see a prompt to open a new PR. - -While best practices for commit messages are encouraged (e.g. start with an imperative verb, keep it short, use the body if needed), this repo doesn’t follow any specific guidelines. Clarity is favored over strict rules. Changelogs are generated separately from git (see [the Changelogs section](#changelogs)) - -### Writing the PR - -**Please fill out the template!** It’s a very lightweight template 🙂. - -### Changelogs - -The changelog is generated via [changesets](https://github.com/changesets/changesets), and is separate from Git commit messages and pull request titles. To write a human-readable changelog for your changes, run: - -``` -npx changeset -``` +### Runtime code vs static type declarations -This will ask if it’s a `patch`, `minor`, or `major` change ([semver](https://semver.org/)), along with a plain description of what you did. Commit this new file along with the rest of your PR, and during the next release this will go into the official changelog! +This project uses **manual type declarations** ([docs](https://www.typescriptlang.org/docs/handbook/2/type-declarations.html#dts-files)) that are kept separately from the runtime code. `index.d.ts` contains **type declarations**, and `index.js` contains **runtime code**. The most important code lives in `index.d.ts` because this library exists to provide correct type inference. `index.js`, is far less important, and is only doing bare-minimum work to support the API as efficiently as possible. -### CI +In most projects, **this is not recommended practice** as the two can (and will) diverge, and you’re left with types that “lie” to you about what the runtime is doing. So this project does have that liability. However, due to the unique nature of this project implementing complex type inference from user-provided schemas, the type inference itself is so complex it was interfering with readable, maintainable, runtime code. By separating the two we won’t have the more complex parts of TypeScript interfering with the optimal runtime code. This would not be tenable in a larger project, but is perfect for a small codebase like this with minimal surface area. -All PRs must fix lint errors, and all tests must pass. PRs will not be merged until all CI checks are “green” (✅). +When writing code, it’s tempting to ignore `index.d.ts` and only make runtime updates, since that is generally simpler. But **please don’t!** We write tests in `*.test.ts` files intentionally so that the type inference can be typechecked as well as the runtime. Whenever you make a change to `index.js`, you probably need to also make a chance to `index.d.ts`, too. And **testing type correctness in tests is just as important as testing the runtime!** -#### Tests +### Testing This library uses [Vitest](https://vitest.dev/) for testing. There’s a great [VS Code extension](https://marketplace.visualstudio.com/items?itemName=ZixuanChen.vitest-explorer) you can optionally use if you’d like in-editor debugging tools. @@ -69,3 +47,45 @@ To start the entire test suite in watch mode: ```bash npx vitest ``` + +#### TypeScript tests + +**Don’t neglect writing TS tests!** In the test suite, you’ll see `// @ts-expect-error` comments. These are critical tests in and of themselves—they are asserting that TypeScript throws an error when it should be throwing an error (the test suite will actually fail in places if a TS error is _not_ raised). + +As this is just a minimal fetch wrapper meant to provide deep type inference for API schemas, **testing TS types** is arguably more important than testing the runtime. So please make liberal use of `// @ts-expect-error`, and as a general rule of thumb, write more **unwanted** output tests than _wanted_ output tests. + +### Changelogs + +The changelog is generated via [changesets](https://github.com/changesets/changesets), and is separate from Git commit messages and pull request titles. To write a human-readable changelog for your changes, run: + +``` +npx changeset +``` + +This will ask if it’s a `patch`, `minor`, or `major` change ([semver](https://semver.org/)), along with a plain description of what you did. Commit this new file along with the rest of your PR, and during the next release this will go into the official changelog! + +## Opening a Pull Request + +Pull requests are **welcome** for this repo! + +Bugfixes will always be accepted, though in some cases some small changes may be requested. + +However, if adding a feature or breaking change, please **open an issue first to discuss.** This ensures no time or work is wasted writing code that won’t be accepted to the project (see [Project Goals](https://openapi-ts.pages.dev/openapi-fetch/about/#project-goals)). Undiscussed feature work may be rejected at the discretion of the maintainers. + +### Writing the commit + +Create a new branch for your PR with `git checkout -b your-branch-name`. Add the relevant code as well as docs and tests. When you push everything up (`git push`), navigate back to your repo in GitHub and you should see a prompt to open a new PR. + +While best practices for commit messages are encouraged (e.g. start with an imperative verb, keep it short, use the body if needed), this repo doesn’t follow any specific guidelines. Clarity is favored over strict rules. Changelogs are generated separately from git (see [the Changelogs section](#changelogs)). + +### Writing the PR notes + +**Please fill out the template!** It’s a very lightweight template 🙂. + +### Adding docs + +If you added a feature, or changed how something worked, please [update the docs](../../docs/)! + +### Passing CI + +All PRs must fix lint errors, and all tests must pass. PRs will not be merged until all CI checks are “green” (✅). diff --git a/packages/openapi-fetch/package.json b/packages/openapi-fetch/package.json index 86daa0fdc..145c8a73b 100644 --- a/packages/openapi-fetch/package.json +++ b/packages/openapi-fetch/package.json @@ -47,18 +47,18 @@ "svelte" ], "scripts": { - "build": "pnpm run build:clean && pnpm run build:ts && pnpm run build:ts-min && pnpm run build:cjs", + "build": "pnpm run build:clean && pnpm run build:js && pnpm run build:js-min && pnpm run build:cjs", "build:clean": "del dist", - "build:ts": "tsc -p tsconfig.build.json", - "build:ts-min": "esbuild --bundle src/index.ts --format=esm --minify --outfile=dist/index.min.js && cp dist/index.d.ts dist/index.min.d.ts", - "build:cjs": "esbuild --bundle src/index.ts --format=cjs --outfile=dist/cjs/index.cjs && cp dist/index.d.ts dist/cjs/index.d.cts", + "build:js": "mkdir -p dist && cp src/* dist", + "build:js-min": "esbuild --bundle src/index.js --format=esm --minify --outfile=dist/index.min.js && cp dist/index.d.ts dist/index.min.d.ts", + "build:cjs": "esbuild --bundle src/index.js --format=cjs --outfile=dist/cjs/index.cjs && cp dist/index.d.ts dist/cjs/index.d.cts", "lint": "pnpm run lint:js", "lint:js": "eslint \"{src,test}/**/*.{js,ts}\"", "lint:prettier": "prettier --check \"{src,test}/**/*\"", "test": "pnpm run test:ts && npm run test:js", "test:js": "vitest run", "test:ts": "tsc --noEmit", - "prepare": "openapi-typescript test/v1.yaml -o test/v1.d.ts", + "prepare": "openapi-typescript test/fixtures/api.yaml -o test/fixtures/api.d.ts", "prepublish": "pnpm run prepare && pnpm run build", "version": "pnpm run prepare && pnpm run build" }, @@ -66,10 +66,10 @@ "openapi-typescript-helpers": "^0.0.4" }, "devDependencies": { - "axios": "^1.5.1", + "axios": "^1.6.0", "del-cli": "^5.1.0", - "esbuild": "^0.19.4", - "nanostores": "^0.9.3", + "esbuild": "^0.19.5", + "nanostores": "^0.9.4", "openapi-typescript": "^6.7.0", "openapi-typescript-codegen": "^0.25.0", "openapi-typescript-fetch": "^1.1.3", diff --git a/packages/openapi-fetch/src/index.d.ts b/packages/openapi-fetch/src/index.d.ts new file mode 100644 index 000000000..ea042b8de --- /dev/null +++ b/packages/openapi-fetch/src/index.d.ts @@ -0,0 +1,272 @@ +import type { + ErrorResponse, + SuccessResponse, + FilterKeys, + MediaType, + PathsWithMethod, + ResponseObjectMap, + OperationRequestBodyContent, + HasRequiredKeys, +} from "openapi-typescript-helpers"; + +// Note: though "any" is considered bad practice in general, this library relies +// on "any" for type inference only it can give. Same goes for the "{}" type. +/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types */ + +/** Options for each client instance */ +export interface ClientOptions extends Omit { + /** set the common root URL for all API requests */ + baseUrl?: string; + /** custom fetch (defaults to globalThis.fetch) */ + fetch?: typeof fetch; + /** global querySerializer */ + querySerializer?: QuerySerializer; + /** global bodySerializer */ + bodySerializer?: BodySerializer; + headers?: HeadersOptions; +} + +export type HeadersOptions = + | HeadersInit + | Record; + +export type QuerySerializer = ( + query: T extends { parameters: any } + ? NonNullable + : Record, +) => string; + +export type BodySerializer = (body: OperationRequestBodyContent) => any; + +export type ParseAs = "json" | "text" | "blob" | "arrayBuffer" | "stream"; + +export interface DefaultParamsOption { + params?: { + query?: Record; + }; +} + +export type ParamsOption = T extends { + parameters: any; +} + ? HasRequiredKeys extends never + ? { params?: T["parameters"] } + : { params: T["parameters"] } + : DefaultParamsOption; + +export type RequestBodyOption = OperationRequestBodyContent extends never + ? { body?: never } + : undefined extends OperationRequestBodyContent + ? { body?: OperationRequestBodyContent } + : { body: OperationRequestBodyContent }; + +export type FetchOptions = RequestOptions & Omit; + +export type FetchResponse = + | { + data: FilterKeys>, MediaType>; + error?: never; + response: Response; + } + | { + data?: never; + error: FilterKeys>, MediaType>; + response: Response; + }; + +export type RequestOptions = ParamsOption & + RequestBodyOption & { + querySerializer?: QuerySerializer; + bodySerializer?: BodySerializer; + parseAs?: ParseAs; + fetch?: ClientOptions["fetch"]; + }; + +export default function createClient( + clientOptions?: ClientOptions, +): { + /** Call a GET endpoint */ + GET

>( + url: P, + ...init: HasRequiredKeys< + FetchOptions> + > extends never + ? [(FetchOptions> | undefined)?] + : [FetchOptions>] + ): Promise< + FetchResponse< + "get" extends infer T + ? T extends "get" + ? T extends keyof Paths[P] + ? Paths[P][T] + : unknown + : never + : never + > + >; + /** Call a PUT endpoint */ + PUT

>( + url: P, + ...init: HasRequiredKeys< + FetchOptions> + > extends never + ? [(FetchOptions> | undefined)?] + : [FetchOptions>] + ): Promise< + FetchResponse< + "put" extends infer T + ? T extends "put" + ? T extends keyof Paths[P] + ? Paths[P][T] + : unknown + : never + : never + > + >; + /** Call a POST endpoint */ + POST

>( + url: P, + ...init: HasRequiredKeys< + FetchOptions> + > extends never + ? [(FetchOptions> | undefined)?] + : [FetchOptions>] + ): Promise< + FetchResponse< + "post" extends infer T + ? T extends "post" + ? T extends keyof Paths[P] + ? Paths[P][T] + : unknown + : never + : never + > + >; + /** Call a DELETE endpoint */ + DELETE

>( + url: P, + ...init: HasRequiredKeys< + FetchOptions> + > extends never + ? [(FetchOptions> | undefined)?] + : [FetchOptions>] + ): Promise< + FetchResponse< + "delete" extends infer T + ? T extends "delete" + ? T extends keyof Paths[P] + ? Paths[P][T] + : unknown + : never + : never + > + >; + /** Call a OPTIONS endpoint */ + OPTIONS

>( + url: P, + ...init: HasRequiredKeys< + FetchOptions> + > extends never + ? [(FetchOptions> | undefined)?] + : [FetchOptions>] + ): Promise< + FetchResponse< + "options" extends infer T + ? T extends "options" + ? T extends keyof Paths[P] + ? Paths[P][T] + : unknown + : never + : never + > + >; + /** Call a HEAD endpoint */ + HEAD

>( + url: P, + ...init: HasRequiredKeys< + FetchOptions> + > extends never + ? [(FetchOptions> | undefined)?] + : [FetchOptions>] + ): Promise< + FetchResponse< + "head" extends infer T + ? T extends "head" + ? T extends keyof Paths[P] + ? Paths[P][T] + : unknown + : never + : never + > + >; + /** Call a PATCH endpoint */ + PATCH

>( + url: P, + ...init: HasRequiredKeys< + FetchOptions> + > extends never + ? [(FetchOptions> | undefined)?] + : [FetchOptions>] + ): Promise< + FetchResponse< + "patch" extends infer T + ? T extends "patch" + ? T extends keyof Paths[P] + ? Paths[P][T] + : unknown + : never + : never + > + >; + /** Call a TRACE endpoint */ + TRACE

>( + url: P, + ...init: HasRequiredKeys< + FetchOptions> + > extends never + ? [(FetchOptions> | undefined)?] + : [FetchOptions>] + ): Promise< + FetchResponse< + "trace" extends infer T + ? T extends "trace" + ? T extends keyof Paths[P] + ? Paths[P][T] + : unknown + : never + : never + > + >; +}; + +/** Serialize query params to string */ +export declare function defaultQuerySerializer(q: T): string; + +/** Serialize query param schema types according to expected default OpenAPI 3.x behavior */ +export declare function defaultQueryParamSerializer( + key: string[], + value: T, +): string | undefined; + +/** Serialize body object to string */ +export declare function defaultBodySerializer(body: T): string; + +/** Construct URL string from baseUrl and handle path and query params */ +export declare function createFinalURL( + pathname: string, + options: { + baseUrl: string; + params: { + query?: Record; + path?: Record; + }; + querySerializer: QuerySerializer; + }, +): string; + +/** Merge headers a and b, with b taking priority */ +export declare function mergeHeaders( + ...allHeaders: (HeadersOptions | undefined)[] +): Headers; + +export {}; diff --git a/packages/openapi-fetch/src/index.js b/packages/openapi-fetch/src/index.js new file mode 100644 index 000000000..23e069fa5 --- /dev/null +++ b/packages/openapi-fetch/src/index.js @@ -0,0 +1,268 @@ +// settings & const +const DEFAULT_HEADERS = { + "Content-Type": "application/json", +}; + +/** + * Create an openapi-fetch client. + * @type {import("./index.js").default} + */ +export default function createClient(clientOptions) { + const { + fetch: baseFetch = globalThis.fetch, + querySerializer: globalQuerySerializer, + bodySerializer: globalBodySerializer, + ...baseOptions + } = clientOptions ?? {}; + let baseUrl = baseOptions.baseUrl ?? ""; + if (baseUrl.endsWith("/")) { + baseUrl = baseUrl.slice(0, -1); // remove trailing slash + } + + /** + * Per-request fetch (keeps settings created in createClient() + * @param {string} url + * @param {import('./index.js').FetchOptions} fetchOptions + */ + async function coreFetch(url, fetchOptions) { + const { + fetch = baseFetch, + headers, + body: requestBody, + params = {}, + parseAs = "json", + querySerializer = globalQuerySerializer ?? defaultQuerySerializer, + bodySerializer = globalBodySerializer ?? defaultBodySerializer, + ...init + } = fetchOptions || {}; + + // URL + const finalURL = createFinalURL(url, { + baseUrl, + params, + querySerializer, + }); + const finalHeaders = mergeHeaders( + DEFAULT_HEADERS, + clientOptions?.headers, + headers, + params.header, + ); + + // fetch! + const requestInit = { + redirect: "follow", + ...baseOptions, + ...init, + headers: finalHeaders, + }; + + if (requestBody) { + requestInit.body = bodySerializer(requestBody); + } + // remove `Content-Type` if serialized body is FormData; browser will correctly set Content-Type & boundary expression + if (requestInit.body instanceof FormData) { + finalHeaders.delete("Content-Type"); + } + + const response = await fetch(finalURL, requestInit); + + // handle empty content + // note: we return `{}` because we want user truthy checks for `.data` or `.error` to succeed + if ( + response.status === 204 || + response.headers.get("Content-Length") === "0" + ) { + return response.ok ? { data: {}, response } : { error: {}, response }; + } + + // parse response (falling back to .text() when necessary) + if (response.ok) { + // if "stream", skip parsing entirely + if (parseAs === "stream") { + // fix for bun: bun consumes response.body, therefore clone before accessing + // TODO: test this? + return { data: response.clone().body, response }; + } + const cloned = response.clone(); + return { + data: + typeof cloned[parseAs] === "function" + ? await cloned[parseAs]() + : await cloned.text(), + response, + }; + } + + // handle errors (always parse as .json() or .text()) + let error = {}; + try { + error = await response.clone().json(); + } catch { + error = await response.clone().text(); + } + return { error, response }; + } + + return { + /** Call a GET endpoint */ + async GET(url, init) { + return coreFetch(url, { ...init, method: "GET" }); + }, + /** Call a PUT endpoint */ + async PUT(url, init) { + return coreFetch(url, { ...init, method: "PUT" }); + }, + /** Call a POST endpoint */ + async POST(url, init) { + return coreFetch(url, { ...init, method: "POST" }); + }, + /** Call a DELETE endpoint */ + async DELETE(url, init) { + return coreFetch(url, { ...init, method: "DELETE" }); + }, + /** Call a OPTIONS endpoint */ + async OPTIONS(url, init) { + return coreFetch(url, { ...init, method: "OPTIONS" }); + }, + /** Call a HEAD endpoint */ + async HEAD(url, init) { + return coreFetch(url, { ...init, method: "HEAD" }); + }, + /** Call a PATCH endpoint */ + async PATCH(url, init) { + return coreFetch(url, { ...init, method: "PATCH" }); + }, + /** Call a TRACE endpoint */ + async TRACE(url, init) { + return coreFetch(url, { ...init, method: "TRACE" }); + }, + }; +} + +// utils + +/** + * Serialize query params to string + * @type {import("./index.js").defaultQuerySerializer} + */ +export function defaultQuerySerializer(q) { + const search = []; + if (q && typeof q === "object") { + for (const [k, v] of Object.entries(q)) { + const value = defaultQueryParamSerializer([k], v); + if (value) { + search.push(value); + } + } + } + return search.join("&"); +} + +/** + * Serialize query param schema types according to expected default OpenAPI 3.x behavior + * @type {import("./index.js").defaultQueryParamSerializer} + */ +export function defaultQueryParamSerializer(key, value) { + if (value === null || value === undefined) { + return undefined; + } + if (typeof value === "string") { + return `${deepObjectPath(key)}=${encodeURIComponent(value)}`; + } + if (typeof value === "number" || typeof value === "boolean") { + return `${deepObjectPath(key)}=${String(value)}`; + } + if (Array.isArray(value)) { + if (!value.length) { + return undefined; + } + const nextValue = []; + for (const item of value) { + const next = defaultQueryParamSerializer(key, item); + if (next !== undefined) { + nextValue.push(next); + } + } + return nextValue.join(`&`); + } + if (typeof value === "object") { + if (!Object.keys(value).length) { + return undefined; + } + const nextValue = []; + for (const [k, v] of Object.entries(value)) { + if (v !== undefined && v !== null) { + const next = defaultQueryParamSerializer([...key, k], v); + if (next !== undefined) { + nextValue.push(next); + } + } + } + return nextValue.join("&"); + } + return encodeURIComponent(`${deepObjectPath(key)}=${String(value)}`); +} + +/** + * Flatten a node path into a deepObject string + * @type {import("./index.js").deepObjectPath} + */ +function deepObjectPath(path) { + let output = path[0]; + for (const k of path.slice(1)) { + output += `[${k}]`; + } + return output; +} + +/** + * Serialize body object to string + * @type {import("./index.js").defaultBodySerializer} + */ +export function defaultBodySerializer(body) { + return JSON.stringify(body); +} + +/** + * Construct URL string from baseUrl and handle path and query params + * @type {import("./index.js").createFinalURL} + */ +export function createFinalURL(pathname, options) { + let finalURL = `${options.baseUrl}${pathname}`; + if (options.params.path) { + for (const [k, v] of Object.entries(options.params.path)) { + finalURL = finalURL.replace(`{${k}}`, encodeURIComponent(String(v))); + } + } + const search = options.querySerializer(options.params.query ?? {}); + if (search) { + finalURL += `?${search}`; + } + return finalURL; +} + +/** + * Merge headers a and b, with b taking priority + * @type {import("./index.js").mergeHeaders} + */ +export function mergeHeaders(...allHeaders) { + const headers = new Headers(); + for (const headerSet of allHeaders) { + if (!headerSet || typeof headerSet !== "object") { + continue; + } + const iterator = + headerSet instanceof Headers + ? headerSet.entries() + : Object.entries(headerSet); + for (const [k, v] of iterator) { + if (v === null) { + headers.delete(k); + } else if (v !== undefined) { + headers.set(k, v); + } + } + } + return headers; +} diff --git a/packages/openapi-fetch/src/index.ts b/packages/openapi-fetch/src/index.ts deleted file mode 100644 index 95e00ee2b..000000000 --- a/packages/openapi-fetch/src/index.ts +++ /dev/null @@ -1,420 +0,0 @@ -import type { - ErrorResponse, - HttpMethod, - SuccessResponse, - FilterKeys, - MediaType, - PathsWithMethod, - ResponseObjectMap, - OperationRequestBodyContent, - HasRequiredKeys, -} from "openapi-typescript-helpers"; - -// settings & const -const DEFAULT_HEADERS = { - "Content-Type": "application/json", -}; - -// Note: though "any" is considered bad practice in general, this library relies -// on "any" for type inference only it can give. Same goes for the "{}" type. -/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types */ - -/** options for each client instance */ -interface ClientOptions extends Omit { - /** set the common root URL for all API requests */ - baseUrl?: string; - /** custom fetch (defaults to globalThis.fetch) */ - fetch?: typeof fetch; - /** global querySerializer */ - querySerializer?: QuerySerializer; - /** global bodySerializer */ - bodySerializer?: BodySerializer; - // headers override to make typing friendlier - headers?: HeadersOptions; -} - -export type HeadersOptions = - | HeadersInit - | Record; - -export type QuerySerializer = ( - query: T extends { parameters: any } - ? NonNullable - : Record, -) => string; - -export type BodySerializer = (body: OperationRequestBodyContent) => any; - -export type ParseAs = "json" | "text" | "blob" | "arrayBuffer" | "stream"; - -export interface DefaultParamsOption { - params?: { query?: Record }; -} - -export type ParamsOption = T extends { parameters: any } - ? HasRequiredKeys extends never - ? { params?: T["parameters"] } - : { params: T["parameters"] } - : DefaultParamsOption; -// v7 breaking change: TODO uncomment for openapi-typescript@7 support -// : never; - -export type RequestBodyOption = OperationRequestBodyContent extends never - ? { body?: never } - : undefined extends OperationRequestBodyContent - ? { body?: OperationRequestBodyContent } - : { body: OperationRequestBodyContent }; - -export type FetchOptions = RequestOptions & Omit; - -export type FetchResponse = - | { - data: FilterKeys>, MediaType>; - error?: never; - response: Response; - } - | { - data?: never; - error: FilterKeys>, MediaType>; - response: Response; - }; - -export type RequestOptions = ParamsOption & - RequestBodyOption & { - querySerializer?: QuerySerializer; - bodySerializer?: BodySerializer; - parseAs?: ParseAs; - fetch?: ClientOptions["fetch"]; - }; - -export default function createClient( - clientOptions: ClientOptions = {}, -) { - const { - fetch: baseFetch = globalThis.fetch, - querySerializer: globalQuerySerializer, - bodySerializer: globalBodySerializer, - ...options - } = clientOptions; - let baseUrl = options.baseUrl ?? ""; - if (baseUrl.endsWith("/")) { - baseUrl = baseUrl.slice(0, -1); // remove trailing slash - } - - async function coreFetch

( - url: P, - fetchOptions: FetchOptions, - ): Promise> { - const { - fetch = baseFetch, - headers, - body: requestBody, - params = {}, - parseAs = "json", - querySerializer = globalQuerySerializer ?? defaultQuerySerializer, - bodySerializer = globalBodySerializer ?? defaultBodySerializer, - ...init - } = fetchOptions || {}; - - // URL - const finalURL = createFinalURL(url as string, { - baseUrl, - params, - querySerializer, - }); - const finalHeaders = mergeHeaders( - DEFAULT_HEADERS, - clientOptions?.headers, - headers, - (params as any).header, - ); - - // fetch! - const requestInit: RequestInit = { - redirect: "follow", - ...options, - ...init, - headers: finalHeaders, - }; - if (requestBody) { - requestInit.body = bodySerializer(requestBody as any); - } - // remove `Content-Type` if serialized body is FormData; browser will correctly set Content-Type & boundary expression - if (requestInit.body instanceof FormData) { - finalHeaders.delete("Content-Type"); - } - const response = await fetch(finalURL, requestInit); - - // handle empty content - // note: we return `{}` because we want user truthy checks for `.data` or `.error` to succeed - if ( - response.status === 204 || - response.headers.get("Content-Length") === "0" - ) { - return response.ok - ? { data: {} as any, response: response as any } - : { error: {} as any, response: response as any }; - } - - // parse response (falling back to .text() when necessary) - if (response.ok) { - let data: any; // we have to leave this empty here so that we don't consume the body - if (parseAs !== "stream") { - const cloned = response.clone(); - data = - typeof cloned[parseAs] === "function" - ? await cloned[parseAs]() - : await cloned.text(); - } else { - // bun consumes the body when calling response.body, therefore we need to clone the response before accessing it - data = response.clone().body; - } - return { data, response: response as any }; - } - - // handle errors (always parse as .json() or .text()) - let error: any = {}; - try { - error = await response.clone().json(); - } catch { - error = await response.clone().text(); - } - return { error, response: response as any }; - } - - type GetPaths = PathsWithMethod; - type PutPaths = PathsWithMethod; - type PostPaths = PathsWithMethod; - type DeletePaths = PathsWithMethod; - type OptionsPaths = PathsWithMethod; - type HeadPaths = PathsWithMethod; - type PatchPaths = PathsWithMethod; - type TracePaths = PathsWithMethod; - type GetFetchOptions

= FetchOptions< - FilterKeys - >; - type PutFetchOptions

= FetchOptions< - FilterKeys - >; - type PostFetchOptions

= FetchOptions< - FilterKeys - >; - type DeleteFetchOptions

= FetchOptions< - FilterKeys - >; - type OptionsFetchOptions

= FetchOptions< - FilterKeys - >; - type HeadFetchOptions

= FetchOptions< - FilterKeys - >; - type PatchFetchOptions

= FetchOptions< - FilterKeys - >; - type TraceFetchOptions

= FetchOptions< - FilterKeys - >; - - return { - /** Call a GET endpoint */ - async GET

( - url: P, - ...init: HasRequiredKeys> extends never - ? [GetFetchOptions

?] - : [GetFetchOptions

] - ) { - return coreFetch(url, { ...init[0], method: "GET" } as any); - }, - /** Call a PUT endpoint */ - async PUT

( - url: P, - ...init: HasRequiredKeys> extends never - ? [PutFetchOptions

?] - : [PutFetchOptions

] - ) { - return coreFetch(url, { ...init[0], method: "PUT" } as any); - }, - /** Call a POST endpoint */ - async POST

( - url: P, - ...init: HasRequiredKeys> extends never - ? [PostFetchOptions

?] - : [PostFetchOptions

] - ) { - return coreFetch(url, { ...init[0], method: "POST" } as any); - }, - /** Call a DELETE endpoint */ - async DELETE

( - url: P, - ...init: HasRequiredKeys> extends never - ? [DeleteFetchOptions

?] - : [DeleteFetchOptions

] - ) { - return coreFetch(url, { - ...init[0], - method: "DELETE", - } as any); - }, - /** Call a OPTIONS endpoint */ - async OPTIONS

( - url: P, - ...init: HasRequiredKeys> extends never - ? [OptionsFetchOptions

?] - : [OptionsFetchOptions

] - ) { - return coreFetch(url, { - ...init[0], - method: "OPTIONS", - } as any); - }, - /** Call a HEAD endpoint */ - async HEAD

( - url: P, - ...init: HasRequiredKeys> extends never - ? [HeadFetchOptions

?] - : [HeadFetchOptions

] - ) { - return coreFetch(url, { ...init[0], method: "HEAD" } as any); - }, - /** Call a PATCH endpoint */ - async PATCH

( - url: P, - ...init: HasRequiredKeys> extends never - ? [PatchFetchOptions

?] - : [PatchFetchOptions

] - ) { - return coreFetch(url, { ...init[0], method: "PATCH" } as any); - }, - /** Call a TRACE endpoint */ - async TRACE

( - url: P, - ...init: HasRequiredKeys> extends never - ? [TraceFetchOptions

?] - : [TraceFetchOptions

] - ) { - return coreFetch(url, { ...init[0], method: "TRACE" } as any); - }, - }; -} - -// utils - -/** serialize query params to string */ -export function defaultQuerySerializer(q: T): string { - const search: string[] = []; - if (q && typeof q === "object") { - for (const [k, v] of Object.entries(q)) { - const value = defaultQueryParamSerializer([k], v); - if (value) { - search.push(value); - } - } - } - return search.join("&"); -} - -/** serialize different query param schema types to a string */ -export function defaultQueryParamSerializer( - key: string[], - value: T, -): string | undefined { - if (value === null || value === undefined) { - return undefined; - } - if (typeof value === "string") { - return `${deepObjectPath(key)}=${encodeURIComponent(value)}`; - } - if (typeof value === "number" || typeof value === "boolean") { - return `${deepObjectPath(key)}=${String(value)}`; - } - if (Array.isArray(value)) { - if (!value.length) { - return undefined; - } - const nextValue: string[] = []; - for (const item of value) { - const next = defaultQueryParamSerializer(key, item); - if (next !== undefined) { - nextValue.push(next); - } - } - return nextValue.join(`&`); - } - if (typeof value === "object") { - if (!Object.keys(value).length) { - return undefined; - } - const nextValue: string[] = []; - for (const [k, v] of Object.entries(value)) { - if (v !== undefined && v !== null) { - const next = defaultQueryParamSerializer([...key, k], v); - if (next !== undefined) { - nextValue.push(next); - } - } - } - return nextValue.join("&"); - } - return encodeURIComponent(`${deepObjectPath(key)}=${String(value)}`); -} - -/** flatten a node path into a deepObject string */ -function deepObjectPath(path: string[]): string { - let output = path[0]!; - for (const k of path.slice(1)) { - output += `[${k}]`; - } - return output; -} - -/** serialize body object to string */ -export function defaultBodySerializer(body: T): string { - return JSON.stringify(body); -} - -/** Construct URL string from baseUrl and handle path and query params */ -export function createFinalURL( - pathname: string, - options: { - baseUrl: string; - params: { query?: Record; path?: Record }; - querySerializer: QuerySerializer; - }, -): string { - let finalURL = `${options.baseUrl}${pathname}`; - if (options.params.path) { - for (const [k, v] of Object.entries(options.params.path)) { - finalURL = finalURL.replace(`{${k}}`, encodeURIComponent(String(v))); - } - } - const search = options.querySerializer((options.params.query as any) ?? {}); - if (search) { - finalURL += `?${search}`; - } - return finalURL; -} - -/** merge headers a and b, with b taking priority */ -export function mergeHeaders( - ...allHeaders: (HeadersOptions | undefined)[] -): Headers { - const headers = new Headers(); - for (const headerSet of allHeaders) { - if (!headerSet || typeof headerSet !== "object") { - continue; - } - const iterator = - headerSet instanceof Headers - ? // @ts-expect-error Headers definitely have entries() - headerSet.entries() - : Object.entries(headerSet); - for (const [k, v] of iterator) { - if (v === null) { - headers.delete(k); - } else if (v !== undefined) { - headers.set(k, v as any); - } - } - } - return headers; -} diff --git a/packages/openapi-fetch/test/v1.d.ts b/packages/openapi-fetch/test/fixtures/api.d.ts similarity index 100% rename from packages/openapi-fetch/test/v1.d.ts rename to packages/openapi-fetch/test/fixtures/api.d.ts diff --git a/packages/openapi-fetch/test/v1.yaml b/packages/openapi-fetch/test/fixtures/api.yaml similarity index 100% rename from packages/openapi-fetch/test/v1.yaml rename to packages/openapi-fetch/test/fixtures/api.yaml diff --git a/packages/openapi-fetch/test/openapi-typescript-codegen.min.js b/packages/openapi-fetch/test/fixtures/openapi-typescript-codegen.min.js similarity index 100% rename from packages/openapi-fetch/test/openapi-typescript-codegen.min.js rename to packages/openapi-fetch/test/fixtures/openapi-typescript-codegen.min.js diff --git a/packages/openapi-fetch/test/v7-beta.d.ts b/packages/openapi-fetch/test/fixtures/v7-beta.d.ts similarity index 100% rename from packages/openapi-fetch/test/v7-beta.d.ts rename to packages/openapi-fetch/test/fixtures/v7-beta.d.ts diff --git a/packages/openapi-fetch/test/index.bench.js b/packages/openapi-fetch/test/index.bench.js index 730a9396e..9e9f93f53 100644 --- a/packages/openapi-fetch/test/index.bench.js +++ b/packages/openapi-fetch/test/index.bench.js @@ -4,7 +4,7 @@ import superagent from "superagent"; import { afterAll, bench, describe, vi } from "vitest"; import createFetchMock from "vitest-fetch-mock"; import createClient from "../dist/index.js"; -import * as openapiTSCodegen from "./openapi-typescript-codegen.min.js"; +import * as openapiTSCodegen from "./fixtures/openapi-typescript-codegen.min.js"; const BASE_URL = "https://api.test.local"; diff --git a/packages/openapi-fetch/test/index.test.ts b/packages/openapi-fetch/test/index.test.ts index 8e0359675..764a17286 100644 --- a/packages/openapi-fetch/test/index.test.ts +++ b/packages/openapi-fetch/test/index.test.ts @@ -3,7 +3,7 @@ import { afterEach, beforeAll, describe, expect, it, vi } from "vitest"; // @ts-expect-error import createFetchMock from "vitest-fetch-mock"; import createClient from "../src/index.js"; -import type { paths } from "./v1.d.js"; +import type { paths } from "./fixtures/api.js"; const fetchMocker = createFetchMock(vi); diff --git a/packages/openapi-fetch/test/v7-beta.test.ts b/packages/openapi-fetch/test/v7-beta.test.ts index 9c7308dc6..871bcd62c 100644 --- a/packages/openapi-fetch/test/v7-beta.test.ts +++ b/packages/openapi-fetch/test/v7-beta.test.ts @@ -3,7 +3,7 @@ import { afterEach, beforeAll, describe, expect, it, vi } from "vitest"; // @ts-expect-error import createFetchMock from "vitest-fetch-mock"; import createClient from "../src/index.js"; -import type { paths } from "./v7-beta.js"; +import type { paths } from "./fixtures/v7-beta.js"; // Note // This is a copy of index.test.ts, but uses generated types from openapi-typescript@7 (beta). diff --git a/packages/openapi-fetch/tsconfig.json b/packages/openapi-fetch/tsconfig.json index 64635a004..c813876e3 100644 --- a/packages/openapi-fetch/tsconfig.json +++ b/packages/openapi-fetch/tsconfig.json @@ -7,6 +7,7 @@ "lib": ["ESNext", "DOM"], "module": "NodeNext", "moduleResolution": "NodeNext", + "noUncheckedIndexedAccess": true, "outDir": "dist", "skipLibCheck": true, "strict": true, diff --git a/packages/openapi-fetch/vitest.config.ts b/packages/openapi-fetch/vitest.config.ts index 7382f40e7..e2ec33294 100644 --- a/packages/openapi-fetch/vitest.config.ts +++ b/packages/openapi-fetch/vitest.config.ts @@ -1,4 +1,4 @@ -import { defineConfig } from 'vitest/config'; +import { defineConfig } from "vitest/config"; export default defineConfig({ test: { diff --git a/packages/openapi-typescript/.eslintignore b/packages/openapi-typescript/.eslintignore new file mode 100644 index 000000000..a843dc44a --- /dev/null +++ b/packages/openapi-typescript/.eslintignore @@ -0,0 +1 @@ +test/fixtures diff --git a/packages/openapi-typescript/package.json b/packages/openapi-typescript/package.json index 860d756eb..df73c5b0a 100644 --- a/packages/openapi-typescript/package.json +++ b/packages/openapi-typescript/package.json @@ -72,7 +72,7 @@ "@types/node": "^20.8.0", "degit": "^2.8.4", "del-cli": "^5.1.0", - "esbuild": "^0.19.4", + "esbuild": "^0.19.5", "execa": "^7.2.0", "vite": "^4.4.9", "vite-node": "^0.34.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c5ea93c48..797083991 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -61,13 +61,13 @@ importers: version: 2.2.2(preact@10.18.1) '@astrojs/react': specifier: ^3.0.2 - version: 3.0.2(@types/react-dom@18.2.8)(@types/react@18.2.24)(react-dom@18.2.0)(react@18.2.0)(vite@4.4.10) + version: 3.0.2(@types/react-dom@18.2.8)(@types/react@18.2.24)(react-dom@18.2.0)(react@18.2.0)(vite@4.5.0) '@docsearch/css': specifier: ^3.5.2 version: 3.5.2 '@docsearch/react': specifier: ^3.5.2 - version: 3.5.2(@algolia/client-search@4.20.0)(@types/react@18.2.24)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.8.3) + version: 3.5.2(@algolia/client-search@4.20.0)(@types/react@18.2.24)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0) '@types/react': specifier: ^18.2.24 version: 18.2.24 @@ -98,7 +98,7 @@ importers: version: 1.6.0 '@cobalt-ui/plugin-sass': specifier: ^1.3.0 - version: 1.3.0(@cobalt-ui/cli@1.6.0)(@cobalt-ui/plugin-css@1.5.0) + version: 1.3.0(@cobalt-ui/cli@1.6.0)(@cobalt-ui/plugin-css@1.5.1) '@types/node': specifier: ^20.8.2 version: 20.8.2 @@ -110,7 +110,7 @@ importers: version: 5.2.2 vite-plugin-sass-dts: specifier: ^1.3.11 - version: 1.3.11(postcss@8.4.31)(prettier@3.0.3)(sass@1.68.0)(vite@4.4.10) + version: 1.3.11(postcss@8.4.31)(prettier@3.0.3)(sass@1.68.0)(vite@4.5.0) packages/openapi-fetch: dependencies: @@ -119,17 +119,17 @@ importers: version: link:../openapi-typescript-helpers devDependencies: axios: - specifier: ^1.5.1 - version: 1.5.1 + specifier: ^1.6.0 + version: 1.6.0 del-cli: specifier: ^5.1.0 version: 5.1.0 esbuild: - specifier: ^0.19.4 - version: 0.19.4 + specifier: ^0.19.5 + version: 0.19.5 nanostores: - specifier: ^0.9.3 - version: 0.9.3 + specifier: ^0.9.4 + version: 0.9.4 openapi-typescript: specifier: ^6.7.0 version: 6.7.0 @@ -276,8 +276,8 @@ importers: specifier: ^5.1.0 version: 5.1.0 esbuild: - specifier: ^0.19.4 - version: 0.19.4 + specifier: ^0.19.5 + version: 0.19.5 execa: specifier: ^7.2.0 version: 7.2.0 @@ -304,10 +304,10 @@ packages: engines: {node: '>=0.10.0'} dev: true - /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.8.3): + /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.9.0): resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.8.3) + '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.9.0) '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0) transitivePeerDependencies: - '@algolia/client-search' @@ -315,13 +315,13 @@ packages: - search-insights dev: false - /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.8.3): + /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.9.0): resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==} peerDependencies: search-insights: '>= 1 < 3' dependencies: '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0) - search-insights: 2.8.3 + search-insights: 2.9.0 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch @@ -449,7 +449,7 @@ packages: resolution: {integrity: sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==} dependencies: '@jsdevtools/ono': 7.1.3 - '@types/json-schema': 7.0.13 + '@types/json-schema': 7.0.14 call-me-maybe: 1.0.2 js-yaml: 4.1.0 dev: true @@ -513,7 +513,7 @@ packages: prismjs: 1.29.0 dev: false - /@astrojs/react@3.0.2(@types/react-dom@18.2.8)(@types/react@18.2.24)(react-dom@18.2.0)(react@18.2.0)(vite@4.4.10): + /@astrojs/react@3.0.2(@types/react-dom@18.2.8)(@types/react@18.2.24)(react-dom@18.2.0)(react@18.2.0)(vite@4.5.0): resolution: {integrity: sha512-aooNIuQxTg+IWGMZPuIEwBeBi4/TCPCMsr3714zuLjAjukVd5ZrX/bCNxJqDWU4HNwUm4XFU1OhcEvYOHa5uMQ==} engines: {node: '>=18.14.1'} peerDependencies: @@ -524,7 +524,7 @@ packages: dependencies: '@types/react': 18.2.24 '@types/react-dom': 18.2.8 - '@vitejs/plugin-react': 4.1.0(vite@4.4.10) + '@vitejs/plugin-react': 4.1.0(vite@4.5.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) ultrahtml: 1.5.2 @@ -1059,28 +1059,28 @@ packages: culori: 3.2.0 dev: true - /@cobalt-ui/plugin-css@1.5.0(@cobalt-ui/cli@1.6.0): - resolution: {integrity: sha512-FXkY+qiL8M/LpQ5q+pwOdVVOSjegJXAns4vzUk3YsU5cpwBnPSeFOb6PHxxjmj+n09UhYVFQ+qLXnjff5hog+Q==} + /@cobalt-ui/plugin-css@1.5.1(@cobalt-ui/cli@1.6.0): + resolution: {integrity: sha512-P4HorghSuO40kzsjzGFAiqzzE+//IkWQilwyW4AWLQ11mCxiWTAWCB2N14wJ1CxbsxugE528Zx2vofoWZnN4PQ==} peerDependencies: '@cobalt-ui/cli': ^1.x dependencies: '@cobalt-ui/cli': 1.6.0 '@cobalt-ui/utils': 1.2.2 - '@types/culori': 2.0.1 - '@types/mime': 3.0.2 + '@types/culori': 2.0.3 + '@types/mime': 3.0.3 culori: 3.2.0 mime: 3.0.0 svgo: 3.0.2 dev: true - /@cobalt-ui/plugin-sass@1.3.0(@cobalt-ui/cli@1.6.0)(@cobalt-ui/plugin-css@1.5.0): + /@cobalt-ui/plugin-sass@1.3.0(@cobalt-ui/cli@1.6.0)(@cobalt-ui/plugin-css@1.5.1): resolution: {integrity: sha512-Pyv0TUL3LEMMvpsrAuLYLjKvPPbAw52WYvH4Aa0SlSni6bm/w/MAmpdQmNKBVXiipSFwd5vZDULpNjy0lZk6dw==} peerDependencies: '@cobalt-ui/cli': ^1.x '@cobalt-ui/plugin-css': ^1.x dependencies: '@cobalt-ui/cli': 1.6.0 - '@cobalt-ui/plugin-css': 1.5.0(@cobalt-ui/cli@1.6.0) + '@cobalt-ui/plugin-css': 1.5.1(@cobalt-ui/cli@1.6.0) '@cobalt-ui/utils': 1.2.2 '@types/mime': 3.0.2 mime: 3.0.0 @@ -1095,7 +1095,7 @@ packages: resolution: {integrity: sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==} dev: false - /@docsearch/react@3.5.2(@algolia/client-search@4.20.0)(@types/react@18.2.24)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.8.3): + /@docsearch/react@3.5.2(@algolia/client-search@4.20.0)(@types/react@18.2.24)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.9.0): resolution: {integrity: sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==} peerDependencies: '@types/react': '>= 16.8.0 < 19.0.0' @@ -1112,14 +1112,14 @@ packages: search-insights: optional: true dependencies: - '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.8.3) + '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0)(search-insights@2.9.0) '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.20.0)(algoliasearch@4.20.0) '@docsearch/css': 3.5.2 '@types/react': 18.2.24 algoliasearch: 4.20.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - search-insights: 2.8.3 + search-insights: 2.9.0 transitivePeerDependencies: - '@algolia/client-search' dev: false @@ -1132,8 +1132,8 @@ packages: requiresBuild: true optional: true - /@esbuild/android-arm64@0.19.4: - resolution: {integrity: sha512-mRsi2vJsk4Bx/AFsNBqOH2fqedxn5L/moT58xgg51DjX1la64Z3Npicut2VbhvDFO26qjWtPMsVxCd80YTFVeg==} + /@esbuild/android-arm64@0.19.5: + resolution: {integrity: sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -1148,8 +1148,8 @@ packages: requiresBuild: true optional: true - /@esbuild/android-arm@0.19.4: - resolution: {integrity: sha512-uBIbiYMeSsy2U0XQoOGVVcpIktjLMEKa7ryz2RLr7L/vTnANNEsPVAh4xOv7ondGz6ac1zVb0F8Jx20rQikffQ==} + /@esbuild/android-arm@0.19.5: + resolution: {integrity: sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -1164,8 +1164,8 @@ packages: requiresBuild: true optional: true - /@esbuild/android-x64@0.19.4: - resolution: {integrity: sha512-4iPufZ1TMOD3oBlGFqHXBpa3KFT46aLl6Vy7gwed0ZSYgHaZ/mihbYb4t7Z9etjkC9Al3ZYIoOaHrU60gcMy7g==} + /@esbuild/android-x64@0.19.5: + resolution: {integrity: sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -1180,8 +1180,8 @@ packages: requiresBuild: true optional: true - /@esbuild/darwin-arm64@0.19.4: - resolution: {integrity: sha512-Lviw8EzxsVQKpbS+rSt6/6zjn9ashUZ7Tbuvc2YENgRl0yZTktGlachZ9KMJUsVjZEGFVu336kl5lBgDN6PmpA==} + /@esbuild/darwin-arm64@0.19.5: + resolution: {integrity: sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -1196,8 +1196,8 @@ packages: requiresBuild: true optional: true - /@esbuild/darwin-x64@0.19.4: - resolution: {integrity: sha512-YHbSFlLgDwglFn0lAO3Zsdrife9jcQXQhgRp77YiTDja23FrC2uwnhXMNkAucthsf+Psr7sTwYEryxz6FPAVqw==} + /@esbuild/darwin-x64@0.19.5: + resolution: {integrity: sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -1212,8 +1212,8 @@ packages: requiresBuild: true optional: true - /@esbuild/freebsd-arm64@0.19.4: - resolution: {integrity: sha512-vz59ijyrTG22Hshaj620e5yhs2dU1WJy723ofc+KUgxVCM6zxQESmWdMuVmUzxtGqtj5heHyB44PjV/HKsEmuQ==} + /@esbuild/freebsd-arm64@0.19.5: + resolution: {integrity: sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -1228,8 +1228,8 @@ packages: requiresBuild: true optional: true - /@esbuild/freebsd-x64@0.19.4: - resolution: {integrity: sha512-3sRbQ6W5kAiVQRBWREGJNd1YE7OgzS0AmOGjDmX/qZZecq8NFlQsQH0IfXjjmD0XtUYqr64e0EKNFjMUlPL3Cw==} + /@esbuild/freebsd-x64@0.19.5: + resolution: {integrity: sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -1244,8 +1244,8 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-arm64@0.19.4: - resolution: {integrity: sha512-ZWmWORaPbsPwmyu7eIEATFlaqm0QGt+joRE9sKcnVUG3oBbr/KYdNE2TnkzdQwX6EDRdg/x8Q4EZQTXoClUqqA==} + /@esbuild/linux-arm64@0.19.5: + resolution: {integrity: sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -1260,8 +1260,8 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-arm@0.19.4: - resolution: {integrity: sha512-z/4ArqOo9EImzTi4b6Vq+pthLnepFzJ92BnofU1jgNlcVb+UqynVFdoXMCFreTK7FdhqAzH0vmdwW5373Hm9pg==} + /@esbuild/linux-arm@0.19.5: + resolution: {integrity: sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -1276,8 +1276,8 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-ia32@0.19.4: - resolution: {integrity: sha512-EGc4vYM7i1GRUIMqRZNCTzJh25MHePYsnQfKDexD8uPTCm9mK56NIL04LUfX2aaJ+C9vyEp2fJ7jbqFEYgO9lQ==} + /@esbuild/linux-ia32@0.19.5: + resolution: {integrity: sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -1292,8 +1292,8 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-loong64@0.19.4: - resolution: {integrity: sha512-WVhIKO26kmm8lPmNrUikxSpXcgd6HDog0cx12BUfA2PkmURHSgx9G6vA19lrlQOMw+UjMZ+l3PpbtzffCxFDRg==} + /@esbuild/linux-loong64@0.19.5: + resolution: {integrity: sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -1308,8 +1308,8 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-mips64el@0.19.4: - resolution: {integrity: sha512-keYY+Hlj5w86hNp5JJPuZNbvW4jql7c1eXdBUHIJGTeN/+0QFutU3GrS+c27L+NTmzi73yhtojHk+lr2+502Mw==} + /@esbuild/linux-mips64el@0.19.5: + resolution: {integrity: sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -1324,8 +1324,8 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-ppc64@0.19.4: - resolution: {integrity: sha512-tQ92n0WMXyEsCH4m32S21fND8VxNiVazUbU4IUGVXQpWiaAxOBvtOtbEt3cXIV3GEBydYsY8pyeRMJx9kn3rvw==} + /@esbuild/linux-ppc64@0.19.5: + resolution: {integrity: sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -1340,8 +1340,8 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-riscv64@0.19.4: - resolution: {integrity: sha512-tRRBey6fG9tqGH6V75xH3lFPpj9E8BH+N+zjSUCnFOX93kEzqS0WdyJHkta/mmJHn7MBaa++9P4ARiU4ykjhig==} + /@esbuild/linux-riscv64@0.19.5: + resolution: {integrity: sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -1356,8 +1356,8 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-s390x@0.19.4: - resolution: {integrity: sha512-152aLpQqKZYhThiJ+uAM4PcuLCAOxDsCekIbnGzPKVBRUDlgaaAfaUl5NYkB1hgY6WN4sPkejxKlANgVcGl9Qg==} + /@esbuild/linux-s390x@0.19.5: + resolution: {integrity: sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -1372,8 +1372,8 @@ packages: requiresBuild: true optional: true - /@esbuild/linux-x64@0.19.4: - resolution: {integrity: sha512-Mi4aNA3rz1BNFtB7aGadMD0MavmzuuXNTaYL6/uiYIs08U7YMPETpgNn5oue3ICr+inKwItOwSsJDYkrE9ekVg==} + /@esbuild/linux-x64@0.19.5: + resolution: {integrity: sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -1388,8 +1388,8 @@ packages: requiresBuild: true optional: true - /@esbuild/netbsd-x64@0.19.4: - resolution: {integrity: sha512-9+Wxx1i5N/CYo505CTT7T+ix4lVzEdz0uCoYGxM5JDVlP2YdDC1Bdz+Khv6IbqmisT0Si928eAxbmGkcbiuM/A==} + /@esbuild/netbsd-x64@0.19.5: + resolution: {integrity: sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -1404,8 +1404,8 @@ packages: requiresBuild: true optional: true - /@esbuild/openbsd-x64@0.19.4: - resolution: {integrity: sha512-MFsHleM5/rWRW9EivFssop+OulYVUoVcqkyOkjiynKBCGBj9Lihl7kh9IzrreDyXa4sNkquei5/DTP4uCk25xw==} + /@esbuild/openbsd-x64@0.19.5: + resolution: {integrity: sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -1420,8 +1420,8 @@ packages: requiresBuild: true optional: true - /@esbuild/sunos-x64@0.19.4: - resolution: {integrity: sha512-6Xq8SpK46yLvrGxjp6HftkDwPP49puU4OF0hEL4dTxqCbfx09LyrbUj/D7tmIRMj5D5FCUPksBbxyQhp8tmHzw==} + /@esbuild/sunos-x64@0.19.5: + resolution: {integrity: sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -1436,8 +1436,8 @@ packages: requiresBuild: true optional: true - /@esbuild/win32-arm64@0.19.4: - resolution: {integrity: sha512-PkIl7Jq4mP6ke7QKwyg4fD4Xvn8PXisagV/+HntWoDEdmerB2LTukRZg728Yd1Fj+LuEX75t/hKXE2Ppk8Hh1w==} + /@esbuild/win32-arm64@0.19.5: + resolution: {integrity: sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -1452,8 +1452,8 @@ packages: requiresBuild: true optional: true - /@esbuild/win32-ia32@0.19.4: - resolution: {integrity: sha512-ga676Hnvw7/ycdKB53qPusvsKdwrWzEyJ+AtItHGoARszIqvjffTwaaW3b2L6l90i7MO9i+dlAW415INuRhSGg==} + /@esbuild/win32-ia32@0.19.5: + resolution: {integrity: sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -1468,8 +1468,8 @@ packages: requiresBuild: true optional: true - /@esbuild/win32-x64@0.19.4: - resolution: {integrity: sha512-HP0GDNla1T3ZL8Ko/SHAS2GgtjOg+VmWnnYLhuTksr++EnduYB0f3Y2LzHsUwb2iQ13JGoY6G3R8h6Du/WG6uA==} + /@esbuild/win32-x64@0.19.5: + resolution: {integrity: sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -1975,6 +1975,11 @@ packages: use-sync-external-store: 1.2.0(react@18.2.0) dev: false + /@tootallnate/once@2.0.0: + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + dev: true + /@trysound/sax@0.2.0: resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} @@ -2009,14 +2014,14 @@ packages: '@babel/types': 7.23.0 dev: false - /@types/chai-subset@1.3.3: - resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + /@types/chai-subset@1.3.4: + resolution: {integrity: sha512-CCWNXrJYSUIojZ1149ksLl3AN9cmZ5djf+yUoVVV+NuYrtydItQVlL2ZDqyC6M6O9LWRnVf8yYDxbXHO2TfQZg==} dependencies: - '@types/chai': 4.3.6 + '@types/chai': 4.3.9 dev: true - /@types/chai@4.3.6: - resolution: {integrity: sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==} + /@types/chai@4.3.9: + resolution: {integrity: sha512-69TtiDzu0bcmKQv3yg1Zx409/Kd7r0b5F1PfpYJfSHzLGtB53547V4u+9iqKYsTu/O2ai6KTb0TInNpvuQ3qmg==} dev: true /@types/cookie@0.5.2: @@ -2027,6 +2032,10 @@ packages: resolution: {integrity: sha512-Mfcyo2pT3IwxIdB2fRZrMp+noSZOOc+719G89h/MqDHcJNEDy22HO0XEso7Ofz6p0kB7XqkhxMBjmCXLQPeyJA==} dev: true + /@types/culori@2.0.3: + resolution: {integrity: sha512-kpW5coysXK3hwCY76W0Z4QuctvMZ25TWNzBVykpFekhGs+WDHOJGoF8hclts5AcIbSrL6f1IW/HsdS0k9lkEmA==} + dev: true + /@types/debug@4.1.9: resolution: {integrity: sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow==} dependencies: @@ -2060,6 +2069,10 @@ packages: resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==} dev: true + /@types/json-schema@7.0.14: + resolution: {integrity: sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==} + dev: true + /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: true @@ -2084,10 +2097,18 @@ packages: resolution: {integrity: sha512-Wj+fqpTLtTbG7c0tH47dkahefpLKEbB+xAZuLq7b4/IDHPl/n6VoXcyUQ2bypFlbSwvCr0y+bD4euTTqTJsPxQ==} dev: true + /@types/mime@3.0.3: + resolution: {integrity: sha512-i8MBln35l856k5iOhKk2XJ4SeAWg75mLIpZB4v6imOagKL6twsukBZGDMNhdOVk7yRFTMPpfILocMos59Q1otQ==} + dev: true + /@types/minimist@1.2.3: resolution: {integrity: sha512-ZYFzrvyWUNhaPomn80dsMNgMeXxNWZBdkuG/hWlUvXvbdUH8ZERNBGXnU87McuGcWDsyzX2aChCv/SVN348k3A==} dev: true + /@types/minimist@1.2.4: + resolution: {integrity: sha512-Kfe/D3hxHTusnPNRbycJE1N77WHDsdS4AjUYIzlDzhDrS47NrwuL3YW4VITxwR7KCVpzwgy4Rbj829KSSQmwXQ==} + dev: true + /@types/ms@0.7.32: resolution: {integrity: sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g==} dev: false @@ -2118,6 +2139,12 @@ packages: resolution: {integrity: sha512-LzcWltT83s1bthcvjBmiBvGJiiUe84NWRHkw+ZV6Fr41z2FbIzvc815dk2nQ3RAKMuN2fkenM/z3Xv2QzEpYxQ==} dev: true + /@types/node@20.8.10: + resolution: {integrity: sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==} + dependencies: + undici-types: 5.26.5 + dev: true + /@types/node@20.8.2: resolution: {integrity: sha512-Vvycsc9FQdwhxE3y3DzeIxuEJbWGDsnrxvMADzTDF/lcdR9/K+AQIeAghTQsHtotg/q0j3WEOYS/jQgSdWue3w==} @@ -2180,7 +2207,7 @@ packages: /@types/sax@1.2.5: resolution: {integrity: sha512-9jWta97bBVC027/MShr3gLab8gPhKy4l6qpb+UJLF5pDm3501NvA7uvqVCW+REFtx00oTi6Cq9JzLwgq6evVgw==} dependencies: - '@types/node': 20.8.2 + '@types/node': 20.8.10 dev: true /@types/scheduler@0.16.3: @@ -2345,7 +2372,7 @@ packages: - '@swc/helpers' dev: true - /@vitejs/plugin-react@4.1.0(vite@4.4.10): + /@vitejs/plugin-react@4.1.0(vite@4.5.0): resolution: {integrity: sha512-rM0SqazU9iqPUraQ2JlIvReeaxOoRj6n+PzB1C0cBzIbd8qP336nC39/R9yPi3wVcah7E7j/kdU1uCUqMEU4OQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -2356,7 +2383,7 @@ packages: '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.23.0) '@types/babel__core': 7.20.2 react-refresh: 0.14.0 - vite: 4.4.10(@types/node@20.8.2)(sass@1.68.0) + vite: 4.5.0(@types/node@20.8.2)(sass@1.68.0) transitivePeerDependencies: - supports-color dev: false @@ -2380,7 +2407,7 @@ packages: /@vitest/snapshot@0.34.6: resolution: {integrity: sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==} dependencies: - magic-string: 0.30.4 + magic-string: 0.30.5 pathe: 1.1.1 pretty-format: 29.7.0 dev: true @@ -2395,10 +2422,14 @@ packages: resolution: {integrity: sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==} dependencies: diff-sequences: 29.6.3 - loupe: 2.3.6 + loupe: 2.3.7 pretty-format: 29.7.0 dev: true + /abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + dev: true + /acorn-jsx@5.3.2(acorn@8.10.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -2407,8 +2438,8 @@ packages: acorn: 8.10.0 dev: true - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + /acorn-walk@8.3.0: + resolution: {integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==} engines: {node: '>=0.4.0'} dev: true @@ -2417,6 +2448,21 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + /acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4(supports-color@9.4.0) + transitivePeerDependencies: + - supports-color + dev: true + /aggregate-error@4.0.1: resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} engines: {node: '>=12'} @@ -2635,7 +2681,7 @@ packages: devalue: 4.3.2 diff: 5.1.0 es-module-lexer: 1.3.1 - esbuild: 0.19.4 + esbuild: 0.19.5 estree-walker: 3.0.3 execa: 8.0.1 fast-glob: 3.3.1 @@ -2691,8 +2737,8 @@ packages: engines: {node: '>= 0.4'} dev: true - /axios@1.5.1: - resolution: {integrity: sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==} + /axios@1.6.0: + resolution: {integrity: sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==} dependencies: follow-redirects: 1.15.3 form-data: 4.0.0 @@ -2942,7 +2988,7 @@ packages: check-error: 1.0.3 deep-eql: 4.1.3 get-func-name: 2.0.2 - loupe: 2.3.6 + loupe: 2.3.7 pathval: 1.1.1 type-detect: 4.0.8 dev: true @@ -3130,8 +3176,8 @@ packages: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} dev: false - /commander@11.0.0: - resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} + /commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} dev: true @@ -3237,6 +3283,13 @@ packages: css-tree: 2.2.1 dev: true + /cssstyle@3.0.0: + resolution: {integrity: sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==} + engines: {node: '>=14'} + dependencies: + rrweb-cssom: 0.6.0 + dev: true + /csstype@3.1.2: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} @@ -3267,6 +3320,15 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true + /data-urls@4.0.0: + resolution: {integrity: sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==} + engines: {node: '>=14'} + dependencies: + abab: 2.0.6 + whatwg-mimetype: 3.0.0 + whatwg-url: 12.0.1 + dev: true + /dataloader@1.4.0: resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} dev: true @@ -3292,6 +3354,18 @@ packages: dependencies: ms: 2.1.3 + /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: true + /debug@4.3.4(supports-color@9.4.0): resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -3322,6 +3396,10 @@ packages: engines: {node: '>=10'} dev: true + /decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + dev: true + /decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} dependencies: @@ -3514,6 +3592,13 @@ packages: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} dev: true + /domexception@4.0.0: + resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} + engines: {node: '>=12'} + dependencies: + webidl-conversions: 7.0.0 + dev: true + /domhandler@5.0.3: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} @@ -3696,34 +3781,34 @@ packages: '@esbuild/win32-ia32': 0.18.20 '@esbuild/win32-x64': 0.18.20 - /esbuild@0.19.4: - resolution: {integrity: sha512-x7jL0tbRRpv4QUyuDMjONtWFciygUxWaUM1kMX2zWxI0X2YWOt7MSA0g4UdeSiHM8fcYVzpQhKYOycZwxTdZkA==} + /esbuild@0.19.5: + resolution: {integrity: sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.19.4 - '@esbuild/android-arm64': 0.19.4 - '@esbuild/android-x64': 0.19.4 - '@esbuild/darwin-arm64': 0.19.4 - '@esbuild/darwin-x64': 0.19.4 - '@esbuild/freebsd-arm64': 0.19.4 - '@esbuild/freebsd-x64': 0.19.4 - '@esbuild/linux-arm': 0.19.4 - '@esbuild/linux-arm64': 0.19.4 - '@esbuild/linux-ia32': 0.19.4 - '@esbuild/linux-loong64': 0.19.4 - '@esbuild/linux-mips64el': 0.19.4 - '@esbuild/linux-ppc64': 0.19.4 - '@esbuild/linux-riscv64': 0.19.4 - '@esbuild/linux-s390x': 0.19.4 - '@esbuild/linux-x64': 0.19.4 - '@esbuild/netbsd-x64': 0.19.4 - '@esbuild/openbsd-x64': 0.19.4 - '@esbuild/sunos-x64': 0.19.4 - '@esbuild/win32-arm64': 0.19.4 - '@esbuild/win32-ia32': 0.19.4 - '@esbuild/win32-x64': 0.19.4 + '@esbuild/android-arm': 0.19.5 + '@esbuild/android-arm64': 0.19.5 + '@esbuild/android-x64': 0.19.5 + '@esbuild/darwin-arm64': 0.19.5 + '@esbuild/darwin-x64': 0.19.5 + '@esbuild/freebsd-arm64': 0.19.5 + '@esbuild/freebsd-x64': 0.19.5 + '@esbuild/linux-arm': 0.19.5 + '@esbuild/linux-arm64': 0.19.5 + '@esbuild/linux-ia32': 0.19.5 + '@esbuild/linux-loong64': 0.19.5 + '@esbuild/linux-mips64el': 0.19.5 + '@esbuild/linux-ppc64': 0.19.5 + '@esbuild/linux-riscv64': 0.19.5 + '@esbuild/linux-s390x': 0.19.5 + '@esbuild/linux-x64': 0.19.5 + '@esbuild/netbsd-x64': 0.19.5 + '@esbuild/openbsd-x64': 0.19.5 + '@esbuild/sunos-x64': 0.19.5 + '@esbuild/win32-arm64': 0.19.5 + '@esbuild/win32-ia32': 0.19.5 + '@esbuild/win32-x64': 0.19.5 /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} @@ -3864,7 +3949,7 @@ packages: dependencies: '@typescript-eslint/utils': 6.7.4(eslint@8.50.0)(typescript@5.2.2) eslint: 8.50.0 - vitest: 0.34.6 + vitest: 0.34.6(jsdom@22.1.0) transitivePeerDependencies: - supports-color - typescript @@ -4218,7 +4303,7 @@ packages: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 - universalify: 2.0.0 + universalify: 2.0.1 dev: true /fs-extra@7.0.1: @@ -4276,10 +4361,6 @@ packages: engines: {node: 6.* || 8.* || >= 10.*} dev: true - /get-func-name@2.0.0: - resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} - dev: true - /get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} dev: true @@ -4600,6 +4681,13 @@ packages: lru-cache: 6.0.0 dev: true + /html-encoding-sniffer@3.0.0: + resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} + engines: {node: '>=12'} + dependencies: + whatwg-encoding: 2.0.0 + dev: true + /html-escaper@3.0.3: resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} @@ -4611,6 +4699,27 @@ packages: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} dev: false + /http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.3.4(supports-color@9.4.0) + transitivePeerDependencies: + - supports-color + dev: true + + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4(supports-color@9.4.0) + transitivePeerDependencies: + - supports-color + dev: true + /human-id@1.0.2: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} dev: true @@ -4636,6 +4745,13 @@ packages: dependencies: safer-buffer: 2.1.2 + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} dev: false @@ -4848,6 +4964,10 @@ packages: engines: {node: '>=12'} dev: false + /is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + dev: true + /is-reference@3.0.1: resolution: {integrity: sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==} dependencies: @@ -4963,6 +5083,44 @@ packages: dependencies: argparse: 2.0.1 + /jsdom@22.1.0: + resolution: {integrity: sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==} + engines: {node: '>=16'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + abab: 2.0.6 + cssstyle: 3.0.0 + data-urls: 4.0.0 + decimal.js: 10.4.3 + domexception: 4.0.0 + form-data: 4.0.0 + html-encoding-sniffer: 3.0.0 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.7 + parse5: 7.1.2 + rrweb-cssom: 0.6.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 4.1.3 + w3c-xmlserializer: 4.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 2.0.0 + whatwg-mimetype: 3.0.0 + whatwg-url: 12.0.1 + ws: 8.14.2 + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} @@ -5026,7 +5184,7 @@ packages: /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: - universalify: 2.0.0 + universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 dev: true @@ -5140,10 +5298,10 @@ packages: js-tokens: 4.0.0 dev: false - /loupe@2.3.6: - resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + /loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} dependencies: - get-func-name: 2.0.0 + get-func-name: 2.0.2 dev: true /lru-cache@4.1.5: @@ -5184,6 +5342,14 @@ packages: engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true /map-obj@1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} @@ -5355,7 +5521,7 @@ packages: resolution: {integrity: sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - '@types/minimist': 1.2.3 + '@types/minimist': 1.2.4 camelcase-keys: 7.0.2 decamelize: 5.0.1 decamelize-keys: 1.1.1 @@ -5771,8 +5937,8 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - /nanostores@0.9.3: - resolution: {integrity: sha512-KobZjcVyNndNrb5DAjfs0WG0lRcZu5Q1BOrfTOxokFLi25zFrWPjg+joXC6kuDqNfSt9fQwppyjUBkRPtsL+8w==} + /nanostores@0.9.4: + resolution: {integrity: sha512-BVFzKt6K5P8tYQLL7MItqcev7jpspA5pIjv+Ck3k6wBnUlwCJcpkGTIinj4APvx8SvdP9fXDGoMRCTY6DO/9QA==} engines: {node: ^16.0.0 || ^18.0.0 || >=20.0.0} dev: true @@ -5963,6 +6129,10 @@ packages: boolbase: 1.0.0 dev: true + /nwsapi@2.2.7: + resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} + dev: true + /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} dev: true @@ -6041,7 +6211,7 @@ packages: hasBin: true dependencies: camelcase: 6.3.0 - commander: 11.0.0 + commander: 11.1.0 fs-extra: 11.1.1 handlebars: 4.7.8 json-schema-ref-parser: 9.0.9 @@ -6060,7 +6230,7 @@ packages: fast-glob: 3.3.1 js-yaml: 4.1.0 supports-color: 9.4.0 - undici: 5.25.4 + undici: 5.27.0 yargs-parser: 21.1.1 dev: true @@ -6201,6 +6371,12 @@ packages: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} dev: false + /parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + dependencies: + entities: 4.5.0 + dev: true + /path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} @@ -6463,6 +6639,10 @@ packages: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} dev: true + /psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + dev: true + /pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} requiresBuild: true @@ -6483,6 +6663,10 @@ packages: side-channel: 1.0.4 dev: true + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: true + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -6728,6 +6912,10 @@ packages: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} dev: true + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: true + /reselect@4.1.8: resolution: {integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==} dev: false @@ -6818,6 +7006,10 @@ packages: optionalDependencies: fsevents: 2.3.3 + /rrweb-cssom@0.6.0: + resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} + dev: true + /run-applescript@5.0.0: resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} engines: {node: '>=12'} @@ -6882,14 +7074,21 @@ packages: /sax@1.3.0: resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + /saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + dependencies: + xmlchars: 2.2.0 + dev: true + /scheduler@0.23.0: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: loose-envify: 1.4.0 dev: false - /search-insights@2.8.3: - resolution: {integrity: sha512-W9rZfQ9XEfF0O6ntgQOTI7Txc8nkZrO4eJ/pTHK0Br6wWND2sPGPoWg+yGhdIW7wMbLqk8dc23IyEtLlNGpeNw==} + /search-insights@2.9.0: + resolution: {integrity: sha512-bkWW9nIHOFkLwjQ1xqVaMbjjO5vhP26ERsH9Y3pKr8imthofEFIxlnOabkmGcw6ksRj9jWidcI65vvjJH/nTGg==} dev: false /section-matter@1.0.0: @@ -7314,7 +7513,7 @@ packages: /strip-literal@1.3.0: resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} dependencies: - acorn: 8.10.0 + acorn: 8.11.2 dev: true /styled-jsx@5.1.1(react@18.2.0): @@ -7340,7 +7539,7 @@ packages: dependencies: component-emitter: 1.3.0 cookiejar: 2.1.4 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4 fast-safe-stringify: 2.1.1 form-data: 4.0.0 formidable: 2.1.2 @@ -7488,6 +7687,10 @@ packages: picocolors: 1.0.0 dev: true + /symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + dev: true + /synckit@0.8.5: resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} engines: {node: ^14.18.0 || >=16.0.0} @@ -7598,9 +7801,26 @@ packages: engines: {node: '>=6'} dev: true + /tough-cookie@4.1.3: + resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} + engines: {node: '>=6'} + dependencies: + psl: 1.9.0 + punycode: 2.3.0 + universalify: 0.2.0 + url-parse: 1.5.10 + dev: true + /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + /tr46@4.1.1: + resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} + engines: {node: '>=14'} + dependencies: + punycode: 2.3.0 + dev: true + /trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} dev: false @@ -7782,6 +8002,10 @@ packages: which-boxed-primitive: 1.0.2 dev: true + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true + /undici@5.23.0: resolution: {integrity: sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==} engines: {node: '>=14.0'} @@ -7794,6 +8018,14 @@ packages: engines: {node: '>=14.0'} dependencies: '@fastify/busboy': 2.0.0 + dev: false + + /undici@5.27.0: + resolution: {integrity: sha512-l3ydWhlhOJzMVOYkymLykcRRXqbUaQriERtR70B9LzNkZ4bX52Fc8wbTDneMiwo8T+AemZXvXaTx+9o5ROxrXg==} + engines: {node: '>=14.0'} + dependencies: + '@fastify/busboy': 2.0.0 + dev: true /unherit@3.0.1: resolution: {integrity: sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==} @@ -7887,8 +8119,13 @@ packages: engines: {node: '>= 4.0.0'} dev: true - /universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + /universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + dev: true + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} dev: true @@ -7913,6 +8150,13 @@ packages: dependencies: punycode: 2.3.0 + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: true + /use-sync-external-store@1.2.0(react@18.2.0): resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} peerDependencies: @@ -7988,17 +8232,17 @@ packages: - terser dev: true - /vite-node@0.34.6(@types/node@20.8.2): + /vite-node@0.34.6(@types/node@20.8.10): resolution: {integrity: sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==} engines: {node: '>=v14.18.0'} hasBin: true dependencies: cac: 6.7.14 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.4 mlly: 1.4.2 pathe: 1.1.1 picocolors: 1.0.0 - vite: 4.4.9(@types/node@20.8.2) + vite: 4.5.0(@types/node@20.8.10) transitivePeerDependencies: - '@types/node' - less @@ -8010,7 +8254,7 @@ packages: - terser dev: true - /vite-node@0.34.6(@types/node@20.8.2)(supports-color@9.4.0): + /vite-node@0.34.6(@types/node@20.8.10)(supports-color@9.4.0): resolution: {integrity: sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==} engines: {node: '>=v14.18.0'} hasBin: true @@ -8020,7 +8264,7 @@ packages: mlly: 1.4.2 pathe: 1.1.1 picocolors: 1.0.0 - vite: 4.4.9(@types/node@20.8.2) + vite: 4.5.0(@types/node@20.8.10) transitivePeerDependencies: - '@types/node' - less @@ -8032,7 +8276,7 @@ packages: - terser dev: true - /vite-plugin-sass-dts@1.3.11(postcss@8.4.31)(prettier@3.0.3)(sass@1.68.0)(vite@4.4.10): + /vite-plugin-sass-dts@1.3.11(postcss@8.4.31)(prettier@3.0.3)(sass@1.68.0)(vite@4.5.0): resolution: {integrity: sha512-3kEMwyejRFf8KGotbUVrYgALWE6JhN+EuZga5ngfDQspaDpqxJbjgKdSVw9cLS+5DGF70QIgr6QCt6Y6lqXF6A==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -8045,7 +8289,7 @@ packages: postcss-js: 4.0.1(postcss@8.4.31) prettier: 3.0.3 sass: 1.68.0 - vite: 4.4.10(@types/node@20.8.2)(sass@1.68.0) + vite: 4.5.0(@types/node@20.8.2)(sass@1.68.0) dev: true /vite@4.4.10(@types/node@20.8.2)(sass@1.68.0): @@ -8083,6 +8327,7 @@ packages: sass: 1.68.0 optionalDependencies: fsevents: 2.3.3 + dev: false /vite@4.4.9(@types/node@20.8.0): resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} @@ -8120,8 +8365,8 @@ packages: fsevents: 2.3.3 dev: true - /vite@4.4.9(@types/node@20.8.2): - resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} + /vite@4.5.0(@types/node@20.8.10): + resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: @@ -8148,7 +8393,7 @@ packages: terser: optional: true dependencies: - '@types/node': 20.8.2 + '@types/node': 20.8.10 esbuild: 0.18.20 postcss: 8.4.31 rollup: 3.29.4 @@ -8156,6 +8401,42 @@ packages: fsevents: 2.3.3 dev: true + /vite@4.5.0(@types/node@20.8.2)(sass@1.68.0): + resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.8.2 + esbuild: 0.18.20 + postcss: 8.4.31 + rollup: 3.29.4 + sass: 1.68.0 + optionalDependencies: + fsevents: 2.3.3 + /vitefu@0.2.4(vite@4.4.10): resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==} peerDependencies: @@ -8221,29 +8502,95 @@ packages: webdriverio: optional: true dependencies: - '@types/chai': 4.3.6 - '@types/chai-subset': 1.3.3 - '@types/node': 20.8.2 + '@types/chai': 4.3.9 + '@types/chai-subset': 1.3.4 + '@types/node': 20.8.10 '@vitest/expect': 0.34.6 '@vitest/runner': 0.34.6 '@vitest/snapshot': 0.34.6 '@vitest/spy': 0.34.6 '@vitest/utils': 0.34.6 - acorn: 8.10.0 - acorn-walk: 8.2.0 + acorn: 8.11.2 + acorn-walk: 8.3.0 + cac: 6.7.14 + chai: 4.3.10 + debug: 4.3.4 + local-pkg: 0.4.3 + magic-string: 0.30.5 + pathe: 1.1.1 + picocolors: 1.0.0 + std-env: 3.4.3 + strip-literal: 1.3.0 + tinybench: 2.5.1 + tinypool: 0.7.0 + vite: 4.5.0(@types/node@20.8.10) + vite-node: 0.34.6(@types/node@20.8.10) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vitest@0.34.6(jsdom@22.1.0): + resolution: {integrity: sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==} + engines: {node: '>=v14.18.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.9 + '@types/chai-subset': 1.3.4 + '@types/node': 20.8.10 + '@vitest/expect': 0.34.6 + '@vitest/runner': 0.34.6 + '@vitest/snapshot': 0.34.6 + '@vitest/spy': 0.34.6 + '@vitest/utils': 0.34.6 + acorn: 8.11.2 + acorn-walk: 8.3.0 cac: 6.7.14 chai: 4.3.10 debug: 4.3.4(supports-color@9.4.0) + jsdom: 22.1.0 local-pkg: 0.4.3 - magic-string: 0.30.4 + magic-string: 0.30.5 pathe: 1.1.1 picocolors: 1.0.0 std-env: 3.4.3 strip-literal: 1.3.0 tinybench: 2.5.1 tinypool: 0.7.0 - vite: 4.4.9(@types/node@20.8.2) - vite-node: 0.34.6(@types/node@20.8.2) + vite: 4.5.0(@types/node@20.8.10) + vite-node: 0.34.6(@types/node@20.8.10) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -8286,29 +8633,29 @@ packages: webdriverio: optional: true dependencies: - '@types/chai': 4.3.6 - '@types/chai-subset': 1.3.3 - '@types/node': 20.8.2 + '@types/chai': 4.3.9 + '@types/chai-subset': 1.3.4 + '@types/node': 20.8.10 '@vitest/expect': 0.34.6 '@vitest/runner': 0.34.6 '@vitest/snapshot': 0.34.6 '@vitest/spy': 0.34.6 '@vitest/utils': 0.34.6 - acorn: 8.10.0 - acorn-walk: 8.2.0 + acorn: 8.11.2 + acorn-walk: 8.3.0 cac: 6.7.14 chai: 4.3.10 debug: 4.3.4(supports-color@9.4.0) local-pkg: 0.4.3 - magic-string: 0.30.4 + magic-string: 0.30.5 pathe: 1.1.1 picocolors: 1.0.0 std-env: 3.4.3 strip-literal: 1.3.0 tinybench: 2.5.1 tinypool: 0.7.0 - vite: 4.4.9(@types/node@20.8.2) - vite-node: 0.34.6(@types/node@20.8.2)(supports-color@9.4.0) + vite: 4.5.0(@types/node@20.8.10) + vite-node: 0.34.6(@types/node@20.8.10)(supports-color@9.4.0) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -8328,6 +8675,13 @@ packages: resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} dev: false + /w3c-xmlserializer@4.0.0: + resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} + engines: {node: '>=14'} + dependencies: + xml-name-validator: 4.0.0 + dev: true + /watchpack@2.4.0: resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} engines: {node: '>=10.13.0'} @@ -8349,6 +8703,31 @@ packages: /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + /webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + dev: true + + /whatwg-encoding@2.0.0: + resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} + engines: {node: '>=12'} + dependencies: + iconv-lite: 0.6.3 + dev: true + + /whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + dev: true + + /whatwg-url@12.0.1: + resolution: {integrity: sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==} + engines: {node: '>=14'} + dependencies: + tr46: 4.1.1 + webidl-conversions: 7.0.0 + dev: true + /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: @@ -8464,6 +8843,28 @@ packages: /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + /ws@8.14.2: + resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + dev: true + + /xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + dev: true + /y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} dev: true