From 58e6c9614897d5bad48aa79dc8f7154d3e4e19ea Mon Sep 17 00:00:00 2001 From: Dylan Meysmans Date: Thu, 19 Dec 2024 23:40:18 +0100 Subject: [PATCH] feat(#2056)!: support Pinia Colada Work in progress. --- packages/openapi-pinia-colada/.npmignore | 5 + packages/openapi-pinia-colada/CHANGELOG.md | 7 + packages/openapi-pinia-colada/CONTRIBUTING.md | 91 ++ packages/openapi-pinia-colada/LICENSE | 21 + packages/openapi-pinia-colada/README.md | 65 + packages/openapi-pinia-colada/biome.json | 17 + packages/openapi-pinia-colada/package.json | 83 ++ packages/openapi-pinia-colada/src/index.ts | 69 + .../test/fixtures/api.d.ts | 1055 +++++++++++++++ .../test/fixtures/api.yaml | 726 ++++++++++ .../test/fixtures/mock-server.ts | 121 ++ .../openapi-pinia-colada/test/index.test.tsx | 792 +++++++++++ .../openapi-pinia-colada/tsconfig.build.json | 4 + packages/openapi-pinia-colada/tsconfig.json | 16 + .../openapi-pinia-colada/vitest.config.ts | 10 + pnpm-lock.yaml | 1190 ++++++++++------- 16 files changed, 3778 insertions(+), 494 deletions(-) create mode 100644 packages/openapi-pinia-colada/.npmignore create mode 100644 packages/openapi-pinia-colada/CHANGELOG.md create mode 100644 packages/openapi-pinia-colada/CONTRIBUTING.md create mode 100644 packages/openapi-pinia-colada/LICENSE create mode 100644 packages/openapi-pinia-colada/README.md create mode 100644 packages/openapi-pinia-colada/biome.json create mode 100644 packages/openapi-pinia-colada/package.json create mode 100644 packages/openapi-pinia-colada/src/index.ts create mode 100644 packages/openapi-pinia-colada/test/fixtures/api.d.ts create mode 100644 packages/openapi-pinia-colada/test/fixtures/api.yaml create mode 100644 packages/openapi-pinia-colada/test/fixtures/mock-server.ts create mode 100644 packages/openapi-pinia-colada/test/index.test.tsx create mode 100644 packages/openapi-pinia-colada/tsconfig.build.json create mode 100644 packages/openapi-pinia-colada/tsconfig.json create mode 100644 packages/openapi-pinia-colada/vitest.config.ts diff --git a/packages/openapi-pinia-colada/.npmignore b/packages/openapi-pinia-colada/.npmignore new file mode 100644 index 000000000..20c0b3b59 --- /dev/null +++ b/packages/openapi-pinia-colada/.npmignore @@ -0,0 +1,5 @@ +.turbo +test +vitest.config.ts +tsconfig*.json +biome.json diff --git a/packages/openapi-pinia-colada/CHANGELOG.md b/packages/openapi-pinia-colada/CHANGELOG.md new file mode 100644 index 000000000..c32f4da71 --- /dev/null +++ b/packages/openapi-pinia-colada/CHANGELOG.md @@ -0,0 +1,7 @@ +# openapi-pinia-colada + +## 0.0.1 + +### Patch Changes + +- [#2060](https://github.com/openapi-ts/openapi-typescript/pull/2060) [`d4ae6c8`](https://github.com/openapi-ts/openapi-typescript/pull/2060/commits/d4ae6c8ec5549e317f09ee32c6a06f9e9c60d97e) Thanks [@mettekou](https://github.com/mettekou)! - Initial release \ No newline at end of file diff --git a/packages/openapi-pinia-colada/CONTRIBUTING.md b/packages/openapi-pinia-colada/CONTRIBUTING.md new file mode 100644 index 000000000..e64717c75 --- /dev/null +++ b/packages/openapi-pinia-colada/CONTRIBUTING.md @@ -0,0 +1,91 @@ +# Contributing + +Thanks for being willing to contribute! 🙏 + +**Working on your first Pull Request (PR)?** You can learn how from this free series [How to Contribute to an Open Source Project on GitHub](https://app.egghead.io/playlists/how-to-contribute-to-an-open-source-project-on-github). + +## Open issues + +Please check out the [the open issues](https://github.com/openapi-ts/openapi-typescript/issues). Issues labelled [**Good First Issue**](https://github.com/openapi-ts/openapi-typescript/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) are especially good to start with. + +Contributing doesn’t have to be in code. Simply answering questions in open issues or providing workarounds is as important as making pull requests. + +## Writing code + +### Setup + +1. Install [pnpm](https://pnpm.io/) +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 + +### 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. + +To run the entire test suite, run: + +```bash +pnpm test +``` + +To run an individual test: + +```bash +pnpm test -- [partial filename] +``` + +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. + +### Running linting + +Linting is handled via [Biome](https://biomejs.dev), a faster ESLint replacement. It was installed with `pnpm i` and can be run with: + +```bash +pnpm run lint +``` + +### 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.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-pinia-colada/LICENSE b/packages/openapi-pinia-colada/LICENSE new file mode 100644 index 000000000..11c04a265 --- /dev/null +++ b/packages/openapi-pinia-colada/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Dylan Meysmans + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/openapi-pinia-colada/README.md b/packages/openapi-pinia-colada/README.md new file mode 100644 index 000000000..f8edfab39 --- /dev/null +++ b/packages/openapi-pinia-colada/README.md @@ -0,0 +1,65 @@ +# openapi-pinia-colada + +openapi-pinia-colada is a type-safe tiny wrapper (1 kb) around [`@pinia/colada`](https://pinia-colada.esm.dev/) to work with OpenAPI schema. + +It works by using [`openapi-fetch`](../openapi-fetch) and [`openapi-typescript`](../openapi-typescript) so you get all the following features: + +- ✅ No typos in URLs or params. +- ✅ All parameters, request bodies, and responses are type-checked and 100% match your schema +- ✅ No manual typing of your API +- ✅ Eliminates `any` types that hide bugs +- ✅ Eliminates `as` type overrides that can also hide bugs + +## Setup + +Install this library along with [`openapi-fetch`](../openapi-fetch) and [`openapi-typescript`](../openapi-typescript): + +```bash +npm i openapi-pinia-colada openapi-fetch +npm i -D openapi-typescript typescript +``` + +Next, generate TypeScript types from your OpenAPI schema using openapi-typescript: + +```bash +npx openapi-typescript ./path/to/api/v1.yaml -o ./src/lib/api/v1.d.ts +``` + +## Usage + +Once your types have been generated from your schema, you can create a [fetch client](../openapi-fetch), a Pinia Colada client and start querying your API. + +```vue + + + +``` + +> You can find more information about `createFetchClient` in the [openapi-fetch documentation](../openapi-fetch). + +## 📓 Docs + +[View Docs](https://openapi-ts.dev/openapi-pinia-colada/) diff --git a/packages/openapi-pinia-colada/biome.json b/packages/openapi-pinia-colada/biome.json new file mode 100644 index 000000000..d5bf28ca0 --- /dev/null +++ b/packages/openapi-pinia-colada/biome.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "extends": ["../../biome.json"], + "files": { + "ignore": ["./test/fixtures/"] + }, + "linter": { + "rules": { + "complexity": { + "noBannedTypes": "off" + }, + "suspicious": { + "noConfusingVoidType": "off" + } + } + } +} diff --git a/packages/openapi-pinia-colada/package.json b/packages/openapi-pinia-colada/package.json new file mode 100644 index 000000000..b66c1e8bd --- /dev/null +++ b/packages/openapi-pinia-colada/package.json @@ -0,0 +1,83 @@ +{ + "name": "openapi-pinia-colada", + "description": "Fast, type-safe @pinia/colada client to work with your OpenAPI schema.", + "version": "0.0.1", + "author": { + "name": "Dylan Meysmans", + "email": "contact@mettekou.com" + }, + "license": "MIT", + "type": "module", + "main": "./dist/index.js", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "require": { + "types": "./dist/index.d.cts", + "default": "./dist/index.cjs" + } + }, + "./*": "./*" + }, + "homepage": "https://openapi-ts.dev", + "repository": { + "type": "git", + "url": "https://github.com/openapi-ts/openapi-typescript", + "directory": "packages/openapi-pinia-colada" + }, + "bugs": { + "url": "https://github.com/openapi-ts/openapi-typescript/issues" + }, + "keywords": [ + "openapi", + "swagger", + "rest", + "api", + "oapi_3", + "oapi_3_1", + "typescript", + "fetch", + "vue", + "pinia-colada", + "pinia" + ], + "scripts": { + "build": "pnpm run build:clean && pnpm run build:esm && pnpm run build:cjs", + "build:clean": "del-cli dist", + "build:esm": "tsc -p tsconfig.build.json", + "build:cjs": "esbuild --bundle --platform=node --target=es2019 --outfile=dist/index.cjs --external:typescript src/index.ts", + "dev": "tsc -p tsconfig.build.json --watch", + "format": "biome format . --write", + "lint": "biome check .", + "generate-types": "openapi-typescript test/fixtures/api.yaml -o test/fixtures/api.d.ts", + "pretest": "pnpm run generate-types", + "test": "pnpm run \"/^test:/\"", + "test:js": "vitest run", + "test:ts": "tsc --noEmit", + "version": "pnpm run prepare && pnpm run build" + }, + "dependencies": { + "openapi-typescript-helpers": "workspace:^" + }, + "devDependencies": { + "@pinia/colada": "^0.13.0", + "@testing-library/vue": "^8.1.0", + "@vitejs/plugin-vue": "^5.2.1", + "del-cli": "^5.1.0", + "esbuild": "^0.24.0", + "execa": "^8.0.1", + "msw": "^2.7.0", + "openapi-fetch": "workspace:^", + "openapi-typescript": "workspace:^", + "vue": "^3.5.12" + }, + "peerDependencies": { + "@pinia/colada": "^0.13.0", + "openapi-fetch": "workspace:^" + } +} diff --git a/packages/openapi-pinia-colada/src/index.ts b/packages/openapi-pinia-colada/src/index.ts new file mode 100644 index 000000000..86d7bb5bc --- /dev/null +++ b/packages/openapi-pinia-colada/src/index.ts @@ -0,0 +1,69 @@ +import { type MaybeRef, unref } from "vue"; +import { + type UseMutationOptions, + type UseMutationReturn, + type UseQueryOptions, + type UseQueryReturn, + useMutation as piniaColadaUseMutation, + useQuery as piniaColadaUseQuery, +} from "@pinia/colada"; +import type { ClientMethod, FetchResponse, MaybeOptionalInit, Client as FetchClient } from "openapi-fetch"; +import type { HttpMethod, MediaType, PathsWithMethod, RequiredKeysOf } from "openapi-typescript-helpers"; + +type InitWithUnknowns = Init & { [key: string]: unknown }; + +export const useQuery = < + Method extends HttpMethod, + Paths extends Record>, + Media extends MediaType, + Path extends PathsWithMethod, + Init extends MaybeOptionalInit, + Response extends Required>, + Options extends Omit, "key" | "query">, +>( + fetchClient: MaybeRef, + method: MaybeRef, + url: MaybeRef>, + ...[init, options]: RequiredKeysOf extends never + ? [MaybeRef>?, MaybeRef?] + : [MaybeRef>, MaybeRef?] +): UseQueryReturn => { + const fetchClientValue = unref(fetchClient); + const methodValue = unref(method); + const urlValue = unref(url); + const initValue = unref(init); + const optionsValue = unref(options); + const mth = methodValue.toUpperCase() as Uppercase; + const fn = fetchClientValue[mth] as ClientMethod; + + return piniaColadaUseQuery({ + key: [methodValue, urlValue as string, initValue as InitWithUnknowns], + query: () => fn(urlValue, optionsValue), + ...optionsValue, + }); +}; + +export const useMutation = < + Method extends HttpMethod, + Paths extends Record>, + Media extends MediaType, + Path extends PathsWithMethod, + Init extends MaybeOptionalInit, + Response extends Required>, // note: Required is used to avoid repeating NonNullable in UseQuery types + Options extends Omit, "key" | "mutation">, + Vars, +>( + fetchClient: MaybeRef, + method: MaybeRef, + url: MaybeRef>, + options?: Options, +): UseMutationReturn => { + const fetchClientValue = unref(fetchClient); + const methodValue = unref(method); + const urlValue = unref(url); + const optionsValue = unref(options); + const mth = methodValue.toUpperCase() as Uppercase; + const fn = fetchClientValue[mth] as ClientMethod; + + return piniaColadaUseMutation({ mutation: () => fn(urlValue, optionsValue), ...optionsValue }); +}; diff --git a/packages/openapi-pinia-colada/test/fixtures/api.d.ts b/packages/openapi-pinia-colada/test/fixtures/api.d.ts new file mode 100644 index 000000000..cad5160d4 --- /dev/null +++ b/packages/openapi-pinia-colada/test/fixtures/api.d.ts @@ -0,0 +1,1055 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + +export interface paths { + "/comment": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: components["requestBodies"]["CreateReply"]; + responses: { + 201: components["responses"]["CreateReply"]; + 500: components["responses"]["Error"]; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/blogposts": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: { + tags?: string[]; + published?: boolean; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["AllPostsGet"]; + 500: components["responses"]["Error"]; + }; + }; + put: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: components["requestBodies"]["CreatePost"]; + responses: { + 201: components["responses"]["CreatePost"]; + 500: components["responses"]["Error"]; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: components["requestBodies"]["PatchPost"]; + responses: { + 201: components["responses"]["PatchPost"]; + }; + }; + trace?: never; + }; + "/blogposts/{post_id}": { + parameters: { + query?: never; + header?: never; + path: { + post_id: string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: { + version?: number; + format?: string; + }; + header?: never; + path: { + post_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["PostGet"]; + 404: components["responses"]["Error"]; + 500: components["responses"]["Error"]; + }; + }; + put?: never; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path: { + post_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["PostDelete"]; + 500: components["responses"]["Error"]; + }; + }; + options?: never; + head?: never; + patch: { + parameters: { + query?: never; + header?: never; + path: { + post_id: string; + }; + cookie?: never; + }; + requestBody: components["requestBodies"]["PatchPost"]; + responses: { + 200: components["responses"]["PatchPost"]; + 404: components["responses"]["Error"]; + 500: components["responses"]["Error"]; + }; + }; + trace?: never; + }; + "/blogposts-optional": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: components["requestBodies"]["CreatePostOptional"]; + responses: { + 201: components["responses"]["CreatePost"]; + 500: components["responses"]["Error"]; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/blogposts-optional-inline": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": components["schemas"]["Post"]; + }; + }; + responses: { + 201: components["responses"]["CreatePost"]; + 500: components["responses"]["Error"]; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/header-params": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["getHeaderParams"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/media": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + /** Format: blob */ + media: string; + name: string; + }; + }; + }; + responses: { + "2XX": { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status: string; + }; + }; + }; + "4XX": components["responses"]["Error"]; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/mismatched-data": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["User"]; + 201: components["responses"]["PostGet"]; + 500: components["responses"]["Error"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/mismatched-errors": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["User"]; + 401: components["responses"]["EmptyError"]; + 500: components["responses"]["Error"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/self": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["User"]; + 404: components["responses"]["Error"]; + 500: components["responses"]["Error"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/string-array": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["StringArray"]; + 500: components["responses"]["Error"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/tag/{name}": { + parameters: { + query?: never; + header?: never; + path: { + name: string; + }; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + name: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["Tag"]; + 500: components["responses"]["Error"]; + }; + }; + put: { + parameters: { + query?: never; + header?: never; + path: { + name: string; + }; + cookie?: never; + }; + requestBody: components["requestBodies"]["CreateTag"]; + responses: { + 201: components["responses"]["CreateTag"]; + 500: components["responses"]["Error"]; + }; + }; + post?: never; + delete: { + parameters: { + query?: never; + header?: never; + path: { + name: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description No Content */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + 500: components["responses"]["Error"]; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/query-params": { + parameters: { + query?: { + string?: string; + number?: number; + boolean?: boolean; + array?: string[]; + object?: { + foo: string; + bar: string; + }; + }; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: { + string?: string; + number?: number; + boolean?: boolean; + array?: string[]; + object?: { + foo: string; + bar: string; + }; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status: string; + }; + }; + }; + default: components["responses"]["Error"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/path-params/{simple_primitive}/{simple_obj_flat}/{simple_arr_flat}/{simple_obj_explode*}/{simple_arr_explode*}/{.label_primitive}/{.label_obj_flat}/{.label_arr_flat}/{.label_obj_explode*}/{.label_arr_explode*}/{;matrix_primitive}/{;matrix_obj_flat}/{;matrix_arr_flat}/{;matrix_obj_explode*}/{;matrix_arr_explode*}": { + parameters: { + query?: never; + header?: never; + path: { + simple_primitive: string; + simple_obj_flat: { + a: string; + c: string; + }; + simple_arr_flat: number[]; + simple_obj_explode: { + e: string; + g: string; + }; + simple_arr_explode: number[]; + label_primitive: string; + label_obj_flat: { + a: string; + c: string; + }; + label_arr_flat: number[]; + label_obj_explode: { + e: string; + g: string; + }; + label_arr_explode: number[]; + matrix_primitive: string; + matrix_obj_flat: { + a: string; + c: string; + }; + matrix_arr_flat: number[]; + matrix_obj_explode: { + e: string; + g: string; + }; + matrix_arr_explode: number[]; + }; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path: { + simple_primitive: string; + simple_obj_flat: { + a: string; + c: string; + }; + simple_arr_flat: number[]; + simple_obj_explode: { + e: string; + g: string; + }; + simple_arr_explode: number[]; + label_primitive: string; + label_obj_flat: { + a: string; + c: string; + }; + label_arr_flat: number[]; + label_obj_explode: { + e: string; + g: string; + }; + label_arr_explode: number[]; + matrix_primitive: string; + matrix_obj_flat: { + a: string; + c: string; + }; + matrix_arr_flat: number[]; + matrix_obj_explode: { + e: string; + g: string; + }; + matrix_arr_explode: number[]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status: string; + }; + }; + }; + default: components["responses"]["Error"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/default-as-error": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + default: components["responses"]["Error"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/anyMethod": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["User"]; + 404: components["responses"]["Error"]; + 500: components["responses"]["Error"]; + }; + }; + put: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["User"]; + 404: components["responses"]["Error"]; + 500: components["responses"]["Error"]; + }; + }; + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["User"]; + 404: components["responses"]["Error"]; + 500: components["responses"]["Error"]; + }; + }; + delete: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["User"]; + 404: components["responses"]["Error"]; + 500: components["responses"]["Error"]; + }; + }; + options: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["User"]; + 404: components["responses"]["Error"]; + 500: components["responses"]["Error"]; + }; + }; + head: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["User"]; + 404: components["responses"]["Error"]; + 500: components["responses"]["Error"]; + }; + }; + patch: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["User"]; + 404: components["responses"]["Error"]; + 500: components["responses"]["Error"]; + }; + }; + trace: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["User"]; + 404: components["responses"]["Error"]; + 500: components["responses"]["Error"]; + }; + }; + }; + "/contact": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: components["requestBodies"]["Contact"]; + responses: { + 200: components["responses"]["Contact"]; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/multiple-response-content": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["MultipleResponse"]; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; +} +export type webhooks = Record; +export interface components { + schemas: { + Post: { + title: string; + body: string; + publish_date?: number; + }; + StringArray: string[]; + User: { + email: string; + age?: number; + avatar?: string; + /** Format: date */ + created_at: number; + /** Format: date */ + updated_at: number; + }; + }; + responses: { + AllPostsGet: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Post"][]; + }; + }; + CreatePost: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status: string; + }; + }; + }; + CreateTag: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status: string; + }; + }; + }; + CreateReply: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json;charset=utf-8": { + message: string; + }; + }; + }; + Contact: { + headers: { + [name: string]: unknown; + }; + content: { + "text/html": string; + }; + }; + EmptyError: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + Error: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + code: number; + message: string; + }; + }; + }; + PatchPost: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status: string; + }; + }; + }; + PostDelete: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status: string; + }; + }; + }; + PostGet: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Post"]; + }; + }; + StringArray: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["StringArray"]; + }; + }; + Tag: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": string; + }; + }; + User: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["User"]; + }; + }; + MultipleResponse: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + email: string; + name?: string; + }; + "application/ld+json": { + "@id": string; + email: string; + name?: string; + }; + }; + }; + }; + parameters: never; + requestBodies: { + CreatePost: { + content: { + "application/json": { + title: string; + body: string; + publish_date: number; + }; + }; + }; + CreatePostOptional: { + content: { + "application/json": { + title: string; + body: string; + publish_date: number; + }; + }; + }; + CreateTag: { + content: { + "application/json": { + description?: string; + }; + }; + }; + CreateReply: { + content: { + "application/json;charset=utf-8": { + message: string; + replied_at: number; + }; + }; + }; + Contact: { + content: { + "multipart/form-data": { + name: string; + email: string; + subject: string; + message: string; + }; + }; + }; + PatchPost: { + content: { + "application/json": { + title?: string; + body?: string; + publish_date?: number; + }; + }; + }; + }; + headers: never; + pathItems: never; +} +export type $defs = Record; +export interface operations { + getHeaderParams: { + parameters: { + query?: never; + header: { + "x-required-header": string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status: string; + }; + }; + }; + 500: components["responses"]["Error"]; + }; + }; +} diff --git a/packages/openapi-pinia-colada/test/fixtures/api.yaml b/packages/openapi-pinia-colada/test/fixtures/api.yaml new file mode 100644 index 000000000..8994e1ba8 --- /dev/null +++ b/packages/openapi-pinia-colada/test/fixtures/api.yaml @@ -0,0 +1,726 @@ +openapi: 3.1.0 +info: + title: Test Specification + version: "1.0" +paths: + /comment: + put: + requestBody: + $ref: "#/components/requestBodies/CreateReply" + responses: + 201: + $ref: "#/components/responses/CreateReply" + 500: + $ref: "#/components/responses/Error" + /blogposts: + get: + parameters: + - in: query + name: tags + schema: + type: array + items: + type: string + - in: query + name: published + schema: + type: boolean + responses: + 200: + $ref: "#/components/responses/AllPostsGet" + 500: + $ref: "#/components/responses/Error" + put: + requestBody: + $ref: "#/components/requestBodies/CreatePost" + responses: + 201: + $ref: "#/components/responses/CreatePost" + 500: + $ref: "#/components/responses/Error" + patch: + requestBody: + $ref: "#/components/requestBodies/PatchPost" + responses: + 201: + $ref: "#/components/responses/PatchPost" + /blogposts/{post_id}: + parameters: + - in: path + name: post_id + schema: + type: string + required: true + get: + parameters: + - in: query + name: version + schema: + type: number + - in: query + name: format + schema: + type: string + responses: + 200: + $ref: "#/components/responses/PostGet" + 404: + $ref: "#/components/responses/Error" + 500: + $ref: "#/components/responses/Error" + patch: + requestBody: + $ref: "#/components/requestBodies/PatchPost" + responses: + 200: + $ref: "#/components/responses/PatchPost" + 404: + $ref: "#/components/responses/Error" + 500: + $ref: "#/components/responses/Error" + delete: + responses: + 200: + $ref: "#/components/responses/PostDelete" + 500: + $ref: "#/components/responses/Error" + /blogposts-optional: + put: + requestBody: + $ref: "#/components/requestBodies/CreatePostOptional" + responses: + 201: + $ref: "#/components/responses/CreatePost" + 500: + $ref: "#/components/responses/Error" + /blogposts-optional-inline: + put: + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/Post" + responses: + 201: + $ref: "#/components/responses/CreatePost" + 500: + $ref: "#/components/responses/Error" + /header-params: + get: + operationId: getHeaderParams + parameters: + - name: x-required-header + in: header + required: true + schema: + type: string + responses: + 200: + content: + application/json: + schema: + type: object + properties: + status: + type: string + required: + - status + 500: + $ref: "#/components/responses/Error" + /media: + put: + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + media: + type: string + format: blob + name: + type: string + required: + - media + - name + responses: + 2XX: + content: + application/json: + schema: + type: object + properties: + status: + type: string + required: + - status + 4XX: + $ref: "#/components/responses/Error" + /mismatched-data: + get: + responses: + 200: + $ref: "#/components/responses/User" + 201: + $ref: "#/components/responses/PostGet" + 500: + $ref: "#/components/responses/Error" + /mismatched-errors: + get: + responses: + 200: + $ref: "#/components/responses/User" + 401: + $ref: "#/components/responses/EmptyError" + 500: + $ref: "#/components/responses/Error" + /self: + get: + responses: + 200: + $ref: "#/components/responses/User" + 404: + $ref: "#/components/responses/Error" + 500: + $ref: "#/components/responses/Error" + /string-array: + get: + responses: + 200: + $ref: "#/components/responses/StringArray" + 500: + $ref: "#/components/responses/Error" + /tag/{name}: + parameters: + - in: path + name: name + schema: + type: string + required: true + get: + responses: + 200: + $ref: "#/components/responses/Tag" + 500: + $ref: "#/components/responses/Error" + put: + requestBody: + $ref: "#/components/requestBodies/CreateTag" + responses: + 201: + $ref: "#/components/responses/CreateTag" + 500: + $ref: "#/components/responses/Error" + delete: + responses: + 204: + description: No Content + 500: + $ref: "#/components/responses/Error" + /query-params: + parameters: + - in: query + name: string + schema: + type: string + - in: query + name: number + schema: + type: number + - in: query + name: boolean + schema: + type: boolean + - in: query + name: array + schema: + type: array + items: + type: string + - in: query + name: object + schema: + type: object + required: + - foo + - bar + properties: + foo: + type: string + bar: + type: string + get: + responses: + 200: + content: + application/json: + schema: + type: object + properties: + status: + type: string + required: + - status + default: + $ref: "#/components/responses/Error" + /path-params/{simple_primitive}/{simple_obj_flat}/{simple_arr_flat}/{simple_obj_explode*}/{simple_arr_explode*}/{.label_primitive}/{.label_obj_flat}/{.label_arr_flat}/{.label_obj_explode*}/{.label_arr_explode*}/{;matrix_primitive}/{;matrix_obj_flat}/{;matrix_arr_flat}/{;matrix_obj_explode*}/{;matrix_arr_explode*}: + parameters: + - in: path + name: simple_primitive + schema: + type: string + - in: path + name: simple_obj_flat + schema: + type: object + required: [a, c] + properties: + a: + type: string + c: + type: string + - in: path + name: simple_arr_flat + schema: + type: array + items: + type: number + - in: path + name: simple_obj_explode + schema: + type: object + required: [e, g] + properties: + e: + type: string + g: + type: string + - in: path + name: simple_arr_explode + schema: + type: array + items: + type: number + - in: path + name: label_primitive + schema: + type: string + - in: path + name: label_obj_flat + schema: + type: object + required: [a, c] + properties: + a: + type: string + c: + type: string + - in: path + name: label_arr_flat + schema: + type: array + items: + type: number + - in: path + name: label_obj_explode + schema: + type: object + required: [e, g] + properties: + e: + type: string + g: + type: string + - in: path + name: label_arr_explode + schema: + type: array + items: + type: number + - in: path + name: matrix_primitive + schema: + type: string + - in: path + name: matrix_obj_flat + schema: + type: object + required: [a, c] + properties: + a: + type: string + c: + type: string + - in: path + name: matrix_arr_flat + schema: + type: array + items: + type: number + - in: path + name: matrix_obj_explode + schema: + type: object + required: [e, g] + properties: + e: + type: string + g: + type: string + - in: path + name: matrix_arr_explode + schema: + type: array + items: + type: number + get: + responses: + 200: + content: + application/json: + schema: + type: object + properties: + status: + type: string + required: + - status + default: + $ref: "#/components/responses/Error" + /default-as-error: + get: + responses: + default: + $ref: "#/components/responses/Error" + /anyMethod: + get: + responses: + 200: + $ref: "#/components/responses/User" + 404: + $ref: "#/components/responses/Error" + 500: + $ref: "#/components/responses/Error" + put: + responses: + 200: + $ref: "#/components/responses/User" + 404: + $ref: "#/components/responses/Error" + 500: + $ref: "#/components/responses/Error" + post: + responses: + 200: + $ref: "#/components/responses/User" + 404: + $ref: "#/components/responses/Error" + 500: + $ref: "#/components/responses/Error" + delete: + responses: + 200: + $ref: "#/components/responses/User" + 404: + $ref: "#/components/responses/Error" + 500: + $ref: "#/components/responses/Error" + options: + responses: + 200: + $ref: "#/components/responses/User" + 404: + $ref: "#/components/responses/Error" + 500: + $ref: "#/components/responses/Error" + head: + responses: + 200: + $ref: "#/components/responses/User" + 404: + $ref: "#/components/responses/Error" + 500: + $ref: "#/components/responses/Error" + patch: + responses: + 200: + $ref: "#/components/responses/User" + 404: + $ref: "#/components/responses/Error" + 500: + $ref: "#/components/responses/Error" + trace: + responses: + 200: + $ref: "#/components/responses/User" + 404: + $ref: "#/components/responses/Error" + 500: + $ref: "#/components/responses/Error" + /contact: + put: + requestBody: + $ref: "#/components/requestBodies/Contact" + responses: + 200: + $ref: "#/components/responses/Contact" + /multiple-response-content: + get: + responses: + 200: + $ref: "#/components/responses/MultipleResponse" +components: + schemas: + Post: + type: object + properties: + title: + type: string + body: + type: string + publish_date: + type: number + required: + - title + - body + StringArray: + type: array + items: + type: string + User: + type: object + properties: + email: + type: string + age: + type: number + avatar: + type: string + created_at: + type: number + format: date + updated_at: + type: number + format: date + required: + - email + - created_at + - updated_at + requestBodies: + CreatePost: + required: true + content: + application/json: + schema: + type: object + properties: + title: + type: string + body: + type: string + publish_date: + type: number + required: + - title + - body + - publish_date + CreatePostOptional: + required: false + content: + application/json: + schema: + type: object + properties: + title: + type: string + body: + type: string + publish_date: + type: number + required: + - title + - body + - publish_date + CreateTag: + required: true + content: + application/json: + schema: + type: object + properties: + description: + type: string + CreateReply: + required: true + content: + "application/json;charset=utf-8": + schema: + type: object + properties: + message: + type: string + replied_at: + type: number + required: + - message + - replied_at + Contact: + required: true + content: + multipart/form-data: + schema: + type: object + properties: + name: + type: string + email: + type: string + subject: + type: string + message: + type: string + required: + - name + - email + - subject + - message + PatchPost: + required: true + content: + application/json: + schema: + type: object + properties: + title: + type: string + body: + type: string + publish_date: + type: number + responses: + AllPostsGet: + content: + application/json: + schema: + type: array + items: + $ref: "#/components/schemas/Post" + CreatePost: + content: + application/json: + schema: + type: object + properties: + status: + type: string + required: + - status + CreateTag: + content: + application/json: + schema: + type: object + properties: + status: + type: string + required: + - status + CreateReply: + content: + "application/json;charset=utf-8": + schema: + type: object + properties: + message: + type: string + required: + - message + Contact: + content: + text/html: + schema: + type: string + EmptyError: + content: {} + Error: + content: + application/json: + schema: + type: object + properties: + code: + type: number + message: + type: string + required: + - code + - message + PatchPost: + content: + application/json: + schema: + type: object + properties: + status: + type: string + required: + - status + PostDelete: + content: + application/json: + schema: + type: object + properties: + status: + type: string + required: + - status + PostGet: + content: + application/json: + schema: + $ref: "#/components/schemas/Post" + StringArray: + content: + application/json: + schema: + $ref: "#/components/schemas/StringArray" + Tag: + content: + application/json: + schema: + type: string + User: + content: + application/json: + schema: + $ref: "#/components/schemas/User" + MultipleResponse: + content: + application/json: + schema: + type: object + properties: + id: + type: string + email: + type: string + name: + type: string + required: + - id + - email + application/ld+json: + schema: + type: object + properties: + "@id": + type: string + email: + type: string + name: + type: string + required: + - "@id" + - email diff --git a/packages/openapi-pinia-colada/test/fixtures/mock-server.ts b/packages/openapi-pinia-colada/test/fixtures/mock-server.ts new file mode 100644 index 000000000..4c7571427 --- /dev/null +++ b/packages/openapi-pinia-colada/test/fixtures/mock-server.ts @@ -0,0 +1,121 @@ +import { + http, + HttpResponse, + type JsonBodyType, + type StrictRequest, + type DefaultBodyType, + type HttpResponseResolver, + type PathParams, + type AsyncResponseResolverReturnType, +} from "msw"; +import { setupServer } from "msw/node"; + +/** + * Mock server instance + */ +export const server = setupServer(); + +/** + * Default baseUrl for tests + */ +export const baseUrl = "https://api.example.com" as const; + +/** + * Test path helper, returns an absolute URL based on + * the given path and base + */ +export function toAbsoluteURL(path: string, base: string = baseUrl) { + // If we have absolute path + // if (URL.canParse(path)) { + // return new URL(path).toString(); + // } + + // Otherwise we want to support relative paths + // where base may also contain some part of the path + // e.g. + // base = https://api.foo.bar/v1/ + // path = /self + // should result in https://api.foo.bar/v1/self + + // Construct base URL + const baseUrlInstance = new URL(base); + + // prepend base url url pathname to path and ensure only one slash between the URL parts + const newPath = `${baseUrlInstance.pathname}/${path}`.replace(/\/+/g, "/"); + + return new URL(newPath, baseUrlInstance).toString(); +} + +export type MswHttpMethod = keyof typeof http; + +export interface MockRequestHandlerOptions< + // Recreate the generic signature of the HTTP resolver + // so the arguments passed to http handlers propagate here. + Params extends PathParams = PathParams, + RequestBodyType extends DefaultBodyType = DefaultBodyType, + ResponseBodyType extends DefaultBodyType = undefined, +> { + baseUrl?: string; + method: MswHttpMethod; + /** + * Relative or absolute path to match. + * When relative, baseUrl will be used as base. + */ + path: string; + body?: JsonBodyType; + headers?: Record; + status?: number; + + /** + * Optional handler which will be called instead of using the body, headers and status + */ + handler?: HttpResponseResolver; +} + +/** + * Configures a msw request handler using the provided options. + */ +export function useMockRequestHandler< + // Recreate the generic signature of the HTTP resolver + // so the arguments passed to http handlers propagate here. + Params extends PathParams = PathParams, + RequestBodyType extends DefaultBodyType = DefaultBodyType, + ResponseBodyType extends DefaultBodyType = undefined, +>({ + baseUrl: requestBaseUrl, + method, + path, + body, + headers, + status, + handler, +}: MockRequestHandlerOptions) { + let requestUrl = ""; + let receivedRequest: StrictRequest; + let receivedCookies: Record = {}; + + const resolvedPath = toAbsoluteURL(path, requestBaseUrl); + + server.use( + http[method](resolvedPath, (args) => { + requestUrl = args.request.url; + receivedRequest = args.request.clone(); + receivedCookies = { ...args.cookies }; + + if (handler) { + return handler(args); + } + + return HttpResponse.json(body as any, { + status: status ?? 200, + headers, + }) as AsyncResponseResolverReturnType; + }), + ); + + return { + getRequestCookies: () => receivedCookies, + getRequest: () => receivedRequest, + getRequestUrl: () => new URL(requestUrl), + }; +} diff --git a/packages/openapi-pinia-colada/test/index.test.tsx b/packages/openapi-pinia-colada/test/index.test.tsx new file mode 100644 index 000000000..294175df9 --- /dev/null +++ b/packages/openapi-pinia-colada/test/index.test.tsx @@ -0,0 +1,792 @@ +import { afterAll, beforeAll, describe, expect, it } from "vitest"; +import { server, baseUrl, useMockRequestHandler } from "./fixtures/mock-server.js"; +import type { paths } from "./fixtures/api.js"; +import createClient from "../src/index.js"; +import createFetchClient from "openapi-fetch"; +import { fireEvent, render, renderHook, screen, waitFor, act } from "@testing-library/react"; +import { + QueryClient, + QueryClientProvider, + useQueries, + useQuery, + useSuspenseQuery, + skipToken, +} from "@tanstack/react-query"; +import { Suspense, type ReactNode } from "react"; +import { ErrorBoundary } from "react-error-boundary"; + +type minimalGetPaths = { + // Without parameters. + "/foo": { + get: { + responses: { + 200: { content: { "application/json": true } }; + 500: { content: { "application/json": false } }; + }; + }; + }; + // With some parameters (makes init required) and different responses. + "/bar": { + get: { + parameters: { query: {} }; + responses: { + 200: { content: { "application/json": "bar 200" } }; + 500: { content: { "application/json": "bar 500" } }; + }; + }; + }; +}; + +const queryClient = new QueryClient({ + defaultOptions: { + queries: { + retry: false, + }, + }, +}); + +const wrapper = ({ children }: { children: ReactNode }) => ( + {children} +); + +const fetchInfinite = async () => { + await new Promise(() => {}); + return Response.error(); +}; + +beforeAll(() => { + server.listen({ + onUnhandledRequest: "error", + }); +}); + +afterEach(() => { + server.resetHandlers(); + queryClient.removeQueries(); +}); + +afterAll(() => server.close()); + +describe("client", () => { + it("generates all proper functions", () => { + const fetchClient = createFetchClient({ baseUrl }); + const client = createClient(fetchClient); + expect(client).toHaveProperty("queryOptions"); + expect(client).toHaveProperty("useQuery"); + expect(client).toHaveProperty("useSuspenseQuery"); + expect(client).toHaveProperty("useMutation"); + }); + + describe("queryOptions", () => { + it("has correct parameter types", async () => { + const fetchClient = createFetchClient({ baseUrl }); + const client = createClient(fetchClient); + + client.queryOptions("get", "/string-array"); + // @ts-expect-error: Wrong method. + client.queryOptions("put", "/string-array"); + // @ts-expect-error: Wrong path. + client.queryOptions("get", "/string-arrayX"); + // @ts-expect-error: Missing 'post_id' param. + client.queryOptions("get", "/blogposts/{post_id}", {}); + }); + + it("returns query options that can resolve data correctly with fetchQuery", async () => { + const response = { title: "title", body: "body" }; + const fetchClient = createFetchClient({ baseUrl }); + const client = createClient(fetchClient); + + useMockRequestHandler({ + baseUrl, + method: "get", + path: "/blogposts/1", + status: 200, + body: response, + }); + + const data = await queryClient.fetchQuery( + client.queryOptions("get", "/blogposts/{post_id}", { + params: { + path: { + post_id: "1", + }, + }, + }), + ); + + expectTypeOf(data).toEqualTypeOf<{ + title: string; + body: string; + publish_date?: number; + }>(); + + expect(data).toEqual(response); + }); + + it("returns query options that can be passed to useQueries", async () => { + const fetchClient = createFetchClient({ baseUrl, fetch: fetchInfinite }); + const client = createClient(fetchClient); + + const { result } = renderHook( + () => + useQueries( + { + queries: [ + client.queryOptions("get", "/string-array"), + client.queryOptions("get", "/string-array", {}), + client.queryOptions("get", "/blogposts/{post_id}", { + params: { + path: { + post_id: "1", + }, + }, + }), + client.queryOptions("get", "/blogposts/{post_id}", { + params: { + path: { + post_id: "2", + }, + }, + }), + ], + }, + queryClient, + ), + { + wrapper, + }, + ); + + expectTypeOf(result.current[0].data).toEqualTypeOf(); + expectTypeOf(result.current[0].error).toEqualTypeOf<{ code: number; message: string } | null>(); + + expectTypeOf(result.current[1]).toEqualTypeOf<(typeof result.current)[0]>(); + + expectTypeOf(result.current[2].data).toEqualTypeOf< + | { + title: string; + body: string; + publish_date?: number; + } + | undefined + >(); + expectTypeOf(result.current[2].error).toEqualTypeOf<{ code: number; message: string } | null>(); + + expectTypeOf(result.current[3]).toEqualTypeOf<(typeof result.current)[2]>(); + + // Generated different queryKey for each query. + expect(queryClient.isFetching()).toBe(4); + }); + + it("returns query options that can be passed to useQuery", async () => { + const SKIP = { queryKey: [] as any, queryFn: skipToken } as const; + + const fetchClient = createFetchClient({ baseUrl }); + const client = createClient(fetchClient); + + const { result } = renderHook( + () => + useQuery( + // biome-ignore lint/correctness/noConstantCondition: it's just here to test types + false + ? { + ...client.queryOptions("get", "/foo"), + select: (data) => { + expectTypeOf(data).toEqualTypeOf(); + + return "select(true)" as const; + }, + } + : SKIP, + ), + { wrapper }, + ); + + expectTypeOf(result.current.data).toEqualTypeOf<"select(true)" | undefined>(); + expectTypeOf(result.current.error).toEqualTypeOf(); + }); + + it("returns query options that can be passed to useSuspenseQuery", async () => { + const fetchClient = createFetchClient({ + baseUrl, + fetch: () => Promise.resolve(Response.json(true)), + }); + const client = createClient(fetchClient); + + const { result } = renderHook( + () => + useSuspenseQuery({ + ...client.queryOptions("get", "/foo"), + select: (data) => { + expectTypeOf(data).toEqualTypeOf(); + + return "select(true)" as const; + }, + }), + { wrapper }, + ); + + await waitFor(() => expect(result.current).not.toBeNull()); + + expectTypeOf(result.current.data).toEqualTypeOf<"select(true)">(); + expectTypeOf(result.current.error).toEqualTypeOf(); + }); + }); + + describe("useQuery", () => { + it("should resolve data properly and have error as null when successfull request", async () => { + const response = ["one", "two", "three"]; + const fetchClient = createFetchClient({ baseUrl }); + const client = createClient(fetchClient); + + useMockRequestHandler({ + baseUrl, + method: "get", + path: "/string-array", + status: 200, + body: response, + }); + + const { result } = renderHook(() => client.useQuery("get", "/string-array"), { + wrapper, + }); + + await waitFor(() => expect(result.current.isFetching).toBe(false)); + + const { data, error } = result.current; + + expect(data).toEqual(response); + expect(error).toBeNull(); + }); + + it("should resolve error properly and have undefined data when failed request", async () => { + const fetchClient = createFetchClient({ baseUrl }); + const client = createClient(fetchClient); + + useMockRequestHandler({ + baseUrl, + method: "get", + path: "/string-array", + status: 500, + body: { code: 500, message: "Something went wrong" }, + }); + + const { result } = renderHook(() => client.useQuery("get", "/string-array"), { + wrapper, + }); + + await waitFor(() => expect(result.current.isFetching).toBe(false)); + + const { data, error } = result.current; + + expect(error?.message).toBe("Something went wrong"); + expect(data).toBeUndefined(); + }); + + it("should resolve data properly and have error as null when queryFn returns null", async () => { + const fetchClient = createFetchClient({ baseUrl }); + const client = createClient(fetchClient); + + useMockRequestHandler({ + baseUrl, + method: "get", + path: "/string-array", + status: 200, + body: null, + }); + + const { result } = renderHook(() => client.useQuery("get", "/string-array"), { wrapper }); + + await waitFor(() => expect(result.current.isFetching).toBe(false)); + + const { data, error } = result.current; + + expect(data).toBeNull(); + expect(error).toBeNull(); + }); + + it("should resolve error properly and have undefined data when queryFn returns undefined", async () => { + const fetchClient = createFetchClient({ baseUrl }); + const client = createClient(fetchClient); + + useMockRequestHandler({ + baseUrl, + method: "get", + path: "/string-array", + status: 200, + body: undefined, + }); + + const { result } = renderHook(() => client.useQuery("get", "/string-array"), { wrapper }); + + await waitFor(() => expect(result.current.isFetching).toBe(false)); + + const { data, error } = result.current; + + expect(error).toBeInstanceOf(Error); + expect(data).toBeUndefined(); + }); + + it("should infer correct data and error type", async () => { + const fetchClient = createFetchClient({ baseUrl, fetch: fetchInfinite }); + const client = createClient(fetchClient); + + const { result } = renderHook(() => client.useQuery("get", "/string-array"), { + wrapper, + }); + + const { data, error } = result.current; + + expectTypeOf(data).toEqualTypeOf(); + expectTypeOf(error).toEqualTypeOf<{ code: number; message: string } | null>(); + }); + + it("passes abort signal to fetch", async () => { + let signalPassedToFetch: AbortSignal | undefined; + + const fetchClient = createFetchClient({ + baseUrl, + fetch: async ({ signal }) => { + signalPassedToFetch = signal; + return await fetchInfinite(); + }, + }); + const client = createClient(fetchClient); + + const { unmount } = renderHook(() => client.useQuery("get", "/string-array"), { wrapper }); + + unmount(); + + expect(signalPassedToFetch?.aborted).toBeTruthy(); + }); + + describe("params", () => { + it("should be required if OpenAPI schema requires params", async () => { + const fetchClient = createFetchClient({ baseUrl }); + const client = createClient(fetchClient); + + useMockRequestHandler({ + baseUrl, + method: "get", + path: "/blogposts/:post_id", + status: 200, + body: { message: "OK" }, + }); + + // expect error on missing 'params' + // @ts-expect-error + const { result } = renderHook(() => client.useQuery("get", "/blogposts/{post_id}"), { + wrapper, + }); + await waitFor(() => expect(result.current.isSuccess).toBe(true)); + }); + }); + + it("should use provided custom queryClient", async () => { + const fetchClient = createFetchClient({ baseUrl }); + const client = createClient(fetchClient); + const customQueryClient = new QueryClient({}); + + function Page() { + const { data } = client.useQuery( + "get", + "/blogposts/{post_id}", + { + params: { + path: { + post_id: "1", + }, + }, + }, + {}, + customQueryClient, + ); + return
data: {data?.title}
; + } + + useMockRequestHandler({ + baseUrl, + method: "get", + path: "/blogposts/:post_id", + status: 200, + body: { title: "hello" }, + }); + + const rendered = render(); + + await waitFor(() => expect(rendered.getByText("data: hello"))); + }); + + it("uses provided options", async () => { + const initialData = ["initial", "data"]; + const fetchClient = createFetchClient({ baseUrl }); + const client = createClient(fetchClient); + + const { result } = renderHook( + () => client.useQuery("get", "/string-array", {}, { enabled: false, initialData }), + { wrapper }, + ); + + const { data, error } = result.current; + + expect(data).toBe(initialData); + expect(error).toBeNull(); + }); + }); + + describe("useSuspenseQuery", () => { + it("should resolve data properly and have error as null when successfull request", async () => { + const fetchClient = createFetchClient({ baseUrl }); + const client = createClient(fetchClient); + + useMockRequestHandler({ + baseUrl, + method: "get", + path: "/string-array", + status: 200, + body: ["one", "two", "three"], + }); + + const { result } = renderHook(() => client.useSuspenseQuery("get", "/string-array"), { + wrapper, + }); + + await waitFor(() => expect(result.current.isFetching).toBe(false)); + + const { data, error } = result.current; + + expect(data[0]).toBe("one"); + expect(error).toBeNull(); + }); + + it("should properly propagate error to suspense with a failed http request", async () => { + const fetchClient = createFetchClient({ baseUrl }); + const client = createClient(fetchClient); + const errorSpy = vi.spyOn(console, "error").mockImplementation(() => {}); // to avoid sending errors to console + + useMockRequestHandler({ + baseUrl, + method: "get", + path: "/string-array", + status: 500, + body: { code: 500, message: "Something went wrong" }, + }); + + const TestComponent = () => { + client.useSuspenseQuery("get", "/string-array"); + return
; + }; + + render( + +

{error.message}

}> + loading

}> + +
+
+
, + ); + + expect(await screen.findByText("Something went wrong")).toBeDefined(); + errorSpy.mockRestore(); + }); + + it("should use provided custom queryClient", async () => { + const fetchClient = createFetchClient({ baseUrl }); + const client = createClient(fetchClient); + const customQueryClient = new QueryClient({}); + + function Page() { + const { data } = client.useSuspenseQuery( + "get", + "/blogposts/{post_id}", + { + params: { + path: { + post_id: "1", + }, + }, + }, + {}, + customQueryClient, + ); + return
data: {data?.title}
; + } + + useMockRequestHandler({ + baseUrl, + method: "get", + path: "/blogposts/:post_id", + status: 200, + body: { title: "Hello" }, + }); + + const rendered = render(); + + await waitFor(() => rendered.findByText("data: Hello")); + }); + + it("passes abort signal to fetch", async () => { + let signalPassedToFetch: AbortSignal | undefined; + + const fetchClient = createFetchClient({ + baseUrl, + fetch: async ({ signal }) => { + signalPassedToFetch = signal; + await new Promise(() => {}); + return Response.error(); + }, + }); + const client = createClient(fetchClient); + const queryClient = new QueryClient({}); + + const { unmount } = renderHook(() => client.useSuspenseQuery("get", "/string-array", {}, {}, queryClient)); + + unmount(); + + await act(() => queryClient.cancelQueries()); + + expect(signalPassedToFetch?.aborted).toBeTruthy(); + }); + }); + + describe("useMutation", () => { + describe("mutate", () => { + it("should resolve data properly and have error as null when successfull request", async () => { + const fetchClient = createFetchClient({ baseUrl }); + const client = createClient(fetchClient); + + useMockRequestHandler({ + baseUrl, + method: "put", + path: "/comment", + status: 200, + body: { message: "Hello" }, + }); + + const { result } = renderHook(() => client.useMutation("put", "/comment"), { + wrapper, + }); + + result.current.mutate({ body: { message: "Hello", replied_at: 0 } }); + + await waitFor(() => expect(result.current.isPending).toBe(false)); + + const { data, error } = result.current; + + expect(data?.message).toBe("Hello"); + expect(error).toBeNull(); + }); + + it("should resolve error properly and have undefined data when failed request", async () => { + const fetchClient = createFetchClient({ baseUrl }); + const client = createClient(fetchClient); + + useMockRequestHandler({ + baseUrl, + method: "put", + path: "/comment", + status: 500, + body: { code: 500, message: "Something went wrong" }, + }); + + const { result } = renderHook(() => client.useMutation("put", "/comment"), { + wrapper, + }); + + result.current.mutate({ body: { message: "Hello", replied_at: 0 } }); + + await waitFor(() => expect(result.current.isPending).toBe(false)); + + const { data, error } = result.current; + + expect(data).toBeUndefined(); + expect(error?.message).toBe("Something went wrong"); + }); + + it("should resolve data properly and have error as null when mutationFn returns null", async () => { + const fetchClient = createFetchClient({ baseUrl }); + const client = createClient(fetchClient); + + useMockRequestHandler({ + baseUrl, + method: "put", + path: "/comment", + status: 200, + body: null, + }); + + const { result } = renderHook(() => client.useMutation("put", "/comment"), { wrapper }); + + result.current.mutate({ body: { message: "Hello", replied_at: 0 } }); + + await waitFor(() => expect(result.current.isPending).toBe(false)); + + const { data, error } = result.current; + + expect(data).toBeNull(); + expect(error).toBeNull(); + }); + + it("should resolve data properly and have error as null when mutationFn returns undefined", async () => { + const fetchClient = createFetchClient({ baseUrl }); + const client = createClient(fetchClient); + + useMockRequestHandler({ + baseUrl, + method: "put", + path: "/comment", + status: 200, + body: undefined, + }); + + const { result } = renderHook(() => client.useMutation("put", "/comment"), { wrapper }); + + result.current.mutate({ body: { message: "Hello", replied_at: 0 } }); + + await waitFor(() => expect(result.current.isPending).toBe(false)); + + const { data, error } = result.current; + + expect(error).toBeNull(); + expect(data).toBeUndefined(); + }); + + it("should use provided custom queryClient", async () => { + const fetchClient = createFetchClient({ baseUrl }); + const client = createClient(fetchClient); + const customQueryClient = new QueryClient({}); + + function Page() { + const mutation = client.useMutation("put", "/comment", {}, customQueryClient); + + return ( +
+ +
+ data: {mutation.data?.message ?? "null"}, status: {mutation.status} +
+
+ ); + } + + useMockRequestHandler({ + baseUrl, + method: "put", + path: "/comment", + status: 200, + body: { message: "Hello" }, + }); + + const rendered = render(); + + await rendered.findByText("data: null, status: idle"); + + fireEvent.click(rendered.getByRole("button", { name: /mutate/i })); + + await waitFor(() => rendered.findByText("data: Hello, status: success")); + }); + }); + + describe("mutateAsync", () => { + it("should resolve data properly", async () => { + const fetchClient = createFetchClient({ baseUrl }); + const client = createClient(fetchClient); + + useMockRequestHandler({ + baseUrl, + method: "put", + path: "/comment", + status: 200, + body: { message: "Hello" }, + }); + + const { result } = renderHook(() => client.useMutation("put", "/comment"), { + wrapper, + }); + + const data = await result.current.mutateAsync({ body: { message: "Hello", replied_at: 0 } }); + + expect(data.message).toBe("Hello"); + }); + + it("should throw an error when failed request", async () => { + const fetchClient = createFetchClient({ baseUrl }); + const client = createClient(fetchClient); + + useMockRequestHandler({ + baseUrl, + method: "put", + path: "/comment", + status: 500, + body: { code: 500, message: "Something went wrong" }, + }); + + const { result } = renderHook(() => client.useMutation("put", "/comment"), { + wrapper, + }); + + expect(result.current.mutateAsync({ body: { message: "Hello", replied_at: 0 } })).rejects.toThrow(); + }); + + it("should use provided custom queryClient", async () => { + const fetchClient = createFetchClient({ baseUrl }); + const client = createClient(fetchClient); + const customQueryClient = new QueryClient({}); + + function Page() { + const mutation = client.useMutation("put", "/comment", {}, customQueryClient); + + return ( +
+ +
+ data: {mutation.data?.message ?? "null"}, status: {mutation.status} +
+
+ ); + } + + useMockRequestHandler({ + baseUrl, + method: "put", + path: "/comment", + status: 200, + body: { message: "Hello" }, + }); + + const rendered = render(); + + await rendered.findByText("data: null, status: idle"); + + fireEvent.click(rendered.getByRole("button", { name: /mutate/i })); + + await waitFor(() => rendered.findByText("data: Hello, status: success")); + }); + }); + }); +}); diff --git a/packages/openapi-pinia-colada/tsconfig.build.json b/packages/openapi-pinia-colada/tsconfig.build.json new file mode 100644 index 000000000..b90fc83e0 --- /dev/null +++ b/packages/openapi-pinia-colada/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "include": ["src"] +} diff --git a/packages/openapi-pinia-colada/tsconfig.json b/packages/openapi-pinia-colada/tsconfig.json new file mode 100644 index 000000000..e103674b1 --- /dev/null +++ b/packages/openapi-pinia-colada/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "lib": ["ESNext", "DOM"], + "module": "ESNext", + "moduleResolution": "Bundler", + "outDir": "dist", + "skipLibCheck": true, + "sourceRoot": ".", + "jsx": "preserve", + "target": "ES2022", + "types": ["vitest/globals"] + }, + "include": ["src", "test", "*.ts"], + "exclude": ["node_modules"] +} \ No newline at end of file diff --git a/packages/openapi-pinia-colada/vitest.config.ts b/packages/openapi-pinia-colada/vitest.config.ts new file mode 100644 index 000000000..a1f5e5ffa --- /dev/null +++ b/packages/openapi-pinia-colada/vitest.config.ts @@ -0,0 +1,10 @@ +import vue from "@vitejs/plugin-vue"; +import { defineConfig, type Plugin } from "vitest/config"; + +export default defineConfig({ + plugins: [vue() as unknown as Plugin], + test: { + environment: "jsdom", + globals: true, + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2fd76e3b4..0346d6d7c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -182,10 +182,10 @@ importers: devDependencies: '@sveltejs/adapter-auto': specifier: ^3.3.1 - version: 3.3.1(@sveltejs/kit@2.13.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.15.0)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1)))(svelte@5.15.0)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1))) + version: 3.3.1(@sveltejs/kit@2.14.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.15.0)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1)))(svelte@5.15.0)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1))) '@sveltejs/kit': specifier: ^2.13.0 - version: 2.13.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.15.0)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1)))(svelte@5.15.0)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1)) + version: 2.14.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.15.0)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1)))(svelte@5.15.0)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1)) '@sveltejs/vite-plugin-svelte': specifier: ^5.0.3 version: 5.0.3(svelte@5.15.0)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1)) @@ -280,7 +280,44 @@ importers: version: 5.7.2 unplugin-swc: specifier: ^1.5.1 - version: 1.5.1(@swc/core@1.10.1(@swc/helpers@0.5.13))(rollup@4.29.1) + version: 1.5.1(@swc/core@1.10.1(@swc/helpers@0.5.13))(rollup@4.28.1) + + packages/openapi-pinia-colada: + dependencies: + openapi-typescript-helpers: + specifier: workspace:^ + version: link:../openapi-typescript-helpers + devDependencies: + '@pinia/colada': + specifier: ^0.13.0 + version: 0.13.0 + '@testing-library/vue': + specifier: ^8.1.0 + version: 8.1.0(@vue/compiler-sfc@3.5.13)(vue@3.5.13(typescript@5.7.2)) + '@vitejs/plugin-vue': + specifier: ^5.2.1 + version: 5.2.1(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2)) + del-cli: + specifier: ^5.1.0 + version: 5.1.0 + esbuild: + specifier: ^0.24.0 + version: 0.24.0 + execa: + specifier: ^8.0.1 + version: 8.0.1 + msw: + specifier: ^2.7.0 + version: 2.7.0(@types/node@22.10.2)(typescript@5.7.2) + openapi-fetch: + specifier: workspace:^ + version: link:../openapi-fetch + openapi-typescript: + specifier: workspace:^ + version: link:../openapi-typescript + vue: + specifier: ^3.5.12 + version: 3.5.13(typescript@5.7.2) packages/openapi-react-query: dependencies: @@ -790,12 +827,6 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.24.2': - resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} @@ -808,12 +839,6 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.24.2': - resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} @@ -826,12 +851,6 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.24.2': - resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} @@ -844,12 +863,6 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.24.2': - resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} @@ -862,12 +875,6 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.24.2': - resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} @@ -880,12 +887,6 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.24.2': - resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} @@ -898,12 +899,6 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.24.2': - resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} @@ -916,12 +911,6 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.24.2': - resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} @@ -934,12 +923,6 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.24.2': - resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} @@ -952,12 +935,6 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.24.2': - resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} @@ -970,12 +947,6 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.24.2': - resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} @@ -988,12 +959,6 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.24.2': - resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} @@ -1006,12 +971,6 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.24.2': - resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} @@ -1024,12 +983,6 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.24.2': - resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} @@ -1042,12 +995,6 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.24.2': - resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} @@ -1060,12 +1007,6 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.24.2': - resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} @@ -1078,18 +1019,6 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.24.2': - resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.24.2': - resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} @@ -1102,24 +1031,12 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.24.2': - resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - '@esbuild/openbsd-arm64@0.24.0': resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.24.2': - resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} @@ -1132,12 +1049,6 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.24.2': - resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} @@ -1150,12 +1061,6 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.24.2': - resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} @@ -1168,12 +1073,6 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.24.2': - resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} @@ -1186,12 +1085,6 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.24.2': - resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} @@ -1204,12 +1097,6 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.24.2': - resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@floating-ui/core@1.6.8': resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} @@ -1456,6 +1343,9 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@one-ini/wasm@0.1.1': + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + '@open-draft/deferred-promise@2.2.0': resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} @@ -1465,6 +1355,9 @@ packages: '@open-draft/until@2.1.0': resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + '@pinia/colada@0.13.0': + resolution: {integrity: sha512-Ah6uv1spRCu3I0QmimOMwrkKMcQK1+Ov2Qroz4PFD2/i9gwRUddj7Pz9kNcg5xXp2WWEPmnvkhTr2GgdqTUaUQ==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -1506,11 +1399,6 @@ packages: cpu: [arm] os: [android] - '@rollup/rollup-android-arm-eabi@4.29.1': - resolution: {integrity: sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw==} - cpu: [arm] - os: [android] - '@rollup/rollup-android-arm64@4.28.0': resolution: {integrity: sha512-eiNkznlo0dLmVG/6wf+Ifi/v78G4d4QxRhuUl+s8EWZpDewgk7PX3ZyECUXU0Zq/Ca+8nU8cQpNC4Xgn2gFNDA==} cpu: [arm64] @@ -1521,11 +1409,6 @@ packages: cpu: [arm64] os: [android] - '@rollup/rollup-android-arm64@4.29.1': - resolution: {integrity: sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew==} - cpu: [arm64] - os: [android] - '@rollup/rollup-darwin-arm64@4.28.0': resolution: {integrity: sha512-lmKx9yHsppblnLQZOGxdO66gT77bvdBtr/0P+TPOseowE7D9AJoBw8ZDULRasXRWf1Z86/gcOdpBrV6VDUY36Q==} cpu: [arm64] @@ -1536,11 +1419,6 @@ packages: cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-arm64@4.29.1': - resolution: {integrity: sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw==} - cpu: [arm64] - os: [darwin] - '@rollup/rollup-darwin-x64@4.28.0': resolution: {integrity: sha512-8hxgfReVs7k9Js1uAIhS6zq3I+wKQETInnWQtgzt8JfGx51R1N6DRVy3F4o0lQwumbErRz52YqwjfvuwRxGv1w==} cpu: [x64] @@ -1551,11 +1429,6 @@ packages: cpu: [x64] os: [darwin] - '@rollup/rollup-darwin-x64@4.29.1': - resolution: {integrity: sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng==} - cpu: [x64] - os: [darwin] - '@rollup/rollup-freebsd-arm64@4.28.0': resolution: {integrity: sha512-lA1zZB3bFx5oxu9fYud4+g1mt+lYXCoch0M0V/xhqLoGatbzVse0wlSQ1UYOWKpuSu3gyN4qEc0Dxf/DII1bhQ==} cpu: [arm64] @@ -1566,11 +1439,6 @@ packages: cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-arm64@4.29.1': - resolution: {integrity: sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw==} - cpu: [arm64] - os: [freebsd] - '@rollup/rollup-freebsd-x64@4.28.0': resolution: {integrity: sha512-aI2plavbUDjCQB/sRbeUZWX9qp12GfYkYSJOrdYTL/C5D53bsE2/nBPuoiJKoWp5SN78v2Vr8ZPnB+/VbQ2pFA==} cpu: [x64] @@ -1581,11 +1449,6 @@ packages: cpu: [x64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.29.1': - resolution: {integrity: sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w==} - cpu: [x64] - os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.28.0': resolution: {integrity: sha512-WXveUPKtfqtaNvpf0iOb0M6xC64GzUX/OowbqfiCSXTdi/jLlOmH0Ba94/OkiY2yTGTwteo4/dsHRfh5bDCZ+w==} cpu: [arm] @@ -1596,11 +1459,6 @@ packages: cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-gnueabihf@4.29.1': - resolution: {integrity: sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A==} - cpu: [arm] - os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.28.0': resolution: {integrity: sha512-yLc3O2NtOQR67lI79zsSc7lk31xjwcaocvdD1twL64PK1yNaIqCeWI9L5B4MFPAVGEVjH5k1oWSGuYX1Wutxpg==} cpu: [arm] @@ -1611,11 +1469,6 @@ packages: cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.29.1': - resolution: {integrity: sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ==} - cpu: [arm] - os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.28.0': resolution: {integrity: sha512-+P9G9hjEpHucHRXqesY+3X9hD2wh0iNnJXX/QhS/J5vTdG6VhNYMxJ2rJkQOxRUd17u5mbMLHM7yWGZdAASfcg==} cpu: [arm64] @@ -1626,11 +1479,6 @@ packages: cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.29.1': - resolution: {integrity: sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-arm64-musl@4.28.0': resolution: {integrity: sha512-1xsm2rCKSTpKzi5/ypT5wfc+4bOGa/9yI/eaOLW0oMs7qpC542APWhl4A37AENGZ6St6GBMWhCCMM6tXgTIplw==} cpu: [arm64] @@ -1641,21 +1489,11 @@ packages: cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.29.1': - resolution: {integrity: sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.28.1': resolution: {integrity: sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.29.1': - resolution: {integrity: sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw==} - cpu: [loong64] - os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.28.0': resolution: {integrity: sha512-zgWxMq8neVQeXL+ouSf6S7DoNeo6EPgi1eeqHXVKQxqPy1B2NvTbaOUWPn/7CfMKL7xvhV0/+fq/Z/J69g1WAQ==} cpu: [ppc64] @@ -1666,11 +1504,6 @@ packages: cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.29.1': - resolution: {integrity: sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w==} - cpu: [ppc64] - os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.28.0': resolution: {integrity: sha512-VEdVYacLniRxbRJLNtzwGt5vwS0ycYshofI7cWAfj7Vg5asqj+pt+Q6x4n+AONSZW/kVm+5nklde0qs2EUwU2g==} cpu: [riscv64] @@ -1681,11 +1514,6 @@ packages: cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.29.1': - resolution: {integrity: sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ==} - cpu: [riscv64] - os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.28.0': resolution: {integrity: sha512-LQlP5t2hcDJh8HV8RELD9/xlYtEzJkm/aWGsauvdO2ulfl3QYRjqrKW+mGAIWP5kdNCBheqqqYIGElSRCaXfpw==} cpu: [s390x] @@ -1696,11 +1524,6 @@ packages: cpu: [s390x] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.29.1': - resolution: {integrity: sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g==} - cpu: [s390x] - os: [linux] - '@rollup/rollup-linux-x64-gnu@4.28.0': resolution: {integrity: sha512-Nl4KIzteVEKE9BdAvYoTkW19pa7LR/RBrT6F1dJCV/3pbjwDcaOq+edkP0LXuJ9kflW/xOK414X78r+K84+msw==} cpu: [x64] @@ -1711,11 +1534,6 @@ packages: cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.29.1': - resolution: {integrity: sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==} - cpu: [x64] - os: [linux] - '@rollup/rollup-linux-x64-musl@4.28.0': resolution: {integrity: sha512-eKpJr4vBDOi4goT75MvW+0dXcNUqisK4jvibY9vDdlgLx+yekxSm55StsHbxUsRxSTt3JEQvlr3cGDkzcSP8bw==} cpu: [x64] @@ -1726,11 +1544,6 @@ packages: cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.29.1': - resolution: {integrity: sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==} - cpu: [x64] - os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.28.0': resolution: {integrity: sha512-Vi+WR62xWGsE/Oj+mD0FNAPY2MEox3cfyG0zLpotZdehPFXwz6lypkGs5y38Jd/NVSbOD02aVad6q6QYF7i8Bg==} cpu: [arm64] @@ -1741,11 +1554,6 @@ packages: cpu: [arm64] os: [win32] - '@rollup/rollup-win32-arm64-msvc@4.29.1': - resolution: {integrity: sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig==} - cpu: [arm64] - os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.28.0': resolution: {integrity: sha512-kN/Vpip8emMLn/eOza+4JwqDZBL6MPNpkdaEsgUtW1NYN3DZvZqSQrbKzJcTL6hd8YNmFTn7XGWMwccOcJBL0A==} cpu: [ia32] @@ -1756,11 +1564,6 @@ packages: cpu: [ia32] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.29.1': - resolution: {integrity: sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng==} - cpu: [ia32] - os: [win32] - '@rollup/rollup-win32-x64-msvc@4.28.0': resolution: {integrity: sha512-Bvno2/aZT6usSa7lRDL2+hMjVAGjuqaymF1ApZm31JXzniR/hvr14jpU+/z4X6Gt5BPlzosscyJZGUvguXIqeQ==} cpu: [x64] @@ -1771,11 +1574,6 @@ packages: cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.29.1': - resolution: {integrity: sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg==} - cpu: [x64] - os: [win32] - '@shikijs/core@1.24.3': resolution: {integrity: sha512-VRcf4GYUIkxIchGM9DrapRcxtgojg4IWKUtX5EtW+4PJiGzF2xQqZSv27PJt+WLc18KT3CNLpNWow9JYV5n+Rg==} @@ -1826,8 +1624,8 @@ packages: peerDependencies: '@sveltejs/kit': ^2.0.0 - '@sveltejs/kit@2.13.0': - resolution: {integrity: sha512-6t6ne00vZx/TjD6s0Jvwt8wRLKBwbSAN1nhlOzcLUSTYX1hTp4eCBaTPB5Yz/lu+tYcvz4YPEEuPv3yfsNp2gw==} + '@sveltejs/kit@2.14.1': + resolution: {integrity: sha512-6dRXi4uxknLMZZfSa0TAZfUfRzWoe0NgIXRcFZPY8iP78ZBMASkZh5L7VCsgLbW1KmA3fnraxZHqEcy9Ovj/ng==} engines: {node: '>=18.13'} hasBin: true peerDependencies: @@ -1940,6 +1738,10 @@ packages: resolution: {integrity: sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==} engines: {node: '>=18'} + '@testing-library/dom@9.3.4': + resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} + engines: {node: '>=14'} + '@testing-library/react@16.1.0': resolution: {integrity: sha512-Q2ToPvg0KsVL0ohND9A3zLJWcOXXcO8IDu3fj11KhNt0UlCWyFyvnCIBkd12tidB2lkiVRG8VFqdhcqhqnAQtg==} engines: {node: '>=18'} @@ -1955,6 +1757,16 @@ packages: '@types/react-dom': optional: true + '@testing-library/vue@8.1.0': + resolution: {integrity: sha512-ls4RiHO1ta4mxqqajWRh8158uFObVrrtAPoxk7cIp4HrnQUj/ScKzqz53HxYpG3X6Zb7H2v+0eTGLSoy8HQ2nA==} + engines: {node: '>=14'} + peerDependencies: + '@vue/compiler-sfc': '>= 3' + vue: '>= 3' + peerDependenciesMeta: + '@vue/compiler-sfc': + optional: true + '@tootallnate/once@2.0.0': resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} @@ -2232,6 +2044,9 @@ packages: '@vue/shared@3.5.13': resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + '@vue/test-utils@2.4.6': + resolution: {integrity: sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==} + '@vue/tsconfig@0.5.1': resolution: {integrity: sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==} @@ -2289,6 +2104,10 @@ packages: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} deprecated: Use your platform's native atob() and btoa() methods instead + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -2374,6 +2193,9 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-query@5.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} @@ -2381,6 +2203,10 @@ packages: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} @@ -2402,6 +2228,10 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + axios@1.7.8: resolution: {integrity: sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw==} @@ -2468,10 +2298,22 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + engines: {node: '>= 0.4'} + call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} + call-me-maybe@1.0.2: resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} @@ -2633,6 +2475,9 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + consola@3.2.3: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} engines: {node: ^14.18.0 || >=16.10.0} @@ -2670,10 +2515,6 @@ packages: resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} engines: {node: '>=12.13'} - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -2749,6 +2590,10 @@ packages: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} + deep-equal@2.2.3: + resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} + engines: {node: '>= 0.4'} + deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -2757,6 +2602,10 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + degit@2.8.4: resolution: {integrity: sha512-vqYuzmSA5I50J882jd+AbAhQtgK6bdKUJIex1JNfEUPENCgYsxugzKVZlFyMwV4i06MmnV47/Iqi5Io86zf3Ng==} engines: {node: '>=8.0.0'} @@ -2820,9 +2669,18 @@ packages: resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} engines: {node: '>=10'} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -2871,13 +2729,24 @@ packages: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} + es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + es-module-lexer@1.5.4: resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + es6-promise@3.3.1: resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} @@ -2891,11 +2760,6 @@ packages: engines: {node: '>=18'} hasBin: true - esbuild@0.24.2: - resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} - engines: {node: '>=18'} - hasBin: true - escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -3027,6 +2891,9 @@ packages: debug: optional: true + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + foreground-child@3.3.0: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} @@ -3074,6 +2941,9 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -3090,6 +2960,10 @@ packages: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} + get-intrinsic@1.2.6: + resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} + engines: {node: '>= 0.4'} + get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} @@ -3128,6 +3002,10 @@ packages: resolution: {integrity: sha512-FQoVQnqcdk4hVM4JN1eromaun4iuS34oStkdlLENLdpULsuQcTyXj8w7ayhuUfPwEYZ1ZOooOTT6fdA9Vmx/RA==} engines: {node: '>= 0.4'} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -3144,6 +3022,10 @@ packages: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -3159,6 +3041,14 @@ packages: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -3258,24 +3148,55 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} + is-boolean-object@1.2.1: + resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + is-core-module@2.15.1: resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} engines: {node: '>= 0.4'} + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -3296,9 +3217,17 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + is-node-process@1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -3321,14 +3250,42 @@ packages: is-reference@3.0.3: resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + is-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + is-what@4.1.16: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} @@ -3337,6 +3294,9 @@ packages: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -3367,6 +3327,15 @@ packages: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} + js-beautify@1.15.1: + resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} + engines: {node: '>=14'} + hasBin: true + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + js-levenshtein@1.1.6: resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} engines: {node: '>=0.10.0'} @@ -3536,6 +3505,10 @@ packages: engines: {node: '>= 16'} hasBin: true + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + mdast-util-find-and-replace@3.0.1: resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} @@ -3698,6 +3671,10 @@ packages: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} + minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -3823,6 +3800,11 @@ packages: node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + normalize-package-data@3.0.3: resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} engines: {node: '>=10'} @@ -3846,6 +3828,18 @@ packages: resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} engines: {node: '>= 0.4'} + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -3920,8 +3914,8 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - package-manager-detector@0.2.8: - resolution: {integrity: sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA==} + package-manager-detector@0.2.7: + resolution: {integrity: sha512-g4+387DXDKlZzHkP+9FLt8yKj8+/3tOkPv7DVTJGGRm00RkEWgqbFstX1mXJ4M0VDYhUqsTOiISqNOJnhAu3PQ==} parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} @@ -4028,6 +4022,10 @@ packages: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + postcss-load-config@6.0.1: resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} engines: {node: '>= 18'} @@ -4078,6 +4076,9 @@ packages: property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -4178,6 +4179,10 @@ packages: regex@5.0.2: resolution: {integrity: sha512-/pczGbKIQgfTMRV0XjABvc5RzLqQmwqxLHdQao2RTXPk+pmTXB2P0IaUHYdYyk412YLwUIkaeMd5T+RzVgTqnQ==} + regexp.prototype.flags@1.5.3: + resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} + engines: {node: '>= 0.4'} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -4224,11 +4229,6 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rollup@4.29.1: - resolution: {integrity: sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -4239,6 +4239,10 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -4279,6 +4283,10 @@ packages: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -4297,10 +4305,26 @@ packages: shiki@1.24.3: resolution: {integrity: sha512-eMeX/ehE2IDKVs71kB4zVcDHjutNcOtm+yIRuR4sA6ThBbdFI0DffGJiyoKCodj0xRGxIoWC3pk/Anmm5mzHmA==} + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -4391,6 +4415,10 @@ packages: std-env@3.8.0: resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -4986,6 +5014,9 @@ packages: vscode-uri@3.0.8: resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + vue-component-type-helpers@2.1.10: + resolution: {integrity: sha512-lfgdSLQKrUmADiSV6PbBvYgQ33KF3Ztv6gP85MfGaGaSGMTXORVaHT1EHfsqCgzRNBstPKYDmvAV9Do5CmJ07A==} + vue-demi@0.14.10: resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} engines: {node: '>=12'} @@ -5059,6 +5090,18 @@ packages: whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + engines: {node: '>= 0.4'} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -5320,7 +5363,7 @@ snapshots: '@babel/traverse': 7.26.4 '@babel/types': 7.26.3 convert-source-map: 2.0.0 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -5411,7 +5454,7 @@ snapshots: '@babel/parser': 7.26.3 '@babel/template': 7.25.9 '@babel/types': 7.26.3 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -5541,7 +5584,7 @@ snapshots: fs-extra: 7.0.1 mri: 1.2.0 p-limit: 2.3.0 - package-manager-detector: 0.2.8 + package-manager-detector: 0.2.7 picocolors: 1.1.1 resolve-from: 5.0.0 semver: 7.6.3 @@ -5678,142 +5721,94 @@ snapshots: '@esbuild/aix-ppc64@0.24.0': optional: true - '@esbuild/aix-ppc64@0.24.2': - optional: true - '@esbuild/android-arm64@0.21.5': optional: true '@esbuild/android-arm64@0.24.0': optional: true - '@esbuild/android-arm64@0.24.2': - optional: true - '@esbuild/android-arm@0.21.5': optional: true '@esbuild/android-arm@0.24.0': optional: true - '@esbuild/android-arm@0.24.2': - optional: true - '@esbuild/android-x64@0.21.5': optional: true '@esbuild/android-x64@0.24.0': optional: true - '@esbuild/android-x64@0.24.2': - optional: true - '@esbuild/darwin-arm64@0.21.5': optional: true '@esbuild/darwin-arm64@0.24.0': optional: true - '@esbuild/darwin-arm64@0.24.2': - optional: true - '@esbuild/darwin-x64@0.21.5': optional: true '@esbuild/darwin-x64@0.24.0': optional: true - '@esbuild/darwin-x64@0.24.2': - optional: true - '@esbuild/freebsd-arm64@0.21.5': optional: true '@esbuild/freebsd-arm64@0.24.0': optional: true - '@esbuild/freebsd-arm64@0.24.2': - optional: true - '@esbuild/freebsd-x64@0.21.5': optional: true '@esbuild/freebsd-x64@0.24.0': optional: true - '@esbuild/freebsd-x64@0.24.2': - optional: true - '@esbuild/linux-arm64@0.21.5': optional: true '@esbuild/linux-arm64@0.24.0': optional: true - '@esbuild/linux-arm64@0.24.2': - optional: true - '@esbuild/linux-arm@0.21.5': optional: true '@esbuild/linux-arm@0.24.0': optional: true - '@esbuild/linux-arm@0.24.2': - optional: true - '@esbuild/linux-ia32@0.21.5': optional: true '@esbuild/linux-ia32@0.24.0': optional: true - '@esbuild/linux-ia32@0.24.2': - optional: true - '@esbuild/linux-loong64@0.21.5': optional: true '@esbuild/linux-loong64@0.24.0': optional: true - '@esbuild/linux-loong64@0.24.2': - optional: true - '@esbuild/linux-mips64el@0.21.5': optional: true '@esbuild/linux-mips64el@0.24.0': optional: true - '@esbuild/linux-mips64el@0.24.2': - optional: true - '@esbuild/linux-ppc64@0.21.5': optional: true '@esbuild/linux-ppc64@0.24.0': optional: true - '@esbuild/linux-ppc64@0.24.2': - optional: true - '@esbuild/linux-riscv64@0.21.5': optional: true '@esbuild/linux-riscv64@0.24.0': optional: true - '@esbuild/linux-riscv64@0.24.2': - optional: true - '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-s390x@0.24.0': - optional: true - - '@esbuild/linux-s390x@0.24.2': + '@esbuild/linux-s390x@0.24.0': optional: true '@esbuild/linux-x64@0.21.5': @@ -5822,72 +5817,45 @@ snapshots: '@esbuild/linux-x64@0.24.0': optional: true - '@esbuild/linux-x64@0.24.2': - optional: true - - '@esbuild/netbsd-arm64@0.24.2': - optional: true - '@esbuild/netbsd-x64@0.21.5': optional: true '@esbuild/netbsd-x64@0.24.0': optional: true - '@esbuild/netbsd-x64@0.24.2': - optional: true - '@esbuild/openbsd-arm64@0.24.0': optional: true - '@esbuild/openbsd-arm64@0.24.2': - optional: true - '@esbuild/openbsd-x64@0.21.5': optional: true '@esbuild/openbsd-x64@0.24.0': optional: true - '@esbuild/openbsd-x64@0.24.2': - optional: true - '@esbuild/sunos-x64@0.21.5': optional: true '@esbuild/sunos-x64@0.24.0': optional: true - '@esbuild/sunos-x64@0.24.2': - optional: true - '@esbuild/win32-arm64@0.21.5': optional: true '@esbuild/win32-arm64@0.24.0': optional: true - '@esbuild/win32-arm64@0.24.2': - optional: true - '@esbuild/win32-ia32@0.21.5': optional: true '@esbuild/win32-ia32@0.24.0': optional: true - '@esbuild/win32-ia32@0.24.2': - optional: true - '@esbuild/win32-x64@0.21.5': optional: true '@esbuild/win32-x64@0.24.0': optional: true - '@esbuild/win32-x64@0.24.2': - optional: true - '@floating-ui/core@1.6.8': dependencies: '@floating-ui/utils': 0.2.8 @@ -6131,6 +6099,8 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + '@one-ini/wasm@0.1.1': {} + '@open-draft/deferred-promise@2.2.0': {} '@open-draft/logger@0.3.0': @@ -6140,6 +6110,8 @@ snapshots: '@open-draft/until@2.1.0': {} + '@pinia/colada@0.13.0': {} + '@pkgjs/parseargs@0.11.0': optional: true @@ -6175,13 +6147,13 @@ snapshots: - encoding - supports-color - '@rollup/pluginutils@5.1.3(rollup@4.29.1)': + '@rollup/pluginutils@5.1.3(rollup@4.28.1)': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.29.1 + rollup: 4.28.1 '@rollup/rollup-android-arm-eabi@4.28.0': optional: true @@ -6189,168 +6161,111 @@ snapshots: '@rollup/rollup-android-arm-eabi@4.28.1': optional: true - '@rollup/rollup-android-arm-eabi@4.29.1': - optional: true - '@rollup/rollup-android-arm64@4.28.0': optional: true '@rollup/rollup-android-arm64@4.28.1': optional: true - '@rollup/rollup-android-arm64@4.29.1': - optional: true - '@rollup/rollup-darwin-arm64@4.28.0': optional: true '@rollup/rollup-darwin-arm64@4.28.1': optional: true - '@rollup/rollup-darwin-arm64@4.29.1': - optional: true - '@rollup/rollup-darwin-x64@4.28.0': optional: true '@rollup/rollup-darwin-x64@4.28.1': optional: true - '@rollup/rollup-darwin-x64@4.29.1': - optional: true - '@rollup/rollup-freebsd-arm64@4.28.0': optional: true '@rollup/rollup-freebsd-arm64@4.28.1': optional: true - '@rollup/rollup-freebsd-arm64@4.29.1': - optional: true - '@rollup/rollup-freebsd-x64@4.28.0': optional: true '@rollup/rollup-freebsd-x64@4.28.1': optional: true - '@rollup/rollup-freebsd-x64@4.29.1': - optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.28.0': optional: true '@rollup/rollup-linux-arm-gnueabihf@4.28.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.29.1': - optional: true - '@rollup/rollup-linux-arm-musleabihf@4.28.0': optional: true '@rollup/rollup-linux-arm-musleabihf@4.28.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.29.1': - optional: true - '@rollup/rollup-linux-arm64-gnu@4.28.0': optional: true '@rollup/rollup-linux-arm64-gnu@4.28.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.29.1': - optional: true - '@rollup/rollup-linux-arm64-musl@4.28.0': optional: true '@rollup/rollup-linux-arm64-musl@4.28.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.29.1': - optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.28.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.29.1': - optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.28.0': optional: true '@rollup/rollup-linux-powerpc64le-gnu@4.28.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.29.1': - optional: true - '@rollup/rollup-linux-riscv64-gnu@4.28.0': optional: true '@rollup/rollup-linux-riscv64-gnu@4.28.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.29.1': - optional: true - '@rollup/rollup-linux-s390x-gnu@4.28.0': optional: true '@rollup/rollup-linux-s390x-gnu@4.28.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.29.1': - optional: true - '@rollup/rollup-linux-x64-gnu@4.28.0': optional: true '@rollup/rollup-linux-x64-gnu@4.28.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.29.1': - optional: true - '@rollup/rollup-linux-x64-musl@4.28.0': optional: true '@rollup/rollup-linux-x64-musl@4.28.1': optional: true - '@rollup/rollup-linux-x64-musl@4.29.1': - optional: true - '@rollup/rollup-win32-arm64-msvc@4.28.0': optional: true '@rollup/rollup-win32-arm64-msvc@4.28.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.29.1': - optional: true - '@rollup/rollup-win32-ia32-msvc@4.28.0': optional: true '@rollup/rollup-win32-ia32-msvc@4.28.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.29.1': - optional: true - '@rollup/rollup-win32-x64-msvc@4.28.0': optional: true '@rollup/rollup-win32-x64-msvc@4.28.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.29.1': - optional: true - '@shikijs/core@1.24.3': dependencies: '@shikijs/engine-javascript': 1.24.3 @@ -6411,7 +6326,7 @@ snapshots: '@size-limit/esbuild@11.1.6(size-limit@11.1.6)': dependencies: - esbuild: 0.24.2 + esbuild: 0.24.0 nanoid: 5.0.9 size-limit: 11.1.6 @@ -6425,12 +6340,12 @@ snapshots: '@size-limit/file': 11.1.6(size-limit@11.1.6) size-limit: 11.1.6 - '@sveltejs/adapter-auto@3.3.1(@sveltejs/kit@2.13.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.15.0)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1)))(svelte@5.15.0)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1)))': + '@sveltejs/adapter-auto@3.3.1(@sveltejs/kit@2.14.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.15.0)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1)))(svelte@5.15.0)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1)))': dependencies: - '@sveltejs/kit': 2.13.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.15.0)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1)))(svelte@5.15.0)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1)) + '@sveltejs/kit': 2.14.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.15.0)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1)))(svelte@5.15.0)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1)) import-meta-resolve: 4.1.0 - '@sveltejs/kit@2.13.0(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.15.0)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1)))(svelte@5.15.0)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1))': + '@sveltejs/kit@2.14.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.15.0)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1)))(svelte@5.15.0)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1))': dependencies: '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.15.0)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1)) '@types/cookie': 0.6.0 @@ -6451,7 +6366,7 @@ snapshots: '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.15.0)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1)))(svelte@5.15.0)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1))': dependencies: '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.15.0)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1)) - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0 svelte: 5.15.0 vite: 6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1) transitivePeerDependencies: @@ -6460,7 +6375,7 @@ snapshots: '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.15.0)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1))': dependencies: '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.15.0)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1)))(svelte@5.15.0)(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1)) - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 @@ -6545,6 +6460,17 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 + '@testing-library/dom@9.3.4': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/runtime': 7.26.0 + '@types/aria-query': 5.0.4 + aria-query: 5.1.3 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + '@testing-library/react@16.1.0(@testing-library/dom@10.1.0)(@types/react-dom@18.3.1)(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.26.0 @@ -6555,6 +6481,15 @@ snapshots: '@types/react': 18.3.1 '@types/react-dom': 18.3.1 + '@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.13)(vue@3.5.13(typescript@5.7.2))': + dependencies: + '@babel/runtime': 7.26.0 + '@testing-library/dom': 9.3.4 + '@vue/test-utils': 2.4.6 + vue: 3.5.13(typescript@5.7.2) + optionalDependencies: + '@vue/compiler-sfc': 3.5.13 + '@tootallnate/once@2.0.0': optional: true @@ -6668,7 +6603,7 @@ snapshots: '@typescript/vfs@1.6.0(typescript@5.7.2)': dependencies: - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0 typescript: 5.7.2 transitivePeerDependencies: - supports-color @@ -6703,11 +6638,16 @@ snapshots: vite: 6.0.4(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1) vue: 3.5.12(typescript@5.7.2) + '@vitejs/plugin-vue@5.2.1(vite@6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1))(vue@3.5.13(typescript@5.7.2))': + dependencies: + vite: 6.0.5(@types/node@22.10.2)(jiti@2.4.2)(yaml@2.5.1) + vue: 3.5.13(typescript@5.7.2) + '@vitest/coverage-v8@2.1.8(vitest@2.1.8(@types/node@22.10.1)(jsdom@20.0.3)(msw@2.7.0(@types/node@22.10.1)(typescript@5.7.2)))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 @@ -6888,9 +6828,9 @@ snapshots: '@vue/language-core@2.1.6(typescript@5.7.2)': dependencies: '@volar/language-core': 2.4.7 - '@vue/compiler-dom': 3.5.12 + '@vue/compiler-dom': 3.5.13 '@vue/compiler-vue2': 2.7.16 - '@vue/shared': 3.5.12 + '@vue/shared': 3.5.13 computeds: 0.0.1 minimatch: 9.0.5 muggle-string: 0.4.1 @@ -6946,6 +6886,11 @@ snapshots: '@vue/shared@3.5.13': {} + '@vue/test-utils@2.4.6': + dependencies: + js-beautify: 1.15.1 + vue-component-type-helpers: 2.1.10 + '@vue/tsconfig@0.5.1': {} '@vueuse/core@11.3.0(vue@3.5.13(typescript@5.7.2))': @@ -6983,6 +6928,8 @@ snapshots: abab@2.0.6: optional: true + abbrev@2.0.0: {} + accepts@1.3.8: dependencies: mime-types: 2.1.35 @@ -7007,14 +6954,14 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0 transitivePeerDependencies: - supports-color optional: true agent-base@7.1.1(supports-color@9.4.0): dependencies: - debug: 4.4.0(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) transitivePeerDependencies: - supports-color @@ -7076,12 +7023,21 @@ snapshots: argparse@2.0.1: {} + aria-query@5.1.3: + dependencies: + deep-equal: 2.2.3 + aria-query@5.3.0: dependencies: dequal: 2.0.3 aria-query@5.3.2: {} + array-buffer-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.5 + array-flatten@1.1.1: {} array-union@2.1.0: {} @@ -7094,6 +7050,10 @@ snapshots: asynckit@0.4.0: {} + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + axios@1.7.8: dependencies: follow-redirects: 1.15.9 @@ -7168,6 +7128,11 @@ snapshots: cac@6.7.14: {} + call-bind-apply-helpers@1.0.1: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 @@ -7176,6 +7141,18 @@ snapshots: get-intrinsic: 1.2.4 set-function-length: 1.2.2 + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.0 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.6 + call-me-maybe@1.0.2: {} camelcase-keys@7.0.2: @@ -7332,6 +7309,11 @@ snapshots: concat-map@0.0.1: {} + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + consola@3.2.3: {} content-disposition@0.5.4: @@ -7356,12 +7338,6 @@ snapshots: dependencies: is-what: 4.1.16 - cross-spawn@7.0.3: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -7402,11 +7378,9 @@ snapshots: optionalDependencies: supports-color: 9.4.0 - debug@4.4.0(supports-color@9.4.0): + debug@4.4.0: dependencies: ms: 2.1.3 - optionalDependencies: - supports-color: 9.4.0 decamelize-keys@1.1.1: dependencies: @@ -7426,6 +7400,27 @@ snapshots: deep-eql@5.0.2: {} + deep-equal@2.2.3: + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + es-get-iterator: 1.1.3 + get-intrinsic: 1.2.4 + is-arguments: 1.2.0 + is-array-buffer: 3.0.5 + is-date-object: 1.1.0 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + isarray: 2.0.5 + object-is: 1.1.6 + object-keys: 1.1.1 + object.assign: 4.1.7 + regexp.prototype.flags: 1.5.3 + side-channel: 1.0.6 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.18 + deepmerge@4.3.1: {} define-data-property@1.1.4: @@ -7434,6 +7429,12 @@ snapshots: es-errors: 1.3.0 gopd: 1.1.0 + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + degit@2.8.4: {} del-cli@5.1.0: @@ -7489,8 +7490,21 @@ snapshots: dotenv@8.6.0: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + eastasianwidth@0.2.0: {} + editorconfig@1.0.4: + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.6.3 + ee-first@1.1.1: {} electron-to-chromium@1.5.74: {} @@ -7526,10 +7540,28 @@ snapshots: dependencies: get-intrinsic: 1.2.4 + es-define-property@1.0.1: {} + es-errors@1.3.0: {} + es-get-iterator@1.1.3: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + is-arguments: 1.2.0 + is-map: 2.0.3 + is-set: 2.0.3 + is-string: 1.1.1 + isarray: 2.0.5 + stop-iteration-iterator: 1.1.0 + es-module-lexer@1.5.4: {} + es-object-atoms@1.0.0: + dependencies: + es-errors: 1.3.0 + es6-promise@3.3.1: {} esbuild@0.21.5: @@ -7585,34 +7617,6 @@ snapshots: '@esbuild/win32-ia32': 0.24.0 '@esbuild/win32-x64': 0.24.0 - esbuild@0.24.2: - optionalDependencies: - '@esbuild/aix-ppc64': 0.24.2 - '@esbuild/android-arm': 0.24.2 - '@esbuild/android-arm64': 0.24.2 - '@esbuild/android-x64': 0.24.2 - '@esbuild/darwin-arm64': 0.24.2 - '@esbuild/darwin-x64': 0.24.2 - '@esbuild/freebsd-arm64': 0.24.2 - '@esbuild/freebsd-x64': 0.24.2 - '@esbuild/linux-arm': 0.24.2 - '@esbuild/linux-arm64': 0.24.2 - '@esbuild/linux-ia32': 0.24.2 - '@esbuild/linux-loong64': 0.24.2 - '@esbuild/linux-mips64el': 0.24.2 - '@esbuild/linux-ppc64': 0.24.2 - '@esbuild/linux-riscv64': 0.24.2 - '@esbuild/linux-s390x': 0.24.2 - '@esbuild/linux-x64': 0.24.2 - '@esbuild/netbsd-arm64': 0.24.2 - '@esbuild/netbsd-x64': 0.24.2 - '@esbuild/openbsd-arm64': 0.24.2 - '@esbuild/openbsd-x64': 0.24.2 - '@esbuild/sunos-x64': 0.24.2 - '@esbuild/win32-arm64': 0.24.2 - '@esbuild/win32-ia32': 0.24.2 - '@esbuild/win32-x64': 0.24.2 - escalade@3.2.0: {} escape-html@1.0.3: {} @@ -7654,7 +7658,7 @@ snapshots: execa@8.0.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 8.0.1 human-signals: 5.0.0 is-stream: 3.0.0 @@ -7776,6 +7780,10 @@ snapshots: follow-redirects@1.15.9: {} + for-each@0.3.3: + dependencies: + is-callable: 1.2.7 + foreground-child@3.3.0: dependencies: cross-spawn: 7.0.6 @@ -7825,6 +7833,8 @@ snapshots: function-bind@1.1.2: {} + functions-have-names@1.2.3: {} + gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} @@ -7839,6 +7849,19 @@ snapshots: has-symbols: 1.0.3 hasown: 2.0.2 + get-intrinsic@1.2.6: + dependencies: + call-bind-apply-helpers: 1.0.1 + dunder-proto: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + function-bind: 1.1.2 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + get-stream@8.0.1: {} glob-parent@5.1.2: @@ -7890,6 +7913,8 @@ snapshots: dependencies: get-intrinsic: 1.2.4 + gopd@1.2.0: {} + graceful-fs@4.2.11: {} graphql@16.10.0: {} @@ -7905,6 +7930,8 @@ snapshots: hard-rejection@2.1.0: {} + has-bigints@1.1.0: {} + has-flag@4.0.0: {} has-property-descriptors@1.0.2: @@ -7917,6 +7944,12 @@ snapshots: has-symbols@1.0.3: {} + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.0.3 + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -7974,7 +8007,7 @@ snapshots: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0 transitivePeerDependencies: - supports-color optional: true @@ -7982,7 +8015,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0 transitivePeerDependencies: - supports-color optional: true @@ -7990,7 +8023,7 @@ snapshots: https-proxy-agent@7.0.5(supports-color@9.4.0): dependencies: agent-base: 7.1.1(supports-color@9.4.0) - debug: 4.4.0(supports-color@9.4.0) + debug: 4.3.7(supports-color@9.4.0) transitivePeerDependencies: - supports-color @@ -8024,21 +8057,56 @@ snapshots: inherits@2.0.4: {} + ini@1.3.8: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + ipaddr.js@1.9.1: {} + is-arguments@1.2.0: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.6 + is-arrayish@0.2.1: {} is-arrayish@0.3.2: optional: true + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 + is-boolean-object@1.2.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + is-core-module@2.15.1: dependencies: hasown: 2.0.2 + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -8053,8 +8121,15 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-map@2.0.3: {} + is-node-process@1.2.0: {} + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + is-number@7.0.0: {} is-path-cwd@3.0.0: {} @@ -8070,16 +8145,49 @@ snapshots: dependencies: '@types/estree': 1.0.6 + is-regex@1.2.1: + dependencies: + call-bound: 1.0.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.3 + is-stream@3.0.0: {} + is-string@1.1.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.3 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-weakmap@2.0.2: {} + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.2.6 + is-what@4.1.16: {} is-windows@1.0.2: {} + isarray@2.0.5: {} + isexe@2.0.0: {} istanbul-lib-coverage@3.2.2: {} @@ -8093,7 +8201,7 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: '@jridgewell/trace-mapping': 0.3.25 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -8113,6 +8221,16 @@ snapshots: joycon@3.1.1: {} + js-beautify@1.15.1: + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.4 + glob: 10.4.5 + js-cookie: 3.0.5 + nopt: 7.2.1 + + js-cookie@3.0.5: {} + js-levenshtein@1.1.6: {} js-tokens@4.0.0: {} @@ -8299,6 +8417,8 @@ snapshots: marked@9.1.6: {} + math-intrinsics@1.1.0: {} + mdast-util-find-and-replace@3.0.1: dependencies: '@types/mdast': 4.0.4 @@ -8552,7 +8672,7 @@ snapshots: micromark@4.0.1: dependencies: '@types/debug': 4.1.12 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0 decode-named-character-reference: 1.0.2 devlop: 1.1.0 micromark-core-commonmark: 2.0.2 @@ -8600,6 +8720,10 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimatch@9.0.1: + dependencies: + brace-expansion: 2.0.1 + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 @@ -8746,6 +8870,10 @@ snapshots: node-releases@2.0.19: {} + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + normalize-package-data@3.0.3: dependencies: hosted-git-info: 4.1.0 @@ -8766,6 +8894,22 @@ snapshots: object-inspect@1.13.3: {} + object-is@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + has-symbols: 1.1.0 + object-keys: 1.1.1 + on-finished@2.4.1: dependencies: ee-first: 1.1.1 @@ -8836,7 +8980,7 @@ snapshots: package-json-from-dist@1.0.1: {} - package-manager-detector@0.2.8: {} + package-manager-detector@0.2.7: {} parse-json@5.2.0: dependencies: @@ -8915,6 +9059,8 @@ snapshots: pluralize@8.0.0: {} + possible-typed-array-names@1.0.0: {} + postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.4.49)(yaml@2.5.1): dependencies: lilconfig: 3.1.3 @@ -8955,6 +9101,8 @@ snapshots: property-information@6.5.0: {} + proto-list@1.2.4: {} + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -9055,6 +9203,13 @@ snapshots: dependencies: regex-utilities: 2.3.0 + regexp.prototype.flags@1.5.3: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -9129,31 +9284,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.28.1 fsevents: 2.3.3 - rollup@4.29.1: - dependencies: - '@types/estree': 1.0.6 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.29.1 - '@rollup/rollup-android-arm64': 4.29.1 - '@rollup/rollup-darwin-arm64': 4.29.1 - '@rollup/rollup-darwin-x64': 4.29.1 - '@rollup/rollup-freebsd-arm64': 4.29.1 - '@rollup/rollup-freebsd-x64': 4.29.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.29.1 - '@rollup/rollup-linux-arm-musleabihf': 4.29.1 - '@rollup/rollup-linux-arm64-gnu': 4.29.1 - '@rollup/rollup-linux-arm64-musl': 4.29.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.29.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.29.1 - '@rollup/rollup-linux-riscv64-gnu': 4.29.1 - '@rollup/rollup-linux-s390x-gnu': 4.29.1 - '@rollup/rollup-linux-x64-gnu': 4.29.1 - '@rollup/rollup-linux-x64-musl': 4.29.1 - '@rollup/rollup-win32-arm64-msvc': 4.29.1 - '@rollup/rollup-win32-ia32-msvc': 4.29.1 - '@rollup/rollup-win32-x64-msvc': 4.29.1 - fsevents: 2.3.3 - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -9164,6 +9294,12 @@ snapshots: safe-buffer@5.2.1: {} + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-regex: 1.2.1 + safer-buffer@2.1.2: {} sander@0.5.1: @@ -9226,6 +9362,13 @@ snapshots: gopd: 1.1.0 has-property-descriptors: 1.0.2 + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + setprototypeof@1.2.0: {} sharp@0.33.5: @@ -9270,6 +9413,26 @@ snapshots: '@shikijs/vscode-textmate': 9.3.1 '@types/hast': 3.0.4 + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.6 + object-inspect: 1.13.3 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.6 + object-inspect: 1.13.3 + side-channel-map: 1.0.1 + side-channel@1.0.6: dependencies: call-bind: 1.0.7 @@ -9277,6 +9440,14 @@ snapshots: get-intrinsic: 1.2.4 object-inspect: 1.13.3 + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} signal-exit@4.1.0: {} @@ -9366,6 +9537,11 @@ snapshots: std-env@3.8.0: {} + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + streamsearch@1.1.0: {} strict-event-emitter@0.5.1: {} @@ -9728,9 +9904,9 @@ snapshots: unpipe@1.0.0: {} - unplugin-swc@1.5.1(@swc/core@1.10.1(@swc/helpers@0.5.13))(rollup@4.29.1): + unplugin-swc@1.5.1(@swc/core@1.10.1(@swc/helpers@0.5.13))(rollup@4.28.1): dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.29.1) + '@rollup/pluginutils': 5.1.3(rollup@4.28.1) '@swc/core': 1.10.1(@swc/helpers@0.5.13) load-tsconfig: 0.2.5 unplugin: 1.16.0 @@ -9804,7 +9980,7 @@ snapshots: vite-node@2.1.8(@types/node@22.10.1): dependencies: cac: 6.7.14 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0 es-module-lexer: 1.5.4 pathe: 1.1.2 vite: 5.4.11(@types/node@22.10.1) @@ -9822,7 +9998,7 @@ snapshots: vite-node@2.1.8(@types/node@22.10.2): dependencies: cac: 6.7.14 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0 es-module-lexer: 1.5.4 pathe: 1.1.2 vite: 5.4.11(@types/node@22.10.2) @@ -9841,7 +10017,7 @@ snapshots: dependencies: esbuild: 0.21.5 postcss: 8.4.49 - rollup: 4.29.1 + rollup: 4.28.1 optionalDependencies: '@types/node': 22.10.1 fsevents: 2.3.3 @@ -9850,7 +10026,7 @@ snapshots: dependencies: esbuild: 0.21.5 postcss: 8.4.49 - rollup: 4.29.1 + rollup: 4.28.1 optionalDependencies: '@types/node': 22.10.2 fsevents: 2.3.3 @@ -9870,7 +10046,7 @@ snapshots: dependencies: esbuild: 0.24.0 postcss: 8.4.49 - rollup: 4.29.1 + rollup: 4.28.1 optionalDependencies: '@types/node': 22.10.2 fsevents: 2.3.3 @@ -9941,7 +10117,7 @@ snapshots: '@vitest/spy': 2.1.8 '@vitest/utils': 2.1.8 chai: 5.1.2 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0 expect-type: 1.1.0 magic-string: 0.30.17 pathe: 1.1.2 @@ -9977,7 +10153,7 @@ snapshots: '@vitest/spy': 2.1.8 '@vitest/utils': 2.1.8 chai: 5.1.2 - debug: 4.4.0(supports-color@9.4.0) + debug: 4.4.0 expect-type: 1.1.0 magic-string: 0.30.17 pathe: 1.1.2 @@ -10005,6 +10181,8 @@ snapshots: vscode-uri@3.0.8: {} + vue-component-type-helpers@2.1.10: {} + vue-demi@0.14.10(vue@3.5.13(typescript@5.7.2)): dependencies: vue: 3.5.13(typescript@5.7.2) @@ -10079,6 +10257,30 @@ snapshots: tr46: 1.0.1 webidl-conversions: 4.0.2 + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.1 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.18: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + for-each: 0.3.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + which@2.0.2: dependencies: isexe: 2.0.0