From e31ddefd65354fc403130984a6b657083645ea69 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Tue, 7 Jul 2026 11:24:52 +0200 Subject: [PATCH 01/22] refactor!: separate config resolution from the server creation (#10554) --- .vitepress/config.ts | 8 ---- .vitepress/scripts/cli-generator.ts | 1 - api/advanced/artifacts.md | 2 +- api/advanced/test-module.md | 2 +- api/browser/commands.md | 6 +-- api/browser/context.md | 2 +- config/api.md | 7 ++- config/browser/api.md | 28 ----------- config/browser/isolate.md | 16 ------- guide/advanced/index.md | 74 +++++++++++++++++++++++------ guide/browser/index.md | 2 +- guide/cli-generated.md | 48 ------------------- 12 files changed, 71 insertions(+), 125 deletions(-) delete mode 100644 config/browser/api.md delete mode 100644 config/browser/isolate.md diff --git a/.vitepress/config.ts b/.vitepress/config.ts index ef05a1d7..9fbf560a 100644 --- a/.vitepress/config.ts +++ b/.vitepress/config.ts @@ -618,18 +618,10 @@ export default ({ mode }: { mode: string }) => { text: 'browser.headless', link: '/config/browser/headless', }, - { - text: 'browser.isolate', - link: '/config/browser/isolate', - }, { text: 'browser.testerHtmlPath', link: '/config/browser/testerhtmlpath', }, - { - text: 'browser.api', - link: '/config/browser/api', - }, { text: 'browser.provider', link: '/config/browser/provider', diff --git a/.vitepress/scripts/cli-generator.ts b/.vitepress/scripts/cli-generator.ts index 132e1c9f..4b4dc535 100644 --- a/.vitepress/scripts/cli-generator.ts +++ b/.vitepress/scripts/cli-generator.ts @@ -39,7 +39,6 @@ const skipConfig = new Set([ 'project', 'ui', 'browser.name', - 'browser.fileParallelism', 'clearCache', 'tagsFilter', 'listTags', diff --git a/api/advanced/artifacts.md b/api/advanced/artifacts.md index e7c2faf7..89d08464 100644 --- a/api/advanced/artifacts.md +++ b/api/advanced/artifacts.md @@ -67,7 +67,7 @@ The `TestArtifactBase` interface is the base for all test artifacts. Extend this interface when creating custom test artifacts. Vitest automatically manages the `attachments` array and injects the `location` property to indicate where the artifact was created in your test code. ::: danger -When running with [`api.allowWrite`](/config/api#api-allowwrite) or [`browser.api.allowWrite`](/config/browser/api#api-allowwrite) disabled, Vitest empties the `attachments` array on every artifact before reporting it. +When running with [`api.allowWrite`](/config/api#api-allowwrite) disabled, Vitest empties the `attachments` array on every artifact before reporting it. If your custom artifact narrows the `attachments` type (e.g. to a tuple), include `| []` in the union so the type reflects what actually happens at runtime. ::: diff --git a/api/advanced/test-module.md b/api/advanced/test-module.md index 1596b564..9468ab79 100644 --- a/api/advanced/test-module.md +++ b/api/advanced/test-module.md @@ -153,7 +153,7 @@ interface ImportDuration { function logs(): ReadonlyArray ``` -Console logs recorded on top level of the module during test collection.For example: +Console logs recorded on top level of the module during test collection. For example: ```ts console.log('included') // [!code highlight] diff --git a/api/browser/commands.md b/api/browser/commands.md index af72781a..5d2067a0 100644 --- a/api/browser/commands.md +++ b/api/browser/commands.md @@ -18,7 +18,7 @@ By default, Vitest uses `utf-8` encoding but you can override it with options. ::: tip The built-in file commands follow Vite's [`server.fs`](https://vitejs.dev/config/server-options.html#server-fs-allow) restrictions for security reasons. -`writeFile` and `removeFile` also require write access through [`browser.api.allowWrite`](/config/browser/api) and [`api.allowWrite`](/config/api#api-allowwrite). +`writeFile` and `removeFile` also require write access through [`api.allowWrite`](/config/api#api-allowwrite). ::: ```ts @@ -60,7 +60,7 @@ expect(input).toHaveValue('a') ::: warning CDP session works only with `playwright` provider and only when using `chromium` browser. You can read more about it in playwright's [`CDPSession`](https://playwright.dev/docs/api/class-cdpsession) documentation. -CDP is a privileged debugging API. It is available only when browser API write and exec operations are enabled through [`browser.api.allowWrite`](/config/browser/api#api-allowwrite), [`browser.api.allowExec`](/config/browser/api#api-allowexec), [`api.allowWrite`](/config/api#api-allowwrite), and [`api.allowExec`](/config/api#api-allowexec). +CDP is a privileged debugging API. It is available only when browser API write and exec operations are enabled through [`api.allowWrite`](/config/api#api-allowwrite), and [`api.allowExec`](/config/api#api-allowexec). ::: ## Custom Commands @@ -131,7 +131,7 @@ Custom commands run in the Vitest Node process and are callable from browser tes Vitest's built-in file commands validate paths against Vite's [`server.fs`](https://vite.dev/config/server-options#server-fs-allow) restrictions and separately check whether writes are allowed. Custom commands do not automatically inherit these protections. If a custom command accepts browser-provided input and uses it to read, write, delete, execute, or expose local resources, validate that input before using it. -For file reads or fixture loading, use `isFileLoadingAllowed` from `vitest/node` or an explicit allowlist. For writes and deletes, also require an explicit mutation policy, such as [`browser.api.allowWrite`](/config/browser/api#api-allowwrite), [`api.allowWrite`](/config/api#api-allowwrite), and a command-specific allowed directory. For commands that execute code, shell commands, or project scripts, also check [`browser.api.allowExec`](/config/browser/api#api-allowexec) and [`api.allowExec`](/config/api#api-allowexec). +For file reads or fixture loading, use `isFileLoadingAllowed` from `vitest/node` or an explicit allowlist. For writes and deletes, also require an explicit mutation policy, such as [`api.allowWrite`](/config/api#api-allowwrite), and a command-specific allowed directory. For commands that execute code, shell commands, or project scripts, also check [`api.allowExec`](/config/api#api-allowexec). For example, if you create your own file-writing command instead of using Vitest's built-in `writeFile`, apply the same checks: diff --git a/api/browser/context.md b/api/browser/context.md index 97658f8a..1ba6984d 100644 --- a/api/browser/context.md +++ b/api/browser/context.md @@ -212,7 +212,7 @@ The `cdp` export returns the current Chrome DevTools Protocol session. It is mos ::: warning CDP session works only with `playwright` provider and only when using `chromium` browser. You can read more about it in playwright's [`CDPSession`](https://playwright.dev/docs/api/class-cdpsession) documentation. -CDP is a privileged debugging API. It is available only when browser API write and exec operations are enabled through [`browser.api.allowWrite`](/config/browser/api#api-allowwrite), [`browser.api.allowExec`](/config/browser/api#api-allowexec), [`api.allowWrite`](/config/api#api-allowwrite), and [`api.allowExec`](/config/api#api-allowexec). +CDP is a privileged debugging API. It is available only when browser API write and exec operations are enabled through [`api.allowWrite`](/config/api#api-allowwrite), and [`api.allowExec`](/config/api#api-allowexec). ::: ```ts diff --git a/config/api.md b/config/api.md index 821cc444..4d2fd461 100644 --- a/config/api.md +++ b/config/api.md @@ -9,7 +9,7 @@ outline: deep - **Default:** `false` - **CLI:** `--api`, `--api.port`, `--api.host`, `--api.strictPort` -Listen to port and serve API for [the UI](/guide/ui) or [browser server](/guide/browser/). When set to `true`, the default port is `51204`. +Listen to port and serve API for [the UI](/guide/ui) or [browser server](/guide/browser/). When set to `true`, the default port is `51204` or `63315` if running in Browser Mode. ## api.allowWrite 4.1.0 {#api-allowwrite} @@ -18,6 +18,8 @@ Listen to port and serve API for [the UI](/guide/ui) or [browser server](/guide/ Vitest server can save test files or snapshot files via the API. This allows anyone who can connect to the API the ability to run any arbitrary code on your machine. +In Browser Mode Vitest saves [annotation attachments](/guide/test-annotations), [artifacts](/api/advanced/artifacts) and [snapshots](/guide/snapshot) by receiving a WebSocket connection from the browser. This allows anyone who can connect to the API write any arbitrary code on your machine within the root of your project (configured by [`fs.allow`](https://vite.dev/config/server-options#server-fs-allow)). This option also gates privileged browser APIs that can write files indirectly, such as raw Chrome DevTools Protocol access through [`cdp()`](/api/browser/context#cdp). + ::: danger SECURITY ADVICE Vitest does not expose the API to the internet by default and only listens on `localhost`. However if `host` is manually exposed to the network, anyone who connects to it can run arbitrary code on your machine, unless `api.allowWrite` and `api.allowExec` are set to `false`. @@ -29,4 +31,5 @@ If the host is set to anything other than `localhost` or `127.0.0.1`, Vitest wil - **Type:** `boolean` - **Default:** `true` if not exposed to the network, `false` otherwise -Allows running any test file via the API. See the security advice in [`api.allowWrite`](#api-allowwrite). +Allows running any test file via the UI. This applies to the interactive elements (and the server code behind them) in the [UI](/guide/ui) that can run the code. This option also gates privileged browser APIs that can execute code indirectly, such as raw Chrome DevTools Protocol access through [`cdp()`](/api/browser/context#cdp). + diff --git a/config/browser/api.md b/config/browser/api.md deleted file mode 100644 index 86e85c61..00000000 --- a/config/browser/api.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: browser.api | Config -outline: deep ---- - -# browser.api - -- **Type:** `number | object` -- **Default:** `63315` -- **CLI:** `--browser.api=63315`, `--browser.api.port=1234, --browser.api.host=example.com` - -Configure options for Vite server that serves code in the browser. Does not affect [`test.api`](/config/api) option. By default, Vitest assigns port `63315` to avoid conflicts with the development server, allowing you to run both in parallel. - -## api.allowWrite 4.1.0 {#api-allowwrite} - -- **Type:** `boolean` -- **Default:** `true` if not exposed to the network, `false` otherwise - -Vitest saves [annotation attachments](/guide/test-annotations), [artifacts](/api/advanced/artifacts) and [snapshots](/guide/snapshot) by receiving a WebSocket connection from the browser. This allows anyone who can connect to the API write any arbitrary code on your machine within the root of your project (configured by [`fs.allow`](https://vite.dev/config/server-options#server-fs-allow)). This option also gates privileged browser APIs that can write files indirectly, such as raw Chrome DevTools Protocol access through [`cdp()`](/api/browser/context#cdp). - -If browser server is not exposed to the internet (the host is `localhost`), this should not be a problem, so the default value in that case is `true`. If you override the host, Vitest will set `allowWrite` to `false` by default to prevent potentially harmful writes. - -## api.allowExec 4.1.0 {#api-allowexec} - -- **Type:** `boolean` -- **Default:** `true` if not exposed to the network, `false` otherwise - -Allows running any test file via the UI. This applies to the interactive elements (and the server code behind them) in the [UI](/guide/ui) that can run the code. This option also gates privileged browser APIs that can execute code indirectly, such as raw Chrome DevTools Protocol access through [`cdp()`](/api/browser/context#cdp). See [`api.allowExec`](/config/api#api-allowexec) for more information. diff --git a/config/browser/isolate.md b/config/browser/isolate.md deleted file mode 100644 index 5e610cdf..00000000 --- a/config/browser/isolate.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: browser.isolate | Config -outline: deep ---- - -# browser.isolate - -- **Type:** `boolean` -- **Default:** the same as [`--isolate`](/config/isolate) -- **CLI:** `--browser.isolate`, `--browser.isolate=false` - -Run every test in a separate iframe. - -::: danger DEPRECATED -This option is deprecated. Use [`isolate`](/config/isolate) instead. -::: diff --git a/guide/advanced/index.md b/guide/advanced/index.md index f796eb5e..affae6a0 100644 --- a/guide/advanced/index.md +++ b/guide/advanced/index.md @@ -85,19 +85,18 @@ The ["Running Tests"](/guide/advanced/tests#createvitest) guide has a usage exam function resolveConfig( options: UserConfig = {}, viteOverrides: ViteUserConfig = {}, -): Promise<{ - vitestConfig: ResolvedConfig - viteConfig: ResolvedViteConfig -}> + harness?: PluginHarness, +): Promise ``` -This method resolves the config with custom parameters. If no parameters are given, the `root` will be `process.cwd()`. +This method resolves the config with custom parameters, without creating a Vite server. If no parameters are given, the `root` will be `process.cwd()`. + +It returns the resolved Vite config. The fully resolved Vitest config, including every project, lives on its `test` property. ```ts import { resolveConfig } from 'vitest/node' -// vitestConfig only has resolved "test" properties -const { vitestConfig, viteConfig } = await resolveConfig({ +const viteConfig = await resolveConfig({ mode: 'custom', configFile: false, resolve: { @@ -108,18 +107,14 @@ const { vitestConfig, viteConfig } = await resolveConfig({ pool: 'threads', }, }) + +viteConfig.test.pool // 'threads' ``` ::: info -Due to how Vite's `createServer` works, Vitest has to resolve the config during the plugin's `configResolve` hook. Therefore, this method is not actually used internally and is exposed exclusively as a public API. - -If you pass down the config to the `startVitest` or `createVitest` APIs, Vitest will still resolve the config again. -::: +This is the same method Vitest uses internally to resolve the config before creating the server. If you pass the options down to `startVitest` or `createVitest`, Vitest resolves them again. -::: warning -The `resolveConfig` doesn't resolve `projects`. To resolve projects configs, Vitest needs an established Vite server. - -Also note that `viteConfig.test` will not be fully resolved. If you need Vitest config, use `vitestConfig` instead. +You can pass a shared [`PluginHarness`](#pluginharness) as the third argument to reuse a logger and package installer across calls. ::: ## parseCLI @@ -147,3 +142,52 @@ result.options result.filter // ['./files.ts'] ``` + +## createCLI + +```ts +function createCLI(options?: CliParseOptions): CAC +``` + +Creates the Vitest command-line interface: a [`cac`](https://github.com/cacjs/cac) instance with all of Vitest's commands and options registered. [`parseCLI`](#parsecli) is built on top of it; use `createCLI` directly if you need the raw parser. + +```ts +import { createCLI } from 'vitest/node' + +const cli = createCLI() +``` + +## PluginHarness + +```ts +class PluginHarness { + vitest?: Vitest + version: string + logger: Logger + packageInstaller: VitestPackageInstaller + getVitest(): Vitest +} +``` + +A container that Vitest passes to its internal plugins while the config is being resolved, before a [`Vitest`](/api/advanced/vitest) instance exists. It holds the [`Logger`](#logger), the package installer and the resolved version, and exposes the `Vitest` instance via `getVitest()` once it has been created (calling it earlier throws). + +This is an advanced, plugin-facing API. You rarely construct one directly, but you can pass a shared instance to [`resolveConfig`](#resolveconfig) to reuse a logger and package installer. + +## Logger + +```ts +class Logger { + constructor( + outputStream?: Writable, + errorStream?: Writable, + ) +} +``` + +Vitest's terminal logger, exposed as [`vitest.logger`](/api/advanced/vitest). It handles formatted output, the error summary, the run banner and screen clearing. Construct one with custom `stdout`/`stderr` streams to capture or redirect Vitest's output when running it programmatically. + +```ts +import { Logger } from 'vitest/node' + +const logger = new Logger(process.stdout, process.stderr) +``` diff --git a/guide/browser/index.md b/guide/browser/index.md index a1073ad4..781c95ff 100644 --- a/guide/browser/index.md +++ b/guide/browser/index.md @@ -118,7 +118,7 @@ export default defineConfig({ ``` ::: info -Vitest assigns port `63315` to avoid conflicts with the development server, allowing you to run both in parallel. You can change that with the [`browser.api`](/config/browser/api) option. +Vitest assigns port `63315` to avoid conflicts with the development server, allowing you to run both in parallel. You can change that with the [`api`](/config/api) option. ::: If you have not used Vite before, make sure you have your framework's plugin installed and specified in the config. Some frameworks might require extra configuration to work - check their Vite related documentation to be sure. diff --git a/guide/cli-generated.md b/guide/cli-generated.md index ced256a0..f602bf0a 100644 --- a/guide/cli-generated.md +++ b/guide/cli-generated.md @@ -353,48 +353,6 @@ Run all tests in a specific browser. Some browsers are only available for specif Run the browser in headless mode (i.e. without opening the GUI (Graphical User Interface)). If you are running Vitest in CI, it will be enabled by default (default: `process.env.CI`) -### browser.api.port - -- **CLI:** `--browser.api.port [port]` -- **Config:** [browser.api.port](/config/browser/api#api-port) - -Specify server port. Note if the port is already being used, Vite will automatically try the next available port so this may not be the actual port the server ends up listening on. If true will be set to `63315` - -### browser.api.host - -- **CLI:** `--browser.api.host [host]` -- **Config:** [browser.api.host](/config/browser/api#api-host) - -Specify which IP addresses the server should listen on. Set this to `0.0.0.0` or `true` to listen on all addresses, including LAN and public addresses - -### browser.api.strictPort - -- **CLI:** `--browser.api.strictPort` -- **Config:** [browser.api.strictPort](/config/browser/api#api-strictport) - -Set to true to exit if port is already in use, instead of automatically trying the next available port - -### browser.api.allowExec - -- **CLI:** `--browser.api.allowExec` -- **Config:** [browser.api.allowExec](/config/browser/api#api-allowexec) - -Allow API to execute code. (Be careful when enabling this option in untrusted environments) - -### browser.api.allowWrite - -- **CLI:** `--browser.api.allowWrite` -- **Config:** [browser.api.allowWrite](/config/browser/api#api-allowwrite) - -Allow API to edit files. (Be careful when enabling this option in untrusted environments) - -### browser.isolate - -- **CLI:** `--browser.isolate` -- **Config:** [browser.isolate](/config/browser/isolate) - -Run every browser test file in isolation. To disable isolation, use `--browser.isolate=false` (default: `true`) - ### browser.ui - **CLI:** `--browser.ui` @@ -409,12 +367,6 @@ Show Vitest UI when running tests (default: `!process.env.CI`) Default position for the details panel in browser mode. Either `right` (horizontal split) or `bottom` (vertical split) (default: `right`) -### browser.fileParallelism - -- **CLI:** `--browser.fileParallelism` - -Should browser test files run in parallel. Use `--browser.fileParallelism=false` to disable (default: `true`) - ### browser.connectTimeout - **CLI:** `--browser.connectTimeout ` From 06a3ac9bb0021ad4abda8fce63041c2fc753dafb Mon Sep 17 00:00:00 2001 From: Vladimir Date: Wed, 8 Jul 2026 09:02:04 +0200 Subject: [PATCH 02/22] feat: add toggable `injectCjsGlobals` option (#10709) --- .vitepress/config.ts | 4 ++++ config/injectcjsglobals.md | 47 ++++++++++++++++++++++++++++++++++++++ guide/cli-generated.md | 7 ++++++ 3 files changed, 58 insertions(+) create mode 100644 config/injectcjsglobals.md diff --git a/.vitepress/config.ts b/.vitepress/config.ts index 9fbf560a..fe9555e9 100644 --- a/.vitepress/config.ts +++ b/.vitepress/config.ts @@ -306,6 +306,10 @@ export default ({ mode }: { mode: string }) => { text: 'globals', link: '/config/globals', }, + { + text: 'injectCjsGlobals', + link: '/config/injectcjsglobals', + }, { text: 'environment', link: '/config/environment', diff --git a/config/injectcjsglobals.md b/config/injectcjsglobals.md new file mode 100644 index 00000000..8119828d --- /dev/null +++ b/config/injectcjsglobals.md @@ -0,0 +1,47 @@ +--- +title: injectCjsGlobals | Config +--- + +# injectCjsGlobals + +- **Type:** `boolean` +- **Default:** `true` +- **CLI:** `--no-inject-cjs-globals`, `--injectCjsGlobals=false` + +Inject CommonJS module variables (`module`, `exports`, `require`, `__filename`, `__dirname`) into every module processed by Vitest. + +By default, every file that Vitest transforms has access to these variables even if it is written using ESM syntax. This doesn't reflect how modules work in the wild: browsers do not support CommonJS variables, and Node.js doesn't expose them in ES modules. + +To make the module environment stricter and closer to the target runtime, you can disable this behaviour: + +```js +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + injectCjsGlobals: false, + }, +}) +``` + +When this option is disabled, only modules that are detected to be CommonJS receive these variables. CommonJS modules always keep them because they are part of the module scope, without them the module cannot be evaluated at all. The module type is detected the same way Node.js does it: + +1. The file extension: `.cjs` and `.cts` files are always CommonJS, `.mjs` and `.mts` files are always ES modules. +2. The `type` field in the nearest `package.json`: `"module"` means ES module, `"commonjs"` means CommonJS. Same as in Node.js, the lookup stops at the first `package.json` and never crosses a `node_modules` boundary, so dependencies don't inherit the `type` of your project. +3. The presence of ESM syntax in the file: if the file has no static `import`/`export` declarations and doesn't reference `import.meta`, it is treated as CommonJS. Syntax inside comments and strings doesn't affect the detection. Dynamic imports are allowed in CommonJS modules, so they don't count as ESM syntax; type-only TypeScript imports are erased during the transform, so they don't count either. + +The syntax detection is always enabled: Vitest doesn't respect Node.js CLI flags that modify the module type resolution, like `--no-experimental-detect-module`, `--input-type` (it only applies to the string input in Node.js), or the `--experimental-default-type` flag removed in Node.js 23. + +Referencing a CommonJS variable in an ES module throws a `ReferenceError`, just like outside of Vitest: + +``` +ReferenceError: __dirname is not defined + +"__dirname" is a CommonJS variable that is not available in ES modules, and "injectCjsGlobals" is disabled. If this module is meant to be an ES module, use "import.meta.dirname" instead of "__dirname". If it is meant to be a CommonJS module, use the ".cjs" file extension, set "type": "commonjs" in the nearest package.json, or externalize it with "server.deps.external". +``` + +::: warning +This option doesn't affect externalized modules which are always executed by the native runtime. Node.js provides CommonJS variables to externalized CommonJS modules on its own. + +Note that inlined CommonJS modules are not processed by Vite plugins even when this option is enabled: `require` calls always leave the module runner, so features like mocking do not apply to them. +::: diff --git a/guide/cli-generated.md b/guide/cli-generated.md index f602bf0a..87d5dcf8 100644 --- a/guide/cli-generated.md +++ b/guide/cli-generated.md @@ -327,6 +327,13 @@ Run every test file in isolation. To disable isolation, use `--no-isolate` (defa Inject apis globally +### injectCjsGlobals + +- **CLI:** `--injectCjsGlobals` +- **Config:** [injectCjsGlobals](/config/injectcjsglobals) + +Inject CommonJS variables (`module`, `exports`, `require`, `__filename`, `__dirname`) into every test module. To disable, use `--no-inject-cjs-globals` (default: `true`) + ### dom - **CLI:** `--dom` From 494f678d29bdf54a1c4f07954ee5819c0f4fe185 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Thu, 9 Jul 2026 08:21:03 +0200 Subject: [PATCH 03/22] perf: make the Node compile cache opt-in, persist worker caches on teardown (#10742) --- guide/improving-performance.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/guide/improving-performance.md b/guide/improving-performance.md index f2af48b7..1bf781cb 100644 --- a/guide/improving-performance.md +++ b/guide/improving-performance.md @@ -91,6 +91,18 @@ Duration 8.75s (transform 4.02s, setup 629ms, import 5.52s, tests 2.52s, enviro Duration 5.90s (transform 842ms, setup 543ms, import 2.35s, tests 2.94s, environment 0ms, prepare 3ms) ``` +## Node Compile Cache + +Vitest supports Node's [on-disk compile cache](https://nodejs.org/api/cli.html#node_compile_cachedir): when the `NODE_COMPILE_CACHE` environment variable points at a directory, the V8 bytecode of Vitest's own modules and of your externalized dependencies is written to disk and reused by later runs instead of being recompiled. Vitest propagates the variable to every worker, and workers persist the modules they compiled when they shut down. + +```shell +NODE_COMPILE_CACHE=node_modules/.cache/node-compile-cache vitest +``` + +The first run with an empty directory pays for serializing the compiled modules, so this is only worth enabling when the directory survives between runs: local runs, or CI pipelines that cache the directory. `NODE_DISABLE_COMPILE_CACHE=1` disables the cache entirely, taking precedence over `NODE_COMPILE_CACHE`. + +Note that Vitest automatically disables the compile cache in workers when the `v8` coverage provider is enabled — V8 serializes cached scripts without the source positions that precise coverage relies on. + ## Pool By default Vitest runs tests in `pool: 'forks'`. While `'forks'` pool is better for compatibility issues ([hanging process](/guide/common-errors.html#failed-to-terminate-worker) and [segfaults](/guide/common-errors.html#segfaults-and-native-code-errors)), it may be slightly slower than `pool: 'threads'` in larger projects. From 591f4dbd1f642eee4932d2e244f0bd55671d1ec9 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Tue, 14 Jul 2026 11:36:04 +0200 Subject: [PATCH 04/22] perf(browser): stop serving framework sourcemaps in headless runs (#10728) --- .vitepress/config.ts | 4 ++++ config/browser/dependencysourcemaps.md | 21 +++++++++++++++++++++ guide/cli-generated.md | 7 +++++++ 3 files changed, 32 insertions(+) create mode 100644 config/browser/dependencysourcemaps.md diff --git a/.vitepress/config.ts b/.vitepress/config.ts index fe9555e9..ba4fe58b 100644 --- a/.vitepress/config.ts +++ b/.vitepress/config.ts @@ -654,6 +654,10 @@ export default ({ mode }: { mode: string }) => { text: 'browser.screenshotFailures', link: '/config/browser/screenshotfailures', }, + { + text: 'browser.dependencySourcemaps', + link: '/config/browser/dependencysourcemaps', + }, { text: 'browser.orchestratorScripts', link: '/config/browser/orchestratorscripts', diff --git a/config/browser/dependencysourcemaps.md b/config/browser/dependencysourcemaps.md new file mode 100644 index 00000000..e8deec98 --- /dev/null +++ b/config/browser/dependencysourcemaps.md @@ -0,0 +1,21 @@ +--- +title: browser.dependencySourcemaps | Config +outline: deep +--- + +# browser.dependencySourcemaps + +- **Type:** `boolean` +- **Default:** `true` + +Serve sourcemaps of your dependencies (files in `node_modules`) to the browser during headless test runs. + +These sourcemaps are used by browser devtools: with `dependencySourcemaps: false`, pausing inside dependency code shows the compiled code the browser actually runs instead of the dependency's original sources. If you don't debug into your dependencies this way, disabling them makes test runs faster: the server doesn't generate and inline the maps, and every browser tab downloads several times fewer bytes. + +Reported test errors are not affected: when an error is thrown inside a pre-bundled dependency, Vitest maps its stack frames using the sourcemaps stored on disk even when this option is disabled. Frames from dependencies that are served without pre-bundling (for example, [linked packages](https://vite.dev/guide/dep-pre-bundling#monorepos-and-linked-dependencies)) that don't ship their own sourcemaps fall back to the position in the served code, which usually matches the original file. + +Vitest never serves sourcemaps of its own pre-built modules in headless runs (unless [`--inspect`](/guide/cli#inspect) is used) — their frames are hidden from stack traces anyway. Sourcemaps of your own source files are always served. + +::: tip +If some of your workspace code resolves to a `node_modules` path (for example, with `resolve.preserveSymlinks`), set [`server.sourcemapIgnoreList`](https://vite.dev/config/server-options#server-sourcemapignorelist) to keep its sourcemaps even when this option is disabled. +::: diff --git a/guide/cli-generated.md b/guide/cli-generated.md index 87d5dcf8..803618b9 100644 --- a/guide/cli-generated.md +++ b/guide/cli-generated.md @@ -381,6 +381,13 @@ Default position for the details panel in browser mode. Either `right` (horizont If connection to the browser takes longer, the test suite will fail (default: `60_000`) +### browser.dependencySourcemaps + +- **CLI:** `--browser.dependencySourcemaps` +- **Config:** [browser.dependencySourcemaps](/config/browser/dependencysourcemaps) + +Serve sourcemaps of dependencies to the browser in headless runs, used by devtools when debugging into `node_modules`. Reported test errors are source-mapped either way. Use `--browser.dependencySourcemaps=false` to speed up test runs if you don't step into dependency code (default: `true`) + ### browser.trackUnhandledErrors - **CLI:** `--browser.trackUnhandledErrors` From 813b6beb4c23f62d06b6015d69c2f5c7f4fc0993 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Tue, 14 Jul 2026 15:13:21 +0200 Subject: [PATCH 05/22] docs: add latitude to sponsors (#10771) --- .vitepress/sponsors.ts | 6 +++++- public/latitude.png | Bin 0 -> 20947 bytes 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 public/latitude.png diff --git a/.vitepress/sponsors.ts b/.vitepress/sponsors.ts index 6bee0075..e9d8db0b 100644 --- a/.vitepress/sponsors.ts +++ b/.vitepress/sponsors.ts @@ -26,12 +26,16 @@ export const sponsors: SponsorTier[] = [ tier: 'Platinum Sponsors', size: 'big', items: [ - { name: 'Bolt', url: 'https://bolt.new', img: '/bolt.svg', }, + { + name: 'Latitude', + url: 'https://latitude.so/', + img: '/latitude.png', + }, ], }, { diff --git a/public/latitude.png b/public/latitude.png new file mode 100644 index 0000000000000000000000000000000000000000..1b7887194de9ac82a2142d1dc856878b771f8184 GIT binary patch literal 20947 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 literal 0 HcmV?d00001 From 614cdaa497b46250121b6aa38f9ffe7ff5724e04 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Mon, 20 Jul 2026 09:04:04 +0100 Subject: [PATCH 06/22] feat: promote fsModuleCache to a top-level option (#10734) --- .vitepress/config.ts | 8 +++ api/advanced/plugin.md | 10 ++-- api/advanced/vitest.md | 2 +- config/experimental.md | 100 --------------------------------- config/fsmodulecache.md | 88 +++++++++++++++++++++++++++++ config/fsmodulecachepath.md | 27 +++++++++ guide/cli-generated.md | 23 +++++--- guide/improving-performance.md | 2 +- guide/ui.md | 2 +- 9 files changed, 146 insertions(+), 116 deletions(-) create mode 100644 config/fsmodulecache.md create mode 100644 config/fsmodulecachepath.md diff --git a/.vitepress/config.ts b/.vitepress/config.ts index ba4fe58b..2da0bd0e 100644 --- a/.vitepress/config.ts +++ b/.vitepress/config.ts @@ -470,6 +470,14 @@ export default ({ mode }: { mode: string }) => { text: 'cache', link: '/config/cache', }, + { + text: 'fsModuleCache', + link: '/config/fsmodulecache', + }, + { + text: 'fsModuleCachePath', + link: '/config/fsmodulecachepath', + }, { text: 'sequence', link: '/config/sequence', diff --git a/api/advanced/plugin.md b/api/advanced/plugin.md index 296042fe..dbdc1111 100644 --- a/api/advanced/plugin.md +++ b/api/advanced/plugin.md @@ -124,7 +124,7 @@ The project's `configFile` can be accessed in Vite's config: `project.vite.confi Note that this will also inherit the `name` - Vitest doesn't allow multiple projects with the same name, so this will throw an error. Make sure you specified a different name. You can access the current name via the `project.name` property and all used names are available in the `vitest.projects` array. ::: -### experimental_defineCacheKeyGenerator 4.0.11 {#definecachekeygenerator} +### defineCacheKeyGenerator 5.0.0 {#definecachekeygenerator} ```ts interface CacheKeyIdGeneratorContext { @@ -133,7 +133,7 @@ interface CacheKeyIdGeneratorContext { sourceCode: string } -function experimental_defineCacheKeyGenerator( +function defineCacheKeyGenerator( callback: (context: CacheKeyIdGeneratorContext) => string | undefined | null | false ): void ``` @@ -142,7 +142,7 @@ Define a generator that will be applied before hashing the cache key. Use this to make sure Vitest generates correct hash. It is a good idea to define this function if your plugin can be registered with different options. -This is called only if [`experimental.fsModuleCache`](/config/experimental#experimental-fsmodulecache) is defined. +This is called only if [`fsModuleCache`](/config/fsmodulecache) is enabled. ```ts interface PluginOptions { @@ -159,8 +159,8 @@ export function plugin(options: PluginOptions) { options.replacePropertyValue ) }, - configureVitest({ experimental_defineCacheKeyGenerator }) { - experimental_defineCacheKeyGenerator(() => { + configureVitest({ defineCacheKeyGenerator }) { + defineCacheKeyGenerator(() => { // since these options affect the transform result, // return them together as a unique string return options.replacePropertyKey + options.replacePropertyValue diff --git a/api/advanced/vitest.md b/api/advanced/vitest.md index 5d2be646..d8c058f0 100644 --- a/api/advanced/vitest.md +++ b/api/advanced/vitest.md @@ -603,7 +603,7 @@ This method will [collect tests](#parsespecification) from an array of specifica function experimental_clearCache(): Promise ``` -Deletes all Vitest caches, including [`experimental.fsModuleCache`](/config/experimental#experimental-fsmodulecache). +Deletes all Vitest caches, including [`fsModuleCache`](/config/fsmodulecache). ## experimental_getSourceModuleDiagnostic 4.0.15 {#getsourcemodulediagnostic} diff --git a/config/experimental.md b/config/experimental.md index 19301268..a3a188ce 100644 --- a/config/experimental.md +++ b/config/experimental.md @@ -5,106 +5,6 @@ outline: deep # experimental -## experimental.fsModuleCache 4.0.11 {#experimental-fsmodulecache} - -::: tip FEEDBACK -Please leave feedback regarding this feature in a [GitHub Discussion](https://github.com/vitest-dev/vitest/discussions/9221). -::: - -- **Type:** `boolean` -- **Default:** `false` - -Enabling this option allows Vitest to keep cached modules on the file system, making tests run faster between reruns. - -You can delete the old cache by running [`vitest --clearCache`](/guide/cli#clearcache). - -::: warning BROWSER SUPPORT -At the moment, this option does not affect [the browser](/guide/browser/). -::: - -You can debug if your modules are cached by running vitest with a `DEBUG=vitest:cache:fs` environment variable: - -```shell -DEBUG=vitest:cache:fs vitest --experimental.fsModuleCache -``` - -### Known Issues - -Vitest creates a persistent file hash based on file content, its id, Vite's environment configuration and coverage status. Vitest tries to use as much information as it has about the configuration, but it is still incomplete. At the moment, it is not possible to track your plugin options because there is no standard interface for it. - -If you have a plugin that relies on things outside the file content or the public configuration (like reading another file or a folder), it's possible that the cache will get stale. To work around that, you can define a [cache key generator](/api/advanced/plugin#definecachekeygenerator) to specify a dynamic option or to opt out of caching for that module: - -```js [vitest.config.js] -import { defineConfig } from 'vitest/config' - -export default defineConfig({ - plugins: [ - { - name: 'vitest-cache', - configureVitest({ experimental_defineCacheKeyGenerator }) { - experimental_defineCacheKeyGenerator(({ id, sourceCode }) => { - // never cache this id - if (id.includes('do-not-cache')) { - return false - } - - // cache this file based on the value of a dynamic variable - if (sourceCode.includes('myDynamicVar')) { - return process.env.DYNAMIC_VAR_VALUE - } - }) - } - } - ], - test: { - experimental: { - fsModuleCache: true, - }, - }, -}) -``` - -If you are a plugin author, consider defining a [cache key generator](/api/advanced/plugin#definecachekeygenerator) in your plugin if it can be registered with different options that affect the transform result. - -On the other hand, if your plugin should not affect the cache key, you can opt out by setting `api.vitest.experimental.ignoreFsModuleCache` to `true`: - -```js [vitest.config.js] -import { defineConfig } from 'vitest/config' - -export default defineConfig({ - plugins: [ - { - name: 'vitest-cache', - api: { - vitest: { - experimental: { - ignoreFsModuleCache: true, - }, - }, - }, - }, - ], - test: { - experimental: { - fsModuleCache: true, - }, - }, -}) -``` - -Note that you can still define the cache key generator even if the plugin opts out of module caching. - -## experimental.fsModuleCachePath 4.0.11 {#experimental-fsmodulecachepath} - -- **Type:** `string` -- **Default:** `'node_modules/.experimental-vitest-cache'` - -Directory where the file system cache is located. - -By default, Vitest will try to find the workspace root and store the cache inside the `node_modules` folder. The root is based on your package manager's lockfile (for example, `.package-lock.json`, `.yarn-state.yml`, `.pnpm/lock.yaml` and so on). - -At the moment, Vitest ignores the [test.cache.dir](/config/cache) or [cacheDir](https://vite.dev/config/shared-options#cachedir) options completely and creates a separate folder. - ## experimental.openTelemetry 4.0.11 {#experimental-opentelemetry} ::: tip FEEDBACK diff --git a/config/fsmodulecache.md b/config/fsmodulecache.md new file mode 100644 index 00000000..21462176 --- /dev/null +++ b/config/fsmodulecache.md @@ -0,0 +1,88 @@ +--- +title: fsModuleCache | Config +outline: deep +--- + +# fsModuleCache 5.0.0 + +- **Type:** `boolean` +- **Default:** `false` +- **CLI:** `--fsModuleCache`, `--fsModuleCache=false` + +In watch mode, Vitest caches all transformed files in memory, which makes reruns fast. However, this cache is discarded once the test run finishes. Enabling this option allows Vitest to persist the transformed modules on the file system, so they can be reused across reruns and separate Vitest processes. + +A single cache directory is shared by every project in the workspace. By default it lives in `node_modules` at the workspace root (so it is naturally invalidated when dependencies are reinstalled); use [`fsModuleCachePath`](/config/fsmodulecachepath) to change its location. You can delete the cache by running [`vitest --clearCache`](/guide/cli#clearcache). + +::: warning BROWSER SUPPORT +At the moment, this option does not affect [the browser](/guide/browser/). +::: + +You can debug if your modules are cached by running vitest with a `DEBUG=vitest:cache:fs` environment variable: + +```shell +DEBUG=vitest:cache:fs vitest --fsModuleCache +``` + +::: tip +The location of the cache is a single, workspace-wide directory. See [`fsModuleCachePath`](/config/fsmodulecachepath) to move it. +::: + +## Known Issues + +Vitest creates a persistent file hash based on file content, its id, Vite's environment configuration and coverage status. Vitest tries to use as much information as it has about the configuration, but it is still incomplete. At the moment, it is not possible to track your plugin options because there is no standard interface for it. + +If you have a plugin that relies on things outside the file content or the public configuration (like reading another file or a folder), it's possible that the cache will get stale. To work around that, you can define a [cache key generator](/api/advanced/plugin#definecachekeygenerator) to specify a dynamic option or to opt out of caching for that module: + +```js [vitest.config.js] +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + plugins: [ + { + name: 'vitest-cache', + configureVitest({ defineCacheKeyGenerator }) { + defineCacheKeyGenerator(({ id, sourceCode }) => { + // never cache this id + if (id.includes('do-not-cache')) { + return false + } + + // cache this file based on the value of a dynamic variable + if (sourceCode.includes('myDynamicVar')) { + return process.env.DYNAMIC_VAR_VALUE + } + }) + } + } + ], + test: { + fsModuleCache: true, + }, +}) +``` + +If you are a plugin author, consider defining a [cache key generator](/api/advanced/plugin#definecachekeygenerator) in your plugin if it can be registered with different options that affect the transform result. + +On the other hand, if your plugin should not affect the cache key, you can opt out by setting `api.vitest.ignoreFsModuleCache` to `true`: + +```js [vitest.config.js] +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + plugins: [ + { + name: 'vitest-cache', + api: { + vitest: { + ignoreFsModuleCache: true, + }, + }, + }, + ], + test: { + fsModuleCache: true, + }, +}) +``` + +Note that you can still define the cache key generator even if the plugin opts out of module caching. diff --git a/config/fsmodulecachepath.md b/config/fsmodulecachepath.md new file mode 100644 index 00000000..420e79ba --- /dev/null +++ b/config/fsmodulecachepath.md @@ -0,0 +1,27 @@ +--- +title: fsModuleCachePath | Config +outline: deep +--- + +# fsModuleCachePath 5.0.0 + +- **Type:** `string` +- **Default:** `'node_modules/.vitest-cache'` (resolved from the workspace root) +- **CLI:** `--fsModuleCachePath=` + +Directory where the [`fsModuleCache`](/config/fsmodulecache) is stored. + +This can be set per project; projects that don't override it fall back to the root's cache directory. The lockfile metadata used to invalidate the cache is always shared across the whole workspace. + +By default Vitest stores the cache inside `node_modules` at the workspace root. The root is based on your package manager's lockfile (for example, `.package-lock.json`, `.yarn-state.yml`, `.pnpm/lock.yaml` and so on). Keeping it inside `node_modules` means the cache is naturally invalidated whenever dependencies are reinstalled. + +```ts +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + fsModuleCache: true, + fsModuleCachePath: 'node_modules/.vitest-cache', + }, +}) +``` diff --git a/guide/cli-generated.md b/guide/cli-generated.md index 803618b9..dbd0eba7 100644 --- a/guide/cli-generated.md +++ b/guide/cli-generated.md @@ -819,6 +819,20 @@ Default timeout of a teardown function in milliseconds (default: `10000`) Maximum number of concurrent tests and suites during test file execution (default: `5`) +### fsModuleCache + +- **CLI:** `--fsModuleCache` +- **Config:** [fsModuleCache](/config/fsmodulecache) + +Cache transformed modules on the file system and reuse them between reruns (default: `false`) + +### fsModuleCachePath + +- **CLI:** `--fsModuleCachePath ` +- **Config:** [fsModuleCachePath](/config/fsmodulecachepath) + +Directory where the `fsModuleCache` is stored (default: `node_modules/.vitest-cache`) + ### expect.requireAssertions - **CLI:** `--expect.requireAssertions` @@ -901,7 +915,7 @@ List all available tags instead of running tests. `--list-tags=json` will output - **CLI:** `--clearCache` -Delete all Vitest caches, including `experimental.fsModuleCache`, without running any tests. This will reduce the performance in the subsequent test run. +Delete all Vitest caches, including the `fsModuleCache`, without running any tests. This will reduce the performance in the subsequent test run. ### tagsFilter @@ -916,13 +930,6 @@ Run only tests with the specified tags. You can use logical operators `&&` (and) Should Vitest throw an error if test has a tag that is not defined in the config. (default: `true`) -### experimental.fsModuleCache - -- **CLI:** `--experimental.fsModuleCache` -- **Config:** [experimental.fsModuleCache](/config/experimental#experimental-fsmodulecache) - -Enable caching of modules on the file system between reruns. - ### experimental.importDurations.print - **CLI:** `--experimental.importDurations.print ` diff --git a/guide/improving-performance.md b/guide/improving-performance.md index 1bf781cb..58244a92 100644 --- a/guide/improving-performance.md +++ b/guide/improving-performance.md @@ -79,7 +79,7 @@ You can limit the working directory when Vitest searches for files using [`test. ## Caching Between Reruns -In watch mode, Vitest caches all transformed files in memory, which makes reruns fast. However, this cache is discarded once the test run finishes. By enabling [`experimental.fsModuleCache`](/config/experimental#experimental-fsmodulecache), Vitest persists this cache to the file system so it can be reused across reruns. +In watch mode, Vitest caches all transformed files in memory, which makes reruns fast. However, this cache is discarded once the test run finishes. By enabling [`fsModuleCache`](/config/fsmodulecache), Vitest persists this cache to the file system so it can be reused across reruns. This improvement is most noticeable when rerunning a small number of tests that depend on a large module graph. For full test suites, parallelization already mitigates the cost because other tests populate the in-memory cache while earlier tests are still running. For example, running one test file with a huge module graph (>900 modules): diff --git a/guide/ui.md b/guide/ui.md index 4643681c..6907460c 100644 --- a/guide/ui.md +++ b/guide/ui.md @@ -118,7 +118,7 @@ By left-clicking on the module node, you open the Module Info view. The module info view for an inlined module The module info view for an inlined module -This view is separated into two parts. The top part shows the full module ID and some diagnostics about the module. If [`experimental.fsModuleCache`](/config/experimental#experimental-fsmodulecache) is enabled, there will be a "cached" or "not cached" badge. On the right you can see time diagnostics: +This view is separated into two parts. The top part shows the full module ID and some diagnostics about the module. If [`fsModuleCache`](/config/fsmodulecache) is enabled, there will be a "cached" or "not cached" badge. On the right you can see time diagnostics: - Self Time: the time it took to import the module, excluding static imports. - Total Time: the time it took to import the module, including static imports. Note that this does not include `transform` time of the current module. From d3cf098f144e00dcf191a16a4ad382c32169ec2a Mon Sep 17 00:00:00 2001 From: Vladimir Date: Mon, 20 Jul 2026 09:11:29 +0100 Subject: [PATCH 07/22] docs: update latitude logo (#10802) --- public/latitude.png | Bin 20947 -> 12488 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/latitude.png b/public/latitude.png index 1b7887194de9ac82a2142d1dc856878b771f8184..3a8b2655d90cdd125ff52f9e7d6757f1676d8e65 100644 GIT binary patch literal 12488 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 From 6f468ba8e8fda2f5a6c84fcecda96a3bda97a00a Mon Sep 17 00:00:00 2001 From: Vladimir Date: Tue, 21 Jul 2026 11:38:38 +0200 Subject: [PATCH 08/22] docs: fix styling of logos (#10806) --- .vitepress/sponsors.ts | 2 +- public/kraken.svg | 4 ---- public/latitude.png | Bin 12488 -> 0 bytes public/latitude.svg | 14 ++++++++++++++ 4 files changed, 15 insertions(+), 5 deletions(-) delete mode 100644 public/latitude.png create mode 100644 public/latitude.svg diff --git a/.vitepress/sponsors.ts b/.vitepress/sponsors.ts index e9d8db0b..6a906b54 100644 --- a/.vitepress/sponsors.ts +++ b/.vitepress/sponsors.ts @@ -34,7 +34,7 @@ export const sponsors: SponsorTier[] = [ { name: 'Latitude', url: 'https://latitude.so/', - img: '/latitude.png', + img: '/latitude.svg', }, ], }, diff --git a/public/kraken.svg b/public/kraken.svg index 52ecee1f..ff77083c 100644 --- a/public/kraken.svg +++ b/public/kraken.svg @@ -14,10 +14,6 @@ fill: #bb00d4; } - .cls-6 { - fill: #fff; - } - .cls-4 { fill: #f050f8; } diff --git a/public/latitude.png b/public/latitude.png deleted file mode 100644 index 3a8b2655d90cdd125ff52f9e7d6757f1676d8e65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12488 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 + + + + + + + + + + + + + From 7eeb95cf9496e2db94894d2b7728ca97d2cbc262 Mon Sep 17 00:00:00 2001 From: Guillaume Lagrange Date: Wed, 22 Jul 2026 15:54:33 +0200 Subject: [PATCH 09/22] feat(benchmark): add pluggable benchmark provider API (#10799) Co-authored-by: Vladimir Sheremet --- .vitepress/config.ts | 4 ++ config/benchmark.md | 9 ++- guide/advanced/benchmark-provider.md | 83 ++++++++++++++++++++++++++++ guide/benchmarking.md | 12 ++-- 4 files changed, 102 insertions(+), 6 deletions(-) create mode 100644 guide/advanced/benchmark-provider.md diff --git a/.vitepress/config.ts b/.vitepress/config.ts index 2da0bd0e..3076617a 100644 --- a/.vitepress/config.ts +++ b/.vitepress/config.ts @@ -1084,6 +1084,10 @@ export default ({ mode }: { mode: string }) => { text: 'Custom Pool', link: '/guide/advanced/pool', }, + { + text: 'Benchmark Provider', + link: '/guide/advanced/benchmark-provider', + }, ], }, // Migration — one-time transitional content: cross-version diff --git a/config/benchmark.md b/config/benchmark.md index 9b63dc40..ca4fc642 100644 --- a/config/benchmark.md +++ b/config/benchmark.md @@ -46,6 +46,14 @@ When defined, Vitest will run all matched files with `import.meta.vitest` inside Include the `samples` array of per-iteration timings on every benchmark result. Disabled by default to reduce memory usage; enable when a custom reporter or API consumer needs the raw samples. +## benchmark.provider + +- **Type:** `string` +- **Default:** `undefined` (uses the built-in provider) + +The benchmark provider that executes registered benchmarks and returns their results. Set this to a module path whose default export implements `BenchmarkProvider`. Relative paths are resolved from the project root. + +See the [Custom Benchmark Provider](/guide/advanced/benchmark-provider) guide for setup instructions and the provider API. ## benchmark.suppressExportGetterWarnings @@ -53,4 +61,3 @@ Include the `samples` array of per-iteration timings on every benchmark result. - **Default:** `false` Suppress the warning printed when a benchmark accesses module export getters too many times. Vitest tracks getter access during benchmark runs because Vite's module runner wraps every export in a getter, and excessive access can dominate the measurement (see [Module Runner Overhead](/guide/benchmarking#module-runner-overhead)). Enable this when you've intentionally accepted the overhead, or when the warning is noisy for benchmarks where the getter cost is negligible. - diff --git a/guide/advanced/benchmark-provider.md b/guide/advanced/benchmark-provider.md new file mode 100644 index 00000000..be8975ab --- /dev/null +++ b/guide/advanced/benchmark-provider.md @@ -0,0 +1,83 @@ +# Custom Benchmark Provider 5.0.0 advanced {#custom-benchmark-provider} + +::: warning +This is an advanced, experimental API. If you only need to run benchmarks with Vitest's built-in provider, read the [Benchmarking](/guide/benchmarking) guide instead. +::: + +Vitest uses a benchmark provider to execute the functions registered with `bench` and convert their measurements into results that Vitest can report. The built-in provider uses [Tinybench](https://github.com/tinylibs/tinybench), but you can replace it to use another benchmarking engine or execution strategy. + +## Setup + +Set [`benchmark.provider`](/config/benchmark#benchmark-provider) to the path of your provider module. Relative paths are resolved from the project root. + +```ts [vitest.config.ts] +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + benchmark: { + provider: './benchmark-provider.ts', + }, + }, +}) +``` + +The module must has a default export with an object that implements `BenchmarkProvider`. This example wraps Tinybench to demonstrate how registrations and results flow through a provider. If you use Tinybench in your provider, add it as a direct dependency of your project. + +```ts [benchmark-provider.ts] +import type { BenchmarkProvider } from 'vitest' +import { Bench } from 'tinybench' + +const provider = { + async run({ test, config, registrations, options }) { + const bench = new Bench({ + signal: test.context.signal, + retainSamples: config.retainSamples, + ...options, + }) + + for (const { name, fn, fnOpts } of registrations) { + bench.add(name, fn, fnOpts) + } + + await bench.run() + + return bench.tasks.map((task) => { + const result = task.result + + if (result.state === 'errored') { + throw result.error + } + if (result.state !== 'completed') { + throw new Error(`Benchmark "${task.name}" ended in the "${result.state}" state`) + } + + return { + ...result, + name: task.name, + } + }) + }, +} satisfies BenchmarkProvider + +export default provider +``` + +## Provider API + +Vitest calls `provider.run(group)` when a registration's `.run()` method is called, or once for all runnable registrations passed to `bench.compare()`. The `group` contains: + +- `test`: the test that registered the benchmarks. `test.context.signal` is aborted when the run is cancelled. +- `config`: the resolved benchmark configuration for the current project. +- `registrations`: runnable benchmarks in registration order. Every registration contains `name`, `fn`, and optional `fnOpts` for lifecycle hooks, cancellation, async behavior, and sample retention. +- `options`: benchmark run options passed to `.run()` or `bench.compare()`, if any. + +The provider is responsible for honoring the run and registration options and for running every benchmark function and its `beforeAll`, `beforeEach`, `afterEach`, and `afterAll` hooks according to the benchmarking engine's lifecycle. If execution fails, throw the error to fail the test. + +`run` must resolve to one `BenchResult` for every runnable registration. Results are matched to registrations by `name` and are the source for `.run()` return values, comparison tables, reporters, and saved benchmark results. A custom engine must convert its measurements into the Tinybench-compatible `BenchResult` shape exported by `vitest`. + +Registrations created by `bench.from()` are loaded by Vitest and are not passed to the provider. + +## Provider Lifetime + +Vitest imports the provider module on first use and caches its default export for the lifetime of the worker. The API does not have separate setup or teardown hooks; keep worker-scoped state on the provider object when needed. diff --git a/guide/benchmarking.md b/guide/benchmarking.md index bfa5df87..fc09fed6 100644 --- a/guide/benchmarking.md +++ b/guide/benchmarking.md @@ -4,7 +4,7 @@ title: Benchmarking | Guide # Benchmarking -Vitest lets you write benchmarks alongside your tests using the `bench` fixture from the [test context](/guide/test-context). Benchmarks are powered by [Tinybench](https://github.com/tinylibs/tinybench) and are defined inside regular `test()` calls, giving you access to the full power of Vitest's test runner: retries, lifecycle hooks, filtering, and assertions. +Vitest lets you write benchmarks alongside your tests using the `bench` fixture from the [test context](/guide/test-context). The built-in benchmark provider is powered by [Tinybench](https://github.com/tinylibs/tinybench), and benchmarks are defined inside regular `test()` calls, giving you access to the full power of Vitest's test runner: retries, lifecycle hooks, filtering, and assertions. ## Defining a Benchmark @@ -23,18 +23,18 @@ test('parsing performance', async ({ bench }) => { The `bench()` function registers a benchmark without executing it. Calling `.run()` runs the benchmark and returns the result. After the test completes, Vitest prints a single-row version of the [comparison table](#comparing-benchmarks) (ops/sec, mean time, percentiles, etc.), so you get the same output for a one-off benchmark as you do for `bench.compare()`. ::: warning -The `bench` fixture is only available in files matched by [`benchmark.include`](/config/#benchmark-include) (default: `**/*.{bench,benchmark}.?(c|m)[jt]s?(x)`). Using `{ bench }` inside a regular test file will throw an error. +The `bench` fixture is only available in files matched by [`benchmark.include`](/config/benchmark#benchmark-include) (default: `**/*.{bench,benchmark}.?(c|m)[jt]s?(x)`). Using `{ bench }` inside a regular test file will throw an error. Whether a file participates in the benchmark run is decided by the filename, not by whether the test uses the `bench` fixture. Renaming `parser.test.ts` to `parser.bench.ts` (or adjusting `benchmark.include`) is what moves it into the benchmark project. ::: ## Running Benchmarks -Benchmark files are matched by [`benchmark.include`](/config/#benchmark-include) (default: `**/*.{bench,benchmark}.?(c|m)[jt]s?(x)`) and run in their own project, separate from your regular tests. There are three ways to run them, depending on whether you want to skip them, run them alongside tests, or run them on their own. +Benchmark files are matched by [`benchmark.include`](/config/benchmark#benchmark-include) (default: `**/*.{bench,benchmark}.?(c|m)[jt]s?(x)`) and run in their own project, separate from your regular tests. There are three ways to run them, depending on whether you want to skip them, run them alongside tests, or run them on their own. ### `vitest` (default) -Without [`benchmark.enabled`](/config/#benchmark-enabled), the `vitest` command only runs regular tests. Benchmark files are ignored entirely. This is the default and the right choice for day-to-day development, since benchmarks are slow and noisy and shouldn't run on every save. +Without [`benchmark.enabled`](/config/benchmark#benchmark-enabled), the `vitest` command only runs regular tests. Benchmark files are ignored entirely. This is the default and the right choice for day-to-day development, since benchmarks are slow and noisy and shouldn't run on every save. ### `vitest` with `benchmark.enabled` @@ -72,6 +72,8 @@ vitest bench parser vitest bench -t JSON ``` +To execute benchmarks with another benchmarking engine or execution strategy, see the [Custom Benchmark Provider](/guide/advanced/benchmark-provider) guide. + ## Comparing Benchmarks Use `bench.compare()` to compare multiple benchmarks against each other: @@ -330,7 +332,7 @@ Use the same template in `bench.from()` so each project reads its own artifact. Benchmarks are inherently flaky: CPU load, thermal throttling, GC pressure, and background processes all affect results. Vitest takes several steps to minimize this noise: -- **Separate project**: Benchmark files are grouped into their own project based on the [`benchmark.include`](/config/#benchmark-include) pattern. The `bench` fixture is only exposed in files matched by that pattern. Using it inside a regular test file will throw an error. +- **Separate project**: Benchmark files are grouped into their own project based on the [`benchmark.include`](/config/benchmark#benchmark-include) pattern. The `bench` fixture is only exposed in files matched by that pattern. Using it inside a regular test file will throw an error. - **No concurrency**: Tests within a benchmark file always run sequentially. Benchmark files themselves also run one at a time, never in parallel. This prevents benchmarks from interfering with each other. To further improve stability: From b417e1fd758af9fe869157f20e1f97a6caf170cc Mon Sep 17 00:00:00 2001 From: Aarav Jaichand <166186487+aaravjaichand@users.noreply.github.com> Date: Thu, 23 Jul 2026 04:52:32 -0400 Subject: [PATCH 10/22] fix(browser): mock window.print to avoid hanging (fix #7375) (#10798) --- guide/browser/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guide/browser/index.md b/guide/browser/index.md index 781c95ff..9cc989bd 100644 --- a/guide/browser/index.md +++ b/guide/browser/index.md @@ -588,7 +588,7 @@ test('renders a message', async () => { ### Thread Blocking Dialogs -When using Vitest Browser, it's important to note that thread blocking dialogs like `alert` or `confirm` cannot be used natively. This is because they block the web page, which means Vitest cannot continue communicating with the page, causing the execution to hang. +When using Vitest Browser, it's important to note that thread blocking dialogs like `alert`, `confirm` or `print` cannot be used natively. This is because they block the web page, which means Vitest cannot continue communicating with the page, causing the execution to hang. In such situations, Vitest provides default mocks with default returned values for these APIs. This ensures that if the user accidentally uses synchronous popup web APIs, the execution would not hang. However, it's still recommended for the user to mock these web APIs for a better experience. Read more in [Mocking](/guide/mocking). From 05d82abcf1f63215ce695603c9dabe932823c12e Mon Sep 17 00:00:00 2001 From: Vladimir Date: Fri, 24 Jul 2026 13:46:48 +0200 Subject: [PATCH 11/22] feat(cli): support -p shorthand for --project (#10826) --- guide/cli-generated.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guide/cli-generated.md b/guide/cli-generated.md index dbd0eba7..bd55f1f3 100644 --- a/guide/cli-generated.md +++ b/guide/cli-generated.md @@ -794,7 +794,7 @@ Minimum time in milliseconds it takes to spawn the typechecker ### project -- **CLI:** `--project ` +- **CLI:** `-p, --project ` The name of the project to run if you are using Vitest workspace feature. This can be repeated for multiple projects: `--project=1 --project=2`. You can also filter projects using wildcards like `--project=packages*`, and exclude projects with `--project=!pattern`. From dee42cd5f661068f8b110816609fe26c7db5b7c3 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Fri, 24 Jul 2026 13:47:12 +0200 Subject: [PATCH 12/22] refactor: deduplicate run-level option propagation and document the resolution model (#10823) --- guide/advanced/index.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/guide/advanced/index.md b/guide/advanced/index.md index affae6a0..ac83e0b5 100644 --- a/guide/advanced/index.md +++ b/guide/advanced/index.md @@ -117,6 +117,31 @@ This is the same method Vitest uses internally to resolve the config before crea You can pass a shared [`PluginHarness`](#pluginharness) as the third argument to reuse a logger and package installer across calls. ::: +## Project Configuration Resolution + +This section describes how the arguments of `startVitest`, `createVitest`, and `resolveConfig` interact with [test projects](/guide/projects). Without projects, all resolved options apply to the single root project and none of this matters. + +The root configuration is resolved from three inputs, in ascending priority: + +1. the root config file +2. `viteOverrides`, merged on top of the config file values +3. CLI options (`options`), applied on top of everything else + +Every project then resolves its own Vite config independently: + +- A project referenced as a config file or a directory resolves only its own file. It does not inherit any options from the root configuration. +- An inline project with the [`extends`](/guide/projects#configuration) option re-executes the extended config file and merges the project's own options on top. Only the config **file** participates in this: `viteOverrides` and CLI options are not part of the file, so `extends` does not carry them into projects. + +Independently of `extends`, several groups of options reach every project: + +- A fixed subset of CLI options that configure how tests run (`--testTimeout`, `--retry`, `--pool`, and similar) is applied to every project at the highest priority, mirroring the root resolution. +- Run-level options only make sense for the test run as a whole: every project receives the root's resolved `coverage`, `attachmentsDir`, and `mergeReportsLabel` values. +- The root's `fsModuleCache`, `fsModuleCachePath`, `experimental.viteModuleRunner`, `experimental.nodeLoader`, and `experimental.importDurations` values are applied as defaults to every project that doesn't define them. + +The project's own `tags` always replace the `tags` array merged from an extended config instead of being concatenated with it, so the same tag names can be redefined. + +Note that `plugins` reach a project only through a config file: the file is re-executed for every project, which creates fresh plugin instances. Plugin instances passed in `viteOverrides` belong to the root Vite server and are never shared with project servers. + ## parseCLI ```ts From 3987c946557e571fba7db8567c5ce88229308e0e Mon Sep 17 00:00:00 2001 From: Vladimir Date: Mon, 27 Jul 2026 09:31:56 +0200 Subject: [PATCH 13/22] feat!: inline projects extend the root config by default (#10750) --- api/advanced/plugin.md | 4 +- guide/advanced/index.md | 17 +++-- guide/advanced/pool.md | 2 - guide/browser/visual-regression-testing.md | 3 - guide/migration.md | 54 ++++++++++++++++ guide/projects.md | 74 +++++++++++++++------- 6 files changed, 118 insertions(+), 36 deletions(-) diff --git a/api/advanced/plugin.md b/api/advanced/plugin.md index dbdc1111..a176f830 100644 --- a/api/advanced/plugin.md +++ b/api/advanced/plugin.md @@ -117,11 +117,11 @@ Note that this will only affect projects injected with [`injectTestProjects`](#i ::: ::: tip Referencing the Current Config -If you want to keep the user configuration, you can specify the `extends` property. All other properties will be merged with the user defined config. +Inline configurations inherit the root config by default. If you want to inherit a specific configuration file instead, set the `extends` property to its path. All other properties will be merged with the user defined config. The project's `configFile` can be accessed in Vite's config: `project.vite.config.configFile`. -Note that this will also inherit the `name` - Vitest doesn't allow multiple projects with the same name, so this will throw an error. Make sure you specified a different name. You can access the current name via the `project.name` property and all used names are available in the `vitest.projects` array. +Note that the `name` is never inherited because Vitest doesn't allow multiple projects with the same name. Make sure every project has a unique name. You can access the current name via the `project.name` property and all used names are available in the `vitest.projects` array. ::: ### defineCacheKeyGenerator 5.0.0 {#definecachekeygenerator} diff --git a/guide/advanced/index.md b/guide/advanced/index.md index ac83e0b5..1b7d3cc5 100644 --- a/guide/advanced/index.md +++ b/guide/advanced/index.md @@ -130,17 +130,20 @@ The root configuration is resolved from three inputs, in ascending priority: Every project then resolves its own Vite config independently: - A project referenced as a config file or a directory resolves only its own file. It does not inherit any options from the root configuration. -- An inline project with the [`extends`](/guide/projects#configuration) option re-executes the extended config file and merges the project's own options on top. Only the config **file** participates in this: `viteOverrides` and CLI options are not part of the file, so `extends` does not carry them into projects. +- An inline project inherits the root configuration by default (see [`extends`](/guide/projects#configuration)): the root config file is re-executed for the project, `viteOverrides` are merged on top of it, and the project's own options are merged last. Inheritance works even when there is no root config file, because `viteOverrides` are part of the effective root configuration. +- With `extends: false`, an inline project resolves only its own options. With `extends: './path'`, the referenced file is re-executed instead of the root config file, and `viteOverrides` are not merged. -Independently of `extends`, several groups of options reach every project: +A few options are excluded from inheritance: -- A fixed subset of CLI options that configure how tests run (`--testTimeout`, `--retry`, `--pool`, and similar) is applied to every project at the highest priority, mirroring the root resolution. -- Run-level options only make sense for the test run as a whole: every project receives the root's resolved `coverage`, `attachmentsDir`, and `mergeReportsLabel` values. -- The root's `fsModuleCache`, `fsModuleCachePath`, `experimental.viteModuleRunner`, `experimental.nodeLoader`, and `experimental.importDurations` values are applied as defaults to every project that doesn't define them. +- `plugins` from `viteOverrides` are never inherited. A config file is re-executed for every project, which creates fresh plugin instances, but plugin instances passed in `viteOverrides` belong to the root Vite server and cannot be shared with project servers. +- `test.browser` and `test.tagsFilter` from `viteOverrides` are never inherited: `browser` describes the instances of a single project, and `tagsFilter` applies to the whole run. +- `name` and `projects` are never inherited; the root `globalSetup` is not inherited because it already runs once per test run. +- The project's own `tags` always replace the `tags` array merged from an extended config instead of being concatenated with it, so the same tag names can be redefined. -The project's own `tags` always replace the `tags` array merged from an extended config instead of being concatenated with it, so the same tag names can be redefined. +Independently of `extends`, two groups of options reach every project: -Note that `plugins` reach a project only through a config file: the file is re-executed for every project, which creates fresh plugin instances. Plugin instances passed in `viteOverrides` belong to the root Vite server and are never shared with project servers. +- A fixed subset of CLI options that configure how tests run (`--testTimeout`, `--retry`, `--pool`, and similar) is applied to every project at the highest priority, mirroring the root resolution. +- Run-level options only make sense for the test run as a whole: every project receives the root's resolved `coverage`, `attachmentsDir`, and `mergeReportsLabel` values. ## parseCLI diff --git a/guide/advanced/pool.md b/guide/advanced/pool.md index cebe4aea..5ae745c1 100644 --- a/guide/advanced/pool.md +++ b/guide/advanced/pool.md @@ -43,13 +43,11 @@ export default defineConfig({ test: { projects: [ { - extends: true, test: { pool: 'threads', }, }, { - extends: true, test: { pool: customPool({ customProperty: true, diff --git a/guide/browser/visual-regression-testing.md b/guide/browser/visual-regression-testing.md index a2242f58..2156e42c 100644 --- a/guide/browser/visual-regression-testing.md +++ b/guide/browser/visual-regression-testing.md @@ -82,14 +82,12 @@ export default defineConfig({ // ...other configurations projects: [ { - extends: true, test: { name: 'unit', exclude: [vrtPattern, ...defaultExclude], }, }, { - extends: true, test: { name: 'vrt', browser: { @@ -675,7 +673,6 @@ export default defineConfig({ // ...other configurations projects: [ { - extends: true, test: { name: 'vrt', browser: { diff --git a/guide/migration.md b/guide/migration.md index 972aa592..015d29fd 100644 --- a/guide/migration.md +++ b/guide/migration.md @@ -56,6 +56,60 @@ export default defineConfig({ }) ``` +### Inline Projects Inherit the Root Config by Default + +The [`extends`](/guide/projects#configuration) option now defaults to `true`: every project defined as an inline configuration in [`test.projects`](/guide/projects) inherits all options from the root configuration, including Vite options like `plugins` or `resolve.alias`. The options are merged with the same rules that applied to an explicit `extends: true` in Vitest 4: + +```ts [vitest.config.ts] +import { defineConfig } from 'vitest/config' +import react from '@vitejs/plugin-react' + +export default defineConfig({ + plugins: [react()], + test: { + projects: [ + { + // v4: this project didn't apply the react plugin + // v5: the plugin is inherited from the root config + test: { + name: 'unit', + include: ['**/*.unit.test.ts'], + }, + }, + ], + }, +}) +``` + +A few options are excluded because they are always scoped to a single project or to the whole test run: + +- `name` and `projects` are never inherited. +- `globalSetup` is not inherited from the root config: the root-level `globalSetup` already runs once per test run, so inheriting it would run the same files again for every project. It is still inherited when extending a non-root config file. +- The project's own `tags` replace the inherited array instead of being merged with it. + +Projects referenced as config files or directories are not affected; they still don't inherit any options from the root config. + +Keep in mind that arrays are merged, not overridden. For example, if the root config defines `setupFiles`, the project's own `setupFiles` are appended to the inherited ones. If you need the previous behavior, set `extends: false` in the project configuration: + +```ts [vitest.config.ts] +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + setupFiles: ['./setup.global.ts'], + projects: [ + { + extends: false, // [!code ++] + test: { + name: 'unit', + setupFiles: ['./setup.unit.ts'], + }, + }, + ], + }, +}) +``` + ### Hoisted Mocking Calls Must Be at the Top Level [`vi.mock`](/api/vi#vi-mock), [`vi.unmock`](/api/vi#vi-unmock), and [`vi.hoisted`](/api/vi#vi-hoisted) are hoisted to the top of the file and run before any surrounding code. Calling them inside a function, block, or `describe`/`test` callback previously only logged a warning. Vitest 5.0 now throws, because the call does not execute where it is written: diff --git a/guide/projects.md b/guide/projects.md index 794a41dd..e2c22b16 100644 --- a/guide/projects.md +++ b/guide/projects.md @@ -126,8 +126,8 @@ export default defineConfig({ // matches every folder and file inside the `packages` folder 'packages/*', { - // add "extends: true" to inherit the options from the root config - extends: true, + // inline projects inherit the options + // from this config file by default test: { include: ['tests/**/*.{browser}.test.{ts,js}'], // it is recommended to define a name when using inline configs @@ -136,6 +136,9 @@ export default defineConfig({ } }, { + // add "extends: false" to ignore + // the options defined in this config file + extends: false, test: { include: ['tests/**/*.{node}.test.{ts,js}'], // color of the name label can be changed @@ -234,23 +237,7 @@ bun run test --project e2e --project unit ## Configuration -None of the configuration options are inherited from the root-level config file. You can create a shared config file and merge it with the project config yourself: - -```ts [packages/a/vitest.config.ts] -import { defineProject, mergeConfig } from 'vitest/config' -import configShared from '../vitest.shared.js' - -export default mergeConfig( - configShared, - defineProject({ - test: { - environment: 'jsdom', - } - }) -) -``` - -Additionally, you can use the `extends` option to inherit from your root-level configuration. All options will be merged. +Projects defined with an inline configuration inherit all options from the root-level configuration. This is controlled by the `extends` option, which is enabled by default since Vitest 5.0: ```ts [vitest.config.ts] import { defineConfig } from 'vitest/config' @@ -262,8 +249,8 @@ export default defineConfig({ pool: 'threads', projects: [ { - // will inherit options from this config like plugins and pool - extends: true, + // inherits options from this config like plugins and pool + // (`extends: true` is the default) test: { name: 'unit', include: ['**/*.unit.test.ts'], @@ -271,7 +258,6 @@ export default defineConfig({ }, { // won't inherit any options from this config - // this is the default behaviour extends: false, test: { name: 'integration', @@ -283,6 +269,50 @@ export default defineConfig({ }) ``` +The `extends` option also accepts a path to another config file if you want to inherit options from a config file other than the root config: + +```ts [vitest.config.ts] +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + projects: [ + { + extends: './vitest.shared.ts', + test: { + name: 'unit', + include: ['**/*.unit.test.ts'], + }, + }, + ], + }, +}) +``` + +All options from the extended config are merged with the project's own options. Note that arrays like `setupFiles` are concatenated, not overridden. A few options are treated specially: + +- `name` and `projects` are never inherited. +- `globalSetup` is not inherited from the root config: the root-level `globalSetup` already runs once per test run, so inheriting it would run the same files again for every project. It is still inherited when extending a non-root config file. +- The project's own `tags` replace the inherited array instead of being merged with it. + +If you run Vitest through the [advanced API](/guide/advanced/), see [Project Configuration Resolution](/guide/advanced/#project-configuration-resolution) for how the programmatic configuration participates in inheritance. + +Projects referenced as config files or directories do not inherit any options from the root config. You can create a shared config file and merge it with the project config yourself: + +```ts [packages/a/vitest.config.ts] +import { defineProject, mergeConfig } from 'vitest/config' +import configShared from '../vitest.shared.js' + +export default mergeConfig( + configShared, + defineProject({ + test: { + environment: 'jsdom', + } + }) +) +``` + ::: danger Unsupported Options Some of the configuration options are not allowed in a project config. Most notably: From 22d6e3fb20065ef80e7b74b06c384edf6f718b87 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 28 Jul 2026 12:34:05 +0200 Subject: [PATCH 14/22] fix(deps): update all non-major dependencies (#9958) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Vladimir Sheremet --- package.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index f77d22c1..ebc852e5 100644 --- a/package.json +++ b/package.json @@ -27,16 +27,16 @@ "@vite-pwa/assets-generator": "^1.0.2", "@vite-pwa/vitepress": "^1.1.0", "@vitejs/plugin-vue": "catalog:", - "@voidzero-dev/vitepress-theme": "^4.8.3", + "@voidzero-dev/vitepress-theme": "^4.8.4", "https-localhost": "^4.7.1", "tinyglobby": "catalog:", "unocss": "catalog:", "vite": "^6.3.5", - "vite-plugin-pwa": "^1.2.0", + "vite-plugin-pwa": "^1.3.0", "vitepress": "2.0.0-alpha.16", - "vitepress-plugin-group-icons": "^1.7.1", - "vitepress-plugin-llms": "^1.11.0", - "vitepress-plugin-tabs": "^0.8.0", - "workbox-window": "^7.4.0" + "vitepress-plugin-group-icons": "^1.7.5", + "vitepress-plugin-llms": "^1.13.3", + "vitepress-plugin-tabs": "^0.9.1", + "workbox-window": "^7.4.1" } } From ad3a4235104d20d06739c889575ea717db79f65b Mon Sep 17 00:00:00 2001 From: Vladimir Date: Tue, 28 Jul 2026 14:40:32 +0200 Subject: [PATCH 15/22] chore: add Knip checks (#10847) --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index ebc852e5..0bc35c44 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "vue": "catalog:" }, "devDependencies": { + "@antfu/ni": "^28.3.0", "@iconify-json/carbon": "catalog:", "@iconify-json/logos": "catalog:", "@iconify/vue": "catalog:", From 7b671073865bc4132060751a4b22ee7a644b3c53 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 28 Jul 2026 15:55:56 +0200 Subject: [PATCH 16/22] chore(deps): update shiki monorepo to v4 (#10625) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 0bc35c44..f937c832 100644 --- a/package.json +++ b/package.json @@ -22,8 +22,8 @@ "@iconify-json/carbon": "catalog:", "@iconify-json/logos": "catalog:", "@iconify/vue": "catalog:", - "@shikijs/transformers": "^3.23.0", - "@shikijs/vitepress-twoslash": "^3.23.0", + "@shikijs/transformers": "^4.3.1", + "@shikijs/vitepress-twoslash": "^4.3.1", "@unocss/reset": "catalog:", "@vite-pwa/assets-generator": "^1.0.2", "@vite-pwa/vitepress": "^1.1.0", From 00987550ab99de7555a17f8541e7a83df9408d75 Mon Sep 17 00:00:00 2001 From: fabon Date: Wed, 29 Jul 2026 16:32:29 +0900 Subject: [PATCH 17/22] feat!: enable mocking Temporal without fake timers (#10757) Co-authored-by: Hiroshi Ogawa <4232207+hi-ogawa@users.noreply.github.com> Co-authored-by: OpenCode --- api/vi.md | 2 +- guide/migration.md | 9 +++++++++ guide/mocking.md | 4 +++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/api/vi.md b/api/vi.md index 3d84ea78..91325198 100644 --- a/api/vi.md +++ b/api/vi.md @@ -1159,7 +1159,7 @@ await vi.runOnlyPendingTimersAsync() function setSystemTime(date: string | number | Date): Vitest ``` -If fake timers are enabled, this method simulates a user changing the system clock (will affect date related API like `hrtime`, `performance.now` or `new Date()`) - however, it will not fire any timers. If fake timers are not enabled, this method will only mock `Date.*` calls. +If fake timers are enabled, this method simulates a user changing the system clock (will affect date related API like `hrtime`, `performance.now` or `new Date()`) - however, it will not fire any timers. If fake timers are not enabled, this method will only mock `Date.*` and `Temporal.Now.*` calls. Useful if you need to test anything that depends on the current date - for example [Luxon](https://github.com/moment/luxon/) calls inside your code. diff --git a/guide/migration.md b/guide/migration.md index 015d29fd..aebda4c1 100644 --- a/guide/migration.md +++ b/guide/migration.md @@ -201,6 +201,15 @@ Temporal.Now.instant().epochMilliseconds // 0 (was the real time in v4) vi.useFakeTimers({ toNotFake: ['Temporal'] }) ``` +### `setSystemTime` Now Mocks Temporal + +Previously `vi.setSystemTime` mocked only `Date` without fake timers, but now it also mocks methods of `Temporal.Now`. + +```ts +vi.setSystemTime(0) +Temporal.Now.instant().epochMilliseconds // 0 (was the real time in v4) +``` + ### `toThrow("")` Matches Any Error Message [`toThrow`](/api/expect#tothrow) (and its alias `toThrowError`) treats a string argument as a substring of the error message. In Vitest 4 an empty string was special-cased to the `/^$/` pattern, so it matched only an error whose message was empty. It now behaves like any other substring, and an empty string is contained in every message: diff --git a/guide/mocking.md b/guide/mocking.md index 57d2abb2..6f93ec31 100644 --- a/guide/mocking.md +++ b/guide/mocking.md @@ -171,7 +171,7 @@ Don't forget that this only [mocks _external_ access](/guide/mocking/modules#moc ### Mock the current date -To mock `Date`'s time, you can use `vi.setSystemTime` helper function. This value will **not** automatically reset between different tests. +To mock `Date` and `Temporal`'s time, you can use `vi.setSystemTime` helper function. This value will **not** automatically reset between different tests. Beware that using `vi.useFakeTimers` also changes the `Date`'s time. @@ -180,6 +180,8 @@ const mockDate = new Date(2022, 0, 1) vi.setSystemTime(mockDate) const now = new Date() expect(now.valueOf()).toBe(mockDate.valueOf()) +const nowInstant = Temporal.Now.instant() +expect(nowInstant.epochMilliseconds).toBe(mockDate.valueOf()) // reset mocked time vi.useRealTimers() ``` From eecf58f15caf1c190727226774e4878a028e482c Mon Sep 17 00:00:00 2001 From: Sam Chung Date: Wed, 29 Jul 2026 23:13:27 +1000 Subject: [PATCH 18/22] feat(types)!: add better promise support in expects and matchers (#8266) Co-authored-by: Vladimir Sheremet --- api/expect.md | 31 ++++++++++++++------------- blog/vitest-3-2.md | 3 +-- guide/extending-matchers.md | 42 +++++++++++++++++++++++++++++-------- guide/migration.md | 37 ++++++++++++++++++++++++++++++++ guide/snapshot.md | 36 +++++++++++++++++++++---------- 5 files changed, 113 insertions(+), 36 deletions(-) diff --git a/api/expect.md b/api/expect.md index ae98bddd..d2ceeead 100644 --- a/api/expect.md +++ b/api/expect.md @@ -9,8 +9,11 @@ type Awaitable = T | PromiseLike `expect` is used to create assertions. In this context `assertions` are functions that can be called to assert a statement. Vitest provides `chai` assertions by default and also `Jest` compatible assertions built on top of `chai`. Since Vitest 4.1, for spy/mock testing, Vitest also provides Chai-style assertions (e.g., [`expect(spy).to.have.been.called()`](#called)) alongside Jest-style assertions (e.g., `expect(spy).toHaveBeenCalled()`). Unlike `Jest`, Vitest supports a message as the second argument - if the assertion fails, the error message will be equal to it. ```ts -export interface ExpectStatic extends Chai.ExpectStatic, AsymmetricMatchersContaining { - (actual: T, message?: string): Assertion +export interface ExpectStatic + extends Chai.ExpectStatic, + Matchers, + AsymmetricMatchersContaining { + (actual: T, message?: string): Assertion extend: (expects: MatchersObject) => void anything: () => any any: (constructor: unknown) => any @@ -2242,12 +2245,11 @@ import { expect, test } from 'vitest' test('custom matchers', () => { expect.extend({ - toBeFoo: (received, expected) => { - if (received !== 'foo') { - return { - message: () => `expected ${received} to be foo`, - pass: false, - } + toBeFoo(received) { + const { isNot } = this + return { + message: () => `expected ${received} is${isNot ? ' not' : ''} foo`, + pass: received === 'foo', } }, }) @@ -2263,19 +2265,20 @@ If you want your matchers to appear in every test, you should call this method i This function is compatible with Jest's `expect.extend`, so any library that uses it to create custom matchers will work with Vitest. -If you are using TypeScript, since Vitest 0.31.0 you can extend default `Assertion` interface in an ambient declaration file (e.g: `vitest.d.ts`) with the code below: +If you are using TypeScript, you can extend the default `Matchers` interface in an ambient declaration file (e.g: `vitest.d.ts`) with the code below: ```ts -interface CustomMatchers { - toBeFoo: () => R -} +import 'vitest' declare module 'vitest' { - interface Assertion extends CustomMatchers {} - interface AsymmetricMatchersContaining extends CustomMatchers {} + interface Matchers { + toBeFoo: () => R + } } ``` +`R` is the assertion return type, and `T` is the type of the received value. + ::: warning Don't forget to include the ambient declaration file in your `tsconfig.json`. ::: diff --git a/blog/vitest-3-2.md b/blog/vitest-3-2.md index 38aecaaa..93ba1383 100644 --- a/blog/vitest-3-2.md +++ b/blog/vitest-3-2.md @@ -239,7 +239,7 @@ Vitest now has a `Matchers` type that you can extend to add type support for all For example, to have a type-safe `toBeFoo` matcher, you can write something like this: -```ts twoslash +```ts import { expect } from 'vitest' interface CustomMatchers { @@ -252,7 +252,6 @@ declare module 'vitest' { expect.extend({ toBeFoo(actual, arg) { - // ^? // ... implementation return { pass: true, diff --git a/guide/extending-matchers.md b/guide/extending-matchers.md index c0cc1bdc..3afb020f 100644 --- a/guide/extending-matchers.md +++ b/guide/extending-matchers.md @@ -12,7 +12,7 @@ To extend default matchers, call `expect.extend` with an object containing your ```ts expect.extend({ - toBeFoo(received, expected) { + toBeFoo(received) { const { isNot } = this return { // do not alter your "pass" based on isNot. Vitest does it for you @@ -29,12 +29,24 @@ If you are using TypeScript, you can extend default `Matchers` interface in an a import 'vitest' declare module 'vitest' { - interface Matchers { + interface Matchers { toBeFoo: () => R } } ``` +`R` is the assertion return type, and `T` is the type of the received value. + +Return `R` from matchers that run synchronously. This makes the return type `void` for a regular assertion and `Promise` when the assertion is used with `.resolves`, `.rejects`, [`expect.poll`](/api/expect#poll), or [`expect.element`](/api/browser/assertions). You can use `T` when an expected argument should have the same type as the received value: + +```ts +declare module 'vitest' { + interface Matchers { + toEqualTyped: (expected: T) => R + } +} +``` + ::: tip Importing `vitest` makes TypeScript think this is an ES module file, type declaration won't work without it. ::: @@ -45,30 +57,42 @@ Extending the `Matchers` interface will add a type to `expect.extend`, `expect() Don't forget to include the ambient declaration file in your `tsconfig.json`. ::: -The return value of a matcher should be compatible with the following interface: +The return value of a matcher should be compatible with the following types: ```ts -interface MatcherResult { +interface SyncMatcherResult { pass: boolean message: () => string // If you pass these, they will automatically appear inside a diff when // the matcher does not pass, so you don't need to print the diff yourself actual?: unknown expected?: unknown + meta?: object } + +type MatcherResult = SyncMatcherResult | Promise ``` ::: warning -If you create an asynchronous matcher, don't forget to `await` the result (`await expect('foo').toBeFoo()`) in the test itself: +If a matcher implementation is asynchronous, declare its return type as `Promise` instead of `R` and don't forget to `await` it in the test: ```ts expect.extend({ - async toBeAsyncAssertion() { - // ... + async toBeAsyncAssertion(received) { + return { + pass: received === 'foo', + message: () => `expected ${received} to be foo`, + } } }) -await expect().toBeAsyncAssertion() +declare module 'vitest' { + interface Matchers { + toBeAsyncAssertion: () => Promise + } +} + +await expect('foo').toBeAsyncAssertion() ``` ::: @@ -155,7 +179,7 @@ The name of the current [`environment`](/config/environment) (for example, `jsdo Was assertion called as a [`soft`](/api/expect#soft) one. You don't need to respect it, Vitest will always catch the error. -## `assertion` 4.1.4 {#assertion} +## `assertion` 5.0.0 {#assertion} The underlying [Chai assertion](https://www.chaijs.com/guide/plugins/) object. This is the same instance that Chai plugins receive, giving you access to Chai's flag system and chainable methods. This can be useful for building custom matchers that need to interact with Chai's internals. diff --git a/guide/migration.md b/guide/migration.md index aebda4c1..aed881a0 100644 --- a/guide/migration.md +++ b/guide/migration.md @@ -225,6 +225,43 @@ To assert that a thrown error has an empty message, match the pattern explicitly expect(() => { throw new Error('boom') }).not.toThrow(/^$/) ``` +### Assertion Types Expose Return and Received Types + +Assertion interfaces now use two type parameters: `R` is the matcher return type and `T` is the received value type. Synchronous assertions use `void`, while assertions accessed through `.resolves`, `.rejects`, [`expect.poll`](/api/expect#poll), or [`expect.element`](/api/browser/assertions) use `Promise`. + +If you declare custom matchers, augment the `Matchers` interface. It adds the matcher to instance assertions, asymmetric matchers, and the type accepted by `expect.extend`: + +```ts [vitest.d.ts] +import 'vitest' + +interface CustomMatchers { + toBeFoo: () => R + toEqualTyped: (expected: T) => R +} + +declare module 'vitest' { + interface Matchers extends CustomMatchers {} +} +``` + +This makes custom matcher return types reflect how the matcher is used: + +```ts +const syncResult = expect('value').toEqualTyped('other') // void +const asyncResult = expect(Promise.resolve('value')).resolves.toEqualTyped('other') // Promise +await asyncResult +``` + +Code that refers to assertion types directly must also provide the return type first: + +```ts +Assertion // [!code --] +Assertion // [!code ++] +Assertion, string> // asynchronous assertion +``` + +Vitest no longer reads custom matcher declarations from the global `jest.Matchers` interface. Libraries that support both Jest and Vitest should augment `jest.Matchers` and `vitest.Matchers` separately. This only affects TypeScript declarations; registering matchers with `expect.extend` works as before. + ### `expect.poll` Fails When It Times Out [`expect.poll`](/api/expect#poll) now rejects when its callback, or the polled assertion, does not settle within `timeout`. Previously a callback that resolved after the deadline, or an assertion that only passed on a late attempt, could still succeed. The callback now also receives an `AbortSignal` that aborts when the timeout elapses, so you can cancel in-flight work: diff --git a/guide/snapshot.md b/guide/snapshot.md index 9db1f71f..df11944d 100644 --- a/guide/snapshot.md +++ b/guide/snapshot.md @@ -246,8 +246,8 @@ import { expect, test, Snapshots } from 'vitest' const { toMatchFileSnapshot, toMatchInlineSnapshot, toMatchSnapshot } = Snapshots expect.extend({ - toMatchTrimmedSnapshot(received: string) { - return toMatchSnapshot.call(this, received.slice(0, 10)) + toMatchTrimmedSnapshot(received: string, length: number) { + return toMatchSnapshot.call(this, received.slice(0, length)) }, toMatchTrimmedInlineSnapshot(received: string, inlineSnapshot?: string) { return toMatchInlineSnapshot.call(this, received.slice(0, 10), inlineSnapshot) @@ -298,7 +298,7 @@ File snapshot matchers must be `async` — `toMatchFileSnapshot` returns a `Prom ::: ::: warning -When custom inline snapshot matcher is aynchronous, Vitest cannot automatically infer the call location for inline snapshot rewriting. You must capture the call site by setting the `'error'` flag on the chai assertion object: +When custom inline snapshot matcher is asynchronous, Vitest cannot automatically infer the call location for inline snapshot rewriting. You must capture the call site by setting the `'error'` flag on the chai assertion object: ```ts import { expect, chai, Snapshots } from 'vitest' @@ -317,16 +317,16 @@ expect.extend({ ::: -For TypeScript, extend the `Assertion` interface: +For TypeScript, augment the `Matchers` interface: ```ts import 'vitest' declare module 'vitest' { - interface Assertion { - toMatchTrimmedSnapshot: (length: number) => T - toMatchTrimmedInlineSnapshot: (inlineSnapshot?: string) => T - toMatchTrimmedFileSnapshot: (file: string) => Promise + interface Matchers { + toMatchTrimmedSnapshot: (length: number) => R + toMatchTrimmedInlineSnapshot: (inlineSnapshot?: string) => R + toMatchTrimmedFileSnapshot: (file: string) => Promise } } ``` @@ -391,14 +391,21 @@ This asymmetry is what makes `--update` work correctly: `match` returns a `resol Register a custom matcher with `expect.extend(...)` and call the snapshot composables from `vitest`: ```ts [setup.ts] -import { expect, Snaphsots } from 'vitest' +import { expect, Snapshots } from 'vitest' + +declare module 'vitest' { + interface Matchers { + toMatchMyDomainSnapshot: () => R + toMatchMyDomainInlineSnapshot: (inlineSnapshot?: string) => R + } +} expect.extend({ toMatchMyDomainSnapshot(received: unknown) { - return Snaphsots.toMatchDomainSnapshot.call(this, myAdapter, received) + return Snapshots.toMatchDomainSnapshot.call(this, myAdapter, received) }, toMatchMyDomainInlineSnapshot(received: unknown, inlineSnapshot?: string) { - return Snaphsots.toMatchDomainInlineSnapshot.call( + return Snapshots.toMatchDomainInlineSnapshot.call( this, myAdapter, received, @@ -494,6 +501,13 @@ export const kvAdapter: DomainSnapshotAdapter = { import { expect, Snapshots } from 'vitest' import { kvAdapter } from './kv-adapter' +declare module 'vitest' { + interface Matchers { + toMatchKvSnapshot: () => R + toMatchKvInlineSnapshot: (inlineSnapshot?: string) => R + } +} + expect.extend({ toMatchKvSnapshot(received: unknown) { return Snapshots.toMatchDomainSnapshot.call(this, kvAdapter, received) From af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Thu, 30 Jul 2026 12:44:54 +0200 Subject: [PATCH 19/22] feat!: support nested projects (#10846) --- config/projects.md | 4 ++- guide/migration.md | 28 +++++++++++++++++++ guide/projects.md | 67 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 98 insertions(+), 1 deletion(-) diff --git a/config/projects.md b/config/projects.md index 761861d1..1e6c06c8 100644 --- a/config/projects.md +++ b/config/projects.md @@ -3,9 +3,11 @@ title: projects | Config outline: deep --- -# projects +# projects - **Type:** `TestProjectConfiguration[]` - **Default:** `[]` An array of [projects](/guide/projects). + +A config file that declares `projects` doesn't run tests itself, it only provides the projects that do. This also applies to project config files: a referenced config that declares `projects` becomes a container for [nested projects](/guide/projects#nested-projects). The option is not supported inside an inline project configuration. diff --git a/guide/migration.md b/guide/migration.md index aed881a0..a0f6c1ff 100644 --- a/guide/migration.md +++ b/guide/migration.md @@ -110,6 +110,34 @@ export default defineConfig({ }) ``` +### Referenced Config Files Can Define Their Own Projects + +A config file referenced in [`test.projects`](/guide/projects) that declares `projects` itself is now treated like the root config: it doesn't run tests on its own, it only provides the [nested projects](/guide/projects#nested-projects) it declares. Their names are prefixed with the name of the declaring config, e.g. `app (unit)`. + +In Vitest 4 the `projects` field of a referenced config was silently ignored and the config ran as a single project. Check that your project configs don't carry a `projects` field unknowingly. The most common way to do that is merging a config that defines it: + +```ts [packages/app/vitest.config.ts] +import { defineProject, mergeConfig } from 'vitest/config' +import rootConfig from '../../vitest.config' // [!code --] +import sharedConfig from '../../vitest.shared' // [!code ++] + +export default mergeConfig( + // the root config defines `test.projects`, so merging it + // would turn this project into a container for those projects + rootConfig, // [!code --] + sharedConfig, // [!code ++] + defineProject({ + test: { + environment: 'jsdom', + }, + }), +) +``` + +Since the inherited `projects` paths resolve relative to the referenced config, this misconfiguration usually fails loudly at startup with `Projects definition references a non-existing file or a directory`, `No projects were found in "..."`, or a circular `projects` definition error. + +Inline configurations continue to ignore the `projects` field at runtime, but it is now also excluded from their `ProjectConfig` type. + ### Hoisted Mocking Calls Must Be at the Top Level [`vi.mock`](/api/vi#vi-mock), [`vi.unmock`](/api/vi#vi-unmock), and [`vi.hoisted`](/api/vi#vi-hoisted) are hoisted to the top of the file and run before any surrounding code. Calling them inside a function, block, or `describe`/`test` callback previously only logged a warning. Vitest 5.0 now throws, because the call does not execute where it is written: diff --git a/guide/projects.md b/guide/projects.md index e2c22b16..2aff34bf 100644 --- a/guide/projects.md +++ b/guide/projects.md @@ -324,3 +324,70 @@ Some of the configuration options are not allowed in a project config. Most nota All configuration options that are not supported inside a project configuration are marked with a icon next to their name. They can only be defined once in the root config file. ::: + +## Nested Projects + +A project referenced as a config file (or a directory containing one) can declare `projects` itself. Such a config behaves like the root config: it doesn't run any tests on its own, it only provides the projects that do. This makes it possible to reference a workspace that already defines its own projects: + +```ts [vitest.config.ts] +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + projects: ['./packages/app/vitest.config.ts'], + }, +}) +``` + +```ts [packages/app/vitest.config.ts] +import { defineProject } from 'vitest/config' + +export default defineProject({ + test: { + name: 'app', + projects: [ + { + test: { + name: 'unit', + include: ['**/*.unit.test.ts'], + }, + }, + { + test: { + name: 'e2e', + include: ['**/*.e2e.test.ts'], + }, + }, + ], + }, +}) +``` + +Nested projects work the same way as projects defined in the root config: inline configurations extend the config that declares them (the `app` config here, not the root one), `extends` paths are resolved relative to it, and its own `globalSetup` is inherited by the extending projects [like any other non-root config](#configuration). + +The names of nested projects are prefixed with the name of the config that declares them, so the example above creates the `app (unit)` and `app (e2e)` projects. The `--project` filter matches the prefix as well: `--project app` runs every project of the `app` config, while `--project "app (unit)"` runs only one of them. + +To also run the tests of the config that declares `projects`, reference its own config file: + +```ts [packages/app/vitest.config.ts] +import { defineProject } from 'vitest/config' + +export default defineProject({ + test: { + name: 'app', + include: ['**/*.test.ts'], + projects: [ + // the "app" project runs its own "include" alongside "app (unit)" + './vitest.config.ts', + { + test: { + name: 'unit', + include: ['**/*.unit.test.ts'], + }, + }, + ], + }, +}) +``` + +Note that only config files can define nested projects. The `projects` option inside an inline configuration is not supported. From 814b6319f1f199f23c02e30a4481231c6d68272e Mon Sep 17 00:00:00 2001 From: noise Date: Mon, 3 Aug 2026 00:45:29 +0800 Subject: [PATCH 20/22] docs(cn): dissolve the conflict --- api/advanced/plugin.md | 31 ++-------- api/advanced/test-module.md | 4 -- api/advanced/vitest.md | 6 +- api/browser/commands.md | 12 +--- api/browser/context.md | 6 +- api/expect.md | 6 +- api/vi.md | 6 +- blog/vitest-3-2.md | 5 -- config/api.md | 24 ++------ config/experimental.md | 102 --------------------------------- config/projects.md | 5 +- guide/advanced/index.md | 25 ++------ guide/benchmarking.md | 4 -- guide/browser/index.md | 10 +--- guide/cli-generated.md | 78 +------------------------ guide/extending-matchers.md | 12 +--- guide/improving-performance.md | 14 +---- guide/mocking.md | 12 +--- guide/projects.md | 56 +----------------- guide/snapshot.md | 10 +--- guide/ui.md | 6 +- package.json | 74 ++++++++---------------- 22 files changed, 63 insertions(+), 445 deletions(-) diff --git a/api/advanced/plugin.md b/api/advanced/plugin.md index 5ea63f47..b1608efd 100644 --- a/api/advanced/plugin.md +++ b/api/advanced/plugin.md @@ -116,23 +116,15 @@ vitest.config.project.push('my-project-name') 请注意,这只会影响使用 [`injectTestProjects`](#injecttestprojects) 方法注入的项目。 ::: -<<<<<<< HEAD ::: tip 引用当前配置 -若想在使用我们自己的配置时仍保留用户的原有配置,可以通过设置 extends 属性实现。这样,除了 extends 指定的内容外,其他配置项都会与我们配置合并。 -======= -::: tip Referencing the Current Config -Inline configurations inherit the root config by default. If you want to inherit a specific configuration file instead, set the `extends` property to its path. All other properties will be merged with the user defined config. ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 +内联配置默认继承根配置。如果想改为继承特定的配置文件,请将 `extends` 属性设为该文件的路径。其他所有属性都会与用户定义的配置合并。 项目的 `configFile` 可以在 Vite 的配置中访问:`project.vite.config.configFile`。 -<<<<<<< HEAD -请注意,这也将继承 `name` - Vitest 不允许多个项目使用相同的名称,因此这将引发错误。请确保我们指定了不同的名称。我们可以通过 `project.name` 属性访问当前名称,并且所有使用的名称都可以在 `vitest.projects` 数组中找到。 -======= -Note that the `name` is never inherited because Vitest doesn't allow multiple projects with the same name. Make sure every project has a unique name. You can access the current name via the `project.name` property and all used names are available in the `vitest.projects` array. ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 +请注意,`name` 永远不会被继承,因为 Vitest 不允许多个项目使用相同的名称。请确保每个项目都有唯一的名称。可以通过 `project.name` 属性访问当前名称,所有已使用的名称都可以在 `vitest.projects` 数组中找到。 ::: + ### defineCacheKeyGenerator 5.0.0 {#definecachekeygenerator} ```ts @@ -151,11 +143,7 @@ function defineCacheKeyGenerator( 如果你的插件支持通过不同的参数选项注册,建议通过这种方式,确保 Vitest 生成正确的哈希值。 -<<<<<<< HEAD -仅当定义了 [`experimental.fsModuleCache`](/config/experimental#experimental-fsmodulecache) 时才会调用此方法。 -======= -This is called only if [`fsModuleCache`](/config/fsmodulecache) is enabled. ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 +仅当定义了 [`fsModuleCache`](/config/fsmodulecache) 时才会调用此方法。 ```ts interface PluginOptions { @@ -172,17 +160,10 @@ export function plugin(options: PluginOptions) { options.replacePropertyValue ) }, -<<<<<<< HEAD - configureVitest({ experimental_defineCacheKeyGenerator }) { - experimental_defineCacheKeyGenerator(() => { - // 由于这些选项会影响转换结果, - // 将它们组合成一个唯一字符串并返回 -======= configureVitest({ defineCacheKeyGenerator }) { defineCacheKeyGenerator(() => { - // since these options affect the transform result, - // return them together as a unique string ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 + // 由于这些选项会影响转换结果, + // 将它们组合成一个唯一字符串并返回 return options.replacePropertyKey + options.replacePropertyValue }) } diff --git a/api/advanced/test-module.md b/api/advanced/test-module.md index 8d6164ec..33e4e712 100644 --- a/api/advanced/test-module.md +++ b/api/advanced/test-module.md @@ -154,11 +154,7 @@ interface ImportDuration { function logs(): ReadonlyArray ``` -<<<<<<< HEAD 测试收集期间在模块顶层记录的 console 日志。例如: -======= -Console logs recorded on top level of the module during test collection. For example: ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 ```ts console.log('included') // [!code highlight] diff --git a/api/advanced/vitest.md b/api/advanced/vitest.md index 6473c977..442a4ff8 100644 --- a/api/advanced/vitest.md +++ b/api/advanced/vitest.md @@ -610,11 +610,7 @@ function experimental_parseSpecifications( function experimental_clearCache(): Promise ``` -<<<<<<< HEAD -删除所有 Vitest 缓存,包括 [`experimental.fsModuleCache`](/config/experimental#experimental-fsmodulecache)。 -======= -Deletes all Vitest caches, including [`fsModuleCache`](/config/fsmodulecache). ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 +删除所有 Vitest 缓存,[`fsModuleCache`](/config/fsmodulecache)。 ## experimental_getSourceModuleDiagnostic 4.0.15 {#getsourcemodulediagnostic} diff --git a/api/browser/commands.md b/api/browser/commands.md index 6b80104b..a0e44e71 100644 --- a/api/browser/commands.md +++ b/api/browser/commands.md @@ -18,11 +18,7 @@ outline: deep ::: tip 出于安全原因,内置的文件命令遵循 Vite 的 [`server.fs`](https://cn.G/config/server-options.html#server-fs-allow) 限制。 -<<<<<<< HEAD -`writeFile` 和 `removeFile` 还需要通过 [`browser.api.allowWrite`](/config/browser/api) 和 [`api.allowWrite`](/config/api#api-allowwrite) 获得写入权限。 -======= -`writeFile` and `removeFile` also require write access through [`api.allowWrite`](/config/api#api-allowwrite). ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 +`writeFile` 和 `removeFile` 还需要通过 [`api.allowWrite`](/config/api#api-allowwrite) 获得写入权限。 ::: ```ts @@ -64,11 +60,7 @@ expect(input).toHaveValue('a') ::: warning CDP session 仅适用于 `playwright` provider,并且仅在使用 `chromium` 浏览器时有效。有关详细信息,请参阅 playwright 的 [`CDPSession`](https://playwright.dev/docs/api/class-cdpsession) 文档。 -<<<<<<< HEAD -CDP 是一个特权调试 API。仅当通过 [`browser.api.allowWrite`](/config/browser/api#api-allowwrite)、[`browser.api.allowExec`](/config/browser/api#api-allowexec)、[`api.allowWrite`](/config/api#api-allowwrite) 和 [`api.allowExec`](/config/api#api-allowexec) 启用浏览器 API 写入和执行操作时,该 API 才可用。 -======= -CDP is a privileged debugging API. It is available only when browser API write and exec operations are enabled through [`api.allowWrite`](/config/api#api-allowwrite), and [`api.allowExec`](/config/api#api-allowexec). ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 +CDP 是一种特权调试 API。仅当通过 [`api.allowWrite`](/config/api#api-allowwrite), and [`api.allowExec`](/config/api#api-allowexec) 启用浏览器 API 的写入及执行操作时,才可使用 CDP。 ::: ## 自定义命令 {#custom-commands} diff --git a/api/browser/context.md b/api/browser/context.md index 6748a52a..9a344971 100644 --- a/api/browser/context.md +++ b/api/browser/context.md @@ -207,11 +207,7 @@ await expect.element(button).toBeVisible() // 查询元素失败 ❌ ::: warning CDP 会话仅适用于 `playwright` provider,并且仅在使用 `chromium` 浏览器时有效。有关详细信息,请参阅 playwright 的 [`CDPSession`](https://playwright.dev/docs/api/class-cdpsession)文档。 -<<<<<<< HEAD -CDP 是一个特权调试 API。仅当通过 [`browser.api.allowWrite`](/config/browser/api#api-allowwrite)、[`browser.api.allowExec`](/config/browser/api#api-allowexec)、[`api.allowWrite`](/config/api#api-allowwrite) 和 [`api.allowExec`](/config/api#api-allowexec) 启用浏览器 API 写入和执行操作时,该 API 才可用。 -======= -CDP is a privileged debugging API. It is available only when browser API write and exec operations are enabled through [`api.allowWrite`](/config/api#api-allowwrite), and [`api.allowExec`](/config/api#api-allowexec). ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 +CDP 是一种特权调试 API。仅当通过 [`api.allowWrite`](/config/api#api-allowwrite), and [`api.allowExec`](/config/api#api-allowexec) 启用浏览器 API 的写入及执行操作时,才可使用 CDP。 ::: ```ts diff --git a/api/expect.md b/api/expect.md index a1a69e87..c2026237 100644 --- a/api/expect.md +++ b/api/expect.md @@ -2261,11 +2261,7 @@ test('custom matchers', () => { 这个函数与 Jest 的 `expect.extend` 兼容,因此任何使用它来创建自定义匹配器的库都可以与 Vitest 一起使用。 -<<<<<<< HEAD -如果正在使用 TypeScript,自从 Vitest 0.31.0 版本以来,我们可以在环境声明文件(例如:`vitest.d.ts`)中使用下面的代码扩展默认的 `Assertion` 接口: -======= -If you are using TypeScript, you can extend the default `Matchers` interface in an ambient declaration file (e.g: `vitest.d.ts`) with the code below: ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 +如果正在使用 TypeScript,我们可以在环境声明文件(例如:`vitest.d.ts`)中使用下面的代码扩展默认的 `Matchers` 接口: ```ts import 'vitest' diff --git a/api/vi.md b/api/vi.md index 66590ba5..13e6c3d8 100644 --- a/api/vi.md +++ b/api/vi.md @@ -1163,11 +1163,7 @@ await vi.runOnlyPendingTimersAsync() function setSystemTime(date: string | number | Date): Vitest ``` -<<<<<<< HEAD -如果启用了伪计时器,此方法将模拟用户更改系统时钟(将影响与日期相关的 API,如 `hrtime` 、`performance.now` 或 `new Date()` ),但不会触发任何计时器。如果未启用假定时器,该方法将仅模拟 `Date.*` 调用。 -======= -If fake timers are enabled, this method simulates a user changing the system clock (will affect date related API like `hrtime`, `performance.now` or `new Date()`) - however, it will not fire any timers. If fake timers are not enabled, this method will only mock `Date.*` and `Temporal.Now.*` calls. ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 +如果启用了伪计时器,此方法将模拟用户更改系统时钟(将影响与日期相关的 API,如 `hrtime` 、`performance.now` 或 `new Date()` ),但不会触发任何计时器。如果未启用假定时器,该方法将仅模拟 `Date.*` 和 `Temporal.Now.*` 调用。 适用于需要测试依赖当前日期的场景,例如代码中的 [Luxon](https://github.com/moment/luxon/) 库调用。 diff --git a/blog/vitest-3-2.md b/blog/vitest-3-2.md index a0a439fd..ccc47170 100644 --- a/blog/vitest-3-2.md +++ b/blog/vitest-3-2.md @@ -252,12 +252,7 @@ declare module 'vitest' { expect.extend({ toBeFoo(actual, arg) { -<<<<<<< HEAD - // ^? // 具体实现... -======= - // ... implementation ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 return { pass: true, message: () => '', diff --git a/config/api.md b/config/api.md index 963a675b..ad6f9b0e 100644 --- a/config/api.md +++ b/config/api.md @@ -9,11 +9,7 @@ outline: deep - **默认值:** `false` - **命令行终端:** `--api`, `--api.port`, `--api.host`, `--api.strictPort` -<<<<<<< HEAD -监听端口并提供 API 服务,用于 [UI 模式](/guide/ui) 或 [浏览器服务](/guide/browser/)。设为 `true` 时,默认端口为 `51204`。 -======= -Listen to port and serve API for [the UI](/guide/ui) or [browser server](/guide/browser/). When set to `true`, the default port is `51204` or `63315` if running in Browser Mode. ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 +监听端口并提供 API 服务,用于 [UI 模式](/guide/ui) 或 [浏览器服务](/guide/browser/)。设为 `true` 时,默认端口为 `51204`,如果在浏览器模式下运行,则为 `63315`。 ## api.allowWrite 4.1.0 {#api-allowwrite} @@ -22,15 +18,12 @@ Listen to port and serve API for [the UI](/guide/ui) or [browser server](/guide/ Vitest 服务器可以通过 API 保存测试文件或快照文件。这意味着任何能连接到 API 的人都可以在你的机器上运行任意代码。 -<<<<<<< HEAD -::: danger 安全警告 -Vitest 默认不会将 API 暴露到互联网,仅在 `localhost` 上监听。但如果 `host` 被手动暴露到网络,任何连接到它的人都可以在你的机器上运行任意代码,除非将 `api.allowWrite` 和 `api.allowExec` 设置为`false`。 -======= + + In Browser Mode Vitest saves [annotation attachments](/guide/test-annotations), [artifacts](/api/advanced/artifacts) and [snapshots](/guide/snapshot) by receiving a WebSocket connection from the browser. This allows anyone who can connect to the API write any arbitrary code on your machine within the root of your project (configured by [`fs.allow`](https://vite.dev/config/server-options#server-fs-allow)). This option also gates privileged browser APIs that can write files indirectly, such as raw Chrome DevTools Protocol access through [`cdp()`](/api/browser/context#cdp). -::: danger SECURITY ADVICE -Vitest does not expose the API to the internet by default and only listens on `localhost`. However if `host` is manually exposed to the network, anyone who connects to it can run arbitrary code on your machine, unless `api.allowWrite` and `api.allowExec` are set to `false`. ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 +::: danger 安全警告 +Vitest 默认不会将 API 暴露到互联网,仅在 `localhost` 上监听。但如果 `host` 被手动暴露到网络,任何连接到它的人都可以在你的机器上运行任意代码,除非将 `api.allowWrite` 和 `api.allowExec` 设置为`false`。 如果 host 设置为 `localhost` 或 `127.0.0.1` 以外的任何值,Vitest 会默认将 `api.allowWrite` 和 `api.allowExec` 设置为 `false`。这意味着任何写入操作(例如 在 UI 模式中修改代码)将不起作用。如果你了解安全风险,可以覆盖这些设置。 ::: @@ -40,9 +33,4 @@ Vitest does not expose the API to the internet by default and only listens on `l - **类型:** `boolean` - **默认值:** `true` 表示未暴露在公共网络中,`false` 则表示已暴露 -<<<<<<< HEAD -允许通过 API 运行任何测试文件。详细安全建议请参阅 [`api.allowWrite`](#api-allowwrite)。 -======= -Allows running any test file via the UI. This applies to the interactive elements (and the server code behind them) in the [UI](/guide/ui) that can run the code. This option also gates privileged browser APIs that can execute code indirectly, such as raw Chrome DevTools Protocol access through [`cdp()`](/api/browser/context#cdp). - ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 +允许通过 API 运行任何测试文件。 This applies to the interactive elements (and the server code behind them) in the [UI](/guide/ui) that can run the code. This option also gates privileged browser APIs that can execute code indirectly, such as raw Chrome DevTools Protocol access through [`cdp()`](/api/browser/context#cdp). diff --git a/config/experimental.md b/config/experimental.md index d2c73443..a790a962 100644 --- a/config/experimental.md +++ b/config/experimental.md @@ -5,108 +5,6 @@ outline: deep # experimental -<<<<<<< HEAD -## experimental.fsModuleCache 4.0.11 {#experimental-fsmodulecache} - -::: tip 功能反馈 -请将关于此功能反馈提交至 [GitHub Discussion](https://github.com/vitest-dev/vitest/discussions/9221)。 -::: - -- **类型:** `boolean` -- **默认值:** `false` - -启用此选项后, Vitest 会将缓存的模块保存在文件系统上,从而在重新运行测试时获得更快的执行速度。 - -你可以通过运行 [`vitest --clearCache`](/guide/cli#clearcache) 来删除旧缓存。 - -::: warning 浏览器支持 -目前,此选项不会影响 [浏览器模式](/guide/browser/)。 -::: - -在运行 vitest 你可以设置 `DEBUG=vitest:cache:fs` 环境变量,来调试模块是否被缓存: - -```shell -DEBUG=vitest:cache:fs vitest --experimental.fsModuleCache -``` - -### 已知问题 {#known-issues} - -Vitest 基于文件内容、文件 id、vite 的环境配置及覆盖率状态生成持久性文件哈希值。虽然 Vitest 会尽可能利用所有可获取的配置信息,但目前仍存在局限性。由于缺乏标准接口支持,当前无法追踪插件选项的变更情况。 - -如果你的插件依赖文件内容或公开配置之外的因素(例如读取其他文件或目录),则可能出现缓存失效的情况。要解决这个问题,你可以定义一个 [缓存键生成器](/api/advanced/plugin#definecachekeygenerator) 来指定动态选项,或选择对该模块禁用缓存: - -```js [vitest.config.js] -import { defineConfig } from 'vitest/config' - -export default defineConfig({ - plugins: [ - { - name: 'vitest-cache', - configureVitest({ experimental_defineCacheKeyGenerator }) { - experimental_defineCacheKeyGenerator(({ id, sourceCode }) => { - // 从不缓存此 id - if (id.includes('do-not-cache')) { - return false - } - - // 根据动态变量的值缓存该文件 - if (sourceCode.includes('myDynamicVar')) { - return process.env.DYNAMIC_VAR_VALUE - } - }) - } - } - ], - test: { - experimental: { - fsModuleCache: true, - }, - }, -}) -``` -如果你是插件作者,当你的插件可以通过不同配置选项影响转换结果时,建议在插件中定义 [缓存键生成器](/api/advanced/plugin#definecachekeygenerator)。 - -另一方面,如果你的插件不应该影响缓存键,你可以通过将 `api.vitest.experimental.ignoreFsModuleCache` 设置为 `true` 来退出缓存机制: - -```js [vitest.config.js] -import { defineConfig } from 'vitest/config' - -export default defineConfig({ - plugins: [ - { - name: 'vitest-cache', - api: { - vitest: { - experimental: { - ignoreFsModuleCache: true, - }, - }, - }, - }, - ], - test: { - experimental: { - fsModuleCache: true, - }, - }, -}) -``` - -请注意,即使插件选择禁用缓存模块,你仍然可以定义缓存键生成器。 - -## experimental.fsModuleCachePath 4.0.11 {#experimental-fsmodulecachepath} - -- **类型:** `string` -- **默认值:** `'node_modules/.experimental-vitest-cache'` - -文件系统缓存所在的目录。 - -默认情况下,Vitest 会尝试查找工作区根目录,并将缓存存储在 `node_modules` 文件夹中。根目录的确定基于你所使用的包管理器的锁文件(例如,`.package-lock.json`、`.yarn-state.yml`、`.pnpm/lock.yaml` 等)。 - -目前,Vitest 会完全忽略 [test.cache.dir](/config/cache) 或 [cacheDir](https://vite.dev/config/shared-options#cachedir) 配置选项,并创建一个单独的缓存文件夹。 - -======= ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 ## experimental.openTelemetry 4.0.11 {#experimental-opentelemetry} ::: tip 功能反馈 diff --git a/config/projects.md b/config/projects.md index da7b3b25..033dd923 100644 --- a/config/projects.md +++ b/config/projects.md @@ -8,10 +8,7 @@ outline: deep - **类型:** `TestProjectConfiguration[]` - **默认值:** `[]` -<<<<<<< HEAD 一个由多个 [项目](/guide/projects) 组成的数组。 -======= -An array of [projects](/guide/projects). + A config file that declares `projects` doesn't run tests itself, it only provides the projects that do. This also applies to project config files: a referenced config that declares `projects` becomes a container for [nested projects](/guide/projects#nested-projects). The option is not supported inside an inline project configuration. ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 diff --git a/guide/advanced/index.md b/guide/advanced/index.md index 8d4694e0..073fff39 100644 --- a/guide/advanced/index.md +++ b/guide/advanced/index.md @@ -89,23 +89,14 @@ function resolveConfig( ): Promise ``` -<<<<<<< HEAD -此方法使用自定义参数解析配置。如果没有提供参数,则 `root` 将为 `process.cwd()`。 -======= -This method resolves the config with custom parameters, without creating a Vite server. If no parameters are given, the `root` will be `process.cwd()`. - +此方法使用自定义参数解析配置,而不会创建 Vite 服务器。如果未提供任何参数,root 将设为 process.cwd()。 + It returns the resolved Vite config. The fully resolved Vitest config, including every project, lives on its `test` property. ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 ```ts import { resolveConfig } from 'vitest/node' -<<<<<<< HEAD -// vitestConfig 只解析了 “测试” 属性 -const { vitestConfig, viteConfig } = await resolveConfig({ -======= const viteConfig = await resolveConfig({ ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 mode: 'custom', configFile: false, resolve: { @@ -121,10 +112,7 @@ viteConfig.test.pool // 'threads' ``` ::: info -<<<<<<< HEAD -由于 Vite 的 `createServer` 工作方式, Vitest 必须在插件的 `configResolve` 钩子中解析配置。因此,此方法实际上并未在内部使用,而是仅作为公共 API 暴露。 - -如果你将配置传递给 `startVitest` 或 `createVitest` API , Vitest 仍然会重新解析配置。 +由于 Vite 的 `createServer` 工作方式, Vitest 必须在插件的 `configResolve` 钩子中解析配置。因此,此方法实际上并未在内部使用,而是仅作为公共 API 暴露。如果你将配置传递给 `startVitest` 或 `createVitest` API , Vitest 仍然会重新解析配置。 ::: ::: warning @@ -132,12 +120,8 @@ viteConfig.test.pool // 'threads' 另外请注意,`viteConfig.test` 不会被完全解析。如果你需要 Vitest 配置,请使用 `vitestConfig` 代替。 ::: -======= -This is the same method Vitest uses internally to resolve the config before creating the server. If you pass the options down to `startVitest` or `createVitest`, Vitest resolves them again. - -You can pass a shared [`PluginHarness`](#pluginharness) as the third argument to reuse a logger and package installer across calls. -::: + ## Project Configuration Resolution This section describes how the arguments of `startVitest`, `createVitest`, and `resolveConfig` interact with [test projects](/guide/projects). Without projects, all resolved options apply to the single root project and none of this matters. @@ -165,7 +149,6 @@ Independently of `extends`, two groups of options reach every project: - A fixed subset of CLI options that configure how tests run (`--testTimeout`, `--retry`, `--pool`, and similar) is applied to every project at the highest priority, mirroring the root resolution. - Run-level options only make sense for the test run as a whole: every project receives the root's resolved `coverage`, `attachmentsDir`, and `mergeReportsLabel` values. ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 ## parseCLI diff --git a/guide/benchmarking.md b/guide/benchmarking.md index 79465dc3..81bd0281 100644 --- a/guide/benchmarking.md +++ b/guide/benchmarking.md @@ -3,13 +3,9 @@ title: Benchmarking | Guide --- # Benchmarking -<<<<<<< HEAD -Vitest lets you write benchmarks alongside your tests using the `bench` fixture from the [test context](/guide/test-context). Benchmarks are powered by [Tinybench](https://github.com/tinylibs/tinybench) and are defined inside regular `test()` calls, giving you access to the full power of Vitest's test runner: retries, lifecycle hooks, filtering, and assertions. -======= Vitest lets you write benchmarks alongside your tests using the `bench` fixture from the [test context](/guide/test-context). The built-in benchmark provider is powered by [Tinybench](https://github.com/tinylibs/tinybench), and benchmarks are defined inside regular `test()` calls, giving you access to the full power of Vitest's test runner: retries, lifecycle hooks, filtering, and assertions. ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 ## Defining a Benchmark diff --git a/guide/browser/index.md b/guide/browser/index.md index 3834cb04..c8ac600d 100644 --- a/guide/browser/index.md +++ b/guide/browser/index.md @@ -118,11 +118,7 @@ export default defineConfig({ ``` ::: info -<<<<<<< HEAD -Vitest 默认分配端口号 `63315` 以避免与开发服务器冲突,允许我们同时并行运行两者。我们可以通过 [`browser.api`](/config/browser/api) 选项来更改这个端口号。 -======= -Vitest assigns port `63315` to avoid conflicts with the development server, allowing you to run both in parallel. You can change that with the [`api`](/config/api) option. ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 +Vitest 默认分配端口号 `63315` 以避免与开发服务器冲突,允许我们同时并行运行两者。我们可以通过 [`api`](/config/api) 选项来更改这个端口号。 ::: 如果之前未使用过 Vite,请确保已安装框架插件并在配置中指定。有些框架可能需要额外配置才能运行,请查看其 Vite 相关文档以确定。 @@ -586,11 +582,7 @@ test('renders a message', async () => { ### 线程阻塞对话框 {#thread-blocking-dialogs} -<<<<<<< HEAD 使用 Vitest 浏览器时,需要注意的是像 `alert` 或 `confirm` 这样的线程阻塞对话框不能在本地使用。这是因为它们阻塞了网页,这意味着 Vitest 无法继续与该页面通信,导致执行挂起。 -======= -When using Vitest Browser, it's important to note that thread blocking dialogs like `alert`, `confirm` or `print` cannot be used natively. This is because they block the web page, which means Vitest cannot continue communicating with the page, causing the execution to hang. ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 在这类情况下,Vitest 会为相关 API 提供带有默认返回值的内置 mock,从而避免用户不小心使用同步弹窗等 Web API 时导致程序卡死。不过,仍然强烈建议用户自行对这些 Web API 进行 mock,以获得更稳定、可控的测试体验。更多内容可参考 [模拟](/guide/mocking) 章节。 diff --git a/guide/cli-generated.md b/guide/cli-generated.md index 92ae9661..0a0f87c4 100644 --- a/guide/cli-generated.md +++ b/guide/cli-generated.md @@ -360,51 +360,6 @@ Inject CommonJS variables (`module`, `exports`, `require`, `__filename`, `__dirn 在无头模式下运行浏览器(即不打开图形用户界面)。如果在 CI 中运行 Vitest,默认情况下将启用无头模式 (默认值: `process.env.CI`) -<<<<<<< HEAD -### browser.api.port - -- **命令行终端:** `--browser.api.port [port]` -- **配置:** [browser.api.port](/config/browser/api#api-port) - -指定服务器端口。注意,如果端口已被使用,Vite 会自动尝试下一个可用端口,因此这可能不是服务器最终监听的实际端口。如果为 `true`,将设置为 `63315` - -### browser.api.host - -- **命令行终端:** `--browser.api.host [host]` -- **配置:** [browser.api.host](/config/browser/api#api-host) - -指定服务器应该监听哪些 IP 地址。设为 `0.0.0.0` 或 `true` 则监听所有地址,包括局域网地址和公共地址 - -### browser.api.strictPort - -- **命令行终端:** `--browser.api.strictPort` -- **配置:** [browser.api.strictPort](/config/browser/api#api-strictport) - -设置为 true 时,如果端口已被使用,则退出,而不是自动尝试下一个可用端口 - -### browser.api.allowExec - -- **命令行终端:** `--browser.api.allowExec` -- **配置:** [browser.api.allowExec](/config/browser/api#api-allowexec) - -允许 API 执行代码。(在非受信环境中启用此选项时需谨慎) - -### browser.api.allowWrite - -- **命令行终端:** `--browser.api.allowWrite` -- **配置:** [browser.api.allowWrite](/config/browser/api#api-allowwrite) - -允许 API 编辑文件。(在非受信环境中启用此选项时需谨慎) - -### browser.isolate - -- **命令行终端:** `--browser.isolate` -- **配置:** [browser.isolate](/config/browser/isolate) - -隔离运行每个浏览器测试文件。要禁用隔离请使用 `--browser.isolate=false` (默认值: `true`) - -======= ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 ### browser.ui - **命令行终端:** `--browser.ui` @@ -419,15 +374,6 @@ Inject CommonJS variables (`module`, `exports`, `require`, `__filename`, `__dirn 浏览器模式下详情面板的默认位置。可选 `right`(水平分割)或 `bottom`(垂直分割)(默认值:`right`) -<<<<<<< HEAD -### browser.fileParallelism - -- **命令行终端:** `--browser.fileParallelism` - -浏览器测试文件是否应并行运行。使用 `--browser.fileParallelism=false` 进行禁用(默认值: `true`) - -======= ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 ### browser.connectTimeout - **命令行终端:** `--browser.connectTimeout ` @@ -848,11 +794,7 @@ Use TypeScript build mode ### project -<<<<<<< HEAD -- **命令行终端:** `--project ` -======= -- **CLI:** `-p, --project ` ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 +- **命令行终端:** `-p, --project ` 如果我们正在使用 Vitest 的工作区功能,这是要运行的项目名称。这个参数可以重复以指定多个项目:`--project=1 --project=2`。我们还可以使用通配符来过滤项目,例如 `--project=packages*`,以及使用 `--project=!pattern` 来排除项目 @@ -876,7 +818,7 @@ Use TypeScript build mode - **配置:** [maxConcurrency](/config/maxconcurrency) 测试文件执行期间并发运行的测试和测试套件的最大数量(默认值:`5`) - + ### fsModuleCache - **CLI:** `--fsModuleCache` @@ -973,11 +915,7 @@ watch 模式下重新运行测试时清除终端屏幕(默认值:`true`) - **命令行终端:** `--clearCache` -<<<<<<< HEAD -删除所有 Vitest 缓存,包括 `experimental.fsModuleCache`,且不运行任何测试。此操作会降低后续测试运行的性能。 -======= -Delete all Vitest caches, including the `fsModuleCache`, without running any tests. This will reduce the performance in the subsequent test run. ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 +删除所有 Vitest 缓存,包括 `fsModuleCache`,且不运行任何测试。此操作会降低后续测试运行的性能。 ### tagsFilter @@ -992,16 +930,6 @@ Delete all Vitest caches, including the `fsModuleCache`, without running any tes 如果测试包含未在配置中定义的标签,Vitest 是否应抛出错误。(默认值:`true`) -<<<<<<< HEAD -### experimental.fsModuleCache - -- **命令行终端:** `--experimental.fsModuleCache` -- **配置:** [experimental.fsModuleCache](/config/experimental#experimental-fsmodulecache) - -在重新运行之前,启用文件系统上的缓存。 - -======= ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 ### experimental.importDurations.print - **命令行终端:** `--experimental.importDurations.print ` diff --git a/guide/extending-matchers.md b/guide/extending-matchers.md index 4f54e17c..21385855 100644 --- a/guide/extending-matchers.md +++ b/guide/extending-matchers.md @@ -34,7 +34,7 @@ declare module 'vitest' { } } ``` - + `R` is the assertion return type, and `T` is the type of the received value. Return `R` from matchers that run synchronously. This makes the return type `void` for a regular assertion and `Promise` when the assertion is used with `.resolves`, `.rejects`, [`expect.poll`](/api/expect#poll), or [`expect.element`](/api/browser/assertions). You can use `T` when an expected argument should have the same type as the received value: @@ -57,11 +57,7 @@ declare module 'vitest' { 不要忘记在 `tsconfig.json` 中包含声明文件。 ::: -<<<<<<< HEAD -断言的返回值应该兼容如下接口: -======= -The return value of a matcher should be compatible with the following types: ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 +断言的返回值应该兼容如下类型: ```ts interface SyncMatcherResult { @@ -78,11 +74,7 @@ type MatcherResult = SyncMatcherResult | Promise ``` ::: warning -<<<<<<< HEAD -如果你实现了一个异步匹配器,记得在测试里对它的结果使用 `await`(例如:`await expect('foo').toBeFoo()`),否则可能不会按预期执行: -======= If a matcher implementation is asynchronous, declare its return type as `Promise` instead of `R` and don't forget to `await` it in the test: ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 ```ts expect.extend({ diff --git a/guide/improving-performance.md b/guide/improving-performance.md index 69e65c81..4677a5bc 100644 --- a/guide/improving-performance.md +++ b/guide/improving-performance.md @@ -89,11 +89,7 @@ export default defineConfig({ ## 重新运行间的缓存机制 {#caching-between-reruns} -<<<<<<< HEAD -在监听模式下,Vitest 会将所有转换后的文件缓存在内存中,从而实现快速重新运行。不过该缓存会在测试运行结束后被清除。通过启用 [`experimental.fsModuleCache`](/config/experimental#experimental-fsmodulecache) 配置,Vitest 会将此缓存持久化到文件系统,使其能在多次重运行间复用。 -======= -In watch mode, Vitest caches all transformed files in memory, which makes reruns fast. However, this cache is discarded once the test run finishes. By enabling [`fsModuleCache`](/config/fsmodulecache), Vitest persists this cache to the file system so it can be reused across reruns. ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 +在监听模式下,Vitest 会将所有转换后的文件缓存在内存中,从而实现快速重新运行。不过该缓存会在测试运行结束后被清除。通过启用 [`fsModuleCache`](/config/fsmodulecache) 配置,Vitest 会将此缓存持久化到文件系统,使其能在多次重运行间复用。 当重新运行少量依赖大型模块图的测试时,这种优化效果最为显著。对于完整测试套件,由于并行化机制会在早期测试仍在运行时通过其他测试填充内存缓存,其性能损耗已得到缓解。例如运行一个依赖庞大模块图(>900 个模块)的测试文件时: @@ -104,10 +100,7 @@ Duration 8.75s (transform 4.02s, setup 629ms, import 5.52s, tests 2.52s, enviro # 第二次运行 Duration 5.90s (transform 842ms, setup 543ms, import 2.35s, tests 2.94s, environment 0ms, prepare 3ms) ``` - -<<<<<<< HEAD -## 运行池 {#pool} -======= + ## Node Compile Cache Vitest supports Node's [on-disk compile cache](https://nodejs.org/api/cli.html#node_compile_cachedir): when the `NODE_COMPILE_CACHE` environment variable points at a directory, the V8 bytecode of Vitest's own modules and of your externalized dependencies is written to disk and reused by later runs instead of being recompiled. Vitest propagates the variable to every worker, and workers persist the modules they compiled when they shut down. @@ -120,8 +113,7 @@ The first run with an empty directory pays for serializing the compiled modules, Note that Vitest automatically disables the compile cache in workers when the `v8` coverage provider is enabled — V8 serializes cached scripts without the source positions that precise coverage relies on. -## Pool ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 +## 运行池 {#pool} 默认情况下,Vitest 在 `pool: 'forks'` 中运行测试。虽然 `'forks'` 池更适合解决兼容性问题([hanging process](/guide/common-errors.html#failed-to-terminate-worker) 和 [segfaults](/guide/common-errors.html#segfaults-and-native-code-errors)),但在较大的项目中,它可能比 `pool: 'threads'` 稍慢。 diff --git a/guide/mocking.md b/guide/mocking.md index 0f7b41fb..557344a6 100644 --- a/guide/mocking.md +++ b/guide/mocking.md @@ -171,11 +171,7 @@ mocked() // 是一个 spy 函数 ### 模拟当前日期 {#mock-the-current-date} -<<<<<<< HEAD -要模拟 `Date` 的时间,你可以使用 `vi.setSystemTime` 辅助函数。 该值将**不会**在不同的测试之间自动重置。 -======= -To mock `Date` and `Temporal`'s time, you can use `vi.setSystemTime` helper function. This value will **not** automatically reset between different tests. ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 +要模拟 `Date` 和 `Temporal` 的时间,你可以使用 `vi.setSystemTime` 辅助函数。 该值将 **不会** 在不同的测试之间自动重置。 请注意,使用 `vi.useFakeTimers` 也会更改 `Date` 的时间。 @@ -184,13 +180,9 @@ const mockDate = new Date(2022, 0, 1) vi.setSystemTime(mockDate) const now = new Date() expect(now.valueOf()).toBe(mockDate.valueOf()) -<<<<<<< HEAD -// 重置模拟的时间 -======= const nowInstant = Temporal.Now.instant() expect(nowInstant.epochMilliseconds).toBe(mockDate.valueOf()) -// reset mocked time ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 +// 重置模拟的时间 vi.useRealTimers() ``` diff --git a/guide/projects.md b/guide/projects.md index 2b4e80c5..580e3f33 100644 --- a/guide/projects.md +++ b/guide/projects.md @@ -116,7 +116,7 @@ export default defineConfig({ 此模式只会包含带有 `e2e` 或 `unit` 字样的 `vitest.config` 文件的项目。 你还可以使用内联配置定义项目。两种语法可以同时使用。 - + ```ts [vitest.config.ts] import { defineConfig } from 'vitest/config' @@ -126,13 +126,8 @@ export default defineConfig({ // 匹配 packages 文件夹下的所有文件和文件夹 'packages/*', { -<<<<<<< HEAD - // 添加 "extends: true" 继承根配置中的选项 - extends: true, -======= // inline projects inherit the options // from this config file by default ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 test: { include: ['tests/**/*.{browser}.test.{ts,js}'], // 建议内联配置时定义项目名称 @@ -241,10 +236,7 @@ bun run test --project e2e --project unit ::: ## 配置说明 {#configuration} - -<<<<<<< HEAD -项目配置不会继承根配置文件中的选项。你可以创建共享配置文件,并在项目配置中手动合并: -======= + Projects defined with an inline configuration inherit all options from the root-level configuration. This is controlled by the `extends` option, which is enabled by default since Vitest 5.0: ```ts [vitest.config.ts] @@ -306,7 +298,6 @@ All options from the extended config are merged with the project's own options. If you run Vitest through the [advanced API](/guide/advanced/), see [Project Configuration Resolution](/guide/advanced/#project-configuration-resolution) for how the programmatic configuration participates in inheritance. Projects referenced as config files or directories do not inherit any options from the root config. You can create a shared config file and merge it with the project config yourself: ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 ```ts [packages/a/vitest.config.ts] import { defineProject, mergeConfig } from 'vitest/config' @@ -322,51 +313,8 @@ export default mergeConfig( ) ``` -<<<<<<< HEAD -另外,你可以使用 `extends` 选项继承根配置,所有选项都会被合并。 - -```ts [vitest.config.ts] -import react from '@vitejs/plugin-react' -import { defineConfig } from 'vitest/config' - -export default defineConfig({ - plugins: [react()], - test: { - pool: 'threads', - projects: [ - { - // 继承此配置的选项,如 plugins 和 pool - extends: true, - test: { - name: 'unit', - include: ['**/*.unit.test.ts'], - }, - }, - { - // 不继承任何此配置的选项 - // 这是默认行为 - extends: false, - test: { - name: 'integration', - include: ['**/*.integration.test.ts'], - }, - }, - ], - }, -}) -``` - -::: danger 不支持的选项 -部分配置选项不允许在项目配置中使用,主要包括: -- `coverage`:覆盖率统计针对整个进程 -- `reporters`:只支持根级别的 reporters -- `resolveSnapshotPath`:只尊重根级别的快照路径解析器 -- `attachmentsDir`:附件存储在由所有项目共享的一个根级目录中 -- 其他不影响测试运行器的选项 -======= ::: danger Unsupported Options Some of the configuration options are not allowed in a project config. Most notably: ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 所有不支持在项目配置中使用的配置选项,在 ["配置"](/config/) 指南中会用 标记。它们必须在根配置文件中定义一次。 ::: diff --git a/guide/snapshot.md b/guide/snapshot.md index 2ca93dee..2c98c86c 100644 --- a/guide/snapshot.md +++ b/guide/snapshot.md @@ -292,11 +292,7 @@ expect.extend({ ::: ::: warning -<<<<<<< HEAD 当自定义内联快照匹配器为异步时,Vitest 无法自动推断内联快照重写的调用位置。你必须通过在 chai 断言对象上设置 `'error'` 参数来捕获调用点: -======= -When custom inline snapshot matcher is asynchronous, Vitest cannot automatically infer the call location for inline snapshot rewriting. You must capture the call site by setting the `'error'` flag on the chai assertion object: ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 ```ts import { chai, expect, Snapshots } from 'vitest' @@ -315,11 +311,7 @@ expect.extend({ ::: -<<<<<<< HEAD -对于 TypeScript,需扩展 `Assertion` 接口: -======= -For TypeScript, augment the `Matchers` interface: ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 +对于 TypeScript,需扩展 `Matchers` 接口: ```ts import 'vitest' diff --git a/guide/ui.md b/guide/ui.md index 7e72aee4..6e2509a8 100644 --- a/guide/ui.md +++ b/guide/ui.md @@ -118,11 +118,7 @@ npx vite preview --outDir .vitest The module info view for an inlined module The module info view for an inlined module -<<<<<<< HEAD -此视图分为上下两部分。顶部显示完整的模块 ID 和一些关于模块的诊断信息。如果启用了 [`experimental.fsModuleCache`](/config/experimental#experimental-fsmodulecache),将会显示 "cached" 或 "not cached" 的徽章。在右侧你可以看到时间诊断信息: -======= -This view is separated into two parts. The top part shows the full module ID and some diagnostics about the module. If [`fsModuleCache`](/config/fsmodulecache) is enabled, there will be a "cached" or "not cached" badge. On the right you can see time diagnostics: ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 +此视图分为上下两部分。顶部显示完整的模块 ID 和一些关于模块的诊断信息。如果启用了 [`fsModuleCache`](/config/fsmodulecache),将会显示 "cached" 或 "not cached" 的徽章。在右侧你可以看到时间诊断信息: - 自身时间:导入模块所花费的时间,不包括静态导入。 - 总耗时:导入模块所花费的时间,包括静态导入。请注意,这不包括当前模块的 `transform` 时间。 diff --git a/package.json b/package.json index b0467297..9f834a7f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "docs-cn", "type": "module", - "version": "5.0.0-beta.6", + "version": "5.0.0-beta.7", "private": true, "packageManager": "pnpm@9.7.1", "scripts": { @@ -18,68 +18,44 @@ "prepare": "simple-git-hooks" }, "dependencies": { - "@vueuse/core": "^14.2.1", - "vue": "^3.5.29" + "@vueuse/core": "^14.4.0", + "vue": "^3.5.40" }, "devDependencies": { -<<<<<<< HEAD - "@antfu/eslint-config": "^7.6.1", - "@antfu/ni": "^28.3.0", - "@iconify-json/carbon": "^1.2.19", - "@iconify-json/logos": "^1.2.10", - "@iconify/vue": "^5.0.0", - "@shikijs/transformers": "^3.23.0", - "@shikijs/vitepress-twoslash": "^3.23.0", - "@types/node": "^25.0.3", - "@unocss/reset": "^66.6.6", + "@antfu/eslint-config": "^9.2.0", + "@antfu/ni": "^30.3.0", + "@iconify-json/carbon": "^1.2.25", + "@iconify-json/logos": "^1.2.11", + "@iconify/vue": "^5.0.1", + "@shikijs/transformers": "^4.3.1", + "@shikijs/vitepress-twoslash": "^4.3.1", + "@types/node": "^26.1.2", + "@unocss/reset": "^66.7.5", "@vite-pwa/assets-generator": "^1.0.2", "@vite-pwa/vitepress": "^1.1.0", - "@vitejs/plugin-vue": "^6.0.4", - "@voidzero-dev/vitepress-theme": "^4.8.3", - "eslint": "^10.0.3", + "@vitejs/plugin-vue": "^6.0.8", + "@voidzero-dev/vitepress-theme": "^5.0.4", + "eslint": "^10.8.0", "eslint-factory": "^0.1.2", "https-localhost": "^4.7.1", - "lint-staged": "^16.2.7", + "lint-staged": "^17.3.0", "pathe": "^2.0.3", "simple-git-hooks": "^2.13.1", - "tinyglobby": "^0.2.15", - "tsx": "^4.21.0", - "unocss": "^66.6.6", - "vite": "^7.3.1", - "vite-plugin-pwa": "^1.2.0", + "tinyglobby": "^0.2.17", + "tsx": "^4.23.4", + "unocss": "^66.7.5", + "vite": "^8.2.0", + "vite-plugin-pwa": "^1.3.0", "vitepress": "2.0.0-alpha.16", - "vitepress-plugin-group-icons": "^1.7.1", - "vitepress-plugin-tabs": "^0.8.0", - "vitest": "^4.0.17", - "workbox-window": "^7.4.0" + "vitepress-plugin-group-icons": "^1.7.6", + "vitepress-plugin-tabs": "^0.9.1", + "vitest": "^4.1.10", + "workbox-window": "^7.4.1" }, "simple-git-hooks": { "pre-commit": "pnpm lint-staged" }, "lint-staged": { "*": "eslint --fix" -======= - "@antfu/ni": "^28.3.0", - "@iconify-json/carbon": "catalog:", - "@iconify-json/logos": "catalog:", - "@iconify/vue": "catalog:", - "@shikijs/transformers": "^4.3.1", - "@shikijs/vitepress-twoslash": "^4.3.1", - "@unocss/reset": "catalog:", - "@vite-pwa/assets-generator": "^1.0.2", - "@vite-pwa/vitepress": "^1.1.0", - "@vitejs/plugin-vue": "catalog:", - "@voidzero-dev/vitepress-theme": "^4.8.4", - "https-localhost": "^4.7.1", - "tinyglobby": "catalog:", - "unocss": "catalog:", - "vite": "^6.3.5", - "vite-plugin-pwa": "^1.3.0", - "vitepress": "2.0.0-alpha.16", - "vitepress-plugin-group-icons": "^1.7.5", - "vitepress-plugin-llms": "^1.13.3", - "vitepress-plugin-tabs": "^0.9.1", - "workbox-window": "^7.4.1" ->>>>>>> af8ee5a7fdeaf4d1a1e9d76d7a60f00174c56ed0 } } From 637c76e9b999a1939ca6d171d8f9c9192c69aec0 Mon Sep 17 00:00:00 2001 From: noise Date: Mon, 3 Aug 2026 00:51:15 +0800 Subject: [PATCH 21/22] chore: update dependencies --- api/advanced/vitest.md | 2 +- pnpm-lock.yaml | 3349 ++++++++++++++++++++++++++-------------- 2 files changed, 2222 insertions(+), 1129 deletions(-) diff --git a/api/advanced/vitest.md b/api/advanced/vitest.md index 442a4ff8..732dc615 100644 --- a/api/advanced/vitest.md +++ b/api/advanced/vitest.md @@ -610,7 +610,7 @@ function experimental_parseSpecifications( function experimental_clearCache(): Promise ``` -删除所有 Vitest 缓存,[`fsModuleCache`](/config/fsmodulecache)。 +删除所有 Vitest 缓存,包括 [`fsModuleCache`](/config/fsmodulecache)。 ## experimental_getSourceModuleDiagnostic 4.0.15 {#getsourcemodulediagnostic} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c15e1f8d..35e73d0c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,63 +9,63 @@ importers: .: dependencies: '@vueuse/core': - specifier: ^14.2.1 - version: 14.2.1(vue@3.5.30(typescript@5.9.3)) + specifier: ^14.4.0 + version: 14.4.0(vue@3.5.40(typescript@5.9.3)) vue: - specifier: ^3.5.29 - version: 3.5.30(typescript@5.9.3) + specifier: ^3.5.40 + version: 3.5.40(typescript@5.9.3) devDependencies: '@antfu/eslint-config': - specifier: ^7.6.1 - version: 7.7.3(@typescript-eslint/rule-tester@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/typescript-estree@8.57.1(typescript@5.9.3))(@typescript-eslint/utils@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(@vue/compiler-sfc@3.5.30)(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)(vitest@4.1.0(@types/node@25.5.0)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))) + specifier: ^9.2.0 + version: 9.2.0(@typescript-eslint/typescript-estree@8.65.0(typescript@5.9.3))(@typescript-eslint/utils@8.65.0(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3))(@vue/compiler-sfc@3.5.40)(eslint@10.8.0(jiti@2.6.1))(ts-declaration-location@1.0.7(typescript@5.9.3))(typescript@5.9.3)(vitest@4.1.10(@types/node@26.1.2)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0))) '@antfu/ni': - specifier: ^28.3.0 - version: 28.3.0 + specifier: ^30.3.0 + version: 30.3.0 '@iconify-json/carbon': - specifier: ^1.2.19 - version: 1.2.19 + specifier: ^1.2.25 + version: 1.2.25 '@iconify-json/logos': - specifier: ^1.2.10 - version: 1.2.10 + specifier: ^1.2.11 + version: 1.2.11 '@iconify/vue': - specifier: ^5.0.0 - version: 5.0.0(vue@3.5.30(typescript@5.9.3)) + specifier: ^5.0.1 + version: 5.0.1(vue@3.5.40(typescript@5.9.3)) '@shikijs/transformers': - specifier: ^3.23.0 - version: 3.23.0 + specifier: ^4.3.1 + version: 4.4.1 '@shikijs/vitepress-twoslash': - specifier: ^3.23.0 - version: 3.23.0(typescript@5.9.3) + specifier: ^4.3.1 + version: 4.4.1(typescript@5.9.3) '@types/node': - specifier: ^25.0.3 - version: 25.5.0 + specifier: ^26.1.2 + version: 26.1.2 '@unocss/reset': - specifier: ^66.6.6 - version: 66.6.6 + specifier: ^66.7.5 + version: 66.7.5 '@vite-pwa/assets-generator': specifier: ^1.0.2 version: 1.0.2 '@vite-pwa/vitepress': specifier: ^1.1.0 - version: 1.1.0(@vite-pwa/assets-generator@1.0.2)(vite-plugin-pwa@1.2.0(@vite-pwa/assets-generator@1.0.2)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))(workbox-build@7.4.0)(workbox-window@7.4.0)) + version: 1.1.0(@vite-pwa/assets-generator@1.0.2)(vite-plugin-pwa@1.3.0(@vite-pwa/assets-generator@1.0.2)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0))(workbox-build@7.4.0)(workbox-window@7.4.1)) '@vitejs/plugin-vue': - specifier: ^6.0.4 - version: 6.0.5(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)) + specifier: ^6.0.8 + version: 6.0.8(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)) '@voidzero-dev/vitepress-theme': - specifier: ^4.8.3 - version: 4.8.4(change-case@5.4.4)(focus-trap@7.8.0)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))(vitepress@2.0.0-alpha.16(@types/node@25.5.0)(change-case@5.4.4)(jiti@2.6.1)(lightningcss@1.31.1)(postcss@8.5.8)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)) + specifier: ^5.0.4 + version: 5.0.4(change-case@5.4.4)(focus-trap@7.8.0)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0))(vitepress@2.0.0-alpha.16(@types/node@26.1.2)(change-case@5.4.4)(jiti@2.6.1)(lightningcss@1.33.0)(postcss@8.5.25)(terser@5.46.1)(tsx@4.23.4)(typescript@5.9.3)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)) eslint: - specifier: ^10.0.3 - version: 10.0.3(jiti@2.6.1) + specifier: ^10.8.0 + version: 10.8.0(jiti@2.6.1) eslint-factory: specifier: ^0.1.2 - version: 0.1.2(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + version: 0.1.2(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3) https-localhost: specifier: ^4.7.1 version: 4.7.1 lint-staged: - specifier: ^16.2.7 - version: 16.4.0 + specifier: ^17.3.0 + version: 17.3.0 pathe: specifier: ^2.0.3 version: 2.0.3 @@ -73,55 +73,54 @@ importers: specifier: ^2.13.1 version: 2.13.1 tinyglobby: - specifier: ^0.2.15 - version: 0.2.15 + specifier: ^0.2.17 + version: 0.2.17 tsx: - specifier: ^4.21.0 - version: 4.21.0 + specifier: ^4.23.4 + version: 4.23.4 unocss: - specifier: ^66.6.6 - version: 66.6.6(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) + specifier: ^66.7.5 + version: 66.7.5(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0)) vite: - specifier: ^7.3.1 - version: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) + specifier: ^8.2.0 + version: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0) vite-plugin-pwa: - specifier: ^1.2.0 - version: 1.2.0(@vite-pwa/assets-generator@1.0.2)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))(workbox-build@7.4.0)(workbox-window@7.4.0) + specifier: ^1.3.0 + version: 1.3.0(@vite-pwa/assets-generator@1.0.2)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0))(workbox-build@7.4.0)(workbox-window@7.4.1) vitepress: specifier: 2.0.0-alpha.16 - version: 2.0.0-alpha.16(@types/node@25.5.0)(change-case@5.4.4)(jiti@2.6.1)(lightningcss@1.31.1)(postcss@8.5.8)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) + version: 2.0.0-alpha.16(@types/node@26.1.2)(change-case@5.4.4)(jiti@2.6.1)(lightningcss@1.33.0)(postcss@8.5.25)(terser@5.46.1)(tsx@4.23.4)(typescript@5.9.3)(yaml@2.9.0) vitepress-plugin-group-icons: - specifier: ^1.7.1 - version: 1.7.1(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) + specifier: ^1.7.6 + version: 1.7.6(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0)) vitepress-plugin-tabs: - specifier: ^0.8.0 - version: 0.8.0(vitepress@2.0.0-alpha.16(@types/node@25.5.0)(change-case@5.4.4)(jiti@2.6.1)(lightningcss@1.31.1)(postcss@8.5.8)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)) + specifier: ^0.9.1 + version: 0.9.1(vitepress@2.0.0-alpha.16(@types/node@26.1.2)(change-case@5.4.4)(jiti@2.6.1)(lightningcss@1.33.0)(postcss@8.5.25)(terser@5.46.1)(tsx@4.23.4)(typescript@5.9.3)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)) vitest: - specifier: ^4.0.17 - version: 4.1.0(@types/node@25.5.0)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) + specifier: ^4.1.10 + version: 4.1.10(@types/node@26.1.2)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0)) workbox-window: - specifier: ^7.4.0 - version: 7.4.0 + specifier: ^7.4.1 + version: 7.4.1 packages: - '@antfu/eslint-config@7.7.3': - resolution: {integrity: sha512-BtroDxTvmWtvr3yJkdWVCvwsKlnEdkreoeOyrdNezc/W5qaiQNf2xjcsQ3N5Yy0x27h+0WFfW8rG8YlVioG6dw==} + '@antfu/eslint-config@9.2.0': + resolution: {integrity: sha512-v/j0Pjn6Sj9CxHT8n4nIKI8lg4O/+P4G+Zdbg7u/3J6JaLayxRXsX2Twx0fjpUtoyxW5mdYd67QycVfr1ahirA==} hasBin: true peerDependencies: '@angular-eslint/eslint-plugin': ^21.1.0 '@angular-eslint/eslint-plugin-template': ^21.1.0 '@angular-eslint/template-parser': ^21.1.0 - '@eslint-react/eslint-plugin': ^2.11.0 + '@eslint-react/eslint-plugin': ^5.6.0 '@next/eslint-plugin-next': '>=15.0.0' '@prettier/plugin-xml': ^3.4.1 '@unocss/eslint-plugin': '>=0.50.0' - astro-eslint-parser: ^1.0.2 + astro-eslint-parser: '>=1.0.2' eslint: ^9.10.0 || ^10.0.0 - eslint-plugin-astro: ^1.2.0 + eslint-plugin-astro: '>=1.2.0' eslint-plugin-format: '>=0.1.0' eslint-plugin-jsx-a11y: '>=6.10.2' - eslint-plugin-react-hooks: ^7.0.0 eslint-plugin-react-refresh: ^0.5.0 eslint-plugin-solid: ^0.14.3 eslint-plugin-svelte: '>=2.35.1' @@ -152,8 +151,6 @@ packages: optional: true eslint-plugin-jsx-a11y: optional: true - eslint-plugin-react-hooks: - optional: true eslint-plugin-react-refresh: optional: true eslint-plugin-solid: @@ -172,9 +169,9 @@ packages: '@antfu/install-pkg@1.1.0': resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} - '@antfu/ni@28.3.0': - resolution: {integrity: sha512-JbRijiCNAGcQcyPfV0EXOJYwV27e/srXfTvETqzbbh4jzHBV2pDYiBz8rj5SyzX27aTbCK+qXR3x6g2WKokcrA==} - engines: {node: '>=20'} + '@antfu/ni@30.3.0': + resolution: {integrity: sha512-KkYFVPA1IvC3m+WBKUuY5oxYc4OdXr83jvnlOn8a+bJM10yQMu+slFN/1pDzAw2JZVi+FYP9IYjo4KaPIccMmA==} + engines: {node: '>=20.19.0'} hasBin: true '@apideck/better-ajv-errors@0.3.6': @@ -270,10 +267,18 @@ packages: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.27.1': resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} @@ -291,6 +296,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.29.8': + resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5': resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} engines: {node: '>=6.9.0'} @@ -678,14 +688,20 @@ packages: resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} + engines: {node: '>=6.9.0'} + '@canvas/image-data@1.1.0': resolution: {integrity: sha512-QdObRRjRbcXGmM1tmJ+MrHcaz1MftF2+W7YI+MsphnsCrmtyfS0d5qJbk0MeSbUeyM/jCb0hmnkXPsy026L7dA==} - '@clack/core@1.1.0': - resolution: {integrity: sha512-SVcm4Dqm2ukn64/8Gub2wnlA5nS2iWJyCkdNHcvNHPIeBTGojpdJ+9cZKwLfmqy7irD4N5qLteSilJlE0WLAtA==} + '@clack/core@1.4.3': + resolution: {integrity: sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ==} + engines: {node: '>= 20.12.0'} - '@clack/prompts@1.1.0': - resolution: {integrity: sha512-pkqbPGtohJAvm4Dphs2M8xE29ggupihHdy1x84HNojZuMtFsHiUlRvqD24tM2+XmI+61LlfNceM3Wr7U5QES5g==} + '@clack/prompts@1.7.0': + resolution: {integrity: sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==} + engines: {node: '>= 20.12.0'} '@docsearch/css@4.6.0': resolution: {integrity: sha512-YlcAimkXclvqta47g47efzCM5CFxDwv2ClkDfEs/fC/Ak0OxPH2b3czwa4o8O1TRBf+ujFF2RiUwszz2fPVNJQ==} @@ -696,28 +712,44 @@ packages: '@docsearch/sidepanel-js@4.6.0': resolution: {integrity: sha512-lFT5KLwlzUmpoGArCScNoK41l9a22JYsEPwBzMrz+/ILVR5Ax87UphCuiyDFQWEvEmbwzn/kJx5W/O5BUlN1Rw==} - '@e18e/eslint-plugin@0.2.0': - resolution: {integrity: sha512-mXgODVwhuDjTJ+UT+XSvmMmCidtGKfrV5nMIv1UtpWex2pYLsIM3RSpT8HWIMAebS9qANbXPKlSX4BE7ZvuCgA==} + '@e18e/eslint-plugin@0.5.1': + resolution: {integrity: sha512-mqUozeyNI9xvJbjrOO7y765dT7Kud3bwCm/DHwctxdEngPdJWQaS9BNGgpM1wCCzZfOtlKQh4ZRhm3VRomT9KA==} peerDependencies: eslint: ^9.0.0 || ^10.0.0 - oxlint: ^1.41.0 + oxlint: ^1.68.0 peerDependenciesMeta: eslint: optional: true oxlint: optional: true - '@emnapi/core@1.9.0': - resolution: {integrity: sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==} + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + + '@emnapi/core@2.0.0-alpha.3': + resolution: {integrity: sha512-AZypUeJ/yByuxyS7BlSNRDOMLMlROYtjYdIAuBmJssVz1UJDSeYxLrdizhXCFYhedC5bqd/ASy8EuNXbVVXp9g==} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} '@emnapi/runtime@1.9.0': resolution: {integrity: sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==} - '@emnapi/wasi-threads@1.2.0': - resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} + '@emnapi/runtime@2.0.0-alpha.3': + resolution: {integrity: sha512-hFPAhMUjJD9BSyCANEISPOogeXC9Zo9ZQl7L6vKnaVsMkCtzznaW/naYypeyl0Gv5rYfWYsZbpixTMpjDJzQeA==} - '@es-joy/jsdoccomment@0.84.0': - resolution: {integrity: sha512-0xew1CxOam0gV5OMjh2KjFQZsKL2bByX1+q4j3E73MpYIdyUxcZb/xQct9ccUb+ve5KGUYbCUxyPnYB7RbuP+w==} + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + + '@emnapi/wasi-threads@2.0.1': + resolution: {integrity: sha512-9DsSk+o5NBX0CCJT8s0EROGSGxjR/tKu6aBTaVyq+SjAEQH4XcdcRxPBRzsBLizTTJ49MJjF+jgu3qnO9GLQcQ==} + + '@es-joy/jsdoccomment@0.88.0': + resolution: {integrity: sha512-GK/HL/claLLNo5KG705auIlZMwEtmn88ofSGuLsmVZwKBqMPJhW9DiznYNq07QEqz9BPtA3LBfYImtZmhVvRAw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@es-joy/jsdoccomment@0.91.0': + resolution: {integrity: sha512-vgqlMGNNhZxwDYbUNIHj3Hskb4R28iqdXx90ufHyt/NeuTQkeqjTDslAs9I0/GCAfbxP5BpH5WsL1R1fht5Lxg==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@es-joy/resolve.exports@1.2.0': @@ -730,158 +762,314 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.28.1': + resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.27.4': resolution: {integrity: sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.28.1': + resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.27.4': resolution: {integrity: sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.28.1': + resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.27.4': resolution: {integrity: sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.28.1': + resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.27.4': resolution: {integrity: sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.28.1': + resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.27.4': resolution: {integrity: sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.28.1': + resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.27.4': resolution: {integrity: sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.28.1': + resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.27.4': resolution: {integrity: sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.28.1': + resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.27.4': resolution: {integrity: sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.28.1': + resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.27.4': resolution: {integrity: sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.28.1': + resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.27.4': resolution: {integrity: sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.28.1': + resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.27.4': resolution: {integrity: sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.28.1': + resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.27.4': resolution: {integrity: sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.28.1': + resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.27.4': resolution: {integrity: sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.28.1': + resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.27.4': resolution: {integrity: sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.28.1': + resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.27.4': resolution: {integrity: sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.28.1': + resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.27.4': resolution: {integrity: sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.28.1': + resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.27.4': resolution: {integrity: sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.28.1': + resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.27.4': resolution: {integrity: sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.28.1': + resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.27.4': resolution: {integrity: sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.28.1': + resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.27.4': resolution: {integrity: sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.28.1': + resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openharmony-arm64@0.27.4': resolution: {integrity: sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] + '@esbuild/openharmony-arm64@0.28.1': + resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.27.4': resolution: {integrity: sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.28.1': + resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.27.4': resolution: {integrity: sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.28.1': + resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.27.4': resolution: {integrity: sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.28.1': + resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.27.4': resolution: {integrity: sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-plugin-eslint-comments@4.7.1': - resolution: {integrity: sha512-Ql2nJFwA8wUGpILYGOQaT1glPsmvEwE0d+a+l7AALLzQvInqdbXJdx7aSu0DpUX9dB1wMVBMhm99/++S3MdEtQ==} + '@esbuild/win32-x64@0.28.1': + resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-plugin-eslint-comments@4.7.2': + resolution: {integrity: sha512-LF03qURSwEWm2dz5wtdDCzNk+7Opl0X7q6I3undsaIuNsEiNvRV3BCtqu14Q/6Pzg1tBj44LcxpW2EpSLZStZw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 @@ -905,36 +1093,40 @@ packages: eslint: optional: true - '@eslint/config-array@0.23.3': - resolution: {integrity: sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==} + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/config-helpers@0.5.3': - resolution: {integrity: sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw==} + '@eslint/config-helpers@0.5.5': + resolution: {integrity: sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/core@0.17.0': - resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-helpers@0.7.0': + resolution: {integrity: sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/core@1.1.1': resolution: {integrity: sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/markdown@7.5.1': - resolution: {integrity: sha512-R8uZemG9dKTbru/DQRPblbJyXpObwKzo8rv1KYGGuPUPtjM4LXBYM9q5CIZAComzZupws3tWbDwam5AFpPLyJQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/object-schema@3.0.3': - resolution: {integrity: sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==} + '@eslint/css-tree@4.0.5': + resolution: {integrity: sha512-iPmijIAq4hlIJB86PYmY/fcZORHtjphSqICDbwuw32A/JmkhZQ/K/6TjHE03zqf3n5yABpVcbRAMG8Mi9ojy8g==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/plugin-kit@0.4.1': - resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/markdown@8.0.3': + resolution: {integrity: sha512-rBTSSShrq7e4O+PWfeE4azH4/CWPNrC+VGxBXiW00o3vYVJnznsZiDayj3KC9JztIMVRZxZHn2nrDIUau/4j7A==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/plugin-kit@0.6.1': - resolution: {integrity: sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==} + '@eslint/plugin-kit@0.7.2': + resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@floating-ui/core@1.7.5': @@ -968,28 +1160,28 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@iconify-json/carbon@1.2.19': - resolution: {integrity: sha512-l89XjtEeSA5fxlxPTNSU9AA+rxaz/Dn0X/ux0/3awR+tAayY8iJqWQu3AKxhchfx3LB/fX1Nv3ZppZzrBAt7aA==} + '@iconify-json/carbon@1.2.25': + resolution: {integrity: sha512-7GLgXnmi47Skh8DcPPiP8U3vgm3rOVziEe+flCdG/kwiVaeb649U3Eqt/ej4f3NvlZK8BrOxpR3xQlWFLZYblQ==} - '@iconify-json/logos@1.2.10': - resolution: {integrity: sha512-qxaXKJ6fu8jzTMPQdHtNxlfx6tBQ0jXRbHZIYy5Ilh8Lx9US9FsAdzZWUR8MXV8PnWTKGDFO4ZZee9VwerCyMA==} + '@iconify-json/logos@1.2.11': + resolution: {integrity: sha512-fOo4pGEatuyuCFNL+cwquYMa2Im0oJHRHV7lt/Qqs5Ode/lPImHCQcfTtPzZj7qYMPb/h8YHN3TG54uEowrjNQ==} '@iconify-json/simple-icons@1.2.74': resolution: {integrity: sha512-yqaohfY6jnYjTVpuTkaBQHrWbdUrQyWXhau0r/0EZiNWYXPX/P8WWwl1DoLH5CbvDjjcWQw5J0zADhgCUklOqA==} - '@iconify-json/vscode-icons@1.2.45': - resolution: {integrity: sha512-ow+ueibMIq79ueM1kv6cOWgHx8jfh1XJQi2RrqMHb4HLbvIBlxpy5PCMvOJXlA68R6fBAHpWQeh6uWx7VKEVsA==} + '@iconify-json/vscode-icons@1.2.68': + resolution: {integrity: sha512-AG8aMOGv+dzQI50oOD9zMqvh/pnlhb8F2HR2FcKDN7qIZt4wFaUTxKAOtt49EskGdOl8z8Ll1vteUI060jCbDw==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - '@iconify/utils@3.1.0': - resolution: {integrity: sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==} + '@iconify/utils@3.1.4': + resolution: {integrity: sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw==} - '@iconify/vue@5.0.0': - resolution: {integrity: sha512-C+KuEWIF5nSBrobFJhT//JS87OZ++QDORB6f2q2Wm6fl2mueSTpFBeBsveK0KW9hWiZ4mNiPjsh6Zs4jjdROSg==} + '@iconify/vue@5.0.1': + resolution: {integrity: sha512-aumwwooJlFJ5H5qYWB6ZTAyM0C8hpfcSVLB9/a3qnH1GGvIJ+FEbpEs4s/HfErYe/M5qZeLjwmESR5fFm3lXEw==} peerDependencies: - vue: '>=3' + vue: '>=3.0.0' '@img/sharp-darwin-arm64@0.33.5': resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} @@ -1125,134 +1317,141 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@napi-rs/wasm-runtime@1.1.1': - resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + '@napi-rs/wasm-runtime@1.2.2': + resolution: {integrity: sha512-JfB4kuJQjaoHuCTseIINHtHWeJnvgEcxjwA5t/Y00ZgaOO1Crz3fjT/p8kT28zA/Caz7oiUMn3d6H2yOVCVwuw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} + peerDependencies: + '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.3 + '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.3 '@ota-meshi/ast-token-store@0.3.0': resolution: {integrity: sha512-XRO0zi2NIUKq2lUk3T1ecFSld1fMWRKE6naRFGkgkdeosx7IslyUKNv5Dcb5PJTja9tHJoFu0v/7yEpAkrkrTg==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@oxc-parser/binding-android-arm-eabi@0.115.0': - resolution: {integrity: sha512-VoB2rhgoqgYf64d6Qs5emONQW8ASiTc0xp+aUE4JUhxjX+0pE3gblTYDO0upcN5vt9UlBNmUhAwfSifkfre7nw==} + '@oxc-parser/binding-android-arm-eabi@0.131.0': + resolution: {integrity: sha512-t2xicr9pfzkSRYx5aPqZqlLaayIwJTqgQ81Jor31Xep2nGyL2Aq3d0K5wOfeR7VevaSdxaS9dzSQP9xDwn8fDg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxc-parser/binding-android-arm64@0.115.0': - resolution: {integrity: sha512-lWRX75u+gqfB4TF3pWCHuvhaeneAmRl2b2qNBcl4S6yJ0HtnT4VXOMEZrq747i4Zby1ZTxj6mtOe678Bg8gRLw==} + '@oxc-parser/binding-android-arm64@0.131.0': + resolution: {integrity: sha512-nlGIod6gw75x1aEDgLS+srj+JRGY0HHm9MI9YgzE/B64l6d6+H3MSP9NOgp0+HTg8tp4vV9rVfgQGgd+TfVZcA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxc-parser/binding-darwin-arm64@0.115.0': - resolution: {integrity: sha512-ii/oOZjfGY1aszXTy29Z5DRyCEnBOrAXDVCvfdfXFQsOZlbbOa7NMHD7D+06YFe5qdxfmbWAYv4yn6QJi/0d2g==} + '@oxc-parser/binding-darwin-arm64@0.131.0': + resolution: {integrity: sha512-jukuV6xe5RbQKFo7QD34NDCLDZp4PSOm8rmckhNdH/60ymG5zXbDzGBEyc+nTkuLQNama2aSGCt+CPfpjNTqyw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxc-parser/binding-darwin-x64@0.115.0': - resolution: {integrity: sha512-R/sW/p8l77wglbjpMcF+h/3rWbp9zk1mRP3U14mxTYIC2k3m+aLBpXXgk2zksqf9qKk5mcc4GIYsuCn9l8TgDg==} + '@oxc-parser/binding-darwin-x64@0.131.0': + resolution: {integrity: sha512-g3JOo4khe9rslHm5WYaVDWb0HS/M1MLR3I9S8560MkKIcC96VQY00QjOlsuRyfSj/JDXj8i9T7ryPO2RidiXVg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxc-parser/binding-freebsd-x64@0.115.0': - resolution: {integrity: sha512-CSJ5ldNm9wIGGkhaIJeGmxRMZbgxThRN+X1ufYQQUNi5jZDV/U3C2QDMywpP93fczNBj961hXtcUPO/oVGq4Pw==} + '@oxc-parser/binding-freebsd-x64@0.131.0': + resolution: {integrity: sha512-1hziITDTxjMePnX+dR9ocVT+EuZkQ8wm4FPAbmbEiKG+Phbo73J1ZnPAA6Y/aGsWF3McOFnQuZIktAFwalkfJQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxc-parser/binding-linux-arm-gnueabihf@0.115.0': - resolution: {integrity: sha512-uWFwssE5dHfQ8lH+ktrsD9JA49+Qa0gtxZHUs62z1e91NgGz6O7jefHGI6aygNyKNS45pnnBSDSP/zV977MsOQ==} + '@oxc-parser/binding-linux-arm-gnueabihf@0.131.0': + resolution: {integrity: sha512-9uRxfXwyKG9+MwmGQBo2ncPNwZH5HTmCETFM2WiuDBNDCW4NC5ttSQkwCAMrTAWgwMzVBH1CP8pM0v7nebCWXQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxc-parser/binding-linux-arm-musleabihf@0.115.0': - resolution: {integrity: sha512-fZbqt8y/sKQ+v6bBCuv/mYYFoC0+fZI3mGDDEemmDOhT78+aUs2+4ZMdbd2btlXmnLaScl37r8IRbhnok5Ka9w==} + '@oxc-parser/binding-linux-arm-musleabihf@0.131.0': + resolution: {integrity: sha512-mgbLvzRShXOLBdWGInf08Af4q+pfj1xD8hSgLClDZ9of/BXkB6+LIhTH7fihiDUipqB3yoSkKBWaZ3Ejlf5Yag==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxc-parser/binding-linux-arm64-gnu@0.115.0': - resolution: {integrity: sha512-1ej/MjuTY9tJEunU/hUPIFmgH5PqgMQoRjNOvOkibtJ3Zqlw/+Lc+HGHDNET8sjbgIkWzdhX+p4J96A5CPdbag==} + '@oxc-parser/binding-linux-arm64-gnu@0.131.0': + resolution: {integrity: sha512-OPT8++4aN6j2GJ8+3IZHS/byXoZP4aSBn+FoG6rgBJ2fKwPKXWF3MqrFMNW7NKHM28FLY579xYLxJSfgobEqPA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@oxc-parser/binding-linux-arm64-musl@0.115.0': - resolution: {integrity: sha512-HjsZbJPH9mMd4swJRywVMsDZsJX0hyKb1iNHo5ijRl5yhtbO3lj7ImSrrL1oZ1VEg0te4iKmDGGz/6YPLd1G8w==} + '@oxc-parser/binding-linux-arm64-musl@0.131.0': + resolution: {integrity: sha512-vtPiwmfVTAXzaxDKsOXG+LwgRAA7WEnaeHzhS5z0GE89gAK18KSXnly7Z6saXXq6L3dVMyK44uoTI03zKxrpmw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@oxc-parser/binding-linux-ppc64-gnu@0.115.0': - resolution: {integrity: sha512-zhhePoBrd7kQx3oClX/W6NldsuCbuMqaN9rRsY+6/WoorAb4j490PG/FjqgAXscWp2uSW2WV9L+ksn0wHrvsrg==} + '@oxc-parser/binding-linux-ppc64-gnu@0.131.0': + resolution: {integrity: sha512-8AW8L7w5cGHSdZPcyZX2yR0+GUODsT15rbRjfdD54rv6DMbtuEB19ysLOpKJlRGfH6UNYNpCHaU1uJWgTWf1/w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] - '@oxc-parser/binding-linux-riscv64-gnu@0.115.0': - resolution: {integrity: sha512-t/IRojvUE9XrKu+/H1b8YINug+7Q6FLls5rsm2lxB5mnS8GN/eYAYrPgHkcg9/1SueRDSzGpDYu3lGWTObk1zw==} + '@oxc-parser/binding-linux-riscv64-gnu@0.131.0': + resolution: {integrity: sha512-vvpjkjEOUsPcsYf8evE4MO3aGx9+3wodXEBOicGNnOwTuAik8eBONNkgSdhkGsAblQmfVHJyanRnpxglddTXIA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] - '@oxc-parser/binding-linux-riscv64-musl@0.115.0': - resolution: {integrity: sha512-79jBHSSh/YpQRAmvYoaCfpyToRbJ/HBrdB7hxK2ku2JMehjopTVo+xMJss/RV7/ZYqeezgjvKDQzapJbgcjVZA==} + '@oxc-parser/binding-linux-riscv64-musl@0.131.0': + resolution: {integrity: sha512-AqmcNC3fClXX+fxQ6VGEN1667xVFiRBkY0CZmDMSiaeFUsv1+UkBPYYi48IUKcA9/ivvoKNRzQl2I4//kT9F/w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] - '@oxc-parser/binding-linux-s390x-gnu@0.115.0': - resolution: {integrity: sha512-nA1TpxkhNTIOMMyiSSsa7XIVJVoOU/SsVrHIz3gHvWweB5PHCQfO7w+Lb2EP0lBWokv7HtA/KbF7aLDoXzmuMw==} + '@oxc-parser/binding-linux-s390x-gnu@0.131.0': + resolution: {integrity: sha512-7d3jOMKy7RSQCcDLIci+ySll2FgsOMl/GiRux4q2JNv0zg4EdhFISa9idvrdN/HEUIQQJNg6dmveUeJl2YErGA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] - '@oxc-parser/binding-linux-x64-gnu@0.115.0': - resolution: {integrity: sha512-9iVX789DoC3SaOOG+X6NcF/tVChgLp2vcHffzOC2/Z1JTPlz6bMG2ogvcW6/9s0BG2qvhNQImd+gbWYeQbOwVw==} + '@oxc-parser/binding-linux-x64-gnu@0.131.0': + resolution: {integrity: sha512-JHK/h95qVqVQ+ITER837kcTdwBDFpFaNnOTYGCP0zdUSX/mLKC7tXOoyrTb6vG7iRPwGlcgBil3v2IjYw1FqJA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@oxc-parser/binding-linux-x64-musl@0.115.0': - resolution: {integrity: sha512-RmQmk+mjCB0nMNfEYhaCxwofLo1Z95ebHw1AGvRiWGCd4zhCNOyskgCbMogIcQzSB3SuEKWgkssyaiQYVAA4hQ==} + '@oxc-parser/binding-linux-x64-musl@0.131.0': + resolution: {integrity: sha512-b2BO82O8azXAyf7EUgOPKu145nWypbNyk07HbU09fkzhm9lEA5oPvaN/M8Nlo7tOErVTa2WOgS4QbOnxAPXdDQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@oxc-parser/binding-openharmony-arm64@0.115.0': - resolution: {integrity: sha512-viigraWWQhhDvX5aGq+wrQq58k00Xq3MHz/0R4AFMxGlZ8ogNonpEfNc73Q5Ly87Z6sU9BvxEdG0dnYTfVnmew==} + '@oxc-parser/binding-openharmony-arm64@0.131.0': + resolution: {integrity: sha512-GHO9glZaX7LkX/OGfluEPf1yjg+ehiFbUdowbX6uNWOQhmwKWU4m4+nZ9FJkrHNKuxyI1KKertMdGjVKCApKWA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxc-parser/binding-wasm32-wasi@0.115.0': - resolution: {integrity: sha512-IzGCrMwXhpb4kTXy/8lnqqqwjI7eOvy+r9AhVw+hsr8t1ecBBEHprcNy0aKatFHN6hsX7UMHHQmBAQjVvL/p1A==} - engines: {node: '>=14.0.0'} + '@oxc-parser/binding-wasm32-wasi@0.131.0': + resolution: {integrity: sha512-3SkikPaEFoih1N83qLVEDLRLeY4nYsf6JT9SnWiMCQ5lGQdKup6bEuKCqkRiG9dD1IIaFeYz9RjlciPmYoFIWA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@oxc-parser/binding-win32-arm64-msvc@0.115.0': - resolution: {integrity: sha512-/ym+Absk/TLFvbhh3se9XYuI1D7BrUVHw4RaG/2dmWKgBenrZHaJsgnRb7NJtaOyjEOLIPtULx1wDdVL0SX2eg==} + '@oxc-parser/binding-win32-arm64-msvc@0.131.0': + resolution: {integrity: sha512-Os5bEhryeA2jkH+ZrnZyAC1EP5gs+X4YB1Fjqml7UPD5kU7ecsK1MPEVMfCrdt/GDNpDbavYXiOXOdyJ5b3OPw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxc-parser/binding-win32-ia32-msvc@0.115.0': - resolution: {integrity: sha512-AQSZjIR+b+Te7uaO/hGTMjT8/oxlYrvKrOTi4KTHF/O6osjHEatUQ3y6ZW2+8+lJxy20zIcGz6iQFmFq/qDKkg==} + '@oxc-parser/binding-win32-ia32-msvc@0.131.0': + resolution: {integrity: sha512-m+jNz9EuF0NXoiptc6B9h5yompZQVW/a5MJeOu5zojfH5yWk82tvF2ccrHkfhgtrS9h9DD5l1Qv8dWlfY7Nz8g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxc-parser/binding-win32-x64-msvc@0.115.0': - resolution: {integrity: sha512-oxUl82N+fIO9jIaXPph8SPPHQXrA08BHokBBJW8ct9F/x6o6bZE6eUAhUtWajbtvFhL8UYcCWRMba+kww6MBlA==} + '@oxc-parser/binding-win32-x64-msvc@0.131.0': + resolution: {integrity: sha512-o14Hk8dAyiEUMFEWEgmAwFZvBt1RzAYLM3xeQ+5315JXgVYhoemivgYcbYVRbsFkS71ShMGlAFE0kPnr460rww==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxc-project/types@0.115.0': - resolution: {integrity: sha512-4n91DKnebUS4yjUHl2g3/b2T+IUdCfmoZGhmwsovZCDaJSs+QkVAM+0AqqTxHSsHfeiMuueT75cZaZcT/m0pSw==} + '@oxc-project/types@0.131.0': + resolution: {integrity: sha512-PgnWDfV0h+b16XNKbXU7Daib/BFSt/J2mEzfYIBu6JB/wNdlU+kVYXCkGA1A9fWkTbOgbjh4e6NhPeQOYvFhEA==} + + '@oxc-project/types@0.142.0': + resolution: {integrity: sha512-7W+2q5AKQVU36fkaryontrHn3YDt1RyUYXatw9i5H8ocYe2sPKSFB6eS8WNPeRKiN1qAWWZUPm7gwFzJGrccqQ==} '@pkgr/core@0.2.9': resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} @@ -1267,8 +1466,96 @@ packages: '@rive-app/canvas-lite@2.35.3': resolution: {integrity: sha512-C4xU4v0G2sXbtQnv0D01I1+mb4JaQ0atb5QiKxq5gnxH9ZeJzaBbf3xZuuJhnDycdHbIc6RHUIuvIaUKzyA63w==} - '@rolldown/pluginutils@1.0.0-rc.2': - resolution: {integrity: sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==} + '@rolldown/binding-android-arm64@1.2.1': + resolution: {integrity: sha512-02hOeOSryYxVrOIphmLAsqnCJWxwlzFk+pEt/N/i6OgT3lShHO7xGCU5cpgchRDHboAEbSjzgGh+O/u1GswQmA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.2.1': + resolution: {integrity: sha512-fMsTOnN0OjFm3CyppWPitKnc8UlliVARUULW6cfU6AIqjdtgmSFWSk9vecHzZduv/yMWIHDlRhM1e8Iff9uAfA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.2.1': + resolution: {integrity: sha512-1wjKdz/XLGKHaTNHjQveQ/B23TKx4ItAqm1JbyVuvNPc4Ze0Fb48s49TAd/2zcplPl8okE/UbTgmlVfwT7eFeQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.2.1': + resolution: {integrity: sha512-Fa0jHR07E7YBN4vOEsbVf2briYNsuOowfLJaXULZM0ldMlaCaj2LJgLMbMe4iacRyZmvR8efFhgR9wKuGclQUg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.2.1': + resolution: {integrity: sha512-pzkgu1SSHGgRRyRZ4fbmSgmajbVt+epaLP99NDjFft69v/ypfTi6swBMiVdh2EkQ0OSnHE1lZDM7DRGkyAzUpA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.2.1': + resolution: {integrity: sha512-QI5SEDY8cbiYWHx0VO4vIc3UlS6a32vXHjU8Qy/17adEmZIPuByJg13UEvo9c/UCiUkdcVWY83C+b+JrwnNyUg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.2.1': + resolution: {integrity: sha512-Sm41FyCeXqmYcERoYOCbGIL5hNfd8w9LQ7Y61Bev48HkcjaJqV/iiVOaiDxjVTRMS+QKrZmD8cfPt4uMVnvM+A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-ppc64-gnu@1.2.1': + resolution: {integrity: sha512-2x+WhXTGl9yJYPbltW/BSEPTVz9OIWQyER4N+gJEDWkkn904eRcBzELqh/Hf7K0w/ubGbKNMv0ZC+94QK/IFEg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@rolldown/binding-linux-s390x-gnu@1.2.1': + resolution: {integrity: sha512-eEjmQpuRQayHPWWnywaWHkFT3ToPbP3RYy42VVd/B9aBGDA+Ol25EIWHxKQST3IiWJjikCWUF7KtbfqwZrzVwQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.2.1': + resolution: {integrity: sha512-/Orga1fZYkLc/56jBICcHrKchl8Z2UKdDSr3LG9ToWO1lQ6a4Livk9Xz+9WN91zsz5QR3XQz2NNoSDEvP6qadw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.2.1': + resolution: {integrity: sha512-xxBJRL+0q0Kce7orznGWLuylHDY65vuARXZRpX+hPdv+DqK2c3NlCsVA98tlWzWNEE7yPqA/1NQ5nnCrj49Y5A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.2.1': + resolution: {integrity: sha512-M6AdXIXw3s+/8XpKMzdGDEXGS1S7kwUsy+rcTIUIOx5Ge4nXKCtAFHFV9YKkXvGcC5WMoTjAteLzlsQROVI0Yw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.2.1': + resolution: {integrity: sha512-/TX0SoRGojHzSAHpfVBbavRVSazg5U3h3Y3VXfcc0cdugq6kxdqw8LPGFiPr+/7gE/60zRcsOY2Vi9b9eT0jww==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} + + '@rolldown/binding-win32-arm64-msvc@1.2.1': + resolution: {integrity: sha512-EvRrivJieyHG+AO9lleZWgq+g0+S7oV2C51yuqlcyU/R9net+sI4Pj0F+lUoP2bEr6TWX3SqFaaS0SzfLxSzkw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.2.1': + resolution: {integrity: sha512-Z4eCmn5QJ/5+azF9knpLWKfVd9aidn0mAe9TpJgvBLId9Ax3t0+JVxBmT25Bv7NBbVW1TZyKjQjQReouMeH5UQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} '@rollup/plugin-babel@5.3.1': resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} @@ -1447,31 +1734,65 @@ packages: '@shikijs/core@3.23.0': resolution: {integrity: sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==} + '@shikijs/core@4.4.1': + resolution: {integrity: sha512-VeR2CY6Nn9/WbisoYLOQZ7HZOnwTrpBuOw4wExjqLnBCi62BNWynBUO6K2uPIASPFJwAv7cX1fUu+LrPlSstcw==} + engines: {node: '>=20'} + '@shikijs/engine-javascript@3.23.0': resolution: {integrity: sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==} + '@shikijs/engine-javascript@4.4.1': + resolution: {integrity: sha512-6U4lJBh8LTvIkEVqRHv/rr3ruwtO6IweFQt1ME1ntHJMGHS+6N86vfYGO1o8c/DtOCTia2lfhdQBtBrps1sDfQ==} + engines: {node: '>=20'} + '@shikijs/engine-oniguruma@3.23.0': resolution: {integrity: sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==} + '@shikijs/engine-oniguruma@4.4.1': + resolution: {integrity: sha512-p23RugMKss0r5DAtRJW1yAXUDl60JvhQYV20yuxei//26JyDSJefV3umyWzzwep2weblMnJGDYahuti6XkcMgA==} + engines: {node: '>=20'} + '@shikijs/langs@3.23.0': resolution: {integrity: sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==} + '@shikijs/langs@4.4.1': + resolution: {integrity: sha512-xb2kCMloBCIraIy2fS5MW0t/BxVY3q2nDyQKBoeSeq6KNrQbShHetCFlw2n35fGIJ6t3+hXDLQogP5ir9O9bvA==} + engines: {node: '>=20'} + + '@shikijs/primitive@4.4.1': + resolution: {integrity: sha512-ko2OfDoG89YuQ7xL5LtcQiWKb7NIv1Ephb7g48TVU198OzAMLC8lXVEwaJGHK4sUMYrfAGJDqYmNLOLiW/Kz8w==} + engines: {node: '>=20'} + '@shikijs/themes@3.23.0': resolution: {integrity: sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==} + '@shikijs/themes@4.4.1': + resolution: {integrity: sha512-wudOaoFro+/Zl9gQv2W1Ur5XlVduqvTuYLI483Xi0wgc1A+cy1hfB2r6ac6ufBgF+ID7KJEW7L41MHrzQ4wH+w==} + engines: {node: '>=20'} + '@shikijs/transformers@3.23.0': resolution: {integrity: sha512-F9msZVxdF+krQNSdQ4V+Ja5QemeAoTQ2jxt7nJCwhDsdF1JWS3KxIQXA3lQbyKwS3J61oHRUSv4jYWv3CkaKTQ==} - '@shikijs/twoslash@3.23.0': - resolution: {integrity: sha512-pNaLJWMA3LU7PhT8tm9OQBZ1epy0jmdgeJzntBtr1EVXLbHxGzTj3mnf9vOdcl84l96qnlJXkJ/NGXZYBpXl5g==} + '@shikijs/transformers@4.4.1': + resolution: {integrity: sha512-Sb9Eehas+5EhClpFgNuklwY3aWf354FLaKRCiAWmjdNbHAjoQUpv6WmSj+N19eTXO6GLIWh1dIOH9dxyauhVWw==} + engines: {node: '>=20'} + + '@shikijs/twoslash@4.4.1': + resolution: {integrity: sha512-FDv09P7ZYrJpzrJ8LnoT8KZa8ZuWZqAsqWzkVkqExuce9ZsgRZ1966KgniSZM2YJMWudKgNIeadl1TsuBFrVhg==} + engines: {node: '>=20'} peerDependencies: typescript: '>=5.5.0' '@shikijs/types@3.23.0': resolution: {integrity: sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==} - '@shikijs/vitepress-twoslash@3.23.0': - resolution: {integrity: sha512-CnNsKIxxkRxRkL5+m6TNPit563TYfEEqlod8C6N1rfeZvX4xUlRrpoKyoWKmpGSNyjWWeYpMZTUH18YTTOxKfw==} + '@shikijs/types@4.4.1': + resolution: {integrity: sha512-GOwCLQDHM5EjGUWNPrhzJbr6JP8V/Dx/CDVkWvbZ1Avw5JFnNUckrgbLmE07qtg4WlW7Q7QFndhjIkeU9XMPvw==} + engines: {node: '>=20'} + + '@shikijs/vitepress-twoslash@4.4.1': + resolution: {integrity: sha512-8mclYzjBm5hRUjbvq6g3cjLCITqAd8+Eac/cefYCwwqdClyBEqJmilNkJ7ZG2ndYS/P14STTU2TED1ZdzpbG0g==} + engines: {node: '>=20'} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} @@ -1598,8 +1919,8 @@ packages: peerDependencies: vue: ^2.7.0 || ^3.0.0 - '@tybys/wasm-util@0.10.1': - resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -1619,12 +1940,21 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/hast@3.0.5': + resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/katex@0.16.8': + resolution: {integrity: sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==} + '@types/linkify-it@5.0.0': resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} @@ -1640,8 +1970,8 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@25.5.0': - resolution: {integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==} + '@types/node@26.1.2': + resolution: {integrity: sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg==} '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} @@ -1655,20 +1985,20 @@ packages: '@types/web-bluetooth@0.0.21': resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} - '@typescript-eslint/eslint-plugin@8.57.1': - resolution: {integrity: sha512-Gn3aqnvNl4NGc6x3/Bqk1AOn0thyTU9bqDRhiRnUWezgvr2OnhYCWCgC8zXXRVqBsIL1pSDt7T9nJUe0oM0kDQ==} + '@typescript-eslint/eslint-plugin@8.65.0': + resolution: {integrity: sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.57.1 + '@typescript-eslint/parser': ^8.65.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.57.1': - resolution: {integrity: sha512-k4eNDan0EIMTT/dUKc/g+rsJ6wcHYhNPdY19VoX/EOtaAG8DLtKCykhrUnuHPYvinn5jhAPgD2Qw9hXBwrahsw==} + '@typescript-eslint/parser@8.65.0': + resolution: {integrity: sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' '@typescript-eslint/project-service@8.57.1': resolution: {integrity: sha512-vx1F37BRO1OftsYlmG9xay1TqnjNVlqALymwWVuYTdo18XuKxtBpCj1QlzNIEHlvlB27osvXFWptYiEWsVdYsg==} @@ -1676,39 +2006,59 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/rule-tester@8.57.1': - resolution: {integrity: sha512-gk0q0rLa7a1uEB0iD2t1GZELK1z6HfudiKYeSVhjQ5gW5FdL0OcZ+8f09Lg7NbmHSBF3V+S9BDuw0qoCFkHR+w==} + '@typescript-eslint/project-service@8.65.0': + resolution: {integrity: sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' '@typescript-eslint/scope-manager@8.57.1': resolution: {integrity: sha512-hs/QcpCwlwT2L5S+3fT6gp0PabyGk4Q0Rv2doJXA0435/OpnSR3VRgvrp8Xdoc3UAYSg9cyUjTeFXZEPg/3OKg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.65.0': + resolution: {integrity: sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/tsconfig-utils@8.57.1': resolution: {integrity: sha512-0lgOZB8cl19fHO4eI46YUx2EceQqhgkPSuCGLlGi79L2jwYY1cxeYc1Nae8Aw1xjgW3PKVDLlr3YJ6Bxx8HkWg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.57.1': - resolution: {integrity: sha512-+Bwwm0ScukFdyoJsh2u6pp4S9ktegF98pYUU0hkphOOqdMB+1sNQhIz8y5E9+4pOioZijrkfNO/HUJVAFFfPKA==} + '@typescript-eslint/tsconfig-utils@8.65.0': + resolution: {integrity: sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/type-utils@8.65.0': + resolution: {integrity: sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' '@typescript-eslint/types@8.57.1': resolution: {integrity: sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.65.0': + resolution: {integrity: sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.57.1': resolution: {integrity: sha512-ybe2hS9G6pXpqGtPli9Gx9quNV0TWLOmh58ADlmZe9DguLq0tiAKVjirSbtM1szG6+QH6rVXyU6GTLQbWnMY+g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/typescript-estree@8.65.0': + resolution: {integrity: sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/utils@8.57.1': resolution: {integrity: sha512-XUNSJ/lEVFttPMMoDVA2r2bwrl8/oPx8cURtczkSEswY5T3AeLmCy+EKWQNdL4u0MmAHOjcWrqJp2cdvgjn8dQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1716,10 +2066,21 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@8.65.0': + resolution: {integrity: sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/visitor-keys@8.57.1': resolution: {integrity: sha512-YWnmJkXbofiz9KbnbbwuA2rpGkFPLbAIetcCNO6mJ8gdhdZ/v7WDXsoGFAJuM6ikUFKTlSQnjWnVO4ux+UzS6A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.65.0': + resolution: {integrity: sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript/vfs@1.6.4': resolution: {integrity: sha512-PJFXFS4ZJKiJ9Qiuix6Dz/OwEIqHD7Dme1UwZhTK11vR+5dqW2ACbdndWQexBzCx+CPuMe5WBYQWCsFyGlQLlQ==} peerDependencies: @@ -1727,78 +2088,76 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + deprecated: Potential CWE-502 - Update to 1.3.1 or higher - '@unocss/cli@66.6.6': - resolution: {integrity: sha512-78SY8j4hAVelK+vP/adsDGaSjEITasYLFECJLHWxUJSzK+G9UIc5wtL/u4jA+zKvwVkHcDvbkcO5K6wwwpAixg==} - engines: {node: '>=14'} + '@unocss/cli@66.7.5': + resolution: {integrity: sha512-fgWkECRn2LGVo9sEpmjk/KJ3NSKUDitaZCNrJcEYM93DG+ELriTHcL+VWBlF4rcZf9fdGlq1nKbbRHUZirFCHQ==} hasBin: true - '@unocss/config@66.6.6': - resolution: {integrity: sha512-menlnkqAFX/4wR2aandY8hSqrt01JE+rOzvtQxWaBt8kf1du62b0sS72FE5Z40n6HlEsEbF91N9FCfhnzG6i6g==} - engines: {node: '>=14'} + '@unocss/config@66.7.5': + resolution: {integrity: sha512-dkPl9glhEahJ+Xoja5ZseKKnH+vZaeaKQzg8b0otcKcPPNrHQgu1nu3QgfeOjnXOGrjZIotHwUeVtt4ZA2Skgg==} - '@unocss/core@66.6.6': - resolution: {integrity: sha512-Sbbx0ZQqmV8K2lg8E+z9MJzWb1MgRtJnvqzxDIrNuBjXasKhbcFt5wEMBtEZJOr63Z4ck0xThhZK53HmYT2jmg==} + '@unocss/core@66.7.5': + resolution: {integrity: sha512-UdJb8MiMywcau8QrWEVgUAz0kvoFHyR+sACwYCgmBh/BpKJGyR/zw/Ys3wvysbm0f+i/20VGBex/QQxYVlzdyQ==} - '@unocss/extractor-arbitrary-variants@66.6.6': - resolution: {integrity: sha512-uMzekF2miZRUwSZGvy3yYQiBAcSAs9LiXK8e3NjldxEw8xcRDWgTErxgStRoBeAD6UyzDcg/Cvwtf2guMbtR+g==} + '@unocss/extractor-arbitrary-variants@66.7.5': + resolution: {integrity: sha512-5zOkbnLIJc8E749qNjLXfPHl3FdHloop12h706/ojr6idK4ix0KLm43R//uLnphixCehdHJRuHnavnM4C/kQbA==} - '@unocss/inspector@66.6.6': - resolution: {integrity: sha512-CpXIsqHwxCXJtUjUz6S29diHCIA+EJ1u5WML/6m2YPI4ObgWAVKrExy09inSg2icS52lFkWWdWQSeqc9kl5W6Q==} + '@unocss/inspector@66.7.5': + resolution: {integrity: sha512-WmTJMnj8bmRxvw/wGeShmL2eEHr2/L0BdGTXSxhfzwcO8y5XZEbBmVciLcM7pqaTXQ6JY4+KnITrDUf1urjZxQ==} - '@unocss/preset-attributify@66.6.6': - resolution: {integrity: sha512-3H12UI1rBt60PQy+S4IEeFYWu1/WQFuc2yhJ5mu/RCvX5/qwlIGanBpuh+xzTPXU1fWBlZN68yyO9uWOQgTqZQ==} + '@unocss/preset-attributify@66.7.5': + resolution: {integrity: sha512-1Oi1Cp81pqYJwG3h4+OlP5A0FKyaa07MFBXaXc4Yr3faiTbsI8SKj2TqnZCb+NQvBsEqslEd+jKXGZ3lKzCVOQ==} - '@unocss/preset-icons@66.6.6': - resolution: {integrity: sha512-HfIEEqf3jyKexOB2Sux556n0NkPoUftb2H4+Cf7prJvKHopMkZ/OUkXjwvUlxt1e5UpAEaIa0A2Ir7+ApxXoGA==} + '@unocss/preset-icons@66.7.5': + resolution: {integrity: sha512-ZsxadWnGGtHdANTikuMnjkQaT1qwUFJHZBF4fzVsPMnUiiKGs8rzXukwM9w3Gi9ontM7nbG2FYi9clWETSlpFg==} - '@unocss/preset-mini@66.6.6': - resolution: {integrity: sha512-k+/95PKMPOK57cJcSmz34VkIFem8BlujRRx6/L0Yusw7vLJMh98k0rPhC5s+NomZ/d9ZPgbNylskLhItJlak3w==} + '@unocss/preset-mini@66.7.5': + resolution: {integrity: sha512-o37TSl4ecT0dKu+3/TYuTYht75h82SEwDNl476m9ve0KW4Pv1O2tT/9TWd7N5cutEpySr8/YtjMwtWBD+drxBg==} - '@unocss/preset-tagify@66.6.6': - resolution: {integrity: sha512-KgBXYPYS0g4TVC3NLiIB78YIqUlvDLanz1EHIDo34rOTUfMgY8Uf5VuDJAzMu4Sc0LiwwBJbk6nIG9/Zm7ufWg==} + '@unocss/preset-tagify@66.7.5': + resolution: {integrity: sha512-/8YB1tXVi+WmNKPhsCdtO1xnQKEkshSnWDp6AbvVP3f6qOF7adlMYpAt3kpWCoVUBsfOQ06ZQlnfricMjObyoQ==} - '@unocss/preset-typography@66.6.6': - resolution: {integrity: sha512-SM1km5nqt15z4sTabfOobSC633I5Ol5nnme6JFTra4wiyCUNs+Cg31nJ6jnopWDUT4SEAXqfUH7jKSSoCnI6ZA==} + '@unocss/preset-typography@66.7.5': + resolution: {integrity: sha512-2dxC8LT9KYa29UZT4muDFl7DbIXvKktTfeSMbUGMdZKbHcuMtKSP2U52wti1PL5I9duqp4v+8G33EeVutGTUaQ==} - '@unocss/preset-uno@66.6.6': - resolution: {integrity: sha512-40PcBDtlhW7QP7e/WOxC684IhN5T1dXvj1dgx9ZzK+8lEDGjcX7bN2noW4aSenzSrHymeSsMrL/0ltL4ED/5Zw==} + '@unocss/preset-uno@66.7.5': + resolution: {integrity: sha512-zaUlYgNngbt50fZA/LbtsEnmPKojPqeiXCyUUiKQMv2uJQhncR32xhLZXVQ+TJD7hlfZ+6FAqlco1NIiAcub9w==} - '@unocss/preset-web-fonts@66.6.6': - resolution: {integrity: sha512-5ikwgrJB8VPzKd0bqgGNgYUGix90KFnVtKJPjWTP5qsv3+ZtZnea1rRbAFl8i2t52hg35msNBsQo+40IC3xB6A==} + '@unocss/preset-web-fonts@66.7.5': + resolution: {integrity: sha512-OLLTK7kswdSu51qxEm6O+AehecgCfS08Ivqo+280lKzFW7V1jXr5okeJ1ty+85oHCprJqzcD9iG1khxNRLomcA==} - '@unocss/preset-wind3@66.6.6': - resolution: {integrity: sha512-rk6gPPIQ7z2DVucOqp7XZ4vGpKAuzBV1vtUDvDh5WscxzO/QlqaeTfTALk5YgGpmLaF4+ns6FrTgLjV+wHgHuQ==} + '@unocss/preset-wind3@66.7.5': + resolution: {integrity: sha512-atFe/7Qein+oMdyZs0hEo+3EjV99Av2LVxDbzpCungxIfbS3TnQt70EIuHXMPNCVWLYwrMV+/P1n9Ntb0E3mow==} - '@unocss/preset-wind4@66.6.6': - resolution: {integrity: sha512-caTDM9rZSlp4tyPWWAnwMvQr2PXq53LsEYwd3N8zj0ou2hcsqptJvF+mFvyhvGF66x26wWJr/FwuUEhh7qycaw==} + '@unocss/preset-wind4@66.7.5': + resolution: {integrity: sha512-n3jIvQv8x1jXpmWfvNFBIqHNARki4mKZXfxAA31gekpXsRRTg16u1+yC1+PBBJgoEDFEnnmKnG7EZP88S8LVXA==} - '@unocss/preset-wind@66.6.6': - resolution: {integrity: sha512-TMy3lZ35FP/4QqDHOLWZmV+RoOGWUDqnDEOTjOKI1CQARGta0ppUmq+IZMuI1ZJLuOa4OZ9V6SfnwMXwRLgXmw==} + '@unocss/preset-wind@66.7.5': + resolution: {integrity: sha512-LVKgGr0A9Lc7F85xGXrrb71DDXMlHGA8bcj/Kht8BCsuRdBZadNbLlnv5qnSJiHYhi3/blzcgVoaeRor6L9yNA==} - '@unocss/reset@66.6.6': - resolution: {integrity: sha512-rBFviUfHC6h0mSW6TYa7O1HGoEF7IV9VS0Q0EpweeQqR4N3D72DazZLWMASwNsmqKHUSDa+6h1oBqF/yqHfGAQ==} + '@unocss/reset@66.7.5': + resolution: {integrity: sha512-z3wbt2cuQPjtT6w5xzRYZYFIIlUPzhVKz8yIcE9fvu7BgR3hO7uVsg/5mzDoGwQ96Ya3Sk68rpmI/gLYl4bJag==} - '@unocss/rule-utils@66.6.6': - resolution: {integrity: sha512-krWtQKGshOaqQMuxeGq1NOA8NL35VdpYlmQEWOe39BY6TACT51bgQFu40MRfsAIMZZtoGS2YYTrnHojgR92omw==} - engines: {node: '>=14'} + '@unocss/rule-utils@66.7.5': + resolution: {integrity: sha512-/AKHBRF6ZOexE3EDDv8ZEYh40P5e2Eha41IYUbE1wjigW7++ssmvimSTdufJzZvU5DGP++E3B3WEsFPprZMjAg==} - '@unocss/transformer-attributify-jsx@66.6.6': - resolution: {integrity: sha512-NnDchmN2EeFLy4lfVqDgNe9j1+w2RLL2L9zKECXs5g6rDVfeeEK6FNgxSq3XnPcKltjNCy1pF4MaDOROG7r8yA==} + '@unocss/transformer-attributify-jsx@66.7.5': + resolution: {integrity: sha512-r8qDwNSt0eGSwWws3xsuIHb3PZYR2embFdYoE67hD/xlYgLjX1uPy/HUlGCSSh4uLc4vVYjurr0Oq5xF/B8YiA==} - '@unocss/transformer-compile-class@66.6.6': - resolution: {integrity: sha512-KKssJxU8fZ9x84yznIirbtta2sB0LN/3lm0bp+Wl1298HITaNiVeG2n26iStQ3N7r240xRN2RarxncSVCMFwWw==} + '@unocss/transformer-compile-class@66.7.5': + resolution: {integrity: sha512-KuECgsGF7tGe808vIvKViEjI0UCUgYgneJfK+/TWBkjC7s8dLVaUtJzzcP9/r6OfGlgyn/x1YTdRqTaCENa7Xg==} - '@unocss/transformer-directives@66.6.6': - resolution: {integrity: sha512-CReFTcBfMtKkRvzIqxL20VptWt5C1Om27dwoKzyVFBXv0jzViWysbu0y0AQg3bsgD4cFqndFyAGyeL84j0nbKg==} + '@unocss/transformer-directives@66.7.5': + resolution: {integrity: sha512-VMJApXXOwlDubkW+cNMmOkfxLefFupJr+yU23gGYUB2NPsuVltc8H5CDM0gfVebpeL5CUW05evxzEAk2wsju+Q==} - '@unocss/transformer-variant-group@66.6.6': - resolution: {integrity: sha512-j4L/0Tw6AdMVB2dDnuBlDbevyL1/0CAk88a77VF/VjgEIBwB9VXsCCUsxz+2Dohcl7N2GMm7+kpaWA6qt2PSaA==} + '@unocss/transformer-variant-group@66.7.5': + resolution: {integrity: sha512-iDmP3mM8J+IxuQf5Uh33zsi528xnGxTpKRJ0c+LCrqBTTkR2tZr4aCzNmJ0g29Js2yEOsyNXRRc8BNTuvgn0AA==} - '@unocss/vite@66.6.6': - resolution: {integrity: sha512-DgG7KcUUMtoDhPOlFf2l4dR+66xZ23SdZvTYpikk5nZfLCzZd62vedutD7x0bTR6VpK2YRq39B+F+Z6TktNY/w==} + '@unocss/vite@66.7.5': + resolution: {integrity: sha512-1z1TBCNJCR2WzjPtjzmCHr8rtzXHosMjLdsCNe6Mzsfwiw044gzzLVuiEZO9vIjkI50lvQ+gIOxOiVQG0hGAeA==} peerDependencies: - vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 || ^8.0.0-0 + vite: ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 || ^8.0.0-0 '@vite-pwa/assets-generator@1.0.2': resolution: {integrity: sha512-MCbrb508JZHqe7bUibmZj/lyojdhLRnfkmyXnkrCM2zVrjTgL89U8UEfInpKTvPeTnxsw2hmyZxnhsdNR6yhwg==} @@ -1814,57 +2173,60 @@ packages: '@vite-pwa/assets-generator': optional: true - '@vitejs/plugin-vue@6.0.5': - resolution: {integrity: sha512-bL3AxKuQySfk1iGcBsQnoRVexTPJq0Z/ixFVM8OhVJAP6ZXXXLtM7NFKWhLl30Kg7uTBqIaPXbh+nuQCuBDedg==} + '@vitejs/plugin-vue@6.0.8': + resolution: {integrity: sha512-0ZjgOg7oO6farnNGup7yvoM/YXZV84OZxHAwtflItNa/6zzQyVb5LNxyea3FEKEX2XlagIKzrlH7wwxkKgtiew==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 vue: ^3.2.25 - '@vitest/eslint-plugin@1.6.12': - resolution: {integrity: sha512-4kI47BJNFE+EQ5bmPbHzBF+ibNzx2Fj0Jo9xhWsTPxMddlHwIWl6YAxagefh461hrwx/W0QwBZpxGS404kBXyg==} + '@vitest/eslint-plugin@1.6.25': + resolution: {integrity: sha512-ylqFL2TYRgtTewl5Kr2NCL3fnLOMNo91XEyniB4tA1zlnZs0GbrNj6ER6ldR9J3r5RSL0dQ7EeMUiXsbfHrvpg==} engines: {node: '>=18'} peerDependencies: + '@typescript-eslint/eslint-plugin': '*' eslint: '>=8.57.0' typescript: '>=5.0.0' vitest: '*' peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true typescript: optional: true vitest: optional: true - '@vitest/expect@4.1.0': - resolution: {integrity: sha512-EIxG7k4wlWweuCLG9Y5InKFwpMEOyrMb6ZJ1ihYu02LVj/bzUwn2VMU+13PinsjRW75XnITeFrQBMH5+dLvCDA==} + '@vitest/expect@4.1.10': + resolution: {integrity: sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==} - '@vitest/mocker@4.1.0': - resolution: {integrity: sha512-evxREh+Hork43+Y4IOhTo+h5lGmVRyjqI739Rz4RlUPqwrkFFDF6EMvOOYjTx4E8Tl6gyCLRL8Mu7Ry12a13Tw==} + '@vitest/mocker@4.1.10': + resolution: {integrity: sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==} peerDependencies: msw: ^2.4.9 - vite: ^6.0.0 || ^7.0.0 || ^8.0.0-0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@4.1.0': - resolution: {integrity: sha512-3RZLZlh88Ib0J7NQTRATfc/3ZPOnSUn2uDBUoGNn5T36+bALixmzphN26OUD3LRXWkJu4H0s5vvUeqBiw+kS0A==} + '@vitest/pretty-format@4.1.10': + resolution: {integrity: sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==} - '@vitest/runner@4.1.0': - resolution: {integrity: sha512-Duvx2OzQ7d6OjchL+trw+aSrb9idh7pnNfxrklo14p3zmNL4qPCDeIJAK+eBKYjkIwG96Bc6vYuxhqDXQOWpoQ==} + '@vitest/runner@4.1.10': + resolution: {integrity: sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==} - '@vitest/snapshot@4.1.0': - resolution: {integrity: sha512-0Vy9euT1kgsnj1CHttwi9i9o+4rRLEaPRSOJ5gyv579GJkNpgJK+B4HSv/rAWixx2wdAFci1X4CEPjiu2bXIMg==} + '@vitest/snapshot@4.1.10': + resolution: {integrity: sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==} - '@vitest/spy@4.1.0': - resolution: {integrity: sha512-pz77k+PgNpyMDv2FV6qmk5ZVau6c3R8HC8v342T2xlFxQKTrSeYw9waIJG8KgV9fFwAtTu4ceRzMivPTH6wSxw==} + '@vitest/spy@4.1.10': + resolution: {integrity: sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==} - '@vitest/utils@4.1.0': - resolution: {integrity: sha512-XfPXT6a8TZY3dcGY8EdwsBulFCIw+BeeX0RZn2x/BtiY/75YGh8FeWGG8QISN/WhaqSrE2OrlDgtF8q5uhOTmw==} + '@vitest/utils@4.1.10': + resolution: {integrity: sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==} - '@voidzero-dev/vitepress-theme@4.8.4': - resolution: {integrity: sha512-o7R2g9OPu5iLW3R4PNkj+JRSIncO8f1hTY0YvO13OMP/kytKUn8MLhy4kTvx+IMRSLeqrGfrBpze/OEPKzcLUQ==} + '@voidzero-dev/vitepress-theme@5.0.4': + resolution: {integrity: sha512-sLCs+hAfejOAQP2B92djz1CIOgRmgRuYEwrE2Fu0i55SQu9+VDz/U9snVOEhYcz/RcHgAU6J24SMyZFqWOZGng==} peerDependencies: vitepress: ^2.0.0-alpha.16 vue: ^3.5.0 @@ -1878,14 +2240,20 @@ packages: '@vue/compiler-core@3.5.30': resolution: {integrity: sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw==} + '@vue/compiler-core@3.5.40': + resolution: {integrity: sha512-39E8IgOhTbVDnoJFMKc2DvYnypcZwUqgUhQkccva/0m6FUwtIKSGV7n1hpVmYcFaoRAwf9pBcwnKlCEsN63ZEQ==} + '@vue/compiler-dom@3.5.30': resolution: {integrity: sha512-eCFYESUEVYHhiMuK4SQTldO3RYxyMR/UQL4KdGD1Yrkfdx4m/HYuZ9jSfPdA+nWJY34VWndiYdW/wZXyiPEB9g==} - '@vue/compiler-sfc@3.5.30': - resolution: {integrity: sha512-LqmFPDn89dtU9vI3wHJnwaV6GfTRD87AjWpTWpyrdVOObVtjIuSeZr181z5C4PmVx/V3j2p+0f7edFKGRMpQ5A==} + '@vue/compiler-dom@3.5.40': + resolution: {integrity: sha512-pwkx4vqlqOspFstrcmzwkKLePVMD3PT65imRzLhanU2V1Fj4K13g6OXjanOyzw3aTAuRk84BOmY8f3rEHqPaVA==} + + '@vue/compiler-sfc@3.5.40': + resolution: {integrity: sha512-gIf497P4kpuALcvs5n3AEg1Vdn0pSY4XbjASIfHNYF1/MP3T2Mf2STERTubysBxCRxzJGJYtF/O7vwJrxFB3Vw==} - '@vue/compiler-ssr@3.5.30': - resolution: {integrity: sha512-NsYK6OMTnx109PSL2IAyf62JP6EUdk4Dmj6AkWcJGBvN0dQoMYtVekAmdqgTtWQgEJo+Okstbf/1p7qZr5H+bA==} + '@vue/compiler-ssr@3.5.40': + resolution: {integrity: sha512-rrE5xiXG663+vHCHa3J9p2z5OcBRjXmoqenprJxAFQxg5pSshzeBiCE6pu46axapRJ2Adk0YDA2BRZVjiHXnhg==} '@vue/devtools-api@8.1.0': resolution: {integrity: sha512-O44X57jjkLKbLEc4OgL/6fEPOOanRJU8kYpCE8qfKlV96RQZcdzrcLI5mxMuVRUeXhHKIHGhCpHacyCk0HyO4w==} @@ -1899,28 +2267,34 @@ packages: '@vue/language-core@3.2.6': resolution: {integrity: sha512-xYYYX3/aVup576tP/23sEUpgiEnujrENaoNRbaozC1/MA9I6EGFQRJb4xrt/MmUCAGlxTKL2RmT8JLTPqagCkg==} - '@vue/reactivity@3.5.30': - resolution: {integrity: sha512-179YNgKATuwj9gB+66snskRDOitDiuOZqkYia7mHKJaidOMo/WJxHKF8DuGc4V4XbYTJANlfEKb0yxTQotnx4Q==} + '@vue/reactivity@3.5.40': + resolution: {integrity: sha512-B7ot9UlUZOi1zbq61/LvE88ZLTV8IlajTdiZTAEiDQgrnIMIZoPr9kGw0Zw46ObW62O9+H/Be3kMbfb7kYPQZA==} - '@vue/runtime-core@3.5.30': - resolution: {integrity: sha512-e0Z+8PQsUTdwV8TtEsLzUM7SzC7lQwYKePydb7K2ZnmS6jjND+WJXkmmfh/swYzRyfP1EY3fpdesyYoymCzYfg==} + '@vue/runtime-core@3.5.40': + resolution: {integrity: sha512-KAZLweuZ6uUJPK1PMSQPgBU5gCjgrrfjUhSglmU9NhH+Zjepa8cnwSydPWDWHDwOgY4g3VcZ+PljbiHlURNCbw==} - '@vue/runtime-dom@3.5.30': - resolution: {integrity: sha512-2UIGakjU4WSQ0T4iwDEW0W7vQj6n7AFn7taqZ9Cvm0Q/RA2FFOziLESrDL4GmtI1wV3jXg5nMoJSYO66egDUBw==} + '@vue/runtime-dom@3.5.40': + resolution: {integrity: sha512-ZfrX8ssZQds900L9pr8AuK05ddnMsR4MPMZr8cPN9GoqoPWcXLhjvvbIA2SMv+7a97sJ1vv9pj/zxK0Cq/eEFQ==} - '@vue/server-renderer@3.5.30': - resolution: {integrity: sha512-v+R34icapydRwbZRD0sXwtHqrQJv38JuMB4JxbOxd8NEpGLny7cncMp53W9UH/zo4j8eDHjQ1dEJXwzFQknjtQ==} - peerDependencies: - vue: 3.5.30 + '@vue/server-renderer@3.5.40': + resolution: {integrity: sha512-XNJym9WpevhTVt1HuwOrCRJ5Q+9z4BjTMrDtjTrvx74SmUll8spNTw6whWJa9mEkO4PKn5TihI/bm/8ds2QVJw==} '@vue/shared@3.5.30': resolution: {integrity: sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==} + '@vue/shared@3.5.40': + resolution: {integrity: sha512-WxnBtruIqOoV3rA4jeKDWzrYI5h7Cp4+pjwDi8kWGHz+IslhiN+wguLVVhtv2l8VoU02rzDCVfDjgCl1lNpZVg==} + '@vueuse/core@14.2.1': resolution: {integrity: sha512-3vwDzV+GDUNpdegRY6kzpLm4Igptq+GA0QkJ3W61Iv27YWwW/ufSlOfgQIpN6FZRMG0mkaz4gglJRtq5SeJyIQ==} peerDependencies: vue: ^3.5.0 + '@vueuse/core@14.4.0': + resolution: {integrity: sha512-X4WHz1HlCzCBoYXesUkifzzWBAcZgXG8Fi5iNPQg/epdzOB3gu8Fawj3hvuwYR1nGcXGnvxwYYcUC/71++svtQ==} + peerDependencies: + vue: ^3.5.0 + '@vueuse/integrations@14.2.1': resolution: {integrity: sha512-2LIUpBi/67PoXJGqSDQUF0pgQWpNHh7beiA+KG2AbybcNm+pTGWT6oPGlBgUoDWmYwfeQqM/uzOHqcILpKL7nA==} peerDependencies: @@ -1966,11 +2340,19 @@ packages: '@vueuse/metadata@14.2.1': resolution: {integrity: sha512-1ButlVtj5Sb/HDtIy1HFr1VqCP4G6Ypqt5MAo0lCgjokrk2mvQKsK2uuy0vqu/Ks+sHfuHo0B9Y9jn9xKdjZsw==} + '@vueuse/metadata@14.4.0': + resolution: {integrity: sha512-swx/255R6JyHZFJhx845iz5CRWDZdCfvkZOpACWc5+c5WHcG24mv8gUT1WIdFQaHt6dq79rvILd9QnCWiyVm9g==} + '@vueuse/shared@14.2.1': resolution: {integrity: sha512-shTJncjV9JTI4oVNyF1FQonetYAiTBd+Qj7cY89SWbXSkx7gyhrgtEdF2ZAVWS1S3SHlaROO6F2IesJxQEkZBw==} peerDependencies: vue: ^3.5.0 + '@vueuse/shared@14.4.0': + resolution: {integrity: sha512-JRgY90Sz8DDtPMsaDflvPMp9xYk69JZAmbuDvAquUVXKr2gEjqtzGNTTthLfckH0BzBqvnu31gb4a8TGLRe79g==} + peerDependencies: + vue: ^3.5.0 + accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -1994,20 +2376,8 @@ packages: alien-signals@3.1.2: resolution: {integrity: sha512-d9dYqZTS90WLiU0I5c6DHj/HcKkF8ZyGN3G5x8wSbslulz70KOxaqCT0hQCo9KOyhVqzqGojvNdJXoTumZOtcw==} - ansi-escapes@7.3.0: - resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} - engines: {node: '>=18'} - - ansi-regex@6.2.2: - resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} - engines: {node: '>=12'} - - ansi-styles@6.2.3: - resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} - engines: {node: '>=12'} - - ansis@4.2.0: - resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} + ansis@4.3.1: + resolution: {integrity: sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==} engines: {node: '>=14'} appdata-path@1.0.0: @@ -2081,6 +2451,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + baseline-browser-mapping@2.11.11: + resolution: {integrity: sha512-/yImnXwyTvgMkhgekLHok/Rx5vO6E0BmStWlSqKWMVm2a2ITuZ1Tn+9bgLS+gZRdZmWtd8nxuhHpdmCUOWsTQQ==} + engines: {node: '>=6.0.0'} + hasBin: true + birpc@2.9.0: resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} @@ -2098,11 +2473,20 @@ packages: resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==} engines: {node: 18 || 20 || >=22} + brace-expansion@5.0.9: + resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} + engines: {node: 20 || >=22} + browserslist@4.28.1: resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.28.7: + resolution: {integrity: sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -2137,6 +2521,9 @@ packages: caniuse-lite@1.0.30001780: resolution: {integrity: sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==} + caniuse-lite@1.0.30001806: + resolution: {integrity: sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==} + ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -2164,18 +2551,6 @@ packages: resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} - clean-regexp@1.0.0: - resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} - engines: {node: '>=4'} - - cli-cursor@5.0.0: - resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} - engines: {node: '>=18'} - - cli-truncate@5.2.0: - resolution: {integrity: sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==} - engines: {node: '>=20'} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -2196,17 +2571,21 @@ packages: comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - commander@14.0.3: - resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} - engines: {node: '>=20'} - commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + comment-parser@1.4.5: resolution: {integrity: sha512-aRDkn3uyIlCFfk5NUA+VdwMmMsh8JGhc4hapfV4yxymHGQ3BVskMQfoXGpCo5IoBuQ9tS5iiVKhCpTcB4pW4qw==} engines: {node: '>= 12.0.0'} + comment-parser@1.4.7: + resolution: {integrity: sha512-0h+uSNtQGW3D98eQt3jJ8L06Fves8hncB4V/PKdw/Qb8Hnk19VaKuTr55UNRYiSoVa7WwrFls+rh3ux9agmkeQ==} + engines: {node: '>= 12.0.0'} + common-tags@1.8.2: resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} engines: {node: '>=4.0.0'} @@ -2237,6 +2616,10 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} + convert-hrtime@5.0.0: + resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} + engines: {node: '>=12'} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -2350,6 +2733,10 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + detect-indent@7.0.2: + resolution: {integrity: sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==} + engines: {node: '>=12.20'} + detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -2382,11 +2769,11 @@ packages: electron-to-chromium@1.5.313: resolution: {integrity: sha512-QBMrTWEf00GXZmJyx2lbYD45jpI3TUFnNIzJ5BBc8piGUDwMPa1GV6HJWTZVvY/eiN3fSopl7NRbgGp9sZ9LTA==} - emoji-regex@10.6.0: - resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + electron-to-chromium@1.5.399: + resolution: {integrity: sha512-lEcqhErbHjXRvd41rnWLpzbyU/IXfIYo7QwaFWmxGeLiLyY2TBCdHnWY88vB+p3ubnihRypDm66panXl7TylLA==} - empathic@2.0.0: - resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} + empathic@2.0.1: + resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} engines: {node: '>=14'} encodeurl@2.0.0: @@ -2405,10 +2792,6 @@ packages: resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} engines: {node: '>=0.12'} - environment@1.1.0: - resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} - engines: {node: '>=18'} - es-abstract@1.24.1: resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} engines: {node: '>= 0.4'} @@ -2441,6 +2824,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.28.1: + resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -2448,10 +2836,6 @@ packages: escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -2466,8 +2850,8 @@ packages: peerDependencies: eslint: '>=6.0.0' - eslint-config-flat-gitignore@2.2.1: - resolution: {integrity: sha512-wA5EqN0era7/7Gt5Botlsfin/UNY0etJSEeBgbUlFLFrBi47rAN//+39fI7fpYcl8RENutlFtvp/zRa/M/pZNg==} + eslint-config-flat-gitignore@2.3.0: + resolution: {integrity: sha512-bg4ZLGgoARg1naWfsINUUb/52Ksw/K22K+T16D38Y8v+/sGwwIYrGvH/JBjOin+RQtxxC9tzNNiy4shnGtGyyQ==} peerDependencies: eslint: ^9.5.0 || ^10.0.0 @@ -2476,8 +2860,8 @@ packages: peerDependencies: eslint: ^9.0.0 - eslint-flat-config-utils@3.0.2: - resolution: {integrity: sha512-mPvevWSDQFwgABvyCurwIu6ZdKxGI5NW22/BGDwA1T49NO6bXuxbV9VfJK/tkQoNyPogT6Yu1d57iM0jnZVWmg==} + eslint-flat-config-utils@3.2.0: + resolution: {integrity: sha512-PHgo1X5uqIorJONLVD9BIaOSdoYFD3z/AeJljdqDPlWVRpeCYkDbK9k0AXoYVqqNJr6FEYIEr5Rm2TSktLQcHw==} eslint-json-compat-utils@0.2.3: resolution: {integrity: sha512-RbBmDFyu7FqnjE8F0ZxPNzx5UaptdeS9Uu50r7A+D7s/+FCX+ybiyViYEgFUaFIFqSWJgZRTpL5d8Kanxxl2lQ==} @@ -2495,86 +2879,87 @@ packages: peerDependencies: eslint: '*' - eslint-plugin-antfu@3.2.2: - resolution: {integrity: sha512-Qzixht2Dmd/pMbb5EnKqw2V8TiWHbotPlsORO8a+IzCLFwE0RxK8a9k4DCTFPzBwyxJzH+0m2Mn8IUGeGQkyUw==} + eslint-plugin-antfu@3.2.3: + resolution: {integrity: sha512-U2fnz/H0gFPxpuC7QpaHa0Jv2AgCZ5hunp36SOP/yWo8yFzgvMh8X4pZ4uN4IKoqtBhk7G3HuVa93Urf51+sZg==} peerDependencies: eslint: '*' - eslint-plugin-command@3.5.2: - resolution: {integrity: sha512-PA59QAkQDwvcCMEt5lYLJLI3zDGVKJeC4id/pcRY2XdRYhSGW7iyYT1VC1N3bmpuvu6Qb/9QptiS3GJMjeGTJg==} + eslint-plugin-command@3.5.3: + resolution: {integrity: sha512-JIhmUOW2K2Dw1K+p4mtj5potkqTZ4ZaicrTkgCygPZCWErP2+O2F46n7ZwGKapeEjiwcVqoY8u01SxNUUXWPeQ==} peerDependencies: - '@typescript-eslint/rule-tester': '*' '@typescript-eslint/typescript-estree': '*' '@typescript-eslint/utils': '*' eslint: '*' - eslint-plugin-depend@1.5.0: - resolution: {integrity: sha512-i3UeLYmclf1Icp35+6W7CR4Bp2PIpDgBuf/mpmXK5UeLkZlvYJ21VuQKKHHAIBKRTPivPGX/gZl5JGno1o9Y0A==} - peerDependencies: - eslint: '>=8.40.0' - eslint-plugin-es-x@7.8.0: resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '>=8' - eslint-plugin-import-lite@0.5.2: - resolution: {integrity: sha512-XvfdWOC5dSLEI9krIPRlNmKSI2ViIE9pVylzfV9fCq0ZpDaNeUk6o0wZv0OzN83QdadgXp1NsY0qjLINxwYCsw==} + eslint-plugin-import-lite@0.6.0: + resolution: {integrity: sha512-80vevx2A7i3H7n1/6pqDO8cc5wRz6OwLDvIyVl9UflBV1N1f46e9Ihzi65IOLYoSxM6YykK2fTw1xm0Ixx6aTQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: '>=9.0.0' + eslint: ^9.0.0 || ^10.0.0 - eslint-plugin-jsdoc@62.8.0: - resolution: {integrity: sha512-hu3r9/6JBmPG6wTcqtYzgZAnjEG2eqRUATfkFscokESg1VDxZM21ZaMire0KjeMwfj+SXvgB4Rvh5LBuesj92w==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} + eslint-plugin-jsdoc@63.3.2: + resolution: {integrity: sha512-5B3oO23iqbNJC/ru7uqIY80wmY66De1Q0+5kXQGHuLrGze/rL0Zw/YktMcqgYQ+kdHmgvY1q5TpRgl3yZMLmhQ==} + engines: {node: ^22.13.0 || >=24} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 - eslint-plugin-jsonc@3.1.2: - resolution: {integrity: sha512-dopTxdB22iuOkgKyJCupEC5IYBItUT4J/teq1H5ddUObcaYhOURxtJElZczdcYnnKCghNU/vccuyPkliy2Wxsg==} + eslint-plugin-jsonc@3.3.0: + resolution: {integrity: sha512-CsTR8aDcShDg6A71ZppLaWiPoSo2J1Ivjm5/c4Mnb9sxgwWq+WG2PgeoAnj7SwzDPJB75tlHvLrGy6ntooIitg==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} peerDependencies: eslint: '>=9.38.0' - eslint-plugin-n@17.24.0: - resolution: {integrity: sha512-/gC7/KAYmfNnPNOb3eu8vw+TdVnV0zhdQwexsw6FLXbhzroVj20vRn2qL8lDWDGnAQ2J8DhdfvXxX9EoxvERvw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-plugin-n@18.2.2: + resolution: {integrity: sha512-gOO0lIqwEjZ750kv9/SptCWArUoAZXJoBr0vYWTO2dCBxctHUXlBIigiC8xuxxr/NKqgIT6Ehz1xRcilj8a5cA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} peerDependencies: - eslint: '>=8.23.0' + eslint: '>=8.57.1' + ts-declaration-location: ^1.0.6 + typescript: '>=5.0.0' + peerDependenciesMeta: + ts-declaration-location: + optional: true + typescript: + optional: true - eslint-plugin-no-only-tests@3.3.0: - resolution: {integrity: sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==} + eslint-plugin-no-only-tests@3.4.0: + resolution: {integrity: sha512-4S3/9Nb7A2tiMcpzEQE9bQSlpeOz6WJkgryBuou/SA8W2x2c8Zf4j0NvTKBjv6qNhF9T79tmkecm/0CHqV0UGg==} engines: {node: '>=5.0.0'} - eslint-plugin-perfectionist@5.6.0: - resolution: {integrity: sha512-pxrLrfRp5wl1Vol1fAEa/G5yTXxefTPJjz07qC7a8iWFXcOZNuWBItMQ2OtTzfQIvMq6bMyYcrzc3Wz++na55Q==} + eslint-plugin-perfectionist@5.10.0: + resolution: {integrity: sha512-HiqpDrUDbGrMC6iHQbemgDyHJ0366Vyz/qRWmxQcSAkmG25cXr8BdRgx8yAhOKhEfBXn8Rnf/mTCsV4EqUJSxg==} engines: {node: ^20.0.0 || >=22.0.0} peerDependencies: eslint: ^8.45.0 || ^9.0.0 || ^10.0.0 - eslint-plugin-pnpm@1.6.0: - resolution: {integrity: sha512-dxmt9r3zvPaft6IugS4i0k16xag3fTbOvm/road5uV9Y8qUCQT0xzheSh3gMlYAlC6vXRpfArBDsTZ7H7JKCbg==} + eslint-plugin-pnpm@1.7.0: + resolution: {integrity: sha512-SZaPARN1+NMqAjQOlQjHu59SnN/o299N5Z4HTyhwWYnfkQkjdiydayHBegwXER3VecRF/Rf7eHw3sGcTF+uLOQ==} peerDependencies: eslint: ^9.0.0 || ^10.0.0 - eslint-plugin-regexp@3.1.0: - resolution: {integrity: sha512-qGXIC3DIKZHcK1H9A9+Byz9gmndY6TTSRkSMTZpNXdyCw2ObSehRgccJv35n9AdUakEjQp5VFNLas6BMXizCZg==} + eslint-plugin-regexp@3.1.1: + resolution: {integrity: sha512-MxR5nqoQCtVWmJwia0D2+NlXX1xzdpkslsVOZLEYQ4PQWEaL65PCZXURxaBc3lPnkNFpNxzMIRmYVxdl8giXRA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} peerDependencies: eslint: '>=9.38.0' - eslint-plugin-toml@1.3.1: - resolution: {integrity: sha512-1l00fBP03HIt9IPV7ZxBi7x0y0NMdEZmakL1jBD6N/FoKBvfKxPw5S8XkmzBecOnFBTn5Z8sNJtL5vdf9cpRMQ==} + eslint-plugin-toml@1.5.0: + resolution: {integrity: sha512-qBjRywEkKxO2uYOjus//6GVF1r+Hg5QDkRO8RTY6XcaXgWfBU0DhwpFmJa2Ljf0Sz49r7DdZlpKwwHmJ4nmH1Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} peerDependencies: eslint: '>=9.38.0' - eslint-plugin-unicorn@63.0.0: - resolution: {integrity: sha512-Iqecl9118uQEXYh7adylgEmGfkn5es3/mlQTLLkd4pXkIk9CTGrAbeUux+YljSa2ohXCBmQQ0+Ej1kZaFgcfkA==} - engines: {node: ^20.10.0 || >=21.0.0} + eslint-plugin-unicorn@72.0.0: + resolution: {integrity: sha512-hqO6ksoOHO+ZhdseTuKRVQbx9U7PRO/cv8qAR1mctwzdVO2hYud8uS9luAhp43RJgziYgHAph8eHyipT8GL0ng==} + engines: {node: '>=22'} peerDependencies: - eslint: '>=9.38.0' + eslint: '>=10.4' eslint-plugin-unused-imports@4.4.1: resolution: {integrity: sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ==} @@ -2585,22 +2970,22 @@ packages: '@typescript-eslint/eslint-plugin': optional: true - eslint-plugin-vue@10.8.0: - resolution: {integrity: sha512-f1J/tcbnrpgC8suPN5AtdJ5MQjuXbSU9pGRSSYAuF3SHoiYCOdEX6O22pLaRyLHXvDcOe+O5ENgc1owQ587agA==} + eslint-plugin-vue@10.10.0: + resolution: {integrity: sha512-dL9x9rBHqqNcByWiLOHK6L0SB97V82/NC0cZRn9cXPjM7pCuWlpQQP9bFH4vjBv80ej1ZpzAkuD8zWH1o9bZbA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@stylistic/eslint-plugin': ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 '@typescript-eslint/parser': ^7.0.0 || ^8.0.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - vue-eslint-parser: ^10.0.0 + vue-eslint-parser: ^10.3.0 peerDependenciesMeta: '@stylistic/eslint-plugin': optional: true '@typescript-eslint/parser': optional: true - eslint-plugin-yml@3.3.1: - resolution: {integrity: sha512-isntsZchaTqDMNNkD+CakrgA/pdUoJ45USWBKpuqfAW1MCuw731xX/vrXfoJFZU3tTFr24nCbDYmDfT2+g4QtQ==} + eslint-plugin-yml@3.7.0: + resolution: {integrity: sha512-cLkVHdBHyRifThJA3ufuEW+imPRO7rHBQXdWgthouY6qEapUw8/0zW6V8NcMEGWzuMykc/ITYl6AuhZLPzI+fw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} peerDependencies: eslint: '>=9.38.0' @@ -2627,8 +3012,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.0.3: - resolution: {integrity: sha512-COV33RzXZkqhG9P2rZCFl9ZmJ7WL+gQSCRzE7RhkbclbQPtLAWReL7ysA0Sh4c8Im2U9ynybdR56PV0XcKvqaQ==} + eslint@10.8.0: + resolution: {integrity: sha512-nuKKvN+oIBO0koN7Tm7dlkmnkc21mtt0QJLwAKzjLq14y6lRTdVG36MZHJ8eQHwdJMwZbQNMlPOYedMq/oVJvQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -2674,9 +3059,6 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} - eventemitter3@5.0.4: - resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - expect-type@1.3.0: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} @@ -2697,9 +3079,18 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} + fault@2.0.1: resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} @@ -2782,6 +3173,10 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + function-timeout@1.0.2: + resolution: {integrity: sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==} + engines: {node: '>=18'} + function.prototype.name@1.1.8: resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} @@ -2800,10 +3195,6 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - get-east-asian-width@1.5.0: - resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} - engines: {node: '>=18'} - get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -2839,12 +3230,8 @@ packages: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} - globals@16.5.0: - resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} - engines: {node: '>=18'} - - globals@17.4.0: - resolution: {integrity: sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==} + globals@17.9.0: + resolution: {integrity: sha512-m/MvAW61QVU5VDNF1Vj8axt016h8w7L5TU1e9zlab7XIttAT2YAlCwl75K1fOqvMM9apmD7lbCIRhpfkhmxhCg==} engines: {node: '>=18'} globalthis@1.0.4: @@ -2930,6 +3317,10 @@ packages: idb@7.1.1: resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + identifier-regex@1.1.0: + resolution: {integrity: sha512-SLX4H/vtcYlYnL7XqnuJKHU7Z8517TgsW9nmQiGOgMCjQ8V/deLYu6bEmbGoXe7WMMhc9+EUGyFFneHja8KabA==} + engines: {node: '>=18'} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -2938,6 +3329,9 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -3004,10 +3398,6 @@ packages: resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'} - is-fullwidth-code-point@5.1.0: - resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} - engines: {node: '>=18'} - is-generator-function@1.1.2: resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} engines: {node: '>= 0.4'} @@ -3016,6 +3406,10 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-identifier@1.1.0: + resolution: {integrity: sha512-NhOds0mDx9lJu+1lBRO0xbwFo5nobA7GCk/0e5xjr6+6XugX985+0OyGX35BNrTkPAsdLcIKg02HUQJOK8D8kw==} + engines: {node: '>=18'} + is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -3108,6 +3502,14 @@ packages: resolution: {integrity: sha512-/2uqY7x6bsrpi3i9LVU6J89352C0rpMk0as8trXxCtvd4kPk1ke/Eyif6wqfSLvoNJqcDG9Vk4UsXgygzCt2xA==} engines: {node: '>=20.0.0'} + jsdoc-type-pratt-parser@7.2.0: + resolution: {integrity: sha512-dh140MMgjyg3JhJZY/+iEzW+NO5xR2gpbDFKHqotCmexElVntw7GjWjt511+C/Ef02RU5TKYrJo/Xlzk+OLaTw==} + engines: {node: '>=20.0.0'} + + jsdoc-type-pratt-parser@8.0.0: + resolution: {integrity: sha512-uQu/fXVqVaMg6gM8/E5G5+eygVcZ1NV0Z51CvqhNa2bDWxvHMl484ETr6vph4oPyC+KUcbP/w2W2pewfCiR9aQ==} + engines: {node: '>=20.0.0'} + jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -3144,6 +3546,10 @@ packages: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} + katex@0.16.47: + resolution: {integrity: sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==} + hasBin: true + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -3161,84 +3567,150 @@ packages: cpu: [arm64] os: [android] + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + lightningcss-darwin-arm64@1.31.1: resolution: {integrity: sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + lightningcss-darwin-x64@1.31.1: resolution: {integrity: sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + lightningcss-freebsd-x64@1.31.1: resolution: {integrity: sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + lightningcss-linux-arm-gnueabihf@1.31.1: resolution: {integrity: sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + lightningcss-linux-arm64-gnu@1.31.1: resolution: {integrity: sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + lightningcss-linux-arm64-musl@1.31.1: resolution: {integrity: sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + lightningcss-linux-x64-gnu@1.31.1: resolution: {integrity: sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + lightningcss-linux-x64-musl@1.31.1: resolution: {integrity: sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + lightningcss-win32-arm64-msvc@1.31.1: resolution: {integrity: sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + lightningcss-win32-x64-msvc@1.31.1: resolution: {integrity: sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + lightningcss@1.31.1: resolution: {integrity: sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==} engines: {node: '>= 12.0.0'} - linkify-it@5.0.0: - resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} + engines: {node: '>= 12.0.0'} - lint-staged@16.4.0: - resolution: {integrity: sha512-lBWt8hujh/Cjysw5GYVmZpFHXDCgZzhrOm8vbcUdobADZNOK/bRshr2kM3DfgrrtR1DQhfupW9gnIXOfiFi+bw==} - engines: {node: '>=20.17'} - hasBin: true + linkify-it@5.0.2: + resolution: {integrity: sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==} - listr2@9.0.5: - resolution: {integrity: sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==} - engines: {node: '>=20.0.0'} + lint-staged@17.3.0: + resolution: {integrity: sha512-woZS3vNe3UKqBaLPvbLOtKRY4tLANpWQhom12MGWqC8Mh1lCOO+WgSwmX2amjJAqTY9BkXYW87fCUH5H9Ph6xw==} + engines: {node: '>=22.22.1'} + hasBin: true - local-pkg@1.1.2: - resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} + local-pkg@1.2.1: + resolution: {integrity: sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==} engines: {node: '>=14'} locate-path@6.0.0: @@ -3248,19 +3720,12 @@ packages: lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} lodash@4.17.23: resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} - log-update@6.1.0: - resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} - engines: {node: '>=18'} - longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} @@ -3284,11 +3749,18 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + magic-string@1.1.0: + resolution: {integrity: sha512-kS3VHe0nEPST2saQV4Rbkchcd3UBRkVTQHo1D3h/ZTwFDhai/mfKkmtPAtD129EOI7K3HlHIsFOt0WrI2/oU9g==} + + make-asynchronous@1.1.0: + resolution: {integrity: sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg==} + engines: {node: '>=18'} + mark.js@8.11.1: resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} - markdown-it@14.1.1: - resolution: {integrity: sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==} + markdown-it@14.3.0: + resolution: {integrity: sha512-RCEsPjR+sr0x+AuYp601tKTkgFG4YEPLCzHST3cQ/fhlJkqAkz1L2/Qbp1j9qw5SBwQHFBoW8+hoN5xssOF0Tw==} hasBin: true markdown-table@3.0.4: @@ -3325,6 +3797,9 @@ packages: mdast-util-gfm@3.1.0: resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + mdast-util-math@3.0.0: + resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==} + mdast-util-phrasing@4.1.0: resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} @@ -3340,6 +3815,9 @@ packages: mdn-data@2.27.1: resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + mdn-data@2.29.0: + resolution: {integrity: sha512-pVxQFCcaYUEAH853+v7yoI/qzhxXSq1bTb9obMYGYAN1c3Hen+XDCEvr296XhstrwlSTNgOR7mCSD4JPjbJe5A==} + mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} @@ -3381,6 +3859,9 @@ packages: micromark-extension-gfm@3.0.0: resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + micromark-extension-math@3.1.0: + resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} + micromark-factory-destination@2.0.1: resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} @@ -3458,10 +3939,6 @@ packages: engines: {node: '>=4'} hasBin: true - mimic-function@5.0.1: - resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} - engines: {node: '>=18'} - minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} @@ -3469,6 +3946,10 @@ packages: resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} engines: {node: 18 || 20 || >=22} + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} + engines: {node: 18 || 20 || >=22} + minimatch@5.1.9: resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} engines: {node: '>=10'} @@ -3483,8 +3964,8 @@ packages: mlly@1.8.1: resolution: {integrity: sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ==} - module-replacements@2.11.0: - resolution: {integrity: sha512-j5sNQm3VCpQQ7nTqGeOZtoJtV3uKERgCBm9QRhmGRiXiqkf7iRFOkfxdJRZWLkqYY8PNf4cDQF/WfXUYLENrRA==} + module-replacements@3.1.0: + resolution: {integrity: sha512-MSTNGqlp2q0seRlrAA/FK3SUkGnmPeexeKWuCjeJ7HobD2RCjk4f8ry8lJ+nUQFDVBAHSdC4TdjyJSaocnR7Uw==} mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} @@ -3504,6 +3985,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@3.3.16: + resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -3525,6 +4011,10 @@ packages: node-releases@2.0.36: resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==} + node-releases@2.0.51: + resolution: {integrity: sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==} + engines: {node: '>=18'} + nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -3532,8 +4022,8 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-deep-merge@2.0.0: - resolution: {integrity: sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg==} + object-deep-merge@2.0.1: + resolution: {integrity: sha512-aKttDKcU3pyZqKcCkDhsMn70WmZFG2JGDQLP9EcLyTSIFQRCPWLAmBZRLJnrVUrhPG1jETEEbfdgbNtJf1LyMg==} object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} @@ -3567,16 +4057,18 @@ packages: resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} engines: {node: '>= 0.8'} - onetime@7.0.0: - resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} - engines: {node: '>=18'} - oniguruma-parser@0.12.1: resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} + oniguruma-parser@0.12.2: + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} + oniguruma-to-es@4.3.5: resolution: {integrity: sha512-Zjygswjpsewa0NLTsiizVuMQZbp0MDyM6lIt66OxsF21npUDlzpHi1Mgb/qhQdkb+dWFTzJmFbEWdvZgRho8eQ==} + oniguruma-to-es@4.3.6: + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -3585,8 +4077,8 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} - oxc-parser@0.115.0: - resolution: {integrity: sha512-2w7Xn3CbS/zwzSY82S5WLemrRu3CT57uF7Lx8llrE/2bul6iMTcJE4Rbls7GDNbLn3ttATI68PfOz2Pt3KZ2cQ==} + oxc-parser@0.131.0: + resolution: {integrity: sha512-SJ3/7ZPbgie8dr5Z9BI/M51zZbpXba+hRSG0MDzVwMW5CRQg2fjYE0jHGlLX4eeiibGgC/mzoDFKSDHwVZEHRQ==} engines: {node: ^20.19.0 || >=22.12.0} oxc-walker@0.7.0: @@ -3594,6 +4086,10 @@ packages: peerDependencies: oxc-parser: '>=0.98.0' + p-event@6.0.1: + resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==} + engines: {node: '>=16.17'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -3602,12 +4098,19 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + p-timeout@6.1.4: + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + engines: {node: '>=14.16'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} package-manager-detector@1.6.0: resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} + package-manager-detector@1.8.0: + resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==} + parse-gitignore@2.0.0: resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==} engines: {node: '>=14'} @@ -3660,6 +4163,10 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} + pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} @@ -3670,8 +4177,8 @@ packages: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} - pnpm-workspace-yaml@1.6.0: - resolution: {integrity: sha512-uUy4dK3E11sp7nK+hnT7uAWfkBMe00KaUw8OG3NuNlYQoTk4sc9pcdIy1+XIP85v9Tvr02mK3JPaNNrP0QyRaw==} + pnpm-workspace-yaml@1.7.0: + resolution: {integrity: sha512-cgjaozHkjWL4H8oKZydEWE4mg31XydK3/1cLKjHvwnFAXutp45yAlMKljpOdZEq4TtLuzYAMvy9j05wRm3aoPw==} possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} @@ -3681,10 +4188,14 @@ packages: resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} engines: {node: '>=4'} - postcss-selector-parser@7.1.1: - resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} + postcss-selector-parser@7.1.4: + resolution: {integrity: sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==} engines: {node: '>=4'} + postcss@8.5.25: + resolution: {integrity: sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==} + engines: {node: ^10 || ^12 || >=14} + postcss@8.5.8: resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} engines: {node: ^10 || ^12 || >=14} @@ -3729,6 +4240,10 @@ packages: quansync@1.0.0: resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} + quote-js-string@0.1.0: + resolution: {integrity: sha512-Y3NoRtprEEZQD8RfxMCfS0ZTqc4e+i18OrXEXAvpM6TfC/3y+0L5rNbZiSnbBBEkDfFzbpd8o+cE8q3/anjMGA==} + engines: {node: '>=22'} + randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} @@ -3798,6 +4313,10 @@ packages: resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} hasBin: true + regjsparser@0.13.2: + resolution: {integrity: sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==} + hasBin: true + reka-ui@2.9.2: resolution: {integrity: sha512-/t4e6y1hcG+uDuRfpg6tbMz3uUEvRzNco6NeYTufoJeUghy5Iosxos5YL/p+ieAsid84sdMX9OrgDqpEuCJhBw==} peerDependencies: @@ -3819,12 +4338,10 @@ packages: engines: {node: '>= 0.4'} hasBin: true - restore-cursor@5.1.0: - resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} - engines: {node: '>=18'} - - rfdc@1.4.1: - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + rolldown@1.2.1: + resolution: {integrity: sha512-4FKJhg8d3OiyQOA6Q1Q0hoFFpW9/OoX+VsHzpECsdsIZoOArrAK90gl59YK/Z+gnDel45bgJZK03ozH/9bCqEw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true rollup@2.80.0: resolution: {integrity: sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ==} @@ -3873,6 +4390,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + send@0.19.2: resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} engines: {node: '>= 0.8.0'} @@ -3917,6 +4439,10 @@ packages: shiki@3.23.0: resolution: {integrity: sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==} + shiki@4.4.1: + resolution: {integrity: sha512-rFP+iYKzjLEIqiMiKANhARqiAbk4deDhWnBtnUO/K0D0dPxMGDH4N0FVfBY/VeI+lPrV4wNGCHQZp7EOr7NNBw==} + engines: {node: '>=20'} + side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} @@ -3954,14 +4480,6 @@ packages: sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - slice-ansi@7.1.2: - resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} - engines: {node: '>=18'} - - slice-ansi@8.0.0: - resolution: {integrity: sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==} - engines: {node: '>=20'} - smob@1.6.1: resolution: {integrity: sha512-KAkBqZl3c2GvNgNhcoyJae1aKldDW0LO279wF9bk1PnluRTETKBq0WyzRXxEhoQLk56yHaOY4JCBEKDuJIET5g==} engines: {node: '>=20.0.0'} @@ -3992,8 +4510,8 @@ packages: spdx-exceptions@2.5.0: resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - spdx-expression-parse@4.0.0: - resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} + spdx-expression-parse@5.0.0: + resolution: {integrity: sha512-vngmw3Rgn+o2arXNbnZaj5UtOEBuWBfvaI+Wc8GFfykIhA5/vdK9/Sp/XkLv63dykz2rxKDvKEHupF5P0FORcQ==} spdx-license-ids@3.0.23: resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} @@ -4023,14 +4541,6 @@ packages: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} - string-width@7.2.0: - resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} - engines: {node: '>=18'} - - string-width@8.2.0: - resolution: {integrity: sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==} - engines: {node: '>=20'} - string.prototype.matchall@4.0.12: resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} engines: {node: '>= 0.4'} @@ -4060,10 +4570,6 @@ packages: resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} engines: {node: '>=4'} - strip-ansi@7.2.0: - resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} - engines: {node: '>=12'} - strip-comments@2.0.1: resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} engines: {node: '>=10'} @@ -4072,6 +4578,10 @@ packages: resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==} engines: {node: '>=12'} + super-regex@1.1.0: + resolution: {integrity: sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==} + engines: {node: '>=18'} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -4103,6 +4613,10 @@ packages: engines: {node: '>=10'} hasBin: true + time-span@5.1.0: + resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} + engines: {node: '>=12'} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -4110,8 +4624,12 @@ packages: resolution: {integrity: sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==} engines: {node: '>=18'} - tinyglobby@0.2.15: - resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + tinyexec@1.3.0: + resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==} + engines: {node: '>=18'} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} tinyrainbow@3.1.0: @@ -4149,6 +4667,12 @@ packages: peerDependencies: typescript: '>=4.8.4' + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + ts-declaration-location@1.0.7: resolution: {integrity: sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==} peerDependencies: @@ -4157,23 +4681,23 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@4.21.0: - resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + tsx@4.23.4: + resolution: {integrity: sha512-ZiUQ8oT/KzN51mJUWPqARYqwFLFJZtGZipRkw1ynHMr9vy3eU77m5yfF3Gzm6meEg/beW+lUu3fHYgskTN2oVQ==} engines: {node: '>=18.0.0'} hasBin: true - twoslash-protocol@0.3.6: - resolution: {integrity: sha512-FHGsJ9Q+EsNr5bEbgG3hnbkvEBdW5STgPU824AHUjB4kw0Dn4p8tABT7Ncg1Ie6V0+mDg3Qpy41VafZXcQhWMA==} + twoslash-protocol@0.3.9: + resolution: {integrity: sha512-9/iwp+CXOnjFMPQuPL5PkuRbZnDoNpBvtJCLs9t8kDYkL3YHujbvnHfZA1i5fApDftVEdBw+T/4F+dH5kIzpYQ==} - twoslash-vue@0.3.6: - resolution: {integrity: sha512-HXYxU+Y7jZiMXJN4980fQNMYflLD8uqKey1qVW5ri8bqYTm2t5ILmOoCOli7esdCHlMq4/No3iQUWBWDhZNs9w==} + twoslash-vue@0.3.9: + resolution: {integrity: sha512-2zO1u4iPhZz9k7ysuDaJL1FUn4SHzm78ZF6/0Q4yFR2VP3NW0JwRpw/4cWqEM6ye3pDf8Zr9lVPBvsX4uK315A==} peerDependencies: - typescript: ^5.5.0 + typescript: ^5.5.0 || ^6.0.0 - twoslash@0.3.6: - resolution: {integrity: sha512-VuI5OKl+MaUO9UIW3rXKoPgHI3X40ZgB/j12VY6h98Ae1mCBihjPvhOPeJWlxCYcmSbmeZt5ZKkK0dsVtp+6pA==} + twoslash@0.3.9: + resolution: {integrity: sha512-rDclk+OtzuTX+tnea7DYLCkqGQ3eP0IyfD+kzUJ7t46X/NzlaxwrhecmEBNuSCuEn3V+n1PhcjUUQQ7gUJzX5Q==} peerDependencies: - typescript: ^5.5.0 + typescript: ^5.5.0 || ^6.0.0 type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} @@ -4183,6 +4707,10 @@ packages: resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} engines: {node: '>=10'} + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -4232,8 +4760,8 @@ packages: unconfig@7.5.0: resolution: {integrity: sha512-oi8Qy2JV4D3UQ0PsopR28CzdQ3S/5A1zwsUwp/rosSbfhJ5z7b90bIyTwi/F7hCLD4SGcZVjDzd4XoUQcEanvA==} - undici-types@7.18.2: - resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + undici-types@8.3.0: + resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} @@ -4261,6 +4789,9 @@ packages: unist-util-position@5.0.0: resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} @@ -4274,13 +4805,12 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} - unocss@66.6.6: - resolution: {integrity: sha512-PRKK945e2oZKHV664MA5Z9CDHbvY/V79IvTOUWKZ514jpl3UsJU3sS+skgxmKJSmwrWvXE5OVcmPthJrD/7vxg==} - engines: {node: '>=14'} + unocss@66.7.5: + resolution: {integrity: sha512-nAdmU8TwnQoiLnQjZ6Hm1GmHy9lTexKsAZNEJtZnxN9wyFRc1eLjQgmh9r7UEGxBQMQLD8OZOgmk5HpwObbh0Q==} peerDependencies: - '@unocss/astro': 66.6.6 - '@unocss/postcss': 66.6.6 - '@unocss/webpack': 66.6.6 + '@unocss/astro': 66.7.5 + '@unocss/postcss': 66.7.5 + '@unocss/webpack': 66.7.5 peerDependenciesMeta: '@unocss/astro': optional: true @@ -4331,14 +4861,14 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-plugin-pwa@1.2.0: - resolution: {integrity: sha512-a2xld+SJshT9Lgcv8Ji4+srFJL4k/1bVbd1x06JIkvecpQkwkvCncD1+gSzcdm3s+owWLpMJerG3aN5jupJEVw==} + vite-plugin-pwa@1.3.0: + resolution: {integrity: sha512-c5kMgN+ITrOtHXp8PAtk2uOIEea6XjP/unCGxOWWBzQ6qa65qj/awHg0wf+QF9E/2u9vh86LqxPwzEPNbM2r5A==} engines: {node: '>=16.0.0'} peerDependencies: '@vite-pwa/assets-generator': ^1.0.0 - vite: ^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - workbox-build: ^7.4.0 - workbox-window: ^7.4.0 + vite: ^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + workbox-build: ^7.4.1 + workbox-window: ^7.4.1 peerDependenciesMeta: '@vite-pwa/assets-generator': optional: true @@ -4383,18 +4913,61 @@ packages: yaml: optional: true - vitepress-plugin-group-icons@1.7.1: - resolution: {integrity: sha512-3ZPcIqwHNBg1btrOOSecOqv8yJxHdu3W2ugxE5LusclDF005LAm60URMEmBQrkgl4JvM32AqJirqghK6lGIk8g==} + vite@8.2.0: + resolution: {integrity: sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.4.0 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitepress-plugin-group-icons@1.7.6: + resolution: {integrity: sha512-fXSpQAYHpFpEsZLKWQAwbRx/+0uRSHmY58YNAQcz0AVirGsM6w22jtSmQhOGLEj8ZKyeRtTJrpx6otUI6wvoaQ==} peerDependencies: vite: '>=3' peerDependenciesMeta: vite: optional: true - vitepress-plugin-tabs@0.8.0: - resolution: {integrity: sha512-86FWHAuS9XCyTMDpMd5MELwp3bQyITDf/+IdZ20+iYbB8TIR8yoCp08PkDHxi4WWSVsCZ3n1uUIC7YCVhMsI3A==} + vitepress-plugin-tabs@0.9.1: + resolution: {integrity: sha512-cRys9pWhyl5YnxXZ3BAdSDW8DriuXBewYhmUu4bBlnzksEDjzbKUwbNi30T74Vi1UXnY1a19Ap6DJDTOWJWdzA==} peerDependencies: - vitepress: ^1.0.0 + vitepress: ^1.0.0 || ^2.0.0-alpha.17 vue: ^3.5.0 vitepress@2.0.0-alpha.16: @@ -4412,21 +4985,23 @@ packages: postcss: optional: true - vitest@4.1.0: - resolution: {integrity: sha512-YbDrMF9jM2Lqc++2530UourxZHmkKLxrs4+mYhEwqWS97WJ7wOYEkcr+QfRgJ3PW9wz3odRijLZjHEaRLTNbqw==} + vitest@4.1.10: + resolution: {integrity: sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.0 - '@vitest/browser-preview': 4.1.0 - '@vitest/browser-webdriverio': 4.1.0 - '@vitest/ui': 4.1.0 + '@vitest/browser-playwright': 4.1.10 + '@vitest/browser-preview': 4.1.10 + '@vitest/browser-webdriverio': 4.1.10 + '@vitest/coverage-istanbul': 4.1.10 + '@vitest/coverage-v8': 4.1.10 + '@vitest/ui': 4.1.10 happy-dom: '*' jsdom: '*' - vite: ^6.0.0 || ^7.0.0 || ^8.0.0-0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@edge-runtime/vm': optional: true @@ -4440,6 +5015,10 @@ packages: optional: true '@vitest/browser-webdriverio': optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true '@vitest/ui': optional: true happy-dom: @@ -4458,8 +5037,8 @@ packages: '@vue/composition-api': optional: true - vue-eslint-parser@10.4.0: - resolution: {integrity: sha512-Vxi9pJdbN3ZnVGLODVtZ7y4Y2kzAAE2Cm0CZ3ZDRvydVYxZ6VrnBhLikBsRS+dpwj4Jv4UCv21PTEwF5rQ9WXg==} + vue-eslint-parser@10.4.1: + resolution: {integrity: sha512-Gk6gRDj0n/fkRa3C3l0bBheoBckUq/Rs0F/TvMWIS6nzzx67amAViMe9CkNgsP2tXyQONvGiHQESHwFtZ3aYDA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -4469,8 +5048,8 @@ packages: peerDependencies: vue: ^3.0.0 - vue@3.5.30: - resolution: {integrity: sha512-hTHLc6VNZyzzEH/l7PFGjpcTvUgiaPK5mdLkbjrTeWSRcEfxFrv56g/XckIYlE9ckuobsdwqd5mk2g1sBkMewg==} + vue@3.5.40: + resolution: {integrity: sha512-+8PJ4SJXdn/cHGImF4CKdxlWHIN5Dkt7DoufRREM6h6uVCx2m7QxgcEQmmzyOK8A9mcafg7sFbJFYsdFVubTig==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -4480,6 +5059,9 @@ packages: wbuf@1.7.3: resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + web-worker@1.5.0: + resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} + webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} @@ -4535,6 +5117,9 @@ packages: workbox-core@7.4.0: resolution: {integrity: sha512-6BMfd8tYEnN4baG4emG9U0hdXM4gGuDU3ectXuVHnj71vwxTFI7WOpQJC4siTOlVtGqCUtj0ZQNsrvi6kZZTAQ==} + workbox-core@7.4.1: + resolution: {integrity: sha512-DT+vu46eh/2vRsSHTY4Xmc32Z1rr9PRlQUXr1Dx30ZuXRWwOsvZgGgcwxcasubQLQmbTNYZjv44LkBAQ4tT5tQ==} + workbox-expiration@7.4.0: resolution: {integrity: sha512-V50p4BxYhtA80eOvulu8xVfPBgZbkxJ1Jr8UUn0rvqjGhLDqKNtfrDfjJKnLz2U8fO2xGQJTx/SKXNTzHOjnHw==} @@ -4568,19 +5153,18 @@ packages: workbox-window@7.4.0: resolution: {integrity: sha512-/bIYdBLAVsNR3v7gYGaV4pQW3M3kEPx5E8vDxGvxo6khTrGtSSCS7QiFKv9ogzBgZiy0OXLP9zO28U/1nF1mfw==} - wrap-ansi@9.0.2: - resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} - engines: {node: '>=18'} + workbox-window@7.4.1: + resolution: {integrity: sha512-notZDH2u8VXaqyuD7xaqIfEFi6SRM4SUSd7ewe9PDsVqADuepxX2ZMY3uvuZGxzY5ZOsGC/vD3A/3smFtJt4/A==} - xml-name-validator@4.0.0: - resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} - engines: {node: '>=12'} + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yaml-eslint-parser@2.0.0: - resolution: {integrity: sha512-h0uDm97wvT2bokfwwTmY6kJ1hp6YDFL0nRHwNKz8s/VD1FH/vvZjAKoMUE+un0eaYBSG7/c6h+lJTP+31tjgTw==} + yaml-eslint-parser@2.1.0: + resolution: {integrity: sha512-1zo9KRfp6vIAXBEhWAz09ex3hUwh3T+/6dGbGteHvNseA0Uk4FgQnPES55klZ6cDzSy9FpgKS0D/CoLUvCCj4w==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} yaml@2.8.2: @@ -4588,6 +5172,11 @@ packages: engines: {node: '>= 14.6'} hasBin: true + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -4597,53 +5186,53 @@ packages: snapshots: - '@antfu/eslint-config@7.7.3(@typescript-eslint/rule-tester@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/typescript-estree@8.57.1(typescript@5.9.3))(@typescript-eslint/utils@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(@vue/compiler-sfc@3.5.30)(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)(vitest@4.1.0(@types/node@25.5.0)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))': + '@antfu/eslint-config@9.2.0(@typescript-eslint/typescript-estree@8.65.0(typescript@5.9.3))(@typescript-eslint/utils@8.65.0(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3))(@vue/compiler-sfc@3.5.40)(eslint@10.8.0(jiti@2.6.1))(ts-declaration-location@1.0.7(typescript@5.9.3))(typescript@5.9.3)(vitest@4.1.10(@types/node@26.1.2)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0)))': dependencies: '@antfu/install-pkg': 1.1.0 - '@clack/prompts': 1.1.0 - '@e18e/eslint-plugin': 0.2.0(eslint@10.0.3(jiti@2.6.1)) - '@eslint-community/eslint-plugin-eslint-comments': 4.7.1(eslint@10.0.3(jiti@2.6.1)) - '@eslint/markdown': 7.5.1 - '@stylistic/eslint-plugin': 5.10.0(eslint@10.0.3(jiti@2.6.1)) - '@typescript-eslint/eslint-plugin': 8.57.1(@typescript-eslint/parser@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - '@vitest/eslint-plugin': 1.6.12(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)(vitest@4.1.0(@types/node@25.5.0)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))) - ansis: 4.2.0 + '@clack/prompts': 1.7.0 + '@e18e/eslint-plugin': 0.5.1(eslint@10.8.0(jiti@2.6.1)) + '@eslint-community/eslint-plugin-eslint-comments': 4.7.2(eslint@10.8.0(jiti@2.6.1)) + '@eslint/markdown': 8.0.3 + '@stylistic/eslint-plugin': 5.10.0(eslint@10.8.0(jiti@2.6.1)) + '@typescript-eslint/eslint-plugin': 8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.65.0(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3) + '@vitest/eslint-plugin': 1.6.25(@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3)(vitest@4.1.10(@types/node@26.1.2)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0))) + ansis: 4.3.1 cac: 7.0.0 - eslint: 10.0.3(jiti@2.6.1) - eslint-config-flat-gitignore: 2.2.1(eslint@10.0.3(jiti@2.6.1)) - eslint-flat-config-utils: 3.0.2 - eslint-merge-processors: 2.0.0(eslint@10.0.3(jiti@2.6.1)) - eslint-plugin-antfu: 3.2.2(eslint@10.0.3(jiti@2.6.1)) - eslint-plugin-command: 3.5.2(@typescript-eslint/rule-tester@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/typescript-estree@8.57.1(typescript@5.9.3))(@typescript-eslint/utils@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1)) - eslint-plugin-import-lite: 0.5.2(eslint@10.0.3(jiti@2.6.1)) - eslint-plugin-jsdoc: 62.8.0(eslint@10.0.3(jiti@2.6.1)) - eslint-plugin-jsonc: 3.1.2(eslint@10.0.3(jiti@2.6.1)) - eslint-plugin-n: 17.24.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-no-only-tests: 3.3.0 - eslint-plugin-perfectionist: 5.6.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-pnpm: 1.6.0(eslint@10.0.3(jiti@2.6.1)) - eslint-plugin-regexp: 3.1.0(eslint@10.0.3(jiti@2.6.1)) - eslint-plugin-toml: 1.3.1(eslint@10.0.3(jiti@2.6.1)) - eslint-plugin-unicorn: 63.0.0(eslint@10.0.3(jiti@2.6.1)) - eslint-plugin-unused-imports: 4.4.1(@typescript-eslint/eslint-plugin@8.57.1(@typescript-eslint/parser@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1)) - eslint-plugin-vue: 10.8.0(@stylistic/eslint-plugin@5.10.0(eslint@10.0.3(jiti@2.6.1)))(@typescript-eslint/parser@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(vue-eslint-parser@10.4.0(eslint@10.0.3(jiti@2.6.1))) - eslint-plugin-yml: 3.3.1(eslint@10.0.3(jiti@2.6.1)) - eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.30)(eslint@10.0.3(jiti@2.6.1)) - globals: 17.4.0 - local-pkg: 1.1.2 + eslint: 10.8.0(jiti@2.6.1) + eslint-config-flat-gitignore: 2.3.0(eslint@10.8.0(jiti@2.6.1)) + eslint-flat-config-utils: 3.2.0 + eslint-merge-processors: 2.0.0(eslint@10.8.0(jiti@2.6.1)) + eslint-plugin-antfu: 3.2.3(eslint@10.8.0(jiti@2.6.1)) + eslint-plugin-command: 3.5.3(@typescript-eslint/typescript-estree@8.65.0(typescript@5.9.3))(@typescript-eslint/utils@8.65.0(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.8.0(jiti@2.6.1)) + eslint-plugin-import-lite: 0.6.0(eslint@10.8.0(jiti@2.6.1)) + eslint-plugin-jsdoc: 63.3.2(eslint@10.8.0(jiti@2.6.1)) + eslint-plugin-jsonc: 3.3.0(eslint@10.8.0(jiti@2.6.1)) + eslint-plugin-n: 18.2.2(eslint@10.8.0(jiti@2.6.1))(ts-declaration-location@1.0.7(typescript@5.9.3))(typescript@5.9.3) + eslint-plugin-no-only-tests: 3.4.0 + eslint-plugin-perfectionist: 5.10.0(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-pnpm: 1.7.0(eslint@10.8.0(jiti@2.6.1)) + eslint-plugin-regexp: 3.1.1(eslint@10.8.0(jiti@2.6.1)) + eslint-plugin-toml: 1.5.0(eslint@10.8.0(jiti@2.6.1)) + eslint-plugin-unicorn: 72.0.0(eslint@10.8.0(jiti@2.6.1)) + eslint-plugin-unused-imports: 4.4.1(@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.8.0(jiti@2.6.1)) + eslint-plugin-vue: 10.10.0(@stylistic/eslint-plugin@5.10.0(eslint@10.8.0(jiti@2.6.1)))(@typescript-eslint/parser@8.65.0(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.8.0(jiti@2.6.1))(vue-eslint-parser@10.4.1(eslint@10.8.0(jiti@2.6.1))) + eslint-plugin-yml: 3.7.0(eslint@10.8.0(jiti@2.6.1)) + eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.40)(eslint@10.8.0(jiti@2.6.1)) + globals: 17.9.0 + local-pkg: 1.2.1 parse-gitignore: 2.0.0 toml-eslint-parser: 1.0.3 - vue-eslint-parser: 10.4.0(eslint@10.0.3(jiti@2.6.1)) - yaml-eslint-parser: 2.0.0 + vue-eslint-parser: 10.4.1(eslint@10.8.0(jiti@2.6.1)) + yaml-eslint-parser: 2.1.0 transitivePeerDependencies: - '@eslint/json' - - '@typescript-eslint/rule-tester' - '@typescript-eslint/typescript-estree' - '@typescript-eslint/utils' - '@vue/compiler-sfc' - oxlint - supports-color + - ts-declaration-location - typescript - vitest @@ -4652,13 +5241,12 @@ snapshots: package-manager-detector: 1.6.0 tinyexec: 1.0.4 - '@antfu/ni@28.3.0': + '@antfu/ni@30.3.0': dependencies: - ansis: 4.2.0 fzf: 0.5.2 - package-manager-detector: 1.6.0 - tinyexec: 1.0.4 - tinyglobby: 0.2.15 + package-manager-detector: 1.8.0 + tinyexec: 1.3.0 + tinyglobby: 0.2.17 '@apideck/better-ajv-errors@0.3.6(ajv@8.18.0)': dependencies: @@ -4804,8 +5392,12 @@ snapshots: '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@7.29.7': {} + '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-identifier@7.29.7': {} + '@babel/helper-validator-option@7.27.1': {} '@babel/helper-wrap-function@7.28.6': @@ -4825,6 +5417,10 @@ snapshots: dependencies: '@babel/types': 7.29.0 + '@babel/parser@7.29.8': + dependencies: + '@babel/types': 7.29.8 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -5321,15 +5917,23 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@babel/types@7.29.8': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@canvas/image-data@1.1.0': {} - '@clack/core@1.1.0': + '@clack/core@1.4.3': dependencies: + fast-wrap-ansi: 0.2.2 sisteransi: 1.0.5 - '@clack/prompts@1.1.0': + '@clack/prompts@1.7.0': dependencies: - '@clack/core': 1.1.0 + '@clack/core': 1.4.3 + fast-string-width: 3.0.2 + fast-wrap-ansi: 0.2.2 sisteransi: 1.0.5 '@docsearch/css@4.6.0': {} @@ -5338,15 +5942,28 @@ snapshots: '@docsearch/sidepanel-js@4.6.0': {} - '@e18e/eslint-plugin@0.2.0(eslint@10.0.3(jiti@2.6.1))': + '@e18e/eslint-plugin@0.5.1(eslint@10.8.0(jiti@2.6.1))': dependencies: - eslint-plugin-depend: 1.5.0(eslint@10.0.3(jiti@2.6.1)) + empathic: 2.0.1 + module-replacements: 3.1.0 + semver: 7.8.5 optionalDependencies: - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.8.0(jiti@2.6.1) - '@emnapi/core@1.9.0': + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + + '@emnapi/core@2.0.0-alpha.3': + dependencies: + '@emnapi/wasi-threads': 2.0.1 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.10.0': dependencies: - '@emnapi/wasi-threads': 1.2.0 tslib: 2.8.1 optional: true @@ -5355,162 +5972,264 @@ snapshots: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.2.0': + '@emnapi/runtime@2.0.0-alpha.3': dependencies: tslib: 2.8.1 optional: true - '@es-joy/jsdoccomment@0.84.0': + '@emnapi/wasi-threads@1.2.1': dependencies: - '@types/estree': 1.0.8 - '@typescript-eslint/types': 8.57.1 - comment-parser: 1.4.5 + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@2.0.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@es-joy/jsdoccomment@0.88.0': + dependencies: + '@types/estree': 1.0.9 + '@typescript-eslint/types': 8.65.0 + comment-parser: 1.4.7 esquery: 1.7.0 - jsdoc-type-pratt-parser: 7.1.1 + jsdoc-type-pratt-parser: 7.2.0 + + '@es-joy/jsdoccomment@0.91.0': + dependencies: + '@types/estree': 1.0.9 + '@typescript-eslint/types': 8.65.0 + comment-parser: 1.4.7 + esquery: 1.7.0 + jsdoc-type-pratt-parser: 8.0.0 '@es-joy/resolve.exports@1.2.0': {} '@esbuild/aix-ppc64@0.27.4': optional: true + '@esbuild/aix-ppc64@0.28.1': + optional: true + '@esbuild/android-arm64@0.27.4': optional: true + '@esbuild/android-arm64@0.28.1': + optional: true + '@esbuild/android-arm@0.27.4': optional: true + '@esbuild/android-arm@0.28.1': + optional: true + '@esbuild/android-x64@0.27.4': optional: true + '@esbuild/android-x64@0.28.1': + optional: true + '@esbuild/darwin-arm64@0.27.4': optional: true + '@esbuild/darwin-arm64@0.28.1': + optional: true + '@esbuild/darwin-x64@0.27.4': optional: true + '@esbuild/darwin-x64@0.28.1': + optional: true + '@esbuild/freebsd-arm64@0.27.4': optional: true + '@esbuild/freebsd-arm64@0.28.1': + optional: true + '@esbuild/freebsd-x64@0.27.4': optional: true + '@esbuild/freebsd-x64@0.28.1': + optional: true + '@esbuild/linux-arm64@0.27.4': optional: true + '@esbuild/linux-arm64@0.28.1': + optional: true + '@esbuild/linux-arm@0.27.4': optional: true + '@esbuild/linux-arm@0.28.1': + optional: true + '@esbuild/linux-ia32@0.27.4': optional: true + '@esbuild/linux-ia32@0.28.1': + optional: true + '@esbuild/linux-loong64@0.27.4': optional: true + '@esbuild/linux-loong64@0.28.1': + optional: true + '@esbuild/linux-mips64el@0.27.4': optional: true + '@esbuild/linux-mips64el@0.28.1': + optional: true + '@esbuild/linux-ppc64@0.27.4': optional: true + '@esbuild/linux-ppc64@0.28.1': + optional: true + '@esbuild/linux-riscv64@0.27.4': optional: true + '@esbuild/linux-riscv64@0.28.1': + optional: true + '@esbuild/linux-s390x@0.27.4': optional: true + '@esbuild/linux-s390x@0.28.1': + optional: true + '@esbuild/linux-x64@0.27.4': optional: true + '@esbuild/linux-x64@0.28.1': + optional: true + '@esbuild/netbsd-arm64@0.27.4': optional: true + '@esbuild/netbsd-arm64@0.28.1': + optional: true + '@esbuild/netbsd-x64@0.27.4': optional: true + '@esbuild/netbsd-x64@0.28.1': + optional: true + '@esbuild/openbsd-arm64@0.27.4': optional: true + '@esbuild/openbsd-arm64@0.28.1': + optional: true + '@esbuild/openbsd-x64@0.27.4': optional: true + '@esbuild/openbsd-x64@0.28.1': + optional: true + '@esbuild/openharmony-arm64@0.27.4': optional: true + '@esbuild/openharmony-arm64@0.28.1': + optional: true + '@esbuild/sunos-x64@0.27.4': optional: true + '@esbuild/sunos-x64@0.28.1': + optional: true + '@esbuild/win32-arm64@0.27.4': optional: true + '@esbuild/win32-arm64@0.28.1': + optional: true + '@esbuild/win32-ia32@0.27.4': optional: true + '@esbuild/win32-ia32@0.28.1': + optional: true + '@esbuild/win32-x64@0.27.4': optional: true - '@eslint-community/eslint-plugin-eslint-comments@4.7.1(eslint@10.0.3(jiti@2.6.1))': + '@esbuild/win32-x64@0.28.1': + optional: true + + '@eslint-community/eslint-plugin-eslint-comments@4.7.2(eslint@10.8.0(jiti@2.6.1))': dependencies: escape-string-regexp: 4.0.0 - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.8.0(jiti@2.6.1) ignore: 7.0.5 - '@eslint-community/eslint-utils@4.9.1(eslint@10.0.3(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.1(eslint@10.8.0(jiti@2.6.1))': dependencies: - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.8.0(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/compat@2.0.3(eslint@10.0.3(jiti@2.6.1))': + '@eslint/compat@2.0.3(eslint@10.8.0(jiti@2.6.1))': dependencies: '@eslint/core': 1.1.1 optionalDependencies: - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.8.0(jiti@2.6.1) - '@eslint/config-array@0.23.3': + '@eslint/config-array@0.23.5': dependencies: - '@eslint/object-schema': 3.0.3 + '@eslint/object-schema': 3.0.5 debug: 4.4.3 - minimatch: 10.2.4 + minimatch: 10.2.6 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.5.3': + '@eslint/config-helpers@0.5.5': dependencies: - '@eslint/core': 1.1.1 + '@eslint/core': 1.2.1 - '@eslint/core@0.17.0': + '@eslint/config-helpers@0.7.0': dependencies: - '@types/json-schema': 7.0.15 + '@eslint/core': 1.2.1 '@eslint/core@1.1.1': dependencies: '@types/json-schema': 7.0.15 - '@eslint/markdown@7.5.1': + '@eslint/core@1.2.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/css-tree@4.0.5': + dependencies: + mdn-data: 2.29.0 + source-map-js: 1.2.1 + + '@eslint/markdown@8.0.3': dependencies: - '@eslint/core': 0.17.0 - '@eslint/plugin-kit': 0.4.1 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.2 github-slugger: 2.0.0 mdast-util-from-markdown: 2.0.3 mdast-util-frontmatter: 2.0.1 mdast-util-gfm: 3.1.0 + mdast-util-math: 3.0.0 micromark-extension-frontmatter: 2.0.0 micromark-extension-gfm: 3.0.0 + micromark-extension-math: 3.1.0 micromark-util-normalize-identifier: 2.0.1 transitivePeerDependencies: - supports-color - '@eslint/object-schema@3.0.3': {} + '@eslint/object-schema@3.0.5': {} - '@eslint/plugin-kit@0.4.1': + '@eslint/plugin-kit@0.7.2': dependencies: - '@eslint/core': 0.17.0 - levn: 0.4.1 - - '@eslint/plugin-kit@0.6.1': - dependencies: - '@eslint/core': 1.1.1 + '@eslint/core': 1.2.1 levn: 0.4.1 '@floating-ui/core@1.7.5': @@ -5528,11 +6247,11 @@ snapshots: '@floating-ui/utils@0.2.11': {} - '@floating-ui/vue@1.1.11(vue@3.5.30(typescript@5.9.3))': + '@floating-ui/vue@1.1.11(vue@3.5.40(typescript@5.9.3))': dependencies: '@floating-ui/dom': 1.7.6 '@floating-ui/utils': 0.2.11 - vue-demi: 0.14.10(vue@3.5.30(typescript@5.9.3)) + vue-demi: 0.14.10(vue@3.5.40(typescript@5.9.3)) transitivePeerDependencies: - '@vue/composition-api' - vue @@ -5548,11 +6267,11 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@iconify-json/carbon@1.2.19': + '@iconify-json/carbon@1.2.25': dependencies: '@iconify/types': 2.0.0 - '@iconify-json/logos@1.2.10': + '@iconify-json/logos@1.2.11': dependencies: '@iconify/types': 2.0.0 @@ -5560,22 +6279,22 @@ snapshots: dependencies: '@iconify/types': 2.0.0 - '@iconify-json/vscode-icons@1.2.45': + '@iconify-json/vscode-icons@1.2.68': dependencies: '@iconify/types': 2.0.0 '@iconify/types@2.0.0': {} - '@iconify/utils@3.1.0': + '@iconify/utils@3.1.4': dependencies: '@antfu/install-pkg': 1.1.0 '@iconify/types': 2.0.0 - mlly: 1.8.1 + import-meta-resolve: 4.2.0 - '@iconify/vue@5.0.0(vue@3.5.30(typescript@5.9.3))': + '@iconify/vue@5.0.1(vue@3.5.40(typescript@5.9.3))': dependencies: '@iconify/types': 2.0.0 - vue: 3.5.30(typescript@5.9.3) + vue: 3.5.40(typescript@5.9.3) '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: @@ -5686,78 +6405,89 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@napi-rs/wasm-runtime@1.1.1': + '@napi-rs/wasm-runtime@1.2.2(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@emnapi/core': 1.9.0 - '@emnapi/runtime': 1.9.0 - '@tybys/wasm-util': 0.10.1 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.3 + optional: true + + '@napi-rs/wasm-runtime@1.2.2(@emnapi/core@2.0.0-alpha.3)(@emnapi/runtime@2.0.0-alpha.3)': + dependencies: + '@emnapi/core': 2.0.0-alpha.3 + '@emnapi/runtime': 2.0.0-alpha.3 + '@tybys/wasm-util': 0.10.3 optional: true '@ota-meshi/ast-token-store@0.3.0': {} - '@oxc-parser/binding-android-arm-eabi@0.115.0': + '@oxc-parser/binding-android-arm-eabi@0.131.0': optional: true - '@oxc-parser/binding-android-arm64@0.115.0': + '@oxc-parser/binding-android-arm64@0.131.0': optional: true - '@oxc-parser/binding-darwin-arm64@0.115.0': + '@oxc-parser/binding-darwin-arm64@0.131.0': optional: true - '@oxc-parser/binding-darwin-x64@0.115.0': + '@oxc-parser/binding-darwin-x64@0.131.0': optional: true - '@oxc-parser/binding-freebsd-x64@0.115.0': + '@oxc-parser/binding-freebsd-x64@0.131.0': optional: true - '@oxc-parser/binding-linux-arm-gnueabihf@0.115.0': + '@oxc-parser/binding-linux-arm-gnueabihf@0.131.0': optional: true - '@oxc-parser/binding-linux-arm-musleabihf@0.115.0': + '@oxc-parser/binding-linux-arm-musleabihf@0.131.0': optional: true - '@oxc-parser/binding-linux-arm64-gnu@0.115.0': + '@oxc-parser/binding-linux-arm64-gnu@0.131.0': optional: true - '@oxc-parser/binding-linux-arm64-musl@0.115.0': + '@oxc-parser/binding-linux-arm64-musl@0.131.0': optional: true - '@oxc-parser/binding-linux-ppc64-gnu@0.115.0': + '@oxc-parser/binding-linux-ppc64-gnu@0.131.0': optional: true - '@oxc-parser/binding-linux-riscv64-gnu@0.115.0': + '@oxc-parser/binding-linux-riscv64-gnu@0.131.0': optional: true - '@oxc-parser/binding-linux-riscv64-musl@0.115.0': + '@oxc-parser/binding-linux-riscv64-musl@0.131.0': optional: true - '@oxc-parser/binding-linux-s390x-gnu@0.115.0': + '@oxc-parser/binding-linux-s390x-gnu@0.131.0': optional: true - '@oxc-parser/binding-linux-x64-gnu@0.115.0': + '@oxc-parser/binding-linux-x64-gnu@0.131.0': optional: true - '@oxc-parser/binding-linux-x64-musl@0.115.0': + '@oxc-parser/binding-linux-x64-musl@0.131.0': optional: true - '@oxc-parser/binding-openharmony-arm64@0.115.0': + '@oxc-parser/binding-openharmony-arm64@0.131.0': optional: true - '@oxc-parser/binding-wasm32-wasi@0.115.0': + '@oxc-parser/binding-wasm32-wasi@0.131.0': dependencies: - '@napi-rs/wasm-runtime': 1.1.1 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.2.2(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@oxc-parser/binding-win32-arm64-msvc@0.115.0': + '@oxc-parser/binding-win32-arm64-msvc@0.131.0': optional: true - '@oxc-parser/binding-win32-ia32-msvc@0.115.0': + '@oxc-parser/binding-win32-ia32-msvc@0.131.0': optional: true - '@oxc-parser/binding-win32-x64-msvc@0.115.0': + '@oxc-parser/binding-win32-x64-msvc@0.131.0': optional: true - '@oxc-project/types@0.115.0': {} + '@oxc-project/types@0.131.0': {} + + '@oxc-project/types@0.142.0': {} '@pkgr/core@0.2.9': {} @@ -5769,7 +6499,56 @@ snapshots: '@rive-app/canvas-lite@2.35.3': {} - '@rolldown/pluginutils@1.0.0-rc.2': {} + '@rolldown/binding-android-arm64@1.2.1': + optional: true + + '@rolldown/binding-darwin-arm64@1.2.1': + optional: true + + '@rolldown/binding-darwin-x64@1.2.1': + optional: true + + '@rolldown/binding-freebsd-x64@1.2.1': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.2.1': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.2.1': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.2.1': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.2.1': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.2.1': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.2.1': + optional: true + + '@rolldown/binding-linux-x64-musl@1.2.1': + optional: true + + '@rolldown/binding-openharmony-arm64@1.2.1': + optional: true + + '@rolldown/binding-wasm32-wasi@1.2.1': + dependencies: + '@emnapi/core': 2.0.0-alpha.3 + '@emnapi/runtime': 2.0.0-alpha.3 + '@napi-rs/wasm-runtime': 1.2.2(@emnapi/core@2.0.0-alpha.3)(@emnapi/runtime@2.0.0-alpha.3) + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.2.1': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.2.1': + optional: true + + '@rolldown/pluginutils@1.0.1': {} '@rollup/plugin-babel@5.3.1(@babel/core@7.29.0)(rollup@2.80.0)': dependencies: @@ -5901,35 +6680,73 @@ snapshots: '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 + '@shikijs/core@4.4.1': + dependencies: + '@shikijs/primitive': 4.4.1 + '@shikijs/types': 4.4.1 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + hast-util-to-html: 9.0.5 + '@shikijs/engine-javascript@3.23.0': dependencies: '@shikijs/types': 3.23.0 '@shikijs/vscode-textmate': 10.0.2 oniguruma-to-es: 4.3.5 + '@shikijs/engine-javascript@4.4.1': + dependencies: + '@shikijs/types': 4.4.1 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.6 + '@shikijs/engine-oniguruma@3.23.0': dependencies: '@shikijs/types': 3.23.0 '@shikijs/vscode-textmate': 10.0.2 + '@shikijs/engine-oniguruma@4.4.1': + dependencies: + '@shikijs/types': 4.4.1 + '@shikijs/vscode-textmate': 10.0.2 + '@shikijs/langs@3.23.0': dependencies: '@shikijs/types': 3.23.0 + '@shikijs/langs@4.4.1': + dependencies: + '@shikijs/types': 4.4.1 + + '@shikijs/primitive@4.4.1': + dependencies: + '@shikijs/types': 4.4.1 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + '@shikijs/themes@3.23.0': dependencies: '@shikijs/types': 3.23.0 + '@shikijs/themes@4.4.1': + dependencies: + '@shikijs/types': 4.4.1 + '@shikijs/transformers@3.23.0': dependencies: '@shikijs/core': 3.23.0 '@shikijs/types': 3.23.0 - '@shikijs/twoslash@3.23.0(typescript@5.9.3)': + '@shikijs/transformers@4.4.1': dependencies: - '@shikijs/core': 3.23.0 - '@shikijs/types': 3.23.0 - twoslash: 0.3.6(typescript@5.9.3) + '@shikijs/core': 4.4.1 + '@shikijs/types': 4.4.1 + + '@shikijs/twoslash@4.4.1(typescript@5.9.3)': + dependencies: + '@shikijs/core': 4.4.1 + '@shikijs/types': 4.4.1 + twoslash: 0.3.9(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -5939,21 +6756,26 @@ snapshots: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - '@shikijs/vitepress-twoslash@3.23.0(typescript@5.9.3)': + '@shikijs/types@4.4.1': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + + '@shikijs/vitepress-twoslash@4.4.1(typescript@5.9.3)': dependencies: - '@shikijs/twoslash': 3.23.0(typescript@5.9.3) - floating-vue: 5.2.2(vue@3.5.30(typescript@5.9.3)) + '@shikijs/twoslash': 4.4.1(typescript@5.9.3) + floating-vue: 5.2.2(vue@3.5.40(typescript@5.9.3)) lz-string: 1.5.0 - magic-string: 0.30.21 - markdown-it: 14.1.1 + magic-string: 1.1.0 + markdown-it: 14.3.0 mdast-util-from-markdown: 2.0.3 mdast-util-gfm: 3.1.0 mdast-util-to-hast: 13.2.1 ohash: 2.0.11 - shiki: 3.23.0 - twoslash: 0.3.6(typescript@5.9.3) - twoslash-vue: 0.3.6(typescript@5.9.3) - vue: 3.5.30(typescript@5.9.3) + shiki: 4.4.1 + twoslash: 0.3.9(typescript@5.9.3) + twoslash-vue: 0.3.9(typescript@5.9.3) + vue: 3.5.40(typescript@5.9.3) transitivePeerDependencies: - '@nuxt/kit' - supports-color @@ -5965,11 +6787,11 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@stylistic/eslint-plugin@5.10.0(eslint@10.0.3(jiti@2.6.1))': + '@stylistic/eslint-plugin@5.10.0(eslint@10.8.0(jiti@2.6.1))': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.3(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.0(jiti@2.6.1)) '@typescript-eslint/types': 8.57.1 - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.8.0(jiti@2.6.1) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 @@ -6052,21 +6874,21 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 4.2.1 - '@tailwindcss/vite@4.2.1(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))': + '@tailwindcss/vite@4.2.1(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0))': dependencies: '@tailwindcss/node': 4.2.1 '@tailwindcss/oxide': 4.2.1 tailwindcss: 4.2.1 - vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0) '@tanstack/virtual-core@3.13.23': {} - '@tanstack/vue-virtual@3.13.23(vue@3.5.30(typescript@5.9.3))': + '@tanstack/vue-virtual@3.13.23(vue@3.5.40(typescript@5.9.3))': dependencies: '@tanstack/virtual-core': 3.13.23 - vue: 3.5.30(typescript@5.9.3) + vue: 3.5.40(typescript@5.9.3) - '@tybys/wasm-util@0.10.1': + '@tybys/wasm-util@0.10.3': dependencies: tslib: 2.8.1 optional: true @@ -6088,12 +6910,20 @@ snapshots: '@types/estree@1.0.8': {} + '@types/estree@1.0.9': {} + '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 + '@types/hast@3.0.5': + dependencies: + '@types/unist': 3.0.3 + '@types/json-schema@7.0.15': {} + '@types/katex@0.16.8': {} + '@types/linkify-it@5.0.0': {} '@types/markdown-it@14.1.2': @@ -6109,9 +6939,9 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@25.5.0': + '@types/node@26.1.2': dependencies: - undici-types: 7.18.2 + undici-types: 8.3.0 '@types/resolve@1.20.2': {} @@ -6121,30 +6951,30 @@ snapshots: '@types/web-bluetooth@0.0.21': {} - '@typescript-eslint/eslint-plugin@8.57.1(@typescript-eslint/parser@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.57.1 - '@typescript-eslint/type-utils': 8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.57.1 - eslint: 10.0.3(jiti@2.6.1) + '@typescript-eslint/parser': 8.65.0(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/type-utils': 8.65.0(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.65.0(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.65.0 + eslint: 10.8.0(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.4.0(typescript@5.9.3) + ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.65.0(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.57.1 - '@typescript-eslint/types': 8.57.1 - '@typescript-eslint/typescript-estree': 8.57.1(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.57.1 + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.65.0 debug: 4.4.3 - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.8.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -6158,65 +6988,97 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/rule-tester@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/project-service@8.65.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/parser': 8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.57.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - ajv: 6.14.0 - eslint: 10.0.3(jiti@2.6.1) - json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - semver: 7.7.4 + '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@5.9.3) + '@typescript-eslint/types': 8.65.0 + debug: 4.4.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - - typescript '@typescript-eslint/scope-manager@8.57.1': dependencies: '@typescript-eslint/types': 8.57.1 '@typescript-eslint/visitor-keys': 8.57.1 + '@typescript-eslint/scope-manager@8.65.0': + dependencies: + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/visitor-keys': 8.65.0 + '@typescript-eslint/tsconfig-utils@8.57.1(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.65.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.57.1 - '@typescript-eslint/typescript-estree': 8.57.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.65.0(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.65.0(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3 - eslint: 10.0.3(jiti@2.6.1) - ts-api-utils: 2.4.0(typescript@5.9.3) + eslint: 10.8.0(jiti@2.6.1) + ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color '@typescript-eslint/types@8.57.1': {} + '@typescript-eslint/types@8.65.0': {} + '@typescript-eslint/typescript-estree@8.57.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.57.1(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.57.1(typescript@5.9.3) - '@typescript-eslint/types': 8.57.1 - '@typescript-eslint/visitor-keys': 8.57.1 + '@typescript-eslint/project-service': 8.57.1(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.57.1(typescript@5.9.3) + '@typescript-eslint/types': 8.57.1 + '@typescript-eslint/visitor-keys': 8.57.1 + debug: 4.4.3 + minimatch: 10.2.4 + semver: 7.7.4 + tinyglobby: 0.2.17 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@8.65.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.65.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@5.9.3) + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/visitor-keys': 8.65.0 debug: 4.4.3 minimatch: 10.2.4 semver: 7.7.4 - tinyglobby: 0.2.15 - ts-api-utils: 2.4.0(typescript@5.9.3) + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.57.1(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.3(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.0(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.57.1 '@typescript-eslint/types': 8.57.1 '@typescript-eslint/typescript-estree': 8.57.1(typescript@5.9.3) - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.8.0(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.65.0(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.0(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3) + eslint: 10.8.0(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -6226,6 +7088,11 @@ snapshots: '@typescript-eslint/types': 8.57.1 eslint-visitor-keys: 5.0.1 + '@typescript-eslint/visitor-keys@8.65.0': + dependencies: + '@typescript-eslint/types': 8.65.0 + eslint-visitor-keys: 5.0.1 + '@typescript/vfs@1.6.4(typescript@5.9.3)': dependencies: debug: 4.4.3 @@ -6235,136 +7102,136 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@unocss/cli@66.6.6': + '@unocss/cli@66.7.5': dependencies: '@jridgewell/remapping': 2.3.5 - '@unocss/config': 66.6.6 - '@unocss/core': 66.6.6 - '@unocss/preset-wind3': 66.6.6 - '@unocss/preset-wind4': 66.6.6 - '@unocss/transformer-directives': 66.6.6 - cac: 6.7.14 + '@unocss/config': 66.7.5 + '@unocss/core': 66.7.5 + '@unocss/preset-wind3': 66.7.5 + '@unocss/preset-wind4': 66.7.5 + '@unocss/transformer-directives': 66.7.5 + cac: 7.0.0 chokidar: 5.0.0 colorette: 2.0.20 consola: 3.4.2 magic-string: 0.30.21 pathe: 2.0.3 perfect-debounce: 2.1.0 - tinyglobby: 0.2.15 + tinyglobby: 0.2.17 unplugin-utils: 0.3.1 - '@unocss/config@66.6.6': + '@unocss/config@66.7.5': dependencies: - '@unocss/core': 66.6.6 + '@unocss/core': 66.7.5 colorette: 2.0.20 consola: 3.4.2 unconfig: 7.5.0 - '@unocss/core@66.6.6': {} + '@unocss/core@66.7.5': {} - '@unocss/extractor-arbitrary-variants@66.6.6': + '@unocss/extractor-arbitrary-variants@66.7.5': dependencies: - '@unocss/core': 66.6.6 + '@unocss/core': 66.7.5 - '@unocss/inspector@66.6.6': + '@unocss/inspector@66.7.5': dependencies: - '@unocss/core': 66.6.6 - '@unocss/rule-utils': 66.6.6 + '@unocss/core': 66.7.5 + '@unocss/rule-utils': 66.7.5 colorette: 2.0.20 gzip-size: 6.0.0 sirv: 3.0.2 - '@unocss/preset-attributify@66.6.6': + '@unocss/preset-attributify@66.7.5': dependencies: - '@unocss/core': 66.6.6 + '@unocss/core': 66.7.5 - '@unocss/preset-icons@66.6.6': + '@unocss/preset-icons@66.7.5': dependencies: - '@iconify/utils': 3.1.0 - '@unocss/core': 66.6.6 + '@iconify/utils': 3.1.4 + '@unocss/core': 66.7.5 ofetch: 1.5.1 - '@unocss/preset-mini@66.6.6': + '@unocss/preset-mini@66.7.5': dependencies: - '@unocss/core': 66.6.6 - '@unocss/extractor-arbitrary-variants': 66.6.6 - '@unocss/rule-utils': 66.6.6 + '@unocss/core': 66.7.5 + '@unocss/extractor-arbitrary-variants': 66.7.5 + '@unocss/rule-utils': 66.7.5 - '@unocss/preset-tagify@66.6.6': + '@unocss/preset-tagify@66.7.5': dependencies: - '@unocss/core': 66.6.6 + '@unocss/core': 66.7.5 - '@unocss/preset-typography@66.6.6': + '@unocss/preset-typography@66.7.5': dependencies: - '@unocss/core': 66.6.6 - '@unocss/rule-utils': 66.6.6 + '@unocss/core': 66.7.5 + '@unocss/rule-utils': 66.7.5 - '@unocss/preset-uno@66.6.6': + '@unocss/preset-uno@66.7.5': dependencies: - '@unocss/core': 66.6.6 - '@unocss/preset-wind3': 66.6.6 + '@unocss/core': 66.7.5 + '@unocss/preset-wind3': 66.7.5 - '@unocss/preset-web-fonts@66.6.6': + '@unocss/preset-web-fonts@66.7.5': dependencies: - '@unocss/core': 66.6.6 + '@unocss/core': 66.7.5 ofetch: 1.5.1 - '@unocss/preset-wind3@66.6.6': + '@unocss/preset-wind3@66.7.5': dependencies: - '@unocss/core': 66.6.6 - '@unocss/preset-mini': 66.6.6 - '@unocss/rule-utils': 66.6.6 + '@unocss/core': 66.7.5 + '@unocss/preset-mini': 66.7.5 + '@unocss/rule-utils': 66.7.5 - '@unocss/preset-wind4@66.6.6': + '@unocss/preset-wind4@66.7.5': dependencies: - '@unocss/core': 66.6.6 - '@unocss/extractor-arbitrary-variants': 66.6.6 - '@unocss/rule-utils': 66.6.6 + '@unocss/core': 66.7.5 + '@unocss/extractor-arbitrary-variants': 66.7.5 + '@unocss/rule-utils': 66.7.5 - '@unocss/preset-wind@66.6.6': + '@unocss/preset-wind@66.7.5': dependencies: - '@unocss/core': 66.6.6 - '@unocss/preset-wind3': 66.6.6 + '@unocss/core': 66.7.5 + '@unocss/preset-wind3': 66.7.5 - '@unocss/reset@66.6.6': {} + '@unocss/reset@66.7.5': {} - '@unocss/rule-utils@66.6.6': + '@unocss/rule-utils@66.7.5': dependencies: - '@unocss/core': 66.6.6 + '@unocss/core': 66.7.5 magic-string: 0.30.21 - '@unocss/transformer-attributify-jsx@66.6.6': + '@unocss/transformer-attributify-jsx@66.7.5': dependencies: - '@unocss/core': 66.6.6 - oxc-parser: 0.115.0 - oxc-walker: 0.7.0(oxc-parser@0.115.0) + '@unocss/core': 66.7.5 + oxc-parser: 0.131.0 + oxc-walker: 0.7.0(oxc-parser@0.131.0) - '@unocss/transformer-compile-class@66.6.6': + '@unocss/transformer-compile-class@66.7.5': dependencies: - '@unocss/core': 66.6.6 + '@unocss/core': 66.7.5 - '@unocss/transformer-directives@66.6.6': + '@unocss/transformer-directives@66.7.5': dependencies: - '@unocss/core': 66.6.6 - '@unocss/rule-utils': 66.6.6 + '@unocss/core': 66.7.5 + '@unocss/rule-utils': 66.7.5 css-tree: 3.2.1 - '@unocss/transformer-variant-group@66.6.6': + '@unocss/transformer-variant-group@66.7.5': dependencies: - '@unocss/core': 66.6.6 + '@unocss/core': 66.7.5 - '@unocss/vite@66.6.6(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))': + '@unocss/vite@66.7.5(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0))': dependencies: '@jridgewell/remapping': 2.3.5 - '@unocss/config': 66.6.6 - '@unocss/core': 66.6.6 - '@unocss/inspector': 66.6.6 + '@unocss/config': 66.7.5 + '@unocss/core': 66.7.5 + '@unocss/inspector': 66.7.5 chokidar: 5.0.0 magic-string: 0.30.21 pathe: 2.0.3 - tinyglobby: 0.2.15 + tinyglobby: 0.2.17 unplugin-utils: 0.3.1 - vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0) '@vite-pwa/assets-generator@1.0.2': dependencies: @@ -6375,89 +7242,96 @@ snapshots: sharp-ico: 0.1.5 unconfig: 7.5.0 - '@vite-pwa/vitepress@1.1.0(@vite-pwa/assets-generator@1.0.2)(vite-plugin-pwa@1.2.0(@vite-pwa/assets-generator@1.0.2)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))(workbox-build@7.4.0)(workbox-window@7.4.0))': + '@vite-pwa/vitepress@1.1.0(@vite-pwa/assets-generator@1.0.2)(vite-plugin-pwa@1.3.0(@vite-pwa/assets-generator@1.0.2)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0))(workbox-build@7.4.0)(workbox-window@7.4.1))': dependencies: - vite-plugin-pwa: 1.2.0(@vite-pwa/assets-generator@1.0.2)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))(workbox-build@7.4.0)(workbox-window@7.4.0) + vite-plugin-pwa: 1.3.0(@vite-pwa/assets-generator@1.0.2)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0))(workbox-build@7.4.0)(workbox-window@7.4.1) optionalDependencies: '@vite-pwa/assets-generator': 1.0.2 - '@vitejs/plugin-vue@6.0.5(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3))': + '@vitejs/plugin-vue@6.0.8(vite@7.3.1(@types/node@26.1.2)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3))': dependencies: - '@rolldown/pluginutils': 1.0.0-rc.2 - vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) - vue: 3.5.30(typescript@5.9.3) + '@rolldown/pluginutils': 1.0.1 + vite: 7.3.1(@types/node@26.1.2)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0) + vue: 3.5.40(typescript@5.9.3) - '@vitest/eslint-plugin@1.6.12(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3)(vitest@4.1.0(@types/node@25.5.0)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)))': + '@vitejs/plugin-vue@6.0.8(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3))': dependencies: - '@typescript-eslint/scope-manager': 8.57.1 - '@typescript-eslint/utils': 8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - eslint: 10.0.3(jiti@2.6.1) + '@rolldown/pluginutils': 1.0.1 + vite: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0) + vue: 3.5.40(typescript@5.9.3) + + '@vitest/eslint-plugin@1.6.25(@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3)(vitest@4.1.10(@types/node@26.1.2)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0)))': + dependencies: + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/utils': 8.65.0(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 10.8.0(jiti@2.6.1) optionalDependencies: + '@typescript-eslint/eslint-plugin': 8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3) typescript: 5.9.3 - vitest: 4.1.0(@types/node@25.5.0)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) + vitest: 4.1.10(@types/node@26.1.2)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0)) transitivePeerDependencies: - supports-color - '@vitest/expect@4.1.0': + '@vitest/expect@4.1.10': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.0 - '@vitest/utils': 4.1.0 + '@vitest/spy': 4.1.10 + '@vitest/utils': 4.1.10 chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.0(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@4.1.10(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0))': dependencies: - '@vitest/spy': 4.1.0 + '@vitest/spy': 4.1.10 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0) - '@vitest/pretty-format@4.1.0': + '@vitest/pretty-format@4.1.10': dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@4.1.0': + '@vitest/runner@4.1.10': dependencies: - '@vitest/utils': 4.1.0 + '@vitest/utils': 4.1.10 pathe: 2.0.3 - '@vitest/snapshot@4.1.0': + '@vitest/snapshot@4.1.10': dependencies: - '@vitest/pretty-format': 4.1.0 - '@vitest/utils': 4.1.0 + '@vitest/pretty-format': 4.1.10 + '@vitest/utils': 4.1.10 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.0': {} + '@vitest/spy@4.1.10': {} - '@vitest/utils@4.1.0': + '@vitest/utils@4.1.10': dependencies: - '@vitest/pretty-format': 4.1.0 + '@vitest/pretty-format': 4.1.10 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 - '@voidzero-dev/vitepress-theme@4.8.4(change-case@5.4.4)(focus-trap@7.8.0)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))(vitepress@2.0.0-alpha.16(@types/node@25.5.0)(change-case@5.4.4)(jiti@2.6.1)(lightningcss@1.31.1)(postcss@8.5.8)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3))': + '@voidzero-dev/vitepress-theme@5.0.4(change-case@5.4.4)(focus-trap@7.8.0)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0))(vitepress@2.0.0-alpha.16(@types/node@26.1.2)(change-case@5.4.4)(jiti@2.6.1)(lightningcss@1.33.0)(postcss@8.5.25)(terser@5.46.1)(tsx@4.23.4)(typescript@5.9.3)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3))': dependencies: '@docsearch/css': 4.6.0 '@docsearch/js': 4.6.0 '@docsearch/sidepanel-js': 4.6.0 - '@iconify/vue': 5.0.0(vue@3.5.30(typescript@5.9.3)) + '@iconify/vue': 5.0.1(vue@3.5.40(typescript@5.9.3)) '@rive-app/canvas-lite': 2.35.3 '@tailwindcss/typography': 0.5.19(tailwindcss@4.2.1) - '@tailwindcss/vite': 4.2.1(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) + '@tailwindcss/vite': 4.2.1(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0)) '@vue/shared': 3.5.30 - '@vueuse/core': 14.2.1(vue@3.5.30(typescript@5.9.3)) - '@vueuse/integrations': 14.2.1(change-case@5.4.4)(focus-trap@7.8.0)(vue@3.5.30(typescript@5.9.3)) - '@vueuse/shared': 14.2.1(vue@3.5.30(typescript@5.9.3)) + '@vueuse/core': 14.4.0(vue@3.5.40(typescript@5.9.3)) + '@vueuse/integrations': 14.2.1(change-case@5.4.4)(focus-trap@7.8.0)(vue@3.5.40(typescript@5.9.3)) + '@vueuse/shared': 14.2.1(vue@3.5.40(typescript@5.9.3)) mark.js: 8.11.1 minisearch: 7.2.0 - reka-ui: 2.9.2(vue@3.5.30(typescript@5.9.3)) + reka-ui: 2.9.2(vue@3.5.40(typescript@5.9.3)) tailwindcss: 4.2.1 - vitepress: 2.0.0-alpha.16(@types/node@25.5.0)(change-case@5.4.4)(jiti@2.6.1)(lightningcss@1.31.1)(postcss@8.5.8)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) - vue: 3.5.30(typescript@5.9.3) + vitepress: 2.0.0-alpha.16(@types/node@26.1.2)(change-case@5.4.4)(jiti@2.6.1)(lightningcss@1.33.0)(postcss@8.5.25)(terser@5.46.1)(tsx@4.23.4)(typescript@5.9.3)(yaml@2.9.0) + vue: 3.5.40(typescript@5.9.3) transitivePeerDependencies: - '@vue/composition-api' - async-validator @@ -6488,27 +7362,40 @@ snapshots: estree-walker: 2.0.2 source-map-js: 1.2.1 + '@vue/compiler-core@3.5.40': + dependencies: + '@babel/parser': 7.29.8 + '@vue/shared': 3.5.40 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + '@vue/compiler-dom@3.5.30': dependencies: '@vue/compiler-core': 3.5.30 '@vue/shared': 3.5.30 - '@vue/compiler-sfc@3.5.30': + '@vue/compiler-dom@3.5.40': dependencies: - '@babel/parser': 7.29.2 - '@vue/compiler-core': 3.5.30 - '@vue/compiler-dom': 3.5.30 - '@vue/compiler-ssr': 3.5.30 - '@vue/shared': 3.5.30 + '@vue/compiler-core': 3.5.40 + '@vue/shared': 3.5.40 + + '@vue/compiler-sfc@3.5.40': + dependencies: + '@babel/parser': 7.29.8 + '@vue/compiler-core': 3.5.40 + '@vue/compiler-dom': 3.5.40 + '@vue/compiler-ssr': 3.5.40 + '@vue/shared': 3.5.40 estree-walker: 2.0.2 magic-string: 0.30.21 - postcss: 8.5.8 + postcss: 8.5.25 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.30': + '@vue/compiler-ssr@3.5.40': dependencies: - '@vue/compiler-dom': 3.5.30 - '@vue/shared': 3.5.30 + '@vue/compiler-dom': 3.5.40 + '@vue/shared': 3.5.40 '@vue/devtools-api@8.1.0': dependencies: @@ -6533,51 +7420,66 @@ snapshots: path-browserify: 1.0.1 picomatch: 4.0.3 - '@vue/reactivity@3.5.30': + '@vue/reactivity@3.5.40': dependencies: - '@vue/shared': 3.5.30 + '@vue/shared': 3.5.40 - '@vue/runtime-core@3.5.30': + '@vue/runtime-core@3.5.40': dependencies: - '@vue/reactivity': 3.5.30 - '@vue/shared': 3.5.30 + '@vue/reactivity': 3.5.40 + '@vue/shared': 3.5.40 - '@vue/runtime-dom@3.5.30': + '@vue/runtime-dom@3.5.40': dependencies: - '@vue/reactivity': 3.5.30 - '@vue/runtime-core': 3.5.30 - '@vue/shared': 3.5.30 + '@vue/reactivity': 3.5.40 + '@vue/runtime-core': 3.5.40 + '@vue/shared': 3.5.40 csstype: 3.2.3 - '@vue/server-renderer@3.5.30(vue@3.5.30(typescript@5.9.3))': + '@vue/server-renderer@3.5.40': dependencies: - '@vue/compiler-ssr': 3.5.30 - '@vue/shared': 3.5.30 - vue: 3.5.30(typescript@5.9.3) + '@vue/compiler-ssr': 3.5.40 + '@vue/runtime-dom': 3.5.40 + '@vue/shared': 3.5.40 '@vue/shared@3.5.30': {} - '@vueuse/core@14.2.1(vue@3.5.30(typescript@5.9.3))': + '@vue/shared@3.5.40': {} + + '@vueuse/core@14.2.1(vue@3.5.40(typescript@5.9.3))': dependencies: '@types/web-bluetooth': 0.0.21 '@vueuse/metadata': 14.2.1 - '@vueuse/shared': 14.2.1(vue@3.5.30(typescript@5.9.3)) - vue: 3.5.30(typescript@5.9.3) + '@vueuse/shared': 14.2.1(vue@3.5.40(typescript@5.9.3)) + vue: 3.5.40(typescript@5.9.3) + + '@vueuse/core@14.4.0(vue@3.5.40(typescript@5.9.3))': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 14.4.0 + '@vueuse/shared': 14.4.0(vue@3.5.40(typescript@5.9.3)) + vue: 3.5.40(typescript@5.9.3) - '@vueuse/integrations@14.2.1(change-case@5.4.4)(focus-trap@7.8.0)(vue@3.5.30(typescript@5.9.3))': + '@vueuse/integrations@14.2.1(change-case@5.4.4)(focus-trap@7.8.0)(vue@3.5.40(typescript@5.9.3))': dependencies: - '@vueuse/core': 14.2.1(vue@3.5.30(typescript@5.9.3)) - '@vueuse/shared': 14.2.1(vue@3.5.30(typescript@5.9.3)) - vue: 3.5.30(typescript@5.9.3) + '@vueuse/core': 14.2.1(vue@3.5.40(typescript@5.9.3)) + '@vueuse/shared': 14.2.1(vue@3.5.40(typescript@5.9.3)) + vue: 3.5.40(typescript@5.9.3) optionalDependencies: change-case: 5.4.4 focus-trap: 7.8.0 '@vueuse/metadata@14.2.1': {} - '@vueuse/shared@14.2.1(vue@3.5.30(typescript@5.9.3))': + '@vueuse/metadata@14.4.0': {} + + '@vueuse/shared@14.2.1(vue@3.5.40(typescript@5.9.3))': + dependencies: + vue: 3.5.40(typescript@5.9.3) + + '@vueuse/shared@14.4.0(vue@3.5.40(typescript@5.9.3))': dependencies: - vue: 3.5.30(typescript@5.9.3) + vue: 3.5.40(typescript@5.9.3) accepts@1.3.8: dependencies: @@ -6606,15 +7508,7 @@ snapshots: alien-signals@3.1.2: {} - ansi-escapes@7.3.0: - dependencies: - environment: 1.1.0 - - ansi-regex@6.2.2: {} - - ansi-styles@6.2.3: {} - - ansis@4.2.0: {} + ansis@4.3.1: {} appdata-path@1.0.0: {} @@ -6685,6 +7579,8 @@ snapshots: baseline-browser-mapping@2.10.8: {} + baseline-browser-mapping@2.11.11: {} + birpc@2.9.0: {} body-parser@1.20.4: @@ -6714,6 +7610,10 @@ snapshots: dependencies: balanced-match: 4.0.4 + brace-expansion@5.0.9: + dependencies: + balanced-match: 4.0.4 + browserslist@4.28.1: dependencies: baseline-browser-mapping: 2.10.8 @@ -6722,6 +7622,14 @@ snapshots: node-releases: 2.0.36 update-browserslist-db: 1.2.3(browserslist@4.28.1) + browserslist@4.28.7: + dependencies: + baseline-browser-mapping: 2.11.11 + caniuse-lite: 1.0.30001806 + electron-to-chromium: 1.5.399 + node-releases: 2.0.51 + update-browserslist-db: 1.2.3(browserslist@4.28.7) + buffer-from@1.1.2: {} builtin-modules@5.0.0: {} @@ -6751,6 +7659,8 @@ snapshots: caniuse-lite@1.0.30001780: {} + caniuse-lite@1.0.30001806: {} + ccount@2.0.1: {} chai@6.2.2: {} @@ -6769,19 +7679,6 @@ snapshots: ci-info@4.4.0: {} - clean-regexp@1.0.0: - dependencies: - escape-string-regexp: 1.0.5 - - cli-cursor@5.0.0: - dependencies: - restore-cursor: 5.1.0 - - cli-truncate@5.2.0: - dependencies: - slice-ansi: 8.0.0 - string-width: 8.2.0 - color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -6802,12 +7699,14 @@ snapshots: comma-separated-tokens@2.0.3: {} - commander@14.0.3: {} - commander@2.20.3: {} + commander@8.3.0: {} + comment-parser@1.4.5: {} + comment-parser@1.4.7: {} + common-tags@1.8.2: {} compressible@2.0.18: @@ -6838,6 +7737,8 @@ snapshots: content-type@1.0.5: {} + convert-hrtime@5.0.0: {} + convert-source-map@2.0.0: {} cookie-signature@1.0.7: {} @@ -6846,7 +7747,7 @@ snapshots: core-js-compat@3.49.0: dependencies: - browserslist: 4.28.1 + browserslist: 4.28.7 core-util-is@1.0.3: {} @@ -6939,6 +7840,8 @@ snapshots: destroy@1.2.0: {} + detect-indent@7.0.2: {} + detect-libc@2.1.2: {} detect-node@2.1.0: {} @@ -6965,9 +7868,9 @@ snapshots: electron-to-chromium@1.5.313: {} - emoji-regex@10.6.0: {} + electron-to-chromium@1.5.399: {} - empathic@2.0.0: {} + empathic@2.0.1: {} encodeurl@2.0.0: {} @@ -6980,8 +7883,6 @@ snapshots: entities@7.0.1: {} - environment@1.1.0: {} - es-abstract@1.24.1: dependencies: array-buffer-byte-length: 1.0.2 @@ -7091,231 +7992,251 @@ snapshots: '@esbuild/win32-ia32': 0.27.4 '@esbuild/win32-x64': 0.27.4 + esbuild@0.28.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.1 + '@esbuild/android-arm': 0.28.1 + '@esbuild/android-arm64': 0.28.1 + '@esbuild/android-x64': 0.28.1 + '@esbuild/darwin-arm64': 0.28.1 + '@esbuild/darwin-x64': 0.28.1 + '@esbuild/freebsd-arm64': 0.28.1 + '@esbuild/freebsd-x64': 0.28.1 + '@esbuild/linux-arm': 0.28.1 + '@esbuild/linux-arm64': 0.28.1 + '@esbuild/linux-ia32': 0.28.1 + '@esbuild/linux-loong64': 0.28.1 + '@esbuild/linux-mips64el': 0.28.1 + '@esbuild/linux-ppc64': 0.28.1 + '@esbuild/linux-riscv64': 0.28.1 + '@esbuild/linux-s390x': 0.28.1 + '@esbuild/linux-x64': 0.28.1 + '@esbuild/netbsd-arm64': 0.28.1 + '@esbuild/netbsd-x64': 0.28.1 + '@esbuild/openbsd-arm64': 0.28.1 + '@esbuild/openbsd-x64': 0.28.1 + '@esbuild/openharmony-arm64': 0.28.1 + '@esbuild/sunos-x64': 0.28.1 + '@esbuild/win32-arm64': 0.28.1 + '@esbuild/win32-ia32': 0.28.1 + '@esbuild/win32-x64': 0.28.1 + escalade@3.2.0: {} escape-html@1.0.3: {} - escape-string-regexp@1.0.5: {} - escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} - eslint-compat-utils@0.5.1(eslint@10.0.3(jiti@2.6.1)): + eslint-compat-utils@0.5.1(eslint@10.8.0(jiti@2.6.1)): dependencies: - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.8.0(jiti@2.6.1) semver: 7.7.4 - eslint-config-flat-gitignore@2.2.1(eslint@10.0.3(jiti@2.6.1)): + eslint-config-flat-gitignore@2.3.0(eslint@10.8.0(jiti@2.6.1)): dependencies: - '@eslint/compat': 2.0.3(eslint@10.0.3(jiti@2.6.1)) - eslint: 10.0.3(jiti@2.6.1) + '@eslint/compat': 2.0.3(eslint@10.8.0(jiti@2.6.1)) + eslint: 10.8.0(jiti@2.6.1) - eslint-factory@0.1.2(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3): + eslint-factory@0.1.2(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/utils': 8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - eslint: 10.0.3(jiti@2.6.1) + '@typescript-eslint/utils': 8.57.1(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 10.8.0(jiti@2.6.1) transitivePeerDependencies: - supports-color - typescript - eslint-flat-config-utils@3.0.2: + eslint-flat-config-utils@3.2.0: dependencies: - '@eslint/config-helpers': 0.5.3 + '@eslint/config-helpers': 0.5.5 pathe: 2.0.3 - eslint-json-compat-utils@0.2.3(eslint@10.0.3(jiti@2.6.1))(jsonc-eslint-parser@3.1.0): + eslint-json-compat-utils@0.2.3(eslint@10.8.0(jiti@2.6.1))(jsonc-eslint-parser@3.1.0): dependencies: - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.8.0(jiti@2.6.1) esquery: 1.7.0 jsonc-eslint-parser: 3.1.0 - eslint-merge-processors@2.0.0(eslint@10.0.3(jiti@2.6.1)): - dependencies: - eslint: 10.0.3(jiti@2.6.1) - - eslint-plugin-antfu@3.2.2(eslint@10.0.3(jiti@2.6.1)): + eslint-merge-processors@2.0.0(eslint@10.8.0(jiti@2.6.1)): dependencies: - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.8.0(jiti@2.6.1) - eslint-plugin-command@3.5.2(@typescript-eslint/rule-tester@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/typescript-estree@8.57.1(typescript@5.9.3))(@typescript-eslint/utils@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1)): + eslint-plugin-antfu@3.2.3(eslint@10.8.0(jiti@2.6.1)): dependencies: - '@es-joy/jsdoccomment': 0.84.0 - '@typescript-eslint/rule-tester': 8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.57.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.8.0(jiti@2.6.1) - eslint-plugin-depend@1.5.0(eslint@10.0.3(jiti@2.6.1)): + eslint-plugin-command@3.5.3(@typescript-eslint/typescript-estree@8.65.0(typescript@5.9.3))(@typescript-eslint/utils@8.65.0(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.8.0(jiti@2.6.1)): dependencies: - empathic: 2.0.0 - eslint: 10.0.3(jiti@2.6.1) - module-replacements: 2.11.0 - semver: 7.7.4 + '@es-joy/jsdoccomment': 0.88.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.65.0(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 10.8.0(jiti@2.6.1) - eslint-plugin-es-x@7.8.0(eslint@10.0.3(jiti@2.6.1)): + eslint-plugin-es-x@7.8.0(eslint@10.8.0(jiti@2.6.1)): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.3(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 - eslint: 10.0.3(jiti@2.6.1) - eslint-compat-utils: 0.5.1(eslint@10.0.3(jiti@2.6.1)) + eslint: 10.8.0(jiti@2.6.1) + eslint-compat-utils: 0.5.1(eslint@10.8.0(jiti@2.6.1)) - eslint-plugin-import-lite@0.5.2(eslint@10.0.3(jiti@2.6.1)): + eslint-plugin-import-lite@0.6.0(eslint@10.8.0(jiti@2.6.1)): dependencies: - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.8.0(jiti@2.6.1) - eslint-plugin-jsdoc@62.8.0(eslint@10.0.3(jiti@2.6.1)): + eslint-plugin-jsdoc@63.3.2(eslint@10.8.0(jiti@2.6.1)): dependencies: - '@es-joy/jsdoccomment': 0.84.0 + '@es-joy/jsdoccomment': 0.91.0 '@es-joy/resolve.exports': 1.2.0 are-docs-informative: 0.0.2 - comment-parser: 1.4.5 + comment-parser: 1.4.7 debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.8.0(jiti@2.6.1) espree: 11.2.0 esquery: 1.7.0 html-entities: 2.6.0 - object-deep-merge: 2.0.0 + object-deep-merge: 2.0.1 parse-imports-exports: 0.2.4 - semver: 7.7.4 - spdx-expression-parse: 4.0.0 + semver: 7.8.5 + spdx-expression-parse: 5.0.0 to-valid-identifier: 1.0.0 transitivePeerDependencies: - supports-color - eslint-plugin-jsonc@3.1.2(eslint@10.0.3(jiti@2.6.1)): + eslint-plugin-jsonc@3.3.0(eslint@10.8.0(jiti@2.6.1)): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.3(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.0(jiti@2.6.1)) '@eslint/core': 1.1.1 - '@eslint/plugin-kit': 0.6.1 + '@eslint/plugin-kit': 0.7.2 '@ota-meshi/ast-token-store': 0.3.0 diff-sequences: 29.6.3 - eslint: 10.0.3(jiti@2.6.1) - eslint-json-compat-utils: 0.2.3(eslint@10.0.3(jiti@2.6.1))(jsonc-eslint-parser@3.1.0) + eslint: 10.8.0(jiti@2.6.1) + eslint-json-compat-utils: 0.2.3(eslint@10.8.0(jiti@2.6.1))(jsonc-eslint-parser@3.1.0) jsonc-eslint-parser: 3.1.0 natural-compare: 1.4.0 synckit: 0.11.12 transitivePeerDependencies: - '@eslint/json' - eslint-plugin-n@17.24.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3): + eslint-plugin-n@18.2.2(eslint@10.8.0(jiti@2.6.1))(ts-declaration-location@1.0.7(typescript@5.9.3))(typescript@5.9.3): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.3(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.0(jiti@2.6.1)) enhanced-resolve: 5.20.1 - eslint: 10.0.3(jiti@2.6.1) - eslint-plugin-es-x: 7.8.0(eslint@10.0.3(jiti@2.6.1)) + eslint: 10.8.0(jiti@2.6.1) + eslint-plugin-es-x: 7.8.0(eslint@10.8.0(jiti@2.6.1)) get-tsconfig: 4.13.6 globals: 15.15.0 globrex: 0.1.2 ignore: 5.3.2 semver: 7.7.4 + optionalDependencies: ts-declaration-location: 1.0.7(typescript@5.9.3) - transitivePeerDependencies: - - typescript + typescript: 5.9.3 - eslint-plugin-no-only-tests@3.3.0: {} + eslint-plugin-no-only-tests@3.4.0: {} - eslint-plugin-perfectionist@5.6.0(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3): + eslint-plugin-perfectionist@5.10.0(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/utils': 8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) - eslint: 10.0.3(jiti@2.6.1) + '@typescript-eslint/utils': 8.65.0(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 10.8.0(jiti@2.6.1) natural-orderby: 5.0.0 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-pnpm@1.6.0(eslint@10.0.3(jiti@2.6.1)): + eslint-plugin-pnpm@1.7.0(eslint@10.8.0(jiti@2.6.1)): dependencies: - empathic: 2.0.0 - eslint: 10.0.3(jiti@2.6.1) + empathic: 2.0.1 + eslint: 10.8.0(jiti@2.6.1) jsonc-eslint-parser: 3.1.0 pathe: 2.0.3 - pnpm-workspace-yaml: 1.6.0 - tinyglobby: 0.2.15 - yaml: 2.8.2 - yaml-eslint-parser: 2.0.0 + pnpm-workspace-yaml: 1.7.0 + tinyglobby: 0.2.17 + yaml: 2.9.0 + yaml-eslint-parser: 2.1.0 - eslint-plugin-regexp@3.1.0(eslint@10.0.3(jiti@2.6.1)): + eslint-plugin-regexp@3.1.1(eslint@10.8.0(jiti@2.6.1)): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.3(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 comment-parser: 1.4.5 - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.8.0(jiti@2.6.1) jsdoc-type-pratt-parser: 7.1.1 refa: 0.12.1 regexp-ast-analysis: 0.7.1 scslre: 0.3.0 - eslint-plugin-toml@1.3.1(eslint@10.0.3(jiti@2.6.1)): + eslint-plugin-toml@1.5.0(eslint@10.8.0(jiti@2.6.1)): dependencies: '@eslint/core': 1.1.1 - '@eslint/plugin-kit': 0.6.1 + '@eslint/plugin-kit': 0.7.2 '@ota-meshi/ast-token-store': 0.3.0 debug: 4.4.3 - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.8.0(jiti@2.6.1) toml-eslint-parser: 1.0.3 transitivePeerDependencies: - supports-color - eslint-plugin-unicorn@63.0.0(eslint@10.0.3(jiti@2.6.1)): + eslint-plugin-unicorn@72.0.0(eslint@10.8.0(jiti@2.6.1)): dependencies: - '@babel/helper-validator-identifier': 7.28.5 - '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.3(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.0(jiti@2.6.1)) + '@eslint/css-tree': 4.0.5 + browserslist: 4.28.7 change-case: 5.4.4 ci-info: 4.4.0 - clean-regexp: 1.0.0 core-js-compat: 3.49.0 - eslint: 10.0.3(jiti@2.6.1) + detect-indent: 7.0.2 + entities: 4.5.0 + eslint: 10.8.0(jiti@2.6.1) find-up-simple: 1.0.1 - globals: 16.5.0 + globals: 17.9.0 indent-string: 5.0.0 is-builtin-module: 5.0.0 - jsesc: 3.1.0 + is-identifier: 1.1.0 pluralize: 8.0.0 - regexp-tree: 0.1.27 - regjsparser: 0.13.0 - semver: 7.7.4 + quote-js-string: 0.1.0 + regjsparser: 0.13.2 + reserved-identifiers: 1.2.0 + semver: 7.8.5 strip-indent: 4.1.1 + yaml: 2.9.0 - eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.57.1(@typescript-eslint/parser@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1)): + eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.8.0(jiti@2.6.1)): dependencies: - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.8.0(jiti@2.6.1) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.57.1(@typescript-eslint/parser@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-vue@10.8.0(@stylistic/eslint-plugin@5.10.0(eslint@10.0.3(jiti@2.6.1)))(@typescript-eslint/parser@8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.3(jiti@2.6.1))(vue-eslint-parser@10.4.0(eslint@10.0.3(jiti@2.6.1))): + eslint-plugin-vue@10.10.0(@stylistic/eslint-plugin@5.10.0(eslint@10.8.0(jiti@2.6.1)))(@typescript-eslint/parser@8.65.0(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.8.0(jiti@2.6.1))(vue-eslint-parser@10.4.1(eslint@10.8.0(jiti@2.6.1))): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.3(jiti@2.6.1)) - eslint: 10.0.3(jiti@2.6.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.0(jiti@2.6.1)) + eslint: 10.8.0(jiti@2.6.1) natural-compare: 1.4.0 nth-check: 2.1.1 - postcss-selector-parser: 7.1.1 - semver: 7.7.4 - vue-eslint-parser: 10.4.0(eslint@10.0.3(jiti@2.6.1)) - xml-name-validator: 4.0.0 + postcss-selector-parser: 7.1.4 + semver: 7.8.5 + vue-eslint-parser: 10.4.1(eslint@10.8.0(jiti@2.6.1)) + xml-name-validator: 5.0.0 optionalDependencies: - '@stylistic/eslint-plugin': 5.10.0(eslint@10.0.3(jiti@2.6.1)) - '@typescript-eslint/parser': 8.57.1(eslint@10.0.3(jiti@2.6.1))(typescript@5.9.3) + '@stylistic/eslint-plugin': 5.10.0(eslint@10.8.0(jiti@2.6.1)) + '@typescript-eslint/parser': 8.65.0(eslint@10.8.0(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-yml@3.3.1(eslint@10.0.3(jiti@2.6.1)): + eslint-plugin-yml@3.7.0(eslint@10.8.0(jiti@2.6.1)): dependencies: '@eslint/core': 1.1.1 - '@eslint/plugin-kit': 0.6.1 + '@eslint/plugin-kit': 0.7.2 '@ota-meshi/ast-token-store': 0.3.0 - debug: 4.4.3 diff-sequences: 29.6.3 escape-string-regexp: 5.0.0 - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.8.0(jiti@2.6.1) natural-compare: 1.4.0 - yaml-eslint-parser: 2.0.0 - transitivePeerDependencies: - - supports-color + yaml-eslint-parser: 2.1.0 - eslint-processor-vue-blocks@2.0.0(@vue/compiler-sfc@3.5.30)(eslint@10.0.3(jiti@2.6.1)): + eslint-processor-vue-blocks@2.0.0(@vue/compiler-sfc@3.5.40)(eslint@10.8.0(jiti@2.6.1)): dependencies: - '@vue/compiler-sfc': 3.5.30 - eslint: 10.0.3(jiti@2.6.1) + '@vue/compiler-sfc': 3.5.40 + eslint: 10.8.0(jiti@2.6.1) eslint-scope@9.1.2: dependencies: @@ -7330,14 +8251,14 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.0.3(jiti@2.6.1): + eslint@10.8.0(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.0.3(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.23.3 - '@eslint/config-helpers': 0.5.3 - '@eslint/core': 1.1.1 - '@eslint/plugin-kit': 0.6.1 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.7.0 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.2 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 @@ -7359,7 +8280,7 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 - minimatch: 10.2.4 + minimatch: 10.2.6 natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: @@ -7401,8 +8322,6 @@ snapshots: etag@1.8.1: {} - eventemitter3@5.0.4: {} - expect-type@1.3.0: {} express@4.22.1: @@ -7449,8 +8368,18 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-string-truncated-width@3.0.3: {} + + fast-string-width@3.0.2: + dependencies: + fast-string-truncated-width: 3.0.3 + fast-uri@3.1.0: {} + fast-wrap-ansi@0.2.2: + dependencies: + fast-string-width: 3.0.2 + fault@2.0.1: dependencies: format: 0.2.2 @@ -7459,6 +8388,10 @@ snapshots: optionalDependencies: picomatch: 4.0.3 + fdir@6.5.0(picomatch@4.0.5): + optionalDependencies: + picomatch: 4.0.5 + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -7493,11 +8426,11 @@ snapshots: flatted@3.4.2: {} - floating-vue@5.2.2(vue@3.5.30(typescript@5.9.3)): + floating-vue@5.2.2(vue@3.5.40(typescript@5.9.3)): dependencies: '@floating-ui/dom': 1.1.1 - vue: 3.5.30(typescript@5.9.3) - vue-resize: 2.0.0-alpha.1(vue@3.5.30(typescript@5.9.3)) + vue: 3.5.40(typescript@5.9.3) + vue-resize: 2.0.0-alpha.1(vue@3.5.40(typescript@5.9.3)) focus-trap@7.8.0: dependencies: @@ -7530,6 +8463,8 @@ snapshots: function-bind@1.1.2: {} + function-timeout@1.0.2: {} + function.prototype.name@1.1.8: dependencies: call-bind: 1.0.8 @@ -7547,8 +8482,6 @@ snapshots: gensync@1.0.0-beta.2: {} - get-east-asian-width@1.5.0: {} - get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -7596,9 +8529,7 @@ snapshots: globals@15.15.0: {} - globals@16.5.0: {} - - globals@17.4.0: {} + globals@17.9.0: {} globalthis@1.0.4: dependencies: @@ -7697,10 +8628,16 @@ snapshots: idb@7.1.1: {} + identifier-regex@1.1.0: + dependencies: + reserved-identifiers: 1.2.0 + ignore@5.3.2: {} ignore@7.0.5: {} + import-meta-resolve@4.2.0: {} + imurmurhash@0.1.4: {} indent-string@5.0.0: {} @@ -7767,10 +8704,6 @@ snapshots: dependencies: call-bound: 1.0.4 - is-fullwidth-code-point@5.1.0: - dependencies: - get-east-asian-width: 1.5.0 - is-generator-function@1.1.2: dependencies: call-bound: 1.0.4 @@ -7783,6 +8716,11 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-identifier@1.1.0: + dependencies: + identifier-regex: 1.1.0 + super-regex: 1.1.0 + is-map@2.0.3: {} is-module@1.0.0: {} @@ -7861,6 +8799,10 @@ snapshots: jsdoc-type-pratt-parser@7.1.1: {} + jsdoc-type-pratt-parser@7.2.0: {} + + jsdoc-type-pratt-parser@8.0.0: {} + jsesc@3.1.0: {} json-buffer@3.0.1: {} @@ -7889,6 +8831,10 @@ snapshots: jsonpointer@5.0.1: {} + katex@0.16.47: + dependencies: + commander: 8.3.0 + keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -7903,36 +8849,69 @@ snapshots: lightningcss-android-arm64@1.31.1: optional: true + lightningcss-android-arm64@1.33.0: + optional: true + lightningcss-darwin-arm64@1.31.1: optional: true + lightningcss-darwin-arm64@1.33.0: + optional: true + lightningcss-darwin-x64@1.31.1: optional: true + lightningcss-darwin-x64@1.33.0: + optional: true + lightningcss-freebsd-x64@1.31.1: optional: true + lightningcss-freebsd-x64@1.33.0: + optional: true + lightningcss-linux-arm-gnueabihf@1.31.1: optional: true + lightningcss-linux-arm-gnueabihf@1.33.0: + optional: true + lightningcss-linux-arm64-gnu@1.31.1: optional: true + lightningcss-linux-arm64-gnu@1.33.0: + optional: true + lightningcss-linux-arm64-musl@1.31.1: optional: true + lightningcss-linux-arm64-musl@1.33.0: + optional: true + lightningcss-linux-x64-gnu@1.31.1: optional: true + lightningcss-linux-x64-gnu@1.33.0: + optional: true + lightningcss-linux-x64-musl@1.31.1: optional: true + lightningcss-linux-x64-musl@1.33.0: + optional: true + lightningcss-win32-arm64-msvc@1.31.1: optional: true + lightningcss-win32-arm64-msvc@1.33.0: + optional: true + lightningcss-win32-x64-msvc@1.31.1: optional: true + lightningcss-win32-x64-msvc@1.33.0: + optional: true + lightningcss@1.31.1: dependencies: detect-libc: 2.1.2 @@ -7949,29 +8928,35 @@ snapshots: lightningcss-win32-arm64-msvc: 1.31.1 lightningcss-win32-x64-msvc: 1.31.1 - linkify-it@5.0.0: + lightningcss@1.33.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 + + linkify-it@5.0.2: dependencies: uc.micro: 2.1.0 - lint-staged@16.4.0: + lint-staged@17.3.0: dependencies: - commander: 14.0.3 - listr2: 9.0.5 - picomatch: 4.0.3 + picomatch: 4.0.5 string-argv: 0.3.2 - tinyexec: 1.0.4 - yaml: 2.8.2 - - listr2@9.0.5: - dependencies: - cli-truncate: 5.2.0 - colorette: 2.0.20 - eventemitter3: 5.0.4 - log-update: 6.1.0 - rfdc: 1.4.1 - wrap-ansi: 9.0.2 + tinyexec: 1.3.0 + optionalDependencies: + yaml: 2.9.0 - local-pkg@1.1.2: + local-pkg@1.2.1: dependencies: mlly: 1.8.1 pkg-types: 2.3.0 @@ -7983,20 +8968,10 @@ snapshots: lodash.debounce@4.0.8: {} - lodash.merge@4.6.2: {} - lodash.sortby@4.7.0: {} lodash@4.17.23: {} - log-update@6.1.0: - dependencies: - ansi-escapes: 7.3.0 - cli-cursor: 5.0.0 - slice-ansi: 7.1.2 - strip-ansi: 7.2.0 - wrap-ansi: 9.0.2 - longest-streak@3.1.0: {} lru-cache@11.2.7: {} @@ -8025,13 +9000,23 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + magic-string@1.1.0: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + make-asynchronous@1.1.0: + dependencies: + p-event: 6.0.1 + type-fest: 4.41.0 + web-worker: 1.5.0 + mark.js@8.11.1: {} - markdown-it@14.1.1: + markdown-it@14.3.0: dependencies: argparse: 2.0.1 entities: 4.5.0 - linkify-it: 5.0.0 + linkify-it: 5.0.2 mdurl: 2.0.0 punycode.js: 2.3.1 uc.micro: 2.1.0 @@ -8132,6 +9117,18 @@ snapshots: transitivePeerDependencies: - supports-color + mdast-util-math@3.0.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + longest-streak: 3.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + unist-util-remove-position: 5.0.0 + transitivePeerDependencies: + - supports-color + mdast-util-phrasing@4.1.0: dependencies: '@types/mdast': 4.0.4 @@ -8167,6 +9164,8 @@ snapshots: mdn-data@2.27.1: {} + mdn-data@2.29.0: {} + mdurl@2.0.0: {} media-typer@0.3.0: {} @@ -8259,6 +9258,16 @@ snapshots: micromark-util-combine-extensions: 2.0.1 micromark-util-types: 2.0.2 + micromark-extension-math@3.1.0: + dependencies: + '@types/katex': 0.16.8 + devlop: 1.1.0 + katex: 0.16.47 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + micromark-factory-destination@2.0.1: dependencies: micromark-util-character: 2.1.1 @@ -8383,14 +9392,16 @@ snapshots: mime@1.6.0: {} - mimic-function@5.0.1: {} - minimalistic-assert@1.0.1: {} minimatch@10.2.4: dependencies: brace-expansion: 5.0.4 + minimatch@10.2.6: + dependencies: + brace-expansion: 5.0.9 + minimatch@5.1.9: dependencies: brace-expansion: 2.0.2 @@ -8406,7 +9417,7 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.3 - module-replacements@2.11.0: {} + module-replacements@3.1.0: {} mrmime@2.0.1: {} @@ -8418,6 +9429,8 @@ snapshots: nanoid@3.3.11: {} + nanoid@3.3.16: {} + natural-compare@1.4.0: {} natural-orderby@5.0.0: {} @@ -8430,13 +9443,15 @@ snapshots: node-releases@2.0.36: {} + node-releases@2.0.51: {} + nth-check@2.1.1: dependencies: boolbase: 1.0.0 object-assign@4.1.1: {} - object-deep-merge@2.0.0: {} + object-deep-merge@2.0.1: {} object-inspect@1.13.4: {} @@ -8469,18 +9484,22 @@ snapshots: on-headers@1.1.0: {} - onetime@7.0.0: - dependencies: - mimic-function: 5.0.1 - oniguruma-parser@0.12.1: {} + oniguruma-parser@0.12.2: {} + oniguruma-to-es@4.3.5: dependencies: oniguruma-parser: 0.12.1 regex: 6.1.0 regex-recursion: 6.0.2 + oniguruma-to-es@4.3.6: + dependencies: + oniguruma-parser: 0.12.2 + regex: 6.1.0 + regex-recursion: 6.0.2 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -8496,35 +9515,39 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - oxc-parser@0.115.0: + oxc-parser@0.131.0: dependencies: - '@oxc-project/types': 0.115.0 + '@oxc-project/types': 0.131.0 optionalDependencies: - '@oxc-parser/binding-android-arm-eabi': 0.115.0 - '@oxc-parser/binding-android-arm64': 0.115.0 - '@oxc-parser/binding-darwin-arm64': 0.115.0 - '@oxc-parser/binding-darwin-x64': 0.115.0 - '@oxc-parser/binding-freebsd-x64': 0.115.0 - '@oxc-parser/binding-linux-arm-gnueabihf': 0.115.0 - '@oxc-parser/binding-linux-arm-musleabihf': 0.115.0 - '@oxc-parser/binding-linux-arm64-gnu': 0.115.0 - '@oxc-parser/binding-linux-arm64-musl': 0.115.0 - '@oxc-parser/binding-linux-ppc64-gnu': 0.115.0 - '@oxc-parser/binding-linux-riscv64-gnu': 0.115.0 - '@oxc-parser/binding-linux-riscv64-musl': 0.115.0 - '@oxc-parser/binding-linux-s390x-gnu': 0.115.0 - '@oxc-parser/binding-linux-x64-gnu': 0.115.0 - '@oxc-parser/binding-linux-x64-musl': 0.115.0 - '@oxc-parser/binding-openharmony-arm64': 0.115.0 - '@oxc-parser/binding-wasm32-wasi': 0.115.0 - '@oxc-parser/binding-win32-arm64-msvc': 0.115.0 - '@oxc-parser/binding-win32-ia32-msvc': 0.115.0 - '@oxc-parser/binding-win32-x64-msvc': 0.115.0 - - oxc-walker@0.7.0(oxc-parser@0.115.0): + '@oxc-parser/binding-android-arm-eabi': 0.131.0 + '@oxc-parser/binding-android-arm64': 0.131.0 + '@oxc-parser/binding-darwin-arm64': 0.131.0 + '@oxc-parser/binding-darwin-x64': 0.131.0 + '@oxc-parser/binding-freebsd-x64': 0.131.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.131.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.131.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.131.0 + '@oxc-parser/binding-linux-arm64-musl': 0.131.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.131.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.131.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.131.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.131.0 + '@oxc-parser/binding-linux-x64-gnu': 0.131.0 + '@oxc-parser/binding-linux-x64-musl': 0.131.0 + '@oxc-parser/binding-openharmony-arm64': 0.131.0 + '@oxc-parser/binding-wasm32-wasi': 0.131.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.131.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.131.0 + '@oxc-parser/binding-win32-x64-msvc': 0.131.0 + + oxc-walker@0.7.0(oxc-parser@0.131.0): dependencies: magic-regexp: 0.10.0 - oxc-parser: 0.115.0 + oxc-parser: 0.131.0 + + p-event@6.0.1: + dependencies: + p-timeout: 6.1.4 p-limit@3.1.0: dependencies: @@ -8534,10 +9557,14 @@ snapshots: dependencies: p-limit: 3.1.0 + p-timeout@6.1.4: {} + package-json-from-dist@1.0.1: {} package-manager-detector@1.6.0: {} + package-manager-detector@1.8.0: {} + parse-gitignore@2.0.0: {} parse-imports-exports@0.2.4: @@ -8573,6 +9600,8 @@ snapshots: picomatch@4.0.3: {} + picomatch@4.0.5: {} + pkg-types@1.3.1: dependencies: confbox: 0.1.8 @@ -8587,9 +9616,9 @@ snapshots: pluralize@8.0.0: {} - pnpm-workspace-yaml@1.6.0: + pnpm-workspace-yaml@1.7.0: dependencies: - yaml: 2.8.2 + yaml: 2.9.0 possible-typed-array-names@1.1.0: {} @@ -8598,11 +9627,17 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-selector-parser@7.1.1: + postcss-selector-parser@7.1.4: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 + postcss@8.5.25: + dependencies: + nanoid: 3.3.16 + picocolors: 1.1.1 + source-map-js: 1.2.1 + postcss@8.5.8: dependencies: nanoid: 3.3.11 @@ -8636,6 +9671,8 @@ snapshots: quansync@1.0.0: {} + quote-js-string@0.1.0: {} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 @@ -8729,19 +9766,23 @@ snapshots: dependencies: jsesc: 3.1.0 - reka-ui@2.9.2(vue@3.5.30(typescript@5.9.3)): + regjsparser@0.13.2: + dependencies: + jsesc: 3.1.0 + + reka-ui@2.9.2(vue@3.5.40(typescript@5.9.3)): dependencies: '@floating-ui/dom': 1.7.6 - '@floating-ui/vue': 1.1.11(vue@3.5.30(typescript@5.9.3)) + '@floating-ui/vue': 1.1.11(vue@3.5.40(typescript@5.9.3)) '@internationalized/date': 3.12.0 '@internationalized/number': 3.6.5 - '@tanstack/vue-virtual': 3.13.23(vue@3.5.30(typescript@5.9.3)) - '@vueuse/core': 14.2.1(vue@3.5.30(typescript@5.9.3)) - '@vueuse/shared': 14.2.1(vue@3.5.30(typescript@5.9.3)) + '@tanstack/vue-virtual': 3.13.23(vue@3.5.40(typescript@5.9.3)) + '@vueuse/core': 14.4.0(vue@3.5.40(typescript@5.9.3)) + '@vueuse/shared': 14.2.1(vue@3.5.40(typescript@5.9.3)) aria-hidden: 1.2.6 defu: 6.1.4 ohash: 2.0.11 - vue: 3.5.30(typescript@5.9.3) + vue: 3.5.40(typescript@5.9.3) transitivePeerDependencies: - '@vue/composition-api' @@ -8757,12 +9798,26 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - restore-cursor@5.1.0: + rolldown@1.2.1: dependencies: - onetime: 7.0.0 - signal-exit: 4.1.0 - - rfdc@1.4.1: {} + '@oxc-project/types': 0.142.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.2.1 + '@rolldown/binding-darwin-arm64': 1.2.1 + '@rolldown/binding-darwin-x64': 1.2.1 + '@rolldown/binding-freebsd-x64': 1.2.1 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.1 + '@rolldown/binding-linux-arm64-gnu': 1.2.1 + '@rolldown/binding-linux-arm64-musl': 1.2.1 + '@rolldown/binding-linux-ppc64-gnu': 1.2.1 + '@rolldown/binding-linux-s390x-gnu': 1.2.1 + '@rolldown/binding-linux-x64-gnu': 1.2.1 + '@rolldown/binding-linux-x64-musl': 1.2.1 + '@rolldown/binding-openharmony-arm64': 1.2.1 + '@rolldown/binding-wasm32-wasi': 1.2.1 + '@rolldown/binding-win32-arm64-msvc': 1.2.1 + '@rolldown/binding-win32-x64-msvc': 1.2.1 rollup@2.80.0: optionalDependencies: @@ -8836,6 +9891,8 @@ snapshots: semver@7.7.4: {} + semver@7.8.5: {} + send@0.19.2: dependencies: debug: 2.6.9 @@ -8940,6 +9997,17 @@ snapshots: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 + shiki@4.4.1: + dependencies: + '@shikijs/core': 4.4.1 + '@shikijs/engine-javascript': 4.4.1 + '@shikijs/engine-oniguruma': 4.4.1 + '@shikijs/langs': 4.4.1 + '@shikijs/themes': 4.4.1 + '@shikijs/types': 4.4.1 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 @@ -8986,16 +10054,6 @@ snapshots: sisteransi@1.0.5: {} - slice-ansi@7.1.2: - dependencies: - ansi-styles: 6.2.3 - is-fullwidth-code-point: 5.1.0 - - slice-ansi@8.0.0: - dependencies: - ansi-styles: 6.2.3 - is-fullwidth-code-point: 5.1.0 - smob@1.6.1: {} source-map-js@1.2.1: {} @@ -9017,7 +10075,7 @@ snapshots: spdx-exceptions@2.5.0: {} - spdx-expression-parse@4.0.0: + spdx-expression-parse@5.0.0: dependencies: spdx-exceptions: 2.5.0 spdx-license-ids: 3.0.23 @@ -9058,17 +10116,6 @@ snapshots: string-argv@0.3.2: {} - string-width@7.2.0: - dependencies: - emoji-regex: 10.6.0 - get-east-asian-width: 1.5.0 - strip-ansi: 7.2.0 - - string-width@8.2.0: - dependencies: - get-east-asian-width: 1.5.0 - strip-ansi: 7.2.0 - string.prototype.matchall@4.0.12: dependencies: call-bind: 1.0.8 @@ -9127,14 +10174,16 @@ snapshots: is-obj: 1.0.1 is-regexp: 1.0.0 - strip-ansi@7.2.0: - dependencies: - ansi-regex: 6.2.2 - strip-comments@2.0.1: {} strip-indent@4.1.1: {} + super-regex@1.1.0: + dependencies: + function-timeout: 1.0.2 + make-asynchronous: 1.1.0 + time-span: 5.1.0 + supports-preserve-symlinks-flag@1.0.0: {} synckit@0.11.12: @@ -9163,14 +10212,20 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 + time-span@5.1.0: + dependencies: + convert-hrtime: 5.0.0 + tinybench@2.9.0: {} tinyexec@1.0.4: {} - tinyglobby@0.2.15: + tinyexec@1.3.0: {} + + tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 tinyrainbow@3.1.0: {} @@ -9199,35 +10254,39 @@ snapshots: dependencies: typescript: 5.9.3 + ts-api-utils@2.5.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + ts-declaration-location@1.0.7(typescript@5.9.3): dependencies: picomatch: 4.0.3 typescript: 5.9.3 + optional: true tslib@2.8.1: {} - tsx@4.21.0: + tsx@4.23.4: dependencies: - esbuild: 0.27.4 - get-tsconfig: 4.13.6 + esbuild: 0.28.1 optionalDependencies: fsevents: 2.3.3 - twoslash-protocol@0.3.6: {} + twoslash-protocol@0.3.9: {} - twoslash-vue@0.3.6(typescript@5.9.3): + twoslash-vue@0.3.9(typescript@5.9.3): dependencies: '@vue/language-core': 3.2.6 - twoslash: 0.3.6(typescript@5.9.3) - twoslash-protocol: 0.3.6 + twoslash: 0.3.9(typescript@5.9.3) + twoslash-protocol: 0.3.9 typescript: 5.9.3 transitivePeerDependencies: - supports-color - twoslash@0.3.6(typescript@5.9.3): + twoslash@0.3.9(typescript@5.9.3): dependencies: '@typescript/vfs': 1.6.4(typescript@5.9.3) - twoslash-protocol: 0.3.6 + twoslash-protocol: 0.3.9 typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -9238,6 +10297,8 @@ snapshots: type-fest@0.16.0: {} + type-fest@4.41.0: {} + type-is@1.6.18: dependencies: media-typer: 0.3.0 @@ -9306,7 +10367,7 @@ snapshots: quansync: 1.0.0 unconfig-core: 7.5.0 - undici-types@7.18.2: {} + undici-types@8.3.0: {} unicode-canonical-property-names-ecmascript@2.0.1: {} @@ -9331,6 +10392,11 @@ snapshots: dependencies: '@types/unist': 3.0.3 + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit: 5.1.0 + unist-util-stringify-position@4.0.0: dependencies: '@types/unist': 3.0.3 @@ -9348,25 +10414,25 @@ snapshots: universalify@2.0.1: {} - unocss@66.6.6(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)): - dependencies: - '@unocss/cli': 66.6.6 - '@unocss/core': 66.6.6 - '@unocss/preset-attributify': 66.6.6 - '@unocss/preset-icons': 66.6.6 - '@unocss/preset-mini': 66.6.6 - '@unocss/preset-tagify': 66.6.6 - '@unocss/preset-typography': 66.6.6 - '@unocss/preset-uno': 66.6.6 - '@unocss/preset-web-fonts': 66.6.6 - '@unocss/preset-wind': 66.6.6 - '@unocss/preset-wind3': 66.6.6 - '@unocss/preset-wind4': 66.6.6 - '@unocss/transformer-attributify-jsx': 66.6.6 - '@unocss/transformer-compile-class': 66.6.6 - '@unocss/transformer-directives': 66.6.6 - '@unocss/transformer-variant-group': 66.6.6 - '@unocss/vite': 66.6.6(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) + unocss@66.7.5(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0)): + dependencies: + '@unocss/cli': 66.7.5 + '@unocss/core': 66.7.5 + '@unocss/preset-attributify': 66.7.5 + '@unocss/preset-icons': 66.7.5 + '@unocss/preset-mini': 66.7.5 + '@unocss/preset-tagify': 66.7.5 + '@unocss/preset-typography': 66.7.5 + '@unocss/preset-uno': 66.7.5 + '@unocss/preset-web-fonts': 66.7.5 + '@unocss/preset-wind': 66.7.5 + '@unocss/preset-wind3': 66.7.5 + '@unocss/preset-wind4': 66.7.5 + '@unocss/transformer-attributify-jsx': 66.7.5 + '@unocss/transformer-compile-class': 66.7.5 + '@unocss/transformer-directives': 66.7.5 + '@unocss/transformer-variant-group': 66.7.5 + '@unocss/vite': 66.7.5(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0)) transitivePeerDependencies: - vite @@ -9392,6 +10458,12 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + update-browserslist-db@1.2.3(browserslist@4.28.7): + dependencies: + browserslist: 4.28.7 + escalade: 3.2.0 + picocolors: 1.1.1 + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -9412,50 +10484,66 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-plugin-pwa@1.2.0(@vite-pwa/assets-generator@1.0.2)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))(workbox-build@7.4.0)(workbox-window@7.4.0): + vite-plugin-pwa@1.3.0(@vite-pwa/assets-generator@1.0.2)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0))(workbox-build@7.4.0)(workbox-window@7.4.1): dependencies: debug: 4.4.3 pretty-bytes: 6.1.1 - tinyglobby: 0.2.15 - vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) + tinyglobby: 0.2.17 + vite: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0) workbox-build: 7.4.0 - workbox-window: 7.4.0 + workbox-window: 7.4.1 optionalDependencies: '@vite-pwa/assets-generator': 1.0.2 transitivePeerDependencies: - supports-color - vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2): + vite@7.3.1(@types/node@26.1.2)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0): dependencies: esbuild: 0.27.4 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.8 rollup: 4.59.0 - tinyglobby: 0.2.15 + tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 25.5.0 + '@types/node': 26.1.2 fsevents: 2.3.3 jiti: 2.6.1 - lightningcss: 1.31.1 + lightningcss: 1.33.0 terser: 5.46.1 - tsx: 4.21.0 - yaml: 2.8.2 + tsx: 4.23.4 + yaml: 2.9.0 + + vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0): + dependencies: + lightningcss: 1.33.0 + picomatch: 4.0.5 + postcss: 8.5.25 + rolldown: 1.2.1 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 26.1.2 + esbuild: 0.28.1 + fsevents: 2.3.3 + jiti: 2.6.1 + terser: 5.46.1 + tsx: 4.23.4 + yaml: 2.9.0 - vitepress-plugin-group-icons@1.7.1(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)): + vitepress-plugin-group-icons@1.7.6(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0)): dependencies: - '@iconify-json/logos': 1.2.10 - '@iconify-json/vscode-icons': 1.2.45 - '@iconify/utils': 3.1.0 + '@iconify-json/logos': 1.2.11 + '@iconify-json/vscode-icons': 1.2.68 + '@iconify/utils': 3.1.4 optionalDependencies: - vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0) - vitepress-plugin-tabs@0.8.0(vitepress@2.0.0-alpha.16(@types/node@25.5.0)(change-case@5.4.4)(jiti@2.6.1)(lightningcss@1.31.1)(postcss@8.5.8)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)): + vitepress-plugin-tabs@0.9.1(vitepress@2.0.0-alpha.16(@types/node@26.1.2)(change-case@5.4.4)(jiti@2.6.1)(lightningcss@1.33.0)(postcss@8.5.25)(terser@5.46.1)(tsx@4.23.4)(typescript@5.9.3)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)): dependencies: - vitepress: 2.0.0-alpha.16(@types/node@25.5.0)(change-case@5.4.4)(jiti@2.6.1)(lightningcss@1.31.1)(postcss@8.5.8)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) - vue: 3.5.30(typescript@5.9.3) + vitepress: 2.0.0-alpha.16(@types/node@26.1.2)(change-case@5.4.4)(jiti@2.6.1)(lightningcss@1.33.0)(postcss@8.5.25)(terser@5.46.1)(tsx@4.23.4)(typescript@5.9.3)(yaml@2.9.0) + vue: 3.5.40(typescript@5.9.3) - vitepress@2.0.0-alpha.16(@types/node@25.5.0)(change-case@5.4.4)(jiti@2.6.1)(lightningcss@1.31.1)(postcss@8.5.8)(terser@5.46.1)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2): + vitepress@2.0.0-alpha.16(@types/node@26.1.2)(change-case@5.4.4)(jiti@2.6.1)(lightningcss@1.33.0)(postcss@8.5.25)(terser@5.46.1)(tsx@4.23.4)(typescript@5.9.3)(yaml@2.9.0): dependencies: '@docsearch/css': 4.6.0 '@docsearch/js': 4.6.0 @@ -9465,19 +10553,19 @@ snapshots: '@shikijs/transformers': 3.23.0 '@shikijs/types': 3.23.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 6.0.5(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)) + '@vitejs/plugin-vue': 6.0.8(vite@7.3.1(@types/node@26.1.2)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)) '@vue/devtools-api': 8.1.0 '@vue/shared': 3.5.30 - '@vueuse/core': 14.2.1(vue@3.5.30(typescript@5.9.3)) - '@vueuse/integrations': 14.2.1(change-case@5.4.4)(focus-trap@7.8.0)(vue@3.5.30(typescript@5.9.3)) + '@vueuse/core': 14.4.0(vue@3.5.40(typescript@5.9.3)) + '@vueuse/integrations': 14.2.1(change-case@5.4.4)(focus-trap@7.8.0)(vue@3.5.40(typescript@5.9.3)) focus-trap: 7.8.0 mark.js: 8.11.1 minisearch: 7.2.0 shiki: 3.23.0 - vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) - vue: 3.5.30(typescript@5.9.3) + vite: 7.3.1(@types/node@26.1.2)(jiti@2.6.1)(lightningcss@1.33.0)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0) + vue: 3.5.40(typescript@5.9.3) optionalDependencies: - postcss: 8.5.8 + postcss: 8.5.25 transitivePeerDependencies: - '@types/node' - async-validator @@ -9503,15 +10591,15 @@ snapshots: - universal-cookie - yaml - vitest@4.1.0(@types/node@25.5.0)(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)): + vitest@4.1.10(@types/node@26.1.2)(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0)): dependencies: - '@vitest/expect': 4.1.0 - '@vitest/mocker': 4.1.0(vite@7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2)) - '@vitest/pretty-format': 4.1.0 - '@vitest/runner': 4.1.0 - '@vitest/snapshot': 4.1.0 - '@vitest/spy': 4.1.0 - '@vitest/utils': 4.1.0 + '@vitest/expect': 4.1.10 + '@vitest/mocker': 4.1.10(vite@8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.10 + '@vitest/runner': 4.1.10 + '@vitest/snapshot': 4.1.10 + '@vitest/spy': 4.1.10 + '@vitest/utils': 4.1.10 es-module-lexer: 2.0.0 expect-type: 1.3.0 magic-string: 0.30.21 @@ -9521,23 +10609,23 @@ snapshots: std-env: 4.0.0 tinybench: 2.9.0 tinyexec: 1.0.4 - tinyglobby: 0.2.15 + tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 7.3.1(@types/node@25.5.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 8.2.0(@types/node@26.1.2)(esbuild@0.28.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.23.4)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 25.5.0 + '@types/node': 26.1.2 transitivePeerDependencies: - msw - vue-demi@0.14.10(vue@3.5.30(typescript@5.9.3)): + vue-demi@0.14.10(vue@3.5.40(typescript@5.9.3)): dependencies: - vue: 3.5.30(typescript@5.9.3) + vue: 3.5.40(typescript@5.9.3) - vue-eslint-parser@10.4.0(eslint@10.0.3(jiti@2.6.1)): + vue-eslint-parser@10.4.1(eslint@10.8.0(jiti@2.6.1)): dependencies: debug: 4.4.3 - eslint: 10.0.3(jiti@2.6.1) + eslint: 10.8.0(jiti@2.6.1) eslint-scope: 9.1.2 eslint-visitor-keys: 5.0.1 espree: 11.2.0 @@ -9546,17 +10634,17 @@ snapshots: transitivePeerDependencies: - supports-color - vue-resize@2.0.0-alpha.1(vue@3.5.30(typescript@5.9.3)): + vue-resize@2.0.0-alpha.1(vue@3.5.40(typescript@5.9.3)): dependencies: - vue: 3.5.30(typescript@5.9.3) + vue: 3.5.40(typescript@5.9.3) - vue@3.5.30(typescript@5.9.3): + vue@3.5.40(typescript@5.9.3): dependencies: - '@vue/compiler-dom': 3.5.30 - '@vue/compiler-sfc': 3.5.30 - '@vue/runtime-dom': 3.5.30 - '@vue/server-renderer': 3.5.30(vue@3.5.30(typescript@5.9.3)) - '@vue/shared': 3.5.30 + '@vue/compiler-dom': 3.5.40 + '@vue/compiler-sfc': 3.5.40 + '@vue/runtime-dom': 3.5.40 + '@vue/server-renderer': 3.5.40 + '@vue/shared': 3.5.40 optionalDependencies: typescript: 5.9.3 @@ -9564,6 +10652,8 @@ snapshots: dependencies: minimalistic-assert: 1.0.1 + web-worker@1.5.0: {} + webidl-conversions@4.0.2: {} webpack-virtual-modules@0.6.2: {} @@ -9684,6 +10774,8 @@ snapshots: workbox-core@7.4.0: {} + workbox-core@7.4.1: {} + workbox-expiration@7.4.0: dependencies: idb: 7.1.1 @@ -9739,23 +10831,24 @@ snapshots: '@types/trusted-types': 2.0.7 workbox-core: 7.4.0 - wrap-ansi@9.0.2: + workbox-window@7.4.1: dependencies: - ansi-styles: 6.2.3 - string-width: 7.2.0 - strip-ansi: 7.2.0 + '@types/trusted-types': 2.0.7 + workbox-core: 7.4.1 - xml-name-validator@4.0.0: {} + xml-name-validator@5.0.0: {} yallist@3.1.1: {} - yaml-eslint-parser@2.0.0: + yaml-eslint-parser@2.1.0: dependencies: eslint-visitor-keys: 5.0.1 yaml: 2.8.2 yaml@2.8.2: {} + yaml@2.9.0: {} + yocto-queue@0.1.0: {} zwitch@2.0.4: {} From 41c253447500b27d6b08bf1e5ec704297cc875bc Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Sun, 2 Aug 2026 16:52:42 +0000 Subject: [PATCH 22/22] [autofix.ci] apply automated fixes --- .vitepress/scripts/cli-generator.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vitepress/scripts/cli-generator.ts b/.vitepress/scripts/cli-generator.ts index f8a04755..6a4e98e8 100644 --- a/.vitepress/scripts/cli-generator.ts +++ b/.vitepress/scripts/cli-generator.ts @@ -85,7 +85,7 @@ const template = options.map((option) => { const cli = option.cli const [page, ...hash] = (title.startsWith('browser.') ? title.slice(8) : title).toLowerCase().split('.') const config = skipConfig.has(title) ? '' : `[${title}](${title.includes('browser.') ? '/config/browser/' : '/config/'}${page}${hash.length ? `#${[page, ...hash].join('-')}` : ''})` - // eslint-disable-next-line e18e/prefer-static-regex + return `### ${title}\n\n- **CLI:** ${cli}\n${config ? `- **Config:** ${config}\n` : ''}\n${option.description.replace(/https:\/\/vitest\.dev\//g, '/')}\n` }).join('\n')